NOT YET TESTED!
This commit is contained in:
@ -15,7 +15,35 @@ namespace CoopClient
|
|||||||
{
|
{
|
||||||
private bool AllDataAvailable = false;
|
private bool AllDataAvailable = false;
|
||||||
public bool LastSyncWasFull { get; set; } = false;
|
public bool LastSyncWasFull { get; set; } = false;
|
||||||
public int LastUpdateReceived { get; set; }
|
private long LastUpdateFrom = 0;
|
||||||
|
public long LastUpdateReceived
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return LastUpdateFrom;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (LastUpdateFrom != 0)
|
||||||
|
{
|
||||||
|
LatencyAverager.Enqueue(value - LastUpdateFrom);
|
||||||
|
if (LatencyAverager.Count >= 10)
|
||||||
|
{
|
||||||
|
LatencyAverager.Dequeue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LastUpdateFrom = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private readonly Queue<double> LatencyAverager = new Queue<double>();
|
||||||
|
private double AverageLatency
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return LatencyAverager.Count == 0 ? 0 : LatencyAverager.Average();
|
||||||
|
}
|
||||||
|
}
|
||||||
public float Latency { get; set; }
|
public float Latency { get; set; }
|
||||||
|
|
||||||
public Ped Character { get; set; }
|
public Ped Character { get; set; }
|
||||||
@ -68,40 +96,10 @@ namespace CoopClient
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public float VehicleSteeringAngle { get; set; }
|
public float VehicleSteeringAngle { get; set; }
|
||||||
private bool LastVehIsEngineRunning { get; set; }
|
public bool VehIsEngineRunning { get; set; }
|
||||||
private bool CurrentVehIsEngineRunning { get; set; }
|
public bool VehAreLightsOn { get; set; }
|
||||||
public bool VehIsEngineRunning
|
public bool VehAreHighBeamsOn { get; set; }
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool LastVehIsInBurnout = false;
|
|
||||||
public bool VehIsInBurnout { get; set; }
|
public bool VehIsInBurnout { get; set; }
|
||||||
private bool LastVehIsSireneActive = false;
|
|
||||||
public bool VehIsSireneActive { get; set; }
|
public bool VehIsSireneActive { get; set; }
|
||||||
private VehicleDoors[] LastVehDoors;
|
private VehicleDoors[] LastVehDoors;
|
||||||
public VehicleDoors[] VehDoors { get; set; }
|
public VehicleDoors[] VehDoors { get; set; }
|
||||||
@ -263,7 +261,7 @@ namespace CoopClient
|
|||||||
{
|
{
|
||||||
if (MainVehicle == null || !MainVehicle.Exists() || MainVehicle.Model.Hash != VehicleModelHash)
|
if (MainVehicle == null || !MainVehicle.Exists() || MainVehicle.Model.Hash != VehicleModelHash)
|
||||||
{
|
{
|
||||||
List<Vehicle> vehs = World.GetNearbyVehicles(Character, 3f, new Model[] { VehicleModelHash }).OrderBy(v => (v.Position - VehiclePosition).Length()).Take(3).ToList();
|
List<Vehicle> vehs = World.GetNearbyVehicles(Character, 7f, new Model[] { VehicleModelHash }).OrderBy(v => (v.Position - Character.Position).Length()).Take(3).ToList();
|
||||||
|
|
||||||
bool vehFound = false;
|
bool vehFound = false;
|
||||||
|
|
||||||
@ -279,7 +277,8 @@ namespace CoopClient
|
|||||||
|
|
||||||
if (!vehFound)
|
if (!vehFound)
|
||||||
{
|
{
|
||||||
MainVehicle = World.CreateVehicle(new Model(VehicleModelHash), VehiclePosition, VehicleRotation.Z);
|
MainVehicle = World.CreateVehicle(new Model(VehicleModelHash), VehiclePosition);
|
||||||
|
MainVehicle.Quaternion = VehicleRotation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,22 +298,6 @@ namespace CoopClient
|
|||||||
}
|
}
|
||||||
|
|
||||||
#region -- VEHICLE SYNC --
|
#region -- VEHICLE SYNC --
|
||||||
if (Util.GetResponsiblePedHandle(MainVehicle) != Character.Handle)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MainVehicle.EngineHealth = VehicleEngineHealth;
|
|
||||||
|
|
||||||
if (VehicleDead && !MainVehicle.IsDead)
|
|
||||||
{
|
|
||||||
MainVehicle.Explode();
|
|
||||||
}
|
|
||||||
else if (!VehicleDead && MainVehicle.IsDead)
|
|
||||||
{
|
|
||||||
MainVehicle.Repair();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VehicleColors != LastVehicleColors)
|
if (VehicleColors != LastVehicleColors)
|
||||||
{
|
{
|
||||||
Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]);
|
Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]);
|
||||||
@ -338,94 +321,103 @@ namespace CoopClient
|
|||||||
StartPedalingAnim(true);
|
StartPedalingAnim(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (CurrentVehIsEngineRunning != LastVehIsEngineRunning)
|
|
||||||
{
|
{
|
||||||
MainVehicle.IsEngineRunning = CurrentVehIsEngineRunning;
|
if (Util.GetResponsiblePedHandle(MainVehicle) != Character.Handle)
|
||||||
}
|
|
||||||
|
|
||||||
if (CurrentVehAreLightsOn != LastVehAreLightsOn)
|
|
||||||
{
|
|
||||||
MainVehicle.AreLightsOn = CurrentVehAreLightsOn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CurrentVehAreHighBeamsOn != LastVehAreHighBeamsOn)
|
|
||||||
{
|
|
||||||
MainVehicle.AreHighBeamsOn = CurrentVehAreHighBeamsOn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VehIsSireneActive != LastVehIsSireneActive)
|
|
||||||
{
|
|
||||||
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++)
|
return;
|
||||||
{
|
|
||||||
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))
|
MainVehicle.EngineHealth = VehicleEngineHealth;
|
||||||
{
|
|
||||||
Function.Call(Hash.SET_VEHICLE_BURNOUT, MainVehicle, true);
|
if (VehicleDead && !MainVehicle.IsDead)
|
||||||
Function.Call(Hash.TASK_VEHICLE_TEMP_ACTION, Character, MainVehicle, 23, 120000); // 30 - burnout
|
{
|
||||||
}
|
MainVehicle.Explode();
|
||||||
else if (!VehIsInBurnout && LastVehIsInBurnout && (LastVehIsInBurnout = false))
|
}
|
||||||
{
|
else if (!VehicleDead && MainVehicle.IsDead)
|
||||||
Function.Call(Hash.SET_VEHICLE_BURNOUT, MainVehicle, false);
|
{
|
||||||
Character.Task.ClearAll();
|
MainVehicle.Repair();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VehIsEngineRunning != MainVehicle.IsEngineRunning)
|
||||||
|
{
|
||||||
|
MainVehicle.IsEngineRunning = VehIsEngineRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VehAreLightsOn != MainVehicle.AreLightsOn)
|
||||||
|
{
|
||||||
|
MainVehicle.AreLightsOn = VehAreLightsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VehAreHighBeamsOn != MainVehicle.AreHighBeamsOn)
|
||||||
|
{
|
||||||
|
MainVehicle.AreHighBeamsOn = VehAreHighBeamsOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VehIsSireneActive != MainVehicle.IsSirenActive)
|
||||||
|
{
|
||||||
|
MainVehicle.IsSirenActive = VehIsSireneActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
Function.Call(Hash.SET_VEHICLE_BRAKE_LIGHTS, MainVehicle, CurrentVehicleSpeed > 0.2f && LastVehicleSpeed > CurrentVehicleSpeed);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BURNOUT SYNC
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VehicleSteeringAngle != MainVehicle.SteeringAngle)
|
if (VehicleSteeringAngle != MainVehicle.SteeringAngle)
|
||||||
{
|
{
|
||||||
Util.CustomSteeringAngle(MainVehicle.Handle, (float)(Math.PI / 180) * VehicleSteeringAngle);
|
Util.CustomSteeringAngle(MainVehicle.Handle, (float)(Math.PI / 180) * VehicleSteeringAngle);
|
||||||
}
|
}
|
||||||
|
|
||||||
Function.Call(Hash.SET_VEHICLE_BRAKE_LIGHTS, MainVehicle, CurrentVehicleSpeed > 0.2f && LastVehicleSpeed > CurrentVehicleSpeed);
|
|
||||||
|
|
||||||
// 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 ((CurrentVehicleSpeed > 0.2f || VehIsInBurnout) && MainVehicle.IsInRange(VehiclePosition, 7.0f))
|
if ((CurrentVehicleSpeed > 0.2f || VehIsInBurnout) && MainVehicle.IsInRange(VehiclePosition, 7.0f))
|
||||||
@ -434,15 +426,15 @@ namespace CoopClient
|
|||||||
|
|
||||||
MainVehicle.Velocity = VehicleVelocity + forceMultiplier * (VehiclePosition - MainVehicle.Position);
|
MainVehicle.Velocity = VehicleVelocity + forceMultiplier * (VehiclePosition - MainVehicle.Position);
|
||||||
|
|
||||||
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, 0.5f);
|
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, Math.Min(1.5f, (Environment.TickCount - LastUpdateFrom) / (float)AverageLatency));
|
||||||
|
|
||||||
VehicleStopTime = Environment.TickCount;
|
VehicleStopTime = Environment.TickCount;
|
||||||
}
|
}
|
||||||
else if ((Environment.TickCount - VehicleStopTime) <= 1000)
|
else if ((Environment.TickCount - VehicleStopTime) <= 1000)
|
||||||
{
|
{
|
||||||
Vector3 posTarget = Util.LinearVectorLerp(MainVehicle.Position, VehiclePosition + (VehiclePosition - MainVehicle.Position), Environment.TickCount - VehicleStopTime, 1000);
|
Vector3 posTarget = Util.LinearVectorLerp(MainVehicle.Position, VehiclePosition, Environment.TickCount - VehicleStopTime, 1000);
|
||||||
MainVehicle.PositionNoOffset = posTarget;
|
MainVehicle.PositionNoOffset = posTarget;
|
||||||
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, 0.5f);
|
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, Math.Min(1.5f, (Environment.TickCount - LastUpdateFrom) / (float)AverageLatency));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -237,7 +237,7 @@ namespace CoopClient
|
|||||||
DebugSyncPed = Players[0];
|
DebugSyncPed = Players[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Environment.TickCount - ArtificialLagCounter) < 37)
|
if ((Environment.TickCount - ArtificialLagCounter) < 23)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -297,6 +297,7 @@ namespace CoopClient
|
|||||||
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.VehicleEngineHealth = veh.EngineHealth;
|
||||||
DebugSyncPed.VehicleVelocity = veh.Velocity;
|
DebugSyncPed.VehicleVelocity = veh.Velocity;
|
||||||
DebugSyncPed.VehicleSpeed = veh.Speed;
|
DebugSyncPed.VehicleSpeed = veh.Speed;
|
||||||
DebugSyncPed.VehicleSteeringAngle = veh.SteeringAngle;
|
DebugSyncPed.VehicleSteeringAngle = veh.SteeringAngle;
|
||||||
|
@ -23,16 +23,16 @@ namespace CoopClient
|
|||||||
|
|
||||||
private void OnTick(object sender, EventArgs e)
|
private void OnTick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if ((Environment.TickCount - LastUpdate) >= 1000)
|
|
||||||
{
|
|
||||||
Update(Main.Players, Main.MainSettings.Username);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Main.MainNetworking.IsOnServer())
|
if (!Main.MainNetworking.IsOnServer())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((Environment.TickCount - LastUpdate) >= 1000)
|
||||||
|
{
|
||||||
|
Update(Main.Players, Main.MainSettings.Username);
|
||||||
|
}
|
||||||
|
|
||||||
if ((Environment.TickCount - Pressed) < 5000 && !Main.MainChat.Focused && !Main.MainMenu.MenuPool.AreAnyVisible)
|
if ((Environment.TickCount - Pressed) < 5000 && !Main.MainChat.Focused && !Main.MainMenu.MenuPool.AreAnyVisible)
|
||||||
{
|
{
|
||||||
Function.Call(Hash.DRAW_SCALEFORM_MOVIE, MainScaleform.Handle, 0.122f, 0.3f, 0.28f, 0.6f, 255, 255, 255, 255, 0);
|
Function.Call(Hash.DRAW_SCALEFORM_MOVIE, MainScaleform.Handle, 0.122f, 0.3f, 0.28f, 0.6f, 255, 255, 255, 255, 0);
|
||||||
|
@ -356,7 +356,10 @@ namespace CoopServer
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NetIncomingMessageType.ConnectionLatencyUpdated:
|
case NetIncomingMessageType.ConnectionLatencyUpdated:
|
||||||
Players[message.SenderConnection.RemoteUniqueIdentifier].Latency = message.ReadFloat();
|
if (Players.ContainsKey(message.SenderConnection.RemoteUniqueIdentifier))
|
||||||
|
{
|
||||||
|
Players[message.SenderConnection.RemoteUniqueIdentifier].Latency = message.ReadFloat();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case NetIncomingMessageType.ErrorMessage:
|
case NetIncomingMessageType.ErrorMessage:
|
||||||
Logging.Error(message.ReadString());
|
Logging.Error(message.ReadString());
|
||||||
|
Reference in New Issue
Block a user