More vehicle sync
This commit is contained in:
@ -50,6 +50,36 @@ namespace CoopClient
|
|||||||
public Quaternion VehicleRotation { get; set; }
|
public Quaternion VehicleRotation { get; set; }
|
||||||
public float VehicleSpeed { get; set; }
|
public float VehicleSpeed { get; set; }
|
||||||
public float VehicleSteeringAngle { get; set; }
|
public float VehicleSteeringAngle { get; set; }
|
||||||
|
private bool LastVehIsEngineRunning { get; set; }
|
||||||
|
private bool CurrentVehIsEngineRunning { get; set; }
|
||||||
|
public bool VehIsEngineRunning
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
LastVehIsEngineRunning = CurrentVehIsEngineRunning;
|
||||||
|
CurrentVehIsEngineRunning = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool LastVehAreLightsOn { get; set; }
|
||||||
|
private bool CurrentVehAreLightsOn { get; set; }
|
||||||
|
public bool VehAreLightsOn
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
LastVehAreLightsOn = CurrentVehAreLightsOn;
|
||||||
|
CurrentVehAreLightsOn = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool LastVehAreHighBeamsOn { get; set; }
|
||||||
|
private bool CurrentVehAreHighBeamsOn { get; set; }
|
||||||
|
public bool VehAreHighBeamsOn
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
LastVehAreHighBeamsOn = CurrentVehAreHighBeamsOn;
|
||||||
|
CurrentVehAreHighBeamsOn = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public void DisplayLocally(string username)
|
public void DisplayLocally(string username)
|
||||||
@ -171,24 +201,6 @@ namespace CoopClient
|
|||||||
Function.Call(Hash.CLEAR_DRAW_ORIGIN);
|
Function.Call(Hash.CLEAR_DRAW_ORIGIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsOnFire && !Character.IsOnFire)
|
|
||||||
{
|
|
||||||
Character.IsInvincible = false;
|
|
||||||
|
|
||||||
Function.Call(Hash.START_ENTITY_FIRE, Character.Handle);
|
|
||||||
}
|
|
||||||
else if (!IsOnFire && Character.IsOnFire)
|
|
||||||
{
|
|
||||||
Function.Call(Hash.STOP_ENTITY_FIRE, Character.Handle);
|
|
||||||
|
|
||||||
Character.IsInvincible = true;
|
|
||||||
|
|
||||||
if (Character.IsDead)
|
|
||||||
{
|
|
||||||
Character.Resurrect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Character.IsDead)
|
if (Character.IsDead)
|
||||||
{
|
{
|
||||||
if (Health <= 0)
|
if (Health <= 0)
|
||||||
@ -244,23 +256,30 @@ namespace CoopClient
|
|||||||
Character.IsVisible = true;
|
Character.IsVisible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region -- VEHICLE SYNC --
|
||||||
|
if (CurrentVehIsEngineRunning != LastVehIsEngineRunning)
|
||||||
|
{
|
||||||
|
MainVehicle.IsEngineRunning = CurrentVehIsEngineRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurrentVehAreLightsOn != LastVehAreLightsOn)
|
||||||
|
{
|
||||||
|
MainVehicle.AreLightsOn = CurrentVehAreLightsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CurrentVehAreHighBeamsOn != LastVehAreHighBeamsOn)
|
||||||
|
{
|
||||||
|
MainVehicle.AreHighBeamsOn = CurrentVehAreHighBeamsOn;
|
||||||
|
}
|
||||||
|
|
||||||
MainVehicle.SteeringAngle = VehicleSteeringAngle;
|
MainVehicle.SteeringAngle = VehicleSteeringAngle;
|
||||||
|
|
||||||
float range = MainVehicle.Position.DistanceTo(VehiclePosition);
|
float range = MainVehicle.Position.DistanceTo(VehiclePosition);
|
||||||
|
|
||||||
// Good enough for now, but we need to create a better sync
|
// Good enough for now, but we need to create a better sync
|
||||||
if (range > 0.8f && range <= 15f && VehicleSpeed >= 1)
|
MainVehicle.Position = VehiclePosition;
|
||||||
{
|
|
||||||
Vector3 dir = VehiclePosition - MainVehicle.Position;
|
|
||||||
dir.Normalize();
|
|
||||||
Vector3 vect = dir * Math.Abs(VehicleSpeed - MainVehicle.Speed);
|
|
||||||
MainVehicle.ApplyForce(vect);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MainVehicle.Position = VehiclePosition;
|
|
||||||
}
|
|
||||||
MainVehicle.Quaternion = VehicleRotation;
|
MainVehicle.Quaternion = VehicleRotation;
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisplayOnFoot()
|
private void DisplayOnFoot()
|
||||||
@ -270,6 +289,26 @@ namespace CoopClient
|
|||||||
Character.Task.LeaveVehicle();
|
Character.Task.LeaveVehicle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsOnFire && !Character.IsOnFire)
|
||||||
|
{
|
||||||
|
Character.IsInvincible = false;
|
||||||
|
|
||||||
|
Function.Call(Hash.START_ENTITY_FIRE, Character.Handle);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!IsOnFire && Character.IsOnFire)
|
||||||
|
{
|
||||||
|
Function.Call(Hash.STOP_ENTITY_FIRE, Character.Handle);
|
||||||
|
|
||||||
|
Character.IsInvincible = true;
|
||||||
|
|
||||||
|
if (Character.IsDead)
|
||||||
|
{
|
||||||
|
Character.Resurrect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (IsJumping && !LastIsJumping)
|
if (IsJumping && !LastIsJumping)
|
||||||
{
|
{
|
||||||
Character.Task.Jump();
|
Character.Task.Jump();
|
||||||
|
@ -266,8 +266,6 @@ namespace CoopClient
|
|||||||
|
|
||||||
ArtificialLagCounter = DateTime.Now;
|
ArtificialLagCounter = DateTime.Now;
|
||||||
|
|
||||||
byte? flags = Util.GetPedFlags(player, FullDebugSync, true);
|
|
||||||
|
|
||||||
if (FullDebugSync)
|
if (FullDebugSync)
|
||||||
{
|
{
|
||||||
DebugSyncPed.ModelHash = player.Model.Hash;
|
DebugSyncPed.ModelHash = player.Model.Hash;
|
||||||
@ -276,8 +274,12 @@ namespace CoopClient
|
|||||||
DebugSyncPed.Health = player.Health;
|
DebugSyncPed.Health = player.Health;
|
||||||
DebugSyncPed.Position = player.Position;
|
DebugSyncPed.Position = player.Position;
|
||||||
|
|
||||||
|
byte? flags;
|
||||||
|
|
||||||
if (!player.IsInVehicle())
|
if (!player.IsInVehicle())
|
||||||
{
|
{
|
||||||
|
flags = Util.GetPedFlags(player, FullDebugSync, true);
|
||||||
|
|
||||||
DebugSyncPed.Rotation = player.Rotation;
|
DebugSyncPed.Rotation = player.Rotation;
|
||||||
DebugSyncPed.Velocity = player.Velocity;
|
DebugSyncPed.Velocity = player.Velocity;
|
||||||
DebugSyncPed.Speed = Util.GetPedSpeed(player);
|
DebugSyncPed.Speed = Util.GetPedSpeed(player);
|
||||||
@ -290,20 +292,26 @@ namespace CoopClient
|
|||||||
DebugSyncPed.IsJumping = (flags.Value & (byte)PedDataFlags.IsJumping) > 0;
|
DebugSyncPed.IsJumping = (flags.Value & (byte)PedDataFlags.IsJumping) > 0;
|
||||||
DebugSyncPed.IsRagdoll = (flags.Value & (byte)PedDataFlags.IsRagdoll) > 0;
|
DebugSyncPed.IsRagdoll = (flags.Value & (byte)PedDataFlags.IsRagdoll) > 0;
|
||||||
DebugSyncPed.IsOnFire = (flags.Value & (byte)PedDataFlags.IsOnFire) > 0;
|
DebugSyncPed.IsOnFire = (flags.Value & (byte)PedDataFlags.IsOnFire) > 0;
|
||||||
|
DebugSyncPed.IsInVehicle = (flags.Value & (byte)PedDataFlags.IsInVehicle) > 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Vehicle veh = player.CurrentVehicle;
|
Vehicle veh = player.CurrentVehicle;
|
||||||
|
flags = Util.GetVehicleFlags(player, veh, FullDebugSync);
|
||||||
|
|
||||||
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.VehicleSpeed = veh.Speed;
|
DebugSyncPed.VehicleSpeed = veh.Speed;
|
||||||
DebugSyncPed.VehicleSteeringAngle = veh.SteeringAngle;
|
DebugSyncPed.VehicleSteeringAngle = veh.SteeringAngle;
|
||||||
|
DebugSyncPed.LastSyncWasFull = (flags.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
|
||||||
|
DebugSyncPed.IsInVehicle = (flags.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
|
||||||
|
DebugSyncPed.VehIsEngineRunning = (flags.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0;
|
||||||
|
DebugSyncPed.VehAreLightsOn = (flags.Value & (byte)VehicleDataFlags.AreLightsOn) > 0;
|
||||||
|
DebugSyncPed.VehAreHighBeamsOn = (flags.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugSyncPed.IsInVehicle = (flags.Value & (byte)PedDataFlags.IsInVehicle) > 0;
|
|
||||||
|
|
||||||
if (DebugSyncPed.Character != null && DebugSyncPed.Character.Exists())
|
if (DebugSyncPed.Character != null && DebugSyncPed.Character.Exists())
|
||||||
{
|
{
|
||||||
Function.Call(Hash.SET_ENTITY_NO_COLLISION_ENTITY, DebugSyncPed.Character.Handle, player.Handle, false);
|
Function.Call(Hash.SET_ENTITY_NO_COLLISION_ENTITY, DebugSyncPed.Character.Handle, player.Handle, false);
|
||||||
|
@ -394,8 +394,11 @@ namespace CoopClient
|
|||||||
npc.VehicleRotation = packet.VehRotation.ToQuaternion();
|
npc.VehicleRotation = packet.VehRotation.ToQuaternion();
|
||||||
npc.VehicleSpeed = packet.VehSpeed;
|
npc.VehicleSpeed = packet.VehSpeed;
|
||||||
npc.VehicleSteeringAngle = packet.VehSteeringAngle;
|
npc.VehicleSteeringAngle = packet.VehSteeringAngle;
|
||||||
npc.LastSyncWasFull = (packet.Flag.Value & (byte)PedDataFlags.LastSyncWasFull) > 0;
|
npc.LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0;
|
||||||
npc.IsInVehicle = (packet.Flag.Value & (byte)PedDataFlags.IsInVehicle) > 0;
|
npc.IsInVehicle = (packet.Flag.Value & (byte)VehicleDataFlags.IsInVehicle) > 0;
|
||||||
|
npc.VehIsEngineRunning = (packet.Flag.Value & (byte)VehicleDataFlags.IsEngineRunning) > 0;
|
||||||
|
npc.VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0;
|
||||||
|
npc.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -412,8 +415,11 @@ namespace CoopClient
|
|||||||
VehicleRotation = packet.VehRotation.ToQuaternion(),
|
VehicleRotation = packet.VehRotation.ToQuaternion(),
|
||||||
VehicleSpeed = packet.VehSpeed,
|
VehicleSpeed = packet.VehSpeed,
|
||||||
VehicleSteeringAngle = packet.VehSteeringAngle,
|
VehicleSteeringAngle = packet.VehSteeringAngle,
|
||||||
LastSyncWasFull = (packet.Flag.Value & (byte)PedDataFlags.LastSyncWasFull) > 0,
|
LastSyncWasFull = (packet.Flag.Value & (byte)VehicleDataFlags.LastSyncWasFull) > 0,
|
||||||
IsInVehicle = (packet.Flag.Value & (byte)PedDataFlags.IsInVehicle) > 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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,6 +123,16 @@ namespace CoopClient
|
|||||||
IsInVehicle = 1 << 7
|
IsInVehicle = 1 << 7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum VehicleDataFlags
|
||||||
|
{
|
||||||
|
LastSyncWasFull = 1 << 0,
|
||||||
|
IsInVehicle = 1 << 1,
|
||||||
|
IsEngineRunning = 1 << 2,
|
||||||
|
AreLightsOn = 1 << 3,
|
||||||
|
AreHighBeamsOn = 1 << 4
|
||||||
|
}
|
||||||
|
|
||||||
public interface IPacket
|
public interface IPacket
|
||||||
{
|
{
|
||||||
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
|
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
|
||||||
|
@ -35,6 +35,38 @@ namespace CoopClient
|
|||||||
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)
|
||||||
|
{
|
||||||
|
byte? flags = 0;
|
||||||
|
|
||||||
|
if (fullSync)
|
||||||
|
{
|
||||||
|
flags |= (byte)VehicleDataFlags.LastSyncWasFull;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ped.IsInVehicle())
|
||||||
|
{
|
||||||
|
flags |= (byte)VehicleDataFlags.IsInVehicle;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (veh.IsEngineRunning)
|
||||||
|
{
|
||||||
|
flags |= (byte)VehicleDataFlags.IsEngineRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (veh.AreLightsOn)
|
||||||
|
{
|
||||||
|
flags |= (byte)VehicleDataFlags.AreLightsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (veh.AreHighBeamsOn)
|
||||||
|
{
|
||||||
|
flags |= (byte)VehicleDataFlags.AreHighBeamsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
public static byte? GetPedFlags(Ped ped, bool fullSync, bool isPlayer = false)
|
public static byte? GetPedFlags(Ped ped, bool fullSync, bool isPlayer = false)
|
||||||
{
|
{
|
||||||
byte? flags = 0;
|
byte? flags = 0;
|
||||||
|
@ -86,6 +86,16 @@ namespace CoopServer
|
|||||||
IsInVehicle = 1 << 7
|
IsInVehicle = 1 << 7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum VehicleDataFlags
|
||||||
|
{
|
||||||
|
LastSyncWasFull = 1 << 0,
|
||||||
|
IsInVehicle = 1 << 1,
|
||||||
|
IsEngineRunning = 1 << 2,
|
||||||
|
AreLightsOn = 1 << 3,
|
||||||
|
AreHighBeamsOn = 1 << 4
|
||||||
|
}
|
||||||
|
|
||||||
public interface IPacket
|
public interface IPacket
|
||||||
{
|
{
|
||||||
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
|
void PacketToNetOutGoingMessage(NetOutgoingMessage message);
|
||||||
|
Reference in New Issue
Block a user