Vehicle dead and door synchronization added

This commit is contained in:
EntenKoeniq
2021-08-14 11:14:34 +02:00
parent 5faac16404
commit ffe808d1ba
6 changed files with 199 additions and 4 deletions

View File

@ -49,6 +49,9 @@ namespace CoopClient
public bool IsInVehicle { get; set; } public bool IsInVehicle { get; set; }
public int VehicleModelHash { get; set; } public int VehicleModelHash { get; set; }
public int[] VehicleColors { get; set; } public int[] VehicleColors { get; set; }
private Dictionary<int, int> LastVehicleMods = new Dictionary<int, int>();
public Dictionary<int, int> VehicleMods { get; set; }
public bool VehicleDead { get; set; }
public int VehicleSeatIndex { get; set; } public int VehicleSeatIndex { get; set; }
public Vehicle MainVehicle { get; set; } public Vehicle MainVehicle { get; set; }
public Vector3 VehiclePosition { get; set; } public Vector3 VehiclePosition { get; set; }
@ -100,6 +103,8 @@ namespace CoopClient
public bool VehIsInBurnout { get; set; } public bool VehIsInBurnout { get; set; }
private bool LastVehIsSireneActive = false; private bool LastVehIsSireneActive = false;
public bool VehIsSireneActive { get; set; } public bool VehIsSireneActive { get; set; }
private VehicleDoors[] LastVehDoors;
public VehicleDoors[] VehDoors { get; set; }
#endregion #endregion
public void DisplayLocally(string username) public void DisplayLocally(string username)
@ -294,8 +299,29 @@ namespace CoopClient
} }
#region -- VEHICLE SYNC -- #region -- VEHICLE SYNC --
if (VehicleDead && !MainVehicle.IsDead)
{
MainVehicle.Explode();
}
else if (!VehicleDead && MainVehicle.IsDead)
{
MainVehicle.Repair();
}
Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]); Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]);
// Only works for "Pfister Comet Safari"??
if (VehicleMods != LastVehicleMods)
{
foreach (KeyValuePair<int, int> mod in VehicleMods)
{
MainVehicle.Mods[(VehicleModType)mod.Key].Index = mod.Value;
// Same effect
//Function.Call(Hash.SET_VEHICLE_MOD, MainVehicle, mod.Key, mod.Value, false);
}
LastVehicleMods = VehicleMods;
}
if (Character.IsOnBike && MainVehicle.ClassType == VehicleClass.Cycles) if (Character.IsOnBike && MainVehicle.ClassType == VehicleClass.Cycles)
{ {
bool isFastPedaling = Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, Character.Handle, PedalingAnimDict(), "fast_pedal_char", 3); bool isFastPedaling = Function.Call<bool>(Hash.IS_ENTITY_PLAYING_ANIM, Character.Handle, PedalingAnimDict(), "fast_pedal_char", 3);
@ -333,6 +359,56 @@ namespace CoopClient
MainVehicle.IsSirenActive = LastVehIsSireneActive = VehIsSireneActive; MainVehicle.IsSirenActive = LastVehIsSireneActive = VehIsSireneActive;
} }
if (VehDoors != null && VehDoors != LastVehDoors)
{
int doorLength = VehDoors.Length;
if (VehDoors.Length != 0)
{
for (int i = 0; i < (doorLength - 1); i++)
{
VehicleDoor door = MainVehicle.Doors[(VehicleDoorIndex)i];
VehicleDoors aDoor = VehDoors[i];
if (aDoor.Broken)
{
if (!door.IsBroken)
{
door.Break();
}
continue;
}
else if (!aDoor.Broken && door.IsBroken)
{
// Repair?
//MainVehicle.Repair();
}
if (aDoor.FullyOpen)
{
if (!door.IsFullyOpen)
{
door.Open(false, true);
}
continue;
}
else if (aDoor.Open)
{
if (!door.IsOpen)
{
door.Open();
}
door.AngleRatio = aDoor.AngleRatio;
continue;
}
door.Close(true);
}
}
LastVehDoors = VehDoors;
}
if (VehIsInBurnout && !LastVehIsInBurnout && (LastVehIsInBurnout = true)) if (VehIsInBurnout && !LastVehIsInBurnout && (LastVehIsInBurnout = true))
{ {
Function.Call(Hash.SET_VEHICLE_BURNOUT, MainVehicle, true); Function.Call(Hash.SET_VEHICLE_BURNOUT, MainVehicle, true);

View File

@ -237,7 +237,7 @@ namespace CoopClient
DebugSyncPed = Players["DebugKey"]; DebugSyncPed = Players["DebugKey"];
} }
if ((Environment.TickCount - ArtificialLagCounter) < 27) if ((Environment.TickCount - ArtificialLagCounter) < 37)
{ {
return; return;
} }
@ -299,6 +299,8 @@ namespace CoopClient
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.VehDoors = Util.GetVehicleDoors(veh.Doors);
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;
@ -306,6 +308,7 @@ namespace CoopClient
DebugSyncPed.VehAreHighBeamsOn = (flags.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0; DebugSyncPed.VehAreHighBeamsOn = (flags.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
DebugSyncPed.VehIsInBurnout = (flags.Value & (byte)VehicleDataFlags.IsInBurnout) > 0; DebugSyncPed.VehIsInBurnout = (flags.Value & (byte)VehicleDataFlags.IsInBurnout) > 0;
DebugSyncPed.VehIsSireneActive = (flags.Value & (byte)VehicleDataFlags.IsSirenActive) > 0; DebugSyncPed.VehIsSireneActive = (flags.Value & (byte)VehicleDataFlags.IsSirenActive) > 0;
DebugSyncPed.VehicleDead = (flags.Value & (byte)VehicleDataFlags.IsDead) > 0;
if (DebugSyncPed.MainVehicle != null && DebugSyncPed.MainVehicle.Exists() && player.IsInVehicle()) if (DebugSyncPed.MainVehicle != null && DebugSyncPed.MainVehicle.Exists() && player.IsInVehicle())
{ {

View File

@ -307,6 +307,7 @@ namespace CoopClient
player.VehicleSpeed = packet.VehSpeed; player.VehicleSpeed = packet.VehSpeed;
player.VehicleSteeringAngle = packet.VehSteeringAngle; player.VehicleSteeringAngle = packet.VehSteeringAngle;
player.VehicleColors = packet.VehColors; player.VehicleColors = packet.VehColors;
player.VehDoors = packet.VehDoors;
player.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0; player.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
player.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0; player.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
player.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0; player.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0;
@ -314,6 +315,7 @@ namespace CoopClient
player.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0; player.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
player.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0; player.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0;
player.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0; player.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0;
player.VehicleDead = (packet.Flag.Value & (byte)VehicleDataFlags.IsDead) > 0;
} }
} }
@ -371,6 +373,7 @@ namespace CoopClient
player.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0; player.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
player.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0; player.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0;
player.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0; player.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0;
player.VehicleDead = (packet.Flag.Value & (byte)VehicleDataFlags.IsDead) > 0;
} }
} }
#endregion // -- PLAYER -- #endregion // -- PLAYER --
@ -454,6 +457,7 @@ namespace CoopClient
npc.VehicleSpeed = packet.VehSpeed; npc.VehicleSpeed = packet.VehSpeed;
npc.VehicleSteeringAngle = packet.VehSteeringAngle; npc.VehicleSteeringAngle = packet.VehSteeringAngle;
npc.VehicleColors = packet.VehColors; npc.VehicleColors = packet.VehColors;
npc.VehDoors = packet.VehDoors;
npc.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0; npc.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
npc.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0; npc.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
npc.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0; npc.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0;
@ -461,6 +465,7 @@ namespace CoopClient
npc.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0; npc.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
npc.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0; npc.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0;
npc.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0; npc.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0;
npc.VehicleDead = (packet.Flag.Value & (byte)VehicleDataFlags.IsDead) > 0;
} }
else else
{ {
@ -480,13 +485,15 @@ namespace CoopClient
VehicleSpeed = packet.VehSpeed, VehicleSpeed = packet.VehSpeed,
VehicleSteeringAngle = packet.VehSteeringAngle, VehicleSteeringAngle = packet.VehSteeringAngle,
VehicleColors = packet.VehColors, VehicleColors = packet.VehColors,
VehDoors = packet.VehDoors,
LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0, LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0,
IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0, IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0,
VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0, VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0,
VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0, VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0,
VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0, VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0,
VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0, VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0,
VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0 VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0,
VehicleDead = (packet.Flag.Value & (byte)VehicleDataFlags.IsDead) > 0
}); });
} }
} }
@ -546,6 +553,7 @@ namespace CoopClient
VehSpeed = player.CurrentVehicle.Speed, VehSpeed = player.CurrentVehicle.Speed,
VehSteeringAngle = player.CurrentVehicle.SteeringAngle, VehSteeringAngle = player.CurrentVehicle.SteeringAngle,
VehColors = new int[] { primaryColor, secondaryColor }, VehColors = new int[] { primaryColor, secondaryColor },
VehDoors = Util.GetVehicleDoors(player.CurrentVehicle.Doors),
Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, true) Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, true)
}.PacketToNetOutGoingMessage(outgoingMessage); }.PacketToNetOutGoingMessage(outgoingMessage);
} }
@ -638,6 +646,7 @@ namespace CoopClient
VehSpeed = npc.CurrentVehicle.Speed, VehSpeed = npc.CurrentVehicle.Speed,
VehSteeringAngle = npc.CurrentVehicle.SteeringAngle, VehSteeringAngle = npc.CurrentVehicle.SteeringAngle,
VehColors = new int[] { primaryColor, secondaryColor }, VehColors = new int[] { primaryColor, secondaryColor },
VehDoors = Util.GetVehicleDoors(npc.CurrentVehicle.Doors),
Flag = Util.GetVehicleFlags(npc, npc.CurrentVehicle, true) Flag = Util.GetVehicleFlags(npc, npc.CurrentVehicle, true)
}.PacketToNetOutGoingMessage(outgoingMessage); }.PacketToNetOutGoingMessage(outgoingMessage);
} }

