New vehicle synchronization added. Some changes

This commit is contained in:
EntenKoeniq
2021-11-19 08:40:40 +01:00
parent 13cd3527e0
commit 5c14d2300b
6 changed files with 140 additions and 88 deletions

View File

@ -77,8 +77,8 @@ namespace CoopClient
public bool VehIsSireneActive { get; set; }
private VehicleDoors[] LastVehDoors;
public VehicleDoors[] VehDoors { get; set; }
private byte LastVehTires;
public byte VehTires { get; set; }
private int LastVehTires;
public int VehTires { get; set; }
#endregion
public void DisplayLocally(string username)
@ -269,7 +269,7 @@ namespace CoopClient
if (!vehFound)
{
Model vehicleModel = Util.ModelRequest(VehicleModelHash);
Model vehicleModel = VehicleModelHash.ModelRequest();
if (vehicleModel == null)
{
GTA.UI.Notification.Show($"~r~Model ({VehicleModelHash}) cannot be loaded!");
@ -315,7 +315,7 @@ namespace CoopClient
}
else
{
if (Util.GetResponsiblePedHandle(MainVehicle) != Character.Handle)
if (MainVehicle.GetResponsiblePedHandle() != Character.Handle)
{
return;
}
@ -424,11 +424,12 @@ namespace CoopClient
if (VehTires != default && LastVehTires != VehTires)
{
for (int i = 0; i < MainVehicle.Wheels.Count - 1; i++)
foreach (var wheel in MainVehicle.Wheels.GetAllWheels())
{
if ((VehTires & 1 << i) != 0)
if ((VehTires & 1 << (int)wheel.BoneId) != 0)
{
Function.Call(Hash.SET_VEHICLE_TYRE_BURST, MainVehicle, i, true, 1000.0);
wheel.Puncture();
wheel.Burst();
}
}
@ -438,7 +439,7 @@ namespace CoopClient
if (VehicleSteeringAngle != MainVehicle.SteeringAngle)
{
Util.CustomSteeringAngle(MainVehicle.Handle, (float)(Math.PI / 180) * VehicleSteeringAngle);
MainVehicle.Handle.CustomSteeringAngle((float)(Math.PI / 180) * VehicleSteeringAngle);
}
// Good enough for now, but we need to create a better sync
@ -622,7 +623,7 @@ namespace CoopClient
LastModelHash = ModelHash;
LastProps = Props;
Model characterModel = Util.ModelRequest(ModelHash);
Model characterModel = ModelHash.ModelRequest();
if (characterModel == null)
{

View File

@ -241,7 +241,7 @@ namespace CoopClient
if (fullSync)
{
DebugSyncPed.ModelHash = player.Model.Hash;
DebugSyncPed.Props = Util.GetPedProps(player);
DebugSyncPed.Props = player.GetPedProps();
}
DebugSyncPed.Health = player.Health;
DebugSyncPed.Position = player.Position;
@ -250,12 +250,12 @@ namespace CoopClient
if (!player.IsInVehicle())
{
flags = Util.GetPedFlags(player, fullSync, true);
flags = player.GetPedFlags(fullSync, true);
DebugSyncPed.Rotation = player.Rotation;
DebugSyncPed.Velocity = player.Velocity;
DebugSyncPed.Speed = Util.GetPedSpeed(player);
DebugSyncPed.AimCoords = Util.GetPedAimCoords(player, false);
DebugSyncPed.Speed = player.GetPedSpeed();
DebugSyncPed.AimCoords = player.GetPedAimCoords(false);
DebugSyncPed.CurrentWeaponHash = (int)player.Weapons.Current.Hash;
DebugSyncPed.LastSyncWasFull = (flags.Value & (byte)PedDataFlags.LastSyncWasFull) > 0;
DebugSyncPed.IsAiming = (flags.Value & (byte)PedDataFlags.IsAiming) > 0;
@ -277,7 +277,7 @@ namespace CoopClient
Vehicle veh = player.CurrentVehicle;
veh.Opacity = 75;
flags = Util.GetVehicleFlags(player, veh, fullSync);
flags = veh.GetVehicleFlags(fullSync);
int secondaryColor;
int primaryColor;
@ -286,27 +286,19 @@ namespace CoopClient
Function.Call<int>(Hash.GET_VEHICLE_COLOURS, veh, &primaryColor, &secondaryColor);
}
byte tyreFlag = 0;
for (int i = 0; i < veh.Wheels.Count - 1; i++)
{
if (Function.Call<bool>(Hash.IS_VEHICLE_TYRE_BURST, veh, i, false))
{
tyreFlag |= (byte)(1 << i);
}
}
DebugSyncPed.VehicleModelHash = veh.Model.Hash;
DebugSyncPed.VehicleSeatIndex = (int)player.SeatIndex;
DebugSyncPed.VehiclePosition = veh.Position;
DebugSyncPed.VehicleRotation = veh.Quaternion;
DebugSyncPed.VehicleEngineHealth = veh.EngineHealth;
DebugSyncPed.VehRPM = veh.CurrentRPM;
DebugSyncPed.VehicleVelocity = veh.Velocity;
DebugSyncPed.VehicleSpeed = veh.Speed;
DebugSyncPed.VehicleSteeringAngle = veh.SteeringAngle;
DebugSyncPed.VehicleColors = new int[] { primaryColor, secondaryColor };
DebugSyncPed.VehicleMods = Util.GetVehicleMods(veh);
DebugSyncPed.VehDoors = Util.GetVehicleDoors(veh.Doors);
DebugSyncPed.VehTires = tyreFlag;
DebugSyncPed.VehicleMods = veh.Mods.GetVehicleMods();
DebugSyncPed.VehDoors = veh.Doors.GetVehicleDoors();
DebugSyncPed.VehTires = veh.Wheels.GetBrokenTires();
DebugSyncPed.LastSyncWasFull = (flags.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
DebugSyncPed.IsInVehicle = (flags.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
DebugSyncPed.VehIsEngineRunning = (flags.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0;

View File

@ -599,28 +599,38 @@ namespace CoopClient
Position = player.Position.ToLVector()
},
ModelHash = player.Model.Hash,
Props = Util.GetPedProps(player),
Props = player.GetPedProps(),
Rotation = player.Rotation.ToLVector(),
Velocity = player.Velocity.ToLVector(),
Speed = Util.GetPedSpeed(player),
AimCoords = Util.GetPedAimCoords(player, false).ToLVector(),
Speed = player.GetPedSpeed(),
AimCoords = player.GetPedAimCoords(false).ToLVector(),
CurrentWeaponHash = (int)player.Weapons.Current.Hash,
Flag = Util.GetPedFlags(player, true, true)
Flag = player.GetPedFlags(true, true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
else
{
bool isDriver = Util.GetResponsiblePedHandle(player.CurrentVehicle) == player.Handle;
bool isDriver = player.CurrentVehicle.GetResponsiblePedHandle() == player.Handle;
int secondaryColor = 0;
int primaryColor = 0;
int tyreFlag = 0;
if (isDriver)
{
unsafe
{
Function.Call<int>(Hash.GET_VEHICLE_COLOURS, player.CurrentVehicle, &primaryColor, &secondaryColor);
}
foreach (var wheel in player.CurrentVehicle.Wheels.GetAllWheels())
{
if (wheel.IsBursted)
{
tyreFlag |= (1 << (int)wheel.BoneId);
}
}
}
new FullSyncPlayerVehPacket()
@ -632,19 +642,21 @@ namespace CoopClient
Position = player.Position.ToLVector()
},
ModelHash = player.Model.Hash,
Props = Util.GetPedProps(player),
Props = player.GetPedProps(),
VehModelHash = player.CurrentVehicle.Model.Hash,
VehSeatIndex = (int)player.SeatIndex,
VehPosition = isDriver ? player.CurrentVehicle.Position.ToLVector() : new LVector3(),
VehRotation = isDriver ? player.CurrentVehicle.Quaternion.ToLQuaternion() : new LQuaternion(),
VehEngineHealth = isDriver ? player.CurrentVehicle.EngineHealth : 0f,
VehRPM = isDriver ? player.CurrentVehicle.CurrentRPM : 0f,
VehVelocity = isDriver ? player.CurrentVehicle.Velocity.ToLVector() : new LVector3(),
VehSpeed = isDriver ? player.CurrentVehicle.Speed : 0f,
VehSteeringAngle = isDriver ? player.CurrentVehicle.SteeringAngle : 0f,
VehColors = isDriver ? new int[] { primaryColor, secondaryColor } : new int[0],
VehMods = isDriver ? Util.GetVehicleMods(player.CurrentVehicle) : null,
VehDoors = isDriver ? Util.GetVehicleDoors(player.CurrentVehicle.Doors) : null,
Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, true)
VehMods = isDriver ? player.CurrentVehicle.Mods.GetVehicleMods() : null,
VehDoors = isDriver ? player.CurrentVehicle.Doors.GetVehicleDoors() : null,
VehTires = isDriver ? tyreFlag : 0,
Flag = player.CurrentVehicle.GetVehicleFlags(true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
@ -666,15 +678,15 @@ namespace CoopClient
},
Rotation = player.Rotation.ToLVector(),
Velocity = player.Velocity.ToLVector(),
Speed = Util.GetPedSpeed(player),
AimCoords = Util.GetPedAimCoords(player, false).ToLVector(),
Speed = player.GetPedSpeed(),
AimCoords = player.GetPedAimCoords(false).ToLVector(),
CurrentWeaponHash = (int)player.Weapons.Current.Hash,
Flag = Util.GetPedFlags(player, false, true)
Flag = player.GetPedFlags(false, true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
else
{
bool isDriver = Util.GetResponsiblePedHandle(player.CurrentVehicle) == player.Handle;
bool isDriver = player.CurrentVehicle.GetResponsiblePedHandle() == player.Handle;
new LightSyncPlayerVehPacket()
{
@ -691,7 +703,7 @@ namespace CoopClient
VehVelocity = isDriver ? player.CurrentVehicle.Velocity.ToLVector() : new LVector3(),
VehSpeed = isDriver ? player.CurrentVehicle.Speed : 0f,
VehSteeringAngle = isDriver ? player.CurrentVehicle.SteeringAngle : 0f,
Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, false)
Flag = player.CurrentVehicle.GetVehicleFlags(false)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
}
@ -717,20 +729,20 @@ namespace CoopClient
{
ID = Main.LocalClientID + npc.Handle,
ModelHash = npc.Model.Hash,
Props = Util.GetPedProps(npc),
Props = npc.GetPedProps(),
Health = npc.Health,
Position = npc.Position.ToLVector(),
Rotation = npc.Rotation.ToLVector(),
Velocity = npc.Velocity.ToLVector(),
Speed = Util.GetPedSpeed(npc),
AimCoords = Util.GetPedAimCoords(npc, true).ToLVector(),
Speed = npc.GetPedSpeed(),
AimCoords = npc.GetPedAimCoords(true).ToLVector(),
CurrentWeaponHash = (int)npc.Weapons.Current.Hash,
Flag = Util.GetPedFlags(npc, true)
Flag = npc.GetPedFlags(true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}
else
{
bool isDriver = Util.GetResponsiblePedHandle(npc.CurrentVehicle) == npc.Handle;
bool isDriver = npc.CurrentVehicle.GetResponsiblePedHandle() == npc.Handle;
int secondaryColor = 0;
int primaryColor = 0;
@ -747,7 +759,7 @@ namespace CoopClient
{
ID = Main.LocalClientID + npc.Handle,
ModelHash = npc.Model.Hash,
Props = Util.GetPedProps(npc),
Props = npc.GetPedProps(),
Health = npc.Health,
Position = npc.Position.ToLVector(),
VehModelHash = npc.CurrentVehicle.Model.Hash,
@ -755,13 +767,15 @@ namespace CoopClient
VehPosition = isDriver ? npc.CurrentVehicle.Position.ToLVector() : new LVector3(),
VehRotation = isDriver ? npc.CurrentVehicle.Quaternion.ToLQuaternion() : new LQuaternion(),
VehEngineHealth = isDriver ? npc.CurrentVehicle.EngineHealth : 0f,
VehRPM = isDriver ? npc.CurrentVehicle.CurrentRPM : 0f,
VehVelocity = isDriver ? npc.CurrentVehicle.Velocity.ToLVector() : new LVector3(),
VehSpeed = isDriver ? npc.CurrentVehicle.Speed : 0f,
VehSteeringAngle = isDriver ? npc.CurrentVehicle.SteeringAngle : 0f,
VehColors = isDriver ? new int[] { primaryColor, secondaryColor } : new int[0],
VehMods = isDriver ? Util.GetVehicleMods(npc.CurrentVehicle) : null,
VehDoors = isDriver ? Util.GetVehicleDoors(npc.CurrentVehicle.Doors) : null,
Flag = Util.GetVehicleFlags(npc, npc.CurrentVehicle, true)
VehMods = isDriver ? npc.CurrentVehicle.Mods.GetVehicleMods() : null,
VehDoors = isDriver ? npc.CurrentVehicle.Doors.GetVehicleDoors() : null,
VehTires = npc.CurrentVehicle.Wheels.GetBrokenTires(),
Flag = npc.CurrentVehicle.GetVehicleFlags(true)
}.PacketToNetOutGoingMessage(outgoingMessage);
}

View File

@ -444,24 +444,30 @@ namespace CoopClient
public float VehEngineHealth { get; set; }
[ProtoMember(9)]
public LVector3 VehVelocity { get; set; }
public float VehRPM { get; set; }
[ProtoMember(10)]
public float VehSpeed { get; set; }
public LVector3 VehVelocity { get; set; }
[ProtoMember(11)]
public float VehSteeringAngle { get; set; }
public float VehSpeed { get; set; }
[ProtoMember(12)]
public int[] VehColors { get; set; }
public float VehSteeringAngle { get; set; }
[ProtoMember(13)]
public Dictionary<int, int> VehMods { get; set; }
public int[] VehColors { get; set; }
[ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(15)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(16)]
public int VehTires { get; set; }
[ProtoMember(17)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -488,12 +494,14 @@ namespace CoopClient
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehEngineHealth = data.VehEngineHealth;
VehRPM = data.VehRPM;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
VehTires = data.VehTires;
Flag = data.Flag;
}
}
@ -839,24 +847,30 @@ namespace CoopClient
public float VehEngineHealth { get; set; }
[ProtoMember(11)]
public LVector3 VehVelocity { get; set; }
public float VehRPM { get; set; }
[ProtoMember(12)]
public float VehSpeed { get; set; }
public LVector3 VehVelocity { get; set; }
[ProtoMember(13)]
public float VehSteeringAngle { get; set; }
public float VehSpeed { get; set; }
[ProtoMember(14)]
public int[] VehColors { get; set; }
public float VehSteeringAngle { get; set; }
[ProtoMember(15)]
public Dictionary<int, int> VehMods { get; set; }
public int[] VehColors { get; set; }
[ProtoMember(16)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(17)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(18)]
public int VehTires { get; set; }
[ProtoMember(19)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -885,12 +899,14 @@ namespace CoopClient
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehEngineHealth = data.VehEngineHealth;
VehRPM = data.VehRPM;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
VehTires = data.VehTires;
Flag = data.Flag;
}
}

View File

@ -67,7 +67,7 @@ namespace CoopClient
}
}
public static unsafe void CustomSteeringAngle(int handle, float value)
public static unsafe void CustomSteeringAngle(this int handle, float value)
{
IntPtr address = new IntPtr((long)GetEntityAddressFunc(handle));
if (address == IntPtr.Zero || SteeringAngleOffset == 0)
@ -79,7 +79,7 @@ namespace CoopClient
}
#endregion
public static Model ModelRequest(int hash)
public static Model ModelRequest(this int hash)
{
Model model = new Model(hash);
short counter = 0;
@ -119,7 +119,7 @@ namespace CoopClient
return (end - start) * currentTime / duration + start;
}
public static int GetResponsiblePedHandle(Vehicle veh)
public static int GetResponsiblePedHandle(this Vehicle veh)
{
if (veh == null || veh.Handle == 0 || !veh.Exists())
{
@ -142,7 +142,7 @@ namespace CoopClient
return 0;
}
public static byte GetPedSpeed(Ped ped)
public static byte GetPedSpeed(this Ped ped)
{
if (ped.IsSprinting)
{
@ -160,13 +160,13 @@ namespace CoopClient
return 0;
}
public static Vector3 GetPedAimCoords(Ped ped, bool isNpc)
public static Vector3 GetPedAimCoords(this Ped ped, bool isNpc)
{
bool aimOrShoot = ped.IsAiming || ped.IsShooting && ped.Weapons.Current?.AmmoInClip != 0;
return aimOrShoot ? (isNpc ? GetLastWeaponImpact(ped) : RaycastEverything(new Vector2(0, 0))) : new Vector3();
}
public static byte? GetVehicleFlags(Ped ped, Vehicle veh, bool fullSync)
public static byte? GetVehicleFlags(this Vehicle veh, bool fullSync)
{
byte? flags = 0;
@ -175,10 +175,8 @@ namespace CoopClient
flags |= (byte)VehicleDataFlags.LastSyncWasFull;
}
if (ped.IsInVehicle())
{
// Ped is in vehicle
flags |= (byte)VehicleDataFlags.IsInVehicle;
}
if (veh.IsEngineRunning)
{
@ -208,7 +206,7 @@ namespace CoopClient
return flags;
}
public static byte? GetPedFlags(Ped ped, bool fullSync, bool isPlayer = false)
public static byte? GetPedFlags(this Ped ped, bool fullSync, bool isPlayer = false)
{
byte? flags = 0;
@ -255,7 +253,7 @@ namespace CoopClient
return flags;
}
public static Dictionary<int, int> GetPedProps(Ped ped)
public static Dictionary<int, int> GetPedProps(this Ped ped)
{
Dictionary<int, int> result = new Dictionary<int, int>();
for (int i = 0; i < 11; i++)
@ -266,17 +264,17 @@ namespace CoopClient
return result;
}
public static Dictionary<int, int> GetVehicleMods(Vehicle veh)
public static Dictionary<int, int> GetVehicleMods(this VehicleModCollection mods)
{
Dictionary<int, int> result = new Dictionary<int, int>();
foreach (VehicleMod mod in veh.Mods.ToArray())
foreach (VehicleMod mod in mods.ToArray())
{
result.Add((int)mod.Type, mod.Index);
}
return result;
}
public static VehicleDoors[] GetVehicleDoors(VehicleDoorCollection doors)
public static VehicleDoors[] GetVehicleDoors(this VehicleDoorCollection doors)
{
int doorLength = doors.ToArray().Length;
if (doorLength == 0)
@ -300,6 +298,21 @@ namespace CoopClient
return result;
}
public static int GetBrokenTires(this VehicleWheelCollection wheels)
{
int tyreFlag = 0;
foreach (var wheel in wheels.GetAllWheels())
{
if (wheel.IsBursted)
{
tyreFlag |= (1 << (int)wheel.BoneId);
}
}
return tyreFlag;
}
public static Settings ReadSettings()
{
XmlSerializer ser = new XmlSerializer(typeof(Settings));

View File

@ -377,24 +377,30 @@ namespace CoopServer
public float VehEngineHealth { get; set; }
[ProtoMember(9)]
public LVector3 VehVelocity { get; set; }
public float VehRPM { get; set; }
[ProtoMember(10)]
public float VehSpeed { get; set; }
public LVector3 VehVelocity { get; set; }
[ProtoMember(11)]
public float VehSteeringAngle { get; set; }
public float VehSpeed { get; set; }
[ProtoMember(12)]
public int[] VehColors { get; set; }
public float VehSteeringAngle { get; set; }
[ProtoMember(13)]
public Dictionary<int, int> VehMods { get; set; }
public int[] VehColors { get; set; }
[ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(15)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(16)]
public int VehTires { get; set; }
[ProtoMember(17)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -421,12 +427,14 @@ namespace CoopServer
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehEngineHealth = data.VehEngineHealth;
VehRPM = data.VehRPM;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
VehTires = data.VehTires;
Flag = data.Flag;
}
}
@ -772,24 +780,30 @@ namespace CoopServer
public float VehEngineHealth { get; set; }
[ProtoMember(11)]
public LVector3 VehVelocity { get; set; }
public float VehRPM { get; set; }
[ProtoMember(12)]
public float VehSpeed { get; set; }
public LVector3 VehVelocity { get; set; }
[ProtoMember(13)]
public float VehSteeringAngle { get; set; }
public float VehSpeed { get; set; }
[ProtoMember(14)]
public int[] VehColors { get; set; }
public float VehSteeringAngle { get; set; }
[ProtoMember(15)]
public Dictionary<int, int> VehMods { get; set; }
public int[] VehColors { get; set; }
[ProtoMember(16)]
public VehicleDoors[] VehDoors { get; set; }
public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(17)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(18)]
public int VehTires { get; set; }
[ProtoMember(19)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -818,12 +832,14 @@ namespace CoopServer
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehEngineHealth = data.VehEngineHealth;
VehRPM = data.VehRPM;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehMods = data.VehMods;
VehDoors = data.VehDoors;
VehTires = data.VehTires;
Flag = data.Flag;
}
}