NOT YET TESTED!

This commit is contained in:
EntenKoeniq
2021-08-17 15:04:50 +02:00
parent 51f4b58497
commit 13f1e4afc4
4 changed files with 136 additions and 140 deletions

View File

@ -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
{ {

View File

@ -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;

View File

@ -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);

View File

@ -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());