View File

@ -141,6 +141,7 @@ namespace CoopClient
IsInVehicle = 1 << 7 IsInVehicle = 1 << 7
} }
#region ===== VEHICLE DATA =====
[Flags] [Flags]
public enum VehicleDataFlags public enum VehicleDataFlags
{ {
@ -150,9 +151,37 @@ namespace CoopClient
AreLightsOn = 1 << 3, AreLightsOn = 1 << 3,
AreHighBeamsOn = 1 << 4, AreHighBeamsOn = 1 << 4,
IsInBurnout = 1 << 5, IsInBurnout = 1 << 5,
IsSirenActive = 1 << 6 IsSirenActive = 1 << 6,
IsDead = 1 << 7
} }
[ProtoContract]
public struct VehicleDoors
{
#region CLIENT-ONLY
public VehicleDoors(float angleRatio = 0f, bool broken = false, bool open = false, bool fullyOpen = false)
{
AngleRatio = angleRatio;
Broken = broken;
Open = open;
FullyOpen = fullyOpen;
}
#endregion
[ProtoMember(1)]
public float AngleRatio { get; set; }
[ProtoMember(2)]
public bool Broken { get; set; }
[ProtoMember(3)]
public bool Open { get; set; }
[ProtoMember(4)]
public bool FullyOpen { get; set; }
}
#endregion
public interface IPacket public interface IPacket
{ {
void PacketToNetOutGoingMessage(NetOutgoingMessage message); void PacketToNetOutGoingMessage(NetOutgoingMessage message);
@ -377,6 +406,9 @@ namespace CoopClient
public int[] VehColors { get; set; } public int[] VehColors { get; set; }
[ProtoMember(14)] [ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(15)]
public byte? Flag { get; set; } = 0; public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message) public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -407,6 +439,8 @@ namespace CoopClient
VehVelocity = data.VehVelocity; VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed; VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle; VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehDoors = data.VehDoors;
Flag = data.Flag; Flag = data.Flag;
} }
} }
@ -676,6 +710,9 @@ namespace CoopClient
public int[] VehColors { get; set; } public int[] VehColors { get; set; }
[ProtoMember(14)] [ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(15)]
public byte? Flag { get; set; } = 0; public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message) public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -706,6 +743,8 @@ namespace CoopClient
VehVelocity = data.VehVelocity; VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed; VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle; VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehDoors = data.VehDoors;
Flag = data.Flag; Flag = data.Flag;
} }
} }

