More vehicle sync
This commit is contained in:
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user