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; } public bool VehIsSireneActive { get; set; }
private VehicleDoors[] LastVehDoors; private VehicleDoors[] LastVehDoors;
public VehicleDoors[] VehDoors { get; set; } public VehicleDoors[] VehDoors { get; set; }
private byte LastVehTires; private int LastVehTires;
public byte VehTires { get; set; } public int VehTires { get; set; }
#endregion #endregion
public void DisplayLocally(string username) public void DisplayLocally(string username)
@ -269,7 +269,7 @@ namespace CoopClient
if (!vehFound) if (!vehFound)
{ {
Model vehicleModel = Util.ModelRequest(VehicleModelHash); Model vehicleModel = VehicleModelHash.ModelRequest();
if (vehicleModel == null) if (vehicleModel == null)
{ {
GTA.UI.Notification.Show($"~r~Model ({VehicleModelHash}) cannot be loaded!"); GTA.UI.Notification.Show($"~r~Model ({VehicleModelHash}) cannot be loaded!");
@ -315,7 +315,7 @@ namespace CoopClient
} }
else else
{ {
if (Util.GetResponsiblePedHandle(MainVehicle) != Character.Handle) if (MainVehicle.GetResponsiblePedHandle() != Character.Handle)
{ {
return; return;
} }
@ -424,11 +424,12 @@ namespace CoopClient
if (VehTires != default && LastVehTires != VehTires) 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) 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 // Good enough for now, but we need to create a better sync
@ -622,7 +623,7 @@ namespace CoopClient
LastModelHash = ModelHash; LastModelHash = ModelHash;
LastProps = Props; LastProps = Props;
Model characterModel = Util.ModelRequest(ModelHash); Model characterModel = ModelHash.ModelRequest();
if (characterModel == null) if (characterModel == null)
{ {

View File

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

View File

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

View File

@ -444,24 +444,30 @@ namespace CoopClient
public float VehEngineHealth { get; set; } public float VehEngineHealth { get; set; }
[ProtoMember(9)] [ProtoMember(9)]
public LVector3 VehVelocity { get; set; } public float VehRPM { get; set; }
[ProtoMember(10)] [ProtoMember(10)]
public float VehSpeed { get; set; } public LVector3 VehVelocity { get; set; }
[ProtoMember(11)] [ProtoMember(11)]
public float VehSteeringAngle { get; set; } public float VehSpeed { get; set; }
[ProtoMember(12)] [ProtoMember(12)]
public int[] VehColors { get; set; } public float VehSteeringAngle { get; set; }
[ProtoMember(13)] [ProtoMember(13)]
public Dictionary<int, int> VehMods { get; set; } public int[] VehColors { get; set; }
[ProtoMember(14)] [ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; } public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(15)] [ProtoMember(15)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(16)]
public int VehTires { get; set; }
[ProtoMember(17)]
public byte? Flag { get; set; } = 0; public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message) public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -488,12 +494,14 @@ namespace CoopClient
VehPosition = data.VehPosition; VehPosition = data.VehPosition;
VehRotation = data.VehRotation; VehRotation = data.VehRotation;
VehEngineHealth = data.VehEngineHealth; VehEngineHealth = data.VehEngineHealth;
VehRPM = data.VehRPM;
VehVelocity = data.VehVelocity; VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed; VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle; VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors; VehColors = data.VehColors;
VehMods = data.VehMods; VehMods = data.VehMods;
VehDoors = data.VehDoors; VehDoors = data.VehDoors;
VehTires = data.VehTires;
Flag = data.Flag; Flag = data.Flag;
} }
} }
@ -839,24 +847,30 @@ namespace CoopClient
public float VehEngineHealth { get; set; } public float VehEngineHealth { get; set; }
[ProtoMember(11)] [ProtoMember(11)]
public LVector3 VehVelocity { get; set; } public float VehRPM { get; set; }
[ProtoMember(12)] [ProtoMember(12)]
public float VehSpeed { get; set; } public LVector3 VehVelocity { get; set; }
[ProtoMember(13)] [ProtoMember(13)]
public float VehSteeringAngle { get; set; } public float VehSpeed { get; set; }
[ProtoMember(14)] [ProtoMember(14)]
public int[] VehColors { get; set; } public float VehSteeringAngle { get; set; }
[ProtoMember(15)] [ProtoMember(15)]
public Dictionary<int, int> VehMods { get; set; } public int[] VehColors { get; set; }
[ProtoMember(16)] [ProtoMember(16)]
public VehicleDoors[] VehDoors { get; set; } public Dictionary<int, int> VehMods { get; set; }
[ProtoMember(17)] [ProtoMember(17)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(18)]
public int VehTires { get; set; }
[ProtoMember(19)]
public byte? Flag { get; set; } = 0; public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message) public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -885,12 +899,14 @@ namespace CoopClient
VehPosition = data.VehPosition; VehPosition = data.VehPosition;
VehRotation = data.VehRotation; VehRotation = data.VehRotation;
VehEngineHealth = data.VehEngineHealth; VehEngineHealth = data.VehEngineHealth;
VehRPM = data.VehRPM;
VehVelocity = data.VehVelocity; VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed; VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle; VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors; VehColors = data.VehColors;
VehMods = data.VehMods; VehMods = data.VehMods;
VehDoors = data.VehDoors; VehDoors = data.VehDoors;
VehTires = data.VehTires;
Flag = data.Flag; 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)); IntPtr address = new IntPtr((long)GetEntityAddressFunc(handle));
if (address == IntPtr.Zero || SteeringAngleOffset == 0) if (address == IntPtr.Zero || SteeringAngleOffset == 0)
@ -79,7 +79,7 @@ namespace CoopClient
} }
#endregion #endregion
public static Model ModelRequest(int hash) public static Model ModelRequest(this int hash)
{ {
Model model = new Model(hash); Model model = new Model(hash);
short counter = 0; short counter = 0;
@ -119,7 +119,7 @@ namespace CoopClient
return (end - start) * currentTime / duration + start; 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()) if (veh == null || veh.Handle == 0 || !veh.Exists())
{ {
@ -142,7 +142,7 @@ namespace CoopClient
return 0; return 0;
} }
public static byte GetPedSpeed(Ped ped) public static byte GetPedSpeed(this Ped ped)
{ {
if (ped.IsSprinting) if (ped.IsSprinting)
{ {
@ -160,13 +160,13 @@ namespace CoopClient
return 0; 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; bool aimOrShoot = ped.IsAiming || ped.IsShooting && ped.Weapons.Current?.AmmoInClip != 0;
return aimOrShoot ? (isNpc ? GetLastWeaponImpact(ped) : RaycastEverything(new Vector2(0, 0))) : new Vector3(); 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; byte? flags = 0;
@ -175,10 +175,8 @@ namespace CoopClient
flags |= (byte)VehicleDataFlags.LastSyncWasFull; flags |= (byte)VehicleDataFlags.LastSyncWasFull;
} }
if (ped.IsInVehicle()) // Ped is in vehicle
{
flags |= (byte)VehicleDataFlags.IsInVehicle; flags |= (byte)VehicleDataFlags.IsInVehicle;
}
if (veh.IsEngineRunning) if (veh.IsEngineRunning)
{ {
@ -208,7 +206,7 @@ namespace CoopClient
return flags; 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; byte? flags = 0;
@ -255,7 +253,7 @@ namespace CoopClient
return flags; 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>(); Dictionary<int, int> result = new Dictionary<int, int>();
for (int i = 0; i < 11; i++) for (int i = 0; i < 11; i++)
@ -266,17 +264,17 @@ namespace CoopClient
return result; 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>(); 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); result.Add((int)mod.Type, mod.Index);
} }
return result; return result;
} }
public static VehicleDoors[] GetVehicleDoors(VehicleDoorCollection doors) public static VehicleDoors[] GetVehicleDoors(this VehicleDoorCollection doors)
{ {
int doorLength = doors.ToArray().Length; int doorLength = doors.ToArray().Length;
if (doorLength == 0) if (doorLength == 0)
@ -300,6 +298,21 @@ namespace CoopClient
return result; 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() public static Settings ReadSettings()
{ {
XmlSerializer ser = new XmlSerializer(typeof(Settings)); XmlSerializer ser = new XmlSerializer(typeof(Settings));

View File

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