View File

@ -162,6 +162,11 @@ namespace CoopClient
flags |= (byte)VehicleDataFlags.IsSirenActive; flags |= (byte)VehicleDataFlags.IsSirenActive;
} }
if (veh.IsDead)
{
flags |= (byte)VehicleDataFlags.IsDead;
}
return flags; return flags;
} }
@ -223,6 +228,40 @@ namespace CoopClient
return result; return result;
} }
public static Dictionary<int, int> GetVehicleMods(Vehicle veh)
{
Dictionary<int, int> result = new Dictionary<int, int>();
foreach (VehicleMod mod in veh.Mods.ToArray())
{
result.Add((int)mod.Type, mod.Index);
}
return result;
}
public static VehicleDoors[] GetVehicleDoors(VehicleDoorCollection doors)
{
int doorLength = doors.ToArray().Length;
if (doorLength == 0)
{
return null;
}
VehicleDoors[] result = new VehicleDoors[doorLength];
for (int i = 0; i < (doorLength - 1); i++)
{
VehicleDoors currentDoor = new VehicleDoors()
{
AngleRatio = doors[(VehicleDoorIndex)i].AngleRatio,
Broken = doors[(VehicleDoorIndex)i].IsBroken,
Open = doors[(VehicleDoorIndex)i].IsOpen,
FullyOpen = doors[(VehicleDoorIndex)i].IsFullyOpen
};
result[i] = currentDoor;
}
return result;
}
public static Settings ReadSettings() public static Settings ReadSettings()
{ {
XmlSerializer ser = new XmlSerializer(typeof(Settings)); XmlSerializer ser = new XmlSerializer(typeof(Settings));

View File

@ -83,6 +83,7 @@ namespace CoopServer
IsInVehicle = 1 << 7 IsInVehicle = 1 << 7
} }
#region ===== VEHICLE DATA =====
[Flags] [Flags]
public enum VehicleDataFlags public enum VehicleDataFlags
{ {
@ -92,9 +93,27 @@ namespace CoopServer
AreLightsOn = 1 << 3, AreLightsOn = 1 << 3,
AreHighBeamsOn = 1 << 4, AreHighBeamsOn = 1 << 4,
IsInBurnout = 1 << 5, IsInBurnout = 1 << 5,
IsSirenActive = 1 << 6 IsSirenActive = 1 << 6,
IsDead = 1 << 7
} }
[ProtoContract]
public struct VehicleDoors
{
[ProtoMember(1)]
public float AngleRatio { get; set; }
[ProtoMember(2)]
public bool Broken { get; set; }
[ProtoMember(3)]
public bool Open { get; set; }
[ProtoMember(4)]
public bool FullyOpen { get; set; }
}
#endregion
public interface IPacket public interface IPacket
{ {
void PacketToNetOutGoingMessage(NetOutgoingMessage message); void PacketToNetOutGoingMessage(NetOutgoingMessage message);
@ -319,6 +338,9 @@ namespace CoopServer
public int[] VehColors { get; set; } public int[] VehColors { get; set; }
[ProtoMember(14)] [ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(15)]
public byte? Flag { get; set; } = 0; public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message) public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -349,6 +371,8 @@ namespace CoopServer
VehVelocity = data.VehVelocity; VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed; VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle; VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehDoors = data.VehDoors;
Flag = data.Flag; Flag = data.Flag;
} }
} }
@ -618,6 +642,9 @@ namespace CoopServer
public int[] VehColors { get; set; } public int[] VehColors { get; set; }
[ProtoMember(14)] [ProtoMember(14)]
public VehicleDoors[] VehDoors { get; set; }
[ProtoMember(15)]
public byte? Flag { get; set; } = 0; public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message) public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
@ -648,6 +675,8 @@ namespace CoopServer
VehVelocity = data.VehVelocity; VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed; VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle; VehSteeringAngle = data.VehSteeringAngle;
VehColors = data.VehColors;
VehDoors = data.VehDoors;
Flag = data.Flag; Flag = data.Flag;
} }
} }