Vehicle dead and door synchronization added
This commit is contained in:
@ -49,6 +49,9 @@ namespace CoopClient
|
||||
public bool IsInVehicle { get; set; }
|
||||
public int VehicleModelHash { 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 Vehicle MainVehicle { get; set; }
|
||||
public Vector3 VehiclePosition { get; set; }
|
||||
@ -100,6 +103,8 @@ namespace CoopClient
|
||||
public bool VehIsInBurnout { get; set; }
|
||||
private bool LastVehIsSireneActive = false;
|
||||
public bool VehIsSireneActive { get; set; }
|
||||
private VehicleDoors[] LastVehDoors;
|
||||
public VehicleDoors[] VehDoors { get; set; }
|
||||
#endregion
|
||||
|
||||
public void DisplayLocally(string username)
|
||||
@ -294,8 +299,29 @@ namespace CoopClient
|
||||
}
|
||||
|
||||
#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]);
|
||||
|
||||
// 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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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))
|
||||
{
|
||||
Function.Call(Hash.SET_VEHICLE_BURNOUT, MainVehicle, true);
|
||||
|
@ -237,7 +237,7 @@ namespace CoopClient
|
||||
DebugSyncPed = Players["DebugKey"];
|
||||
}
|
||||
|
||||
if ((Environment.TickCount - ArtificialLagCounter) < 27)
|
||||
if ((Environment.TickCount - ArtificialLagCounter) < 37)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -299,6 +299,8 @@ namespace CoopClient
|
||||
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.LastSyncWasFull = (flags.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
|
||||
DebugSyncPed.IsInVehicle = (flags.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
|
||||
DebugSyncPed.VehIsEngineRunning = (flags.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0;
|
||||
@ -306,6 +308,7 @@ namespace CoopClient
|
||||
DebugSyncPed.VehAreHighBeamsOn = (flags.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
|
||||
DebugSyncPed.VehIsInBurnout = (flags.Value & (byte)VehicleDataFlags.IsInBurnout) > 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())
|
||||
{
|
||||
|
@ -307,6 +307,7 @@ namespace CoopClient
|
||||
player.VehicleSpeed = packet.VehSpeed;
|
||||
player.VehicleSteeringAngle = packet.VehSteeringAngle;
|
||||
player.VehicleColors = packet.VehColors;
|
||||
player.VehDoors = packet.VehDoors;
|
||||
player.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
|
||||
player.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 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.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 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.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0;
|
||||
player.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0;
|
||||
player.VehicleDead = (packet.Flag.Value & (byte)VehicleDataFlags.IsDead) > 0;
|
||||
}
|
||||
}
|
||||
#endregion // -- PLAYER --
|
||||
@ -454,6 +457,7 @@ namespace CoopClient
|
||||
npc.VehicleSpeed = packet.VehSpeed;
|
||||
npc.VehicleSteeringAngle = packet.VehSteeringAngle;
|
||||
npc.VehicleColors = packet.VehColors;
|
||||
npc.VehDoors = packet.VehDoors;
|
||||
npc.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
|
||||
npc.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 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.VehIsInBurnout = (packet.Flag.Value & (byte)VehicleDataFlags.IsInBurnout) > 0;
|
||||
npc.VehIsSireneActive = (packet.Flag.Value & (byte)VehicleDataFlags.IsSirenActive) > 0;
|
||||
npc.VehicleDead = (packet.Flag.Value & (byte)VehicleDataFlags.IsDead) > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -480,13 +485,15 @@ namespace CoopClient
|
||||
VehicleSpeed = packet.VehSpeed,
|
||||
VehicleSteeringAngle = packet.VehSteeringAngle,
|
||||
VehicleColors = packet.VehColors,
|
||||
VehDoors = packet.VehDoors,
|
||||
LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0,
|
||||
IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0,
|
||||
VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0,
|
||||
VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0,
|
||||
VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 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,
|
||||
VehSteeringAngle = player.CurrentVehicle.SteeringAngle,
|
||||
VehColors = new int[] { primaryColor, secondaryColor },
|
||||
VehDoors = Util.GetVehicleDoors(player.CurrentVehicle.Doors),
|
||||
Flag = Util.GetVehicleFlags(player, player.CurrentVehicle, true)
|
||||
}.PacketToNetOutGoingMessage(outgoingMessage);
|
||||
}
|
||||
@ -638,6 +646,7 @@ namespace CoopClient
|
||||
VehSpeed = npc.CurrentVehicle.Speed,
|
||||
VehSteeringAngle = npc.CurrentVehicle.SteeringAngle,
|
||||
VehColors = new int[] { primaryColor, secondaryColor },
|
||||
VehDoors = Util.GetVehicleDoors(npc.CurrentVehicle.Doors),
|
||||
Flag = Util.GetVehicleFlags(npc, npc.CurrentVehicle, true)
|
||||
}.PacketToNetOutGoingMessage(outgoingMessage);
|
||||
}
|
||||
|
@ -141,6 +141,7 @@ namespace CoopClient
|
||||
IsInVehicle = 1 << 7
|
||||
}
|
||||
|
||||
#region ===== VEHICLE DATA =====
|
||||
[Flags]
|
||||
public enum VehicleDataFlags
|
||||
{
|
||||
@ -150,9 +151,37 @@ namespace CoopClient
|
||||
AreLightsOn = 1 << 3,
|
||||
AreHighBeamsOn = 1 << 4,
|
||||
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
|
||||
{
|
||||
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
|
||||
@ -377,6 +406,9 @@ namespace CoopClient
|
||||
public int[] VehColors { get; set; }
|
||||
|
||||
[ProtoMember(14)]
|
||||
public VehicleDoors[] VehDoors { get; set; }
|
||||
|
||||
[ProtoMember(15)]
|
||||
public byte? Flag { get; set; } = 0;
|
||||
|
||||
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
|
||||
@ -407,6 +439,8 @@ namespace CoopClient
|
||||
VehVelocity = data.VehVelocity;
|
||||
VehSpeed = data.VehSpeed;
|
||||
VehSteeringAngle = data.VehSteeringAngle;
|
||||
VehColors = data.VehColors;
|
||||
VehDoors = data.VehDoors;
|
||||
Flag = data.Flag;
|
||||
}
|
||||
}
|
||||
@ -676,6 +710,9 @@ namespace CoopClient
|
||||
public int[] VehColors { get; set; }
|
||||
|
||||
[ProtoMember(14)]
|
||||
public VehicleDoors[] VehDoors { get; set; }
|
||||
|
||||
[ProtoMember(15)]
|
||||
public byte? Flag { get; set; } = 0;
|
||||
|
||||
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
|
||||
@ -706,6 +743,8 @@ namespace CoopClient
|
||||
VehVelocity = data.VehVelocity;
|
||||
VehSpeed = data.VehSpeed;
|
||||
VehSteeringAngle = data.VehSteeringAngle;
|
||||
VehColors = data.VehColors;
|
||||
VehDoors = data.VehDoors;
|
||||
Flag = data.Flag;
|
||||
}
|
||||
}
|
||||
|
@ -162,6 +162,11 @@ namespace CoopClient
|
||||
flags |= (byte)VehicleDataFlags.IsSirenActive;
|
||||
}
|
||||
|
||||
if (veh.IsDead)
|
||||
{
|
||||
flags |= (byte)VehicleDataFlags.IsDead;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
@ -223,6 +228,40 @@ namespace CoopClient
|
||||
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()
|
||||
{
|
||||
XmlSerializer ser = new XmlSerializer(typeof(Settings));
|
||||
|
@ -83,6 +83,7 @@ namespace CoopServer
|
||||
IsInVehicle = 1 << 7
|
||||
}
|
||||
|
||||
#region ===== VEHICLE DATA =====
|
||||
[Flags]
|
||||
public enum VehicleDataFlags
|
||||
{
|
||||
@ -92,9 +93,27 @@ namespace CoopServer
|
||||
AreLightsOn = 1 << 3,
|
||||
AreHighBeamsOn = 1 << 4,
|
||||
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
|
||||
{
|
||||
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
|
||||
@ -319,6 +338,9 @@ namespace CoopServer
|
||||
public int[] VehColors { get; set; }
|
||||
|
||||
[ProtoMember(14)]
|
||||
public VehicleDoors[] VehDoors { get; set; }
|
||||
|
||||
[ProtoMember(15)]
|
||||
public byte? Flag { get; set; } = 0;
|
||||
|
||||
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
|
||||
@ -349,6 +371,8 @@ namespace CoopServer
|
||||
VehVelocity = data.VehVelocity;
|
||||
VehSpeed = data.VehSpeed;
|
||||
VehSteeringAngle = data.VehSteeringAngle;
|
||||
VehColors = data.VehColors;
|
||||
VehDoors = data.VehDoors;
|
||||
Flag = data.Flag;
|
||||
}
|
||||
}
|
||||
@ -618,6 +642,9 @@ namespace CoopServer
|
||||
public int[] VehColors { get; set; }
|
||||
|
||||
[ProtoMember(14)]
|
||||
public VehicleDoors[] VehDoors { get; set; }
|
||||
|
||||
[ProtoMember(15)]
|
||||
public byte? Flag { get; set; } = 0;
|
||||
|
||||
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
|
||||
@ -648,6 +675,8 @@ namespace CoopServer
|
||||
VehVelocity = data.VehVelocity;
|
||||
VehSpeed = data.VehSpeed;
|
||||
VehSteeringAngle = data.VehSteeringAngle;
|
||||
VehColors = data.VehColors;
|
||||
VehDoors = data.VehDoors;
|
||||
Flag = data.Flag;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user