More vehicle sync

This commit is contained in:
EntenKoeniq
2021-07-10 23:41:28 +02:00
parent 7b8af52ae1
commit 7e628ce71f
6 changed files with 142 additions and 37 deletions

View File

@ -50,6 +50,36 @@ namespace CoopClient
public Quaternion VehicleRotation { get; set; }
public float VehicleSpeed { 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
public void DisplayLocally(string username)
@ -171,24 +201,6 @@ namespace CoopClient
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 (Health <= 0)
@ -244,23 +256,30 @@ namespace CoopClient
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;
float range = MainVehicle.Position.DistanceTo(VehiclePosition);
// Good enough for now, but we need to create a better sync
if (range > 0.8f && range <= 15f && VehicleSpeed >= 1)
{
Vector3 dir = VehiclePosition - MainVehicle.Position;
dir.Normalize();
Vector3 vect = dir * Math.Abs(VehicleSpeed - MainVehicle.Speed);
MainVehicle.ApplyForce(vect);
}
else
{
MainVehicle.Position = VehiclePosition;
}
MainVehicle.Position = VehiclePosition;
MainVehicle.Quaternion = VehicleRotation;
#endregion
}
private void DisplayOnFoot()
@ -270,6 +289,26 @@ namespace CoopClient
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)
{
Character.Task.Jump();

View File

@ -266,8 +266,6 @@ namespace CoopClient
ArtificialLagCounter = DateTime.Now;
byte? flags = Util.GetPedFlags(player, FullDebugSync, true);
if (FullDebugSync)
{
DebugSyncPed.ModelHash = player.Model.Hash;
@ -276,8 +274,12 @@ namespace CoopClient
DebugSyncPed.Health = player.Health;
DebugSyncPed.Position = player.Position;
byte? flags;
if (!player.IsInVehicle())
{
flags = Util.GetPedFlags(player, FullDebugSync, true);
DebugSyncPed.Rotation = player.Rotation;
DebugSyncPed.Velocity = player.Velocity;
DebugSyncPed.Speed = Util.GetPedSpeed(player);
@ -290,20 +292,26 @@ namespace CoopClient
DebugSyncPed.IsJumping = (flags.Value & (byte)PedDataFlags.IsJumping) > 0;
DebugSyncPed.IsRagdoll = (flags.Value & (byte)PedDataFlags.IsRagdoll) > 0;
DebugSyncPed.IsOnFire = (flags.Value & (byte)PedDataFlags.IsOnFire) > 0;
DebugSyncPed.IsInVehicle = (flags.Value & (byte)PedDataFlags.IsInVehicle) > 0;
}
else
{
Vehicle veh = player.CurrentVehicle;
flags = Util.GetVehicleFlags(player, veh, FullDebugSync);
DebugSyncPed.VehicleModelHash = veh.Model.Hash;
DebugSyncPed.VehicleSeatIndex = (int)player.SeatIndex;
DebugSyncPed.VehiclePosition = veh.Position;
DebugSyncPed.VehicleRotation = veh.Quaternion;
DebugSyncPed.VehicleSpeed = veh.Speed;
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())
{
Function.Call(Hash.SET_ENTITY_NO_COLLISION_ENTITY, DebugSyncPed.Character.Handle, player.Handle, false);

View File

@ -394,8 +394,11 @@ namespace CoopClient
npc.VehicleRotation = packet.VehRotation.ToQuaternion();
npc.VehicleSpeed = packet.VehSpeed;
npc.VehicleSteeringAngle = packet.VehSteeringAngle;
npc.LastSyncWasFull = (packet.Flag.Value & (byte)PedDataFlags.LastSyncWasFull) > 0;
npc.IsInVehicle = (packet.Flag.Value & (byte)PedDataFlags.IsInVehicle) > 0;
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;
npc.VehAreLightsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreLightsOn) > 0;
npc.VehAreHighBeamsOn = (packet.Flag.Value & (byte)VehicleDataFlags.AreHighBeamsOn) > 0;
}
else
{
@ -412,8 +415,11 @@ namespace CoopClient
VehicleRotation = packet.VehRotation.ToQuaternion(),
VehicleSpeed = packet.VehSpeed,
VehicleSteeringAngle = packet.VehSteeringAngle,
LastSyncWasFull = (packet.Flag.Value & (byte)PedDataFlags.LastSyncWasFull) > 0,
IsInVehicle = (packet.Flag.Value & (byte)PedDataFlags.IsInVehicle) > 0
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
});
}
}

View File

@ -123,6 +123,16 @@ namespace CoopClient
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
{
void PacketToNetOutGoingMessage(NetOutgoingMessage message);

View File

@ -35,6 +35,38 @@ namespace CoopClient
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)
{
byte? flags = 0;

View File

@ -86,6 +86,16 @@ namespace CoopServer
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
{
void PacketToNetOutGoingMessage(NetOutgoingMessage message);