Changed vehicle synchronization back to the old one. Fixed custom pause menu and changed it to GTA controls. Small changes

This commit is contained in:
EntenKoeniq
2022-04-18 21:54:34 +02:00
parent a6e416ec06
commit 7d411474cd
5 changed files with 34 additions and 73 deletions

View File

@ -7,7 +7,6 @@ using GTA.Native;
using GTA.Math; using GTA.Math;
using LemonUI.Elements; using LemonUI.Elements;
using System.Linq;
namespace CoopClient.Entities.Player namespace CoopClient.Entities.Player
{ {
@ -26,26 +25,7 @@ namespace CoopClient.Entities.Player
/// <summary> /// <summary>
/// Get the last update = TickCount64() /// Get the last update = TickCount64()
/// </summary> /// </summary>
public ulong LastUpdateReceived public ulong LastUpdateReceived { get; set; } = 0;
{
get => _lastUpdateReceived;
set
{
if (_lastUpdateReceived != 0)
{
_latencyAverager.Enqueue(value - _lastUpdateReceived);
if (_latencyAverager.Count >= 10)
{
_latencyAverager.Dequeue();
}
}
_lastUpdateReceived = value;
}
}
private ulong _lastUpdateReceived = 0;
internal double AverageLatency => _latencyAverager.Count == 0 ? 0 : _latencyAverager.Average();
private readonly Queue<ulong> _latencyAverager = new Queue<ulong>();
/// <summary> /// <summary>
/// Get the player latency /// Get the player latency
/// </summary> /// </summary>

View File

@ -11,6 +11,8 @@ namespace CoopClient.Entities.Player
public partial class EntitiesPlayer public partial class EntitiesPlayer
{ {
#region -- VARIABLES -- #region -- VARIABLES --
private ulong _vehicleStopTime { get; set; }
internal bool IsInVehicle { get; set; } internal bool IsInVehicle { get; set; }
/// <summary> /// <summary>
/// The latest vehicle model hash (may not have been applied yet) /// The latest vehicle model hash (may not have been applied yet)
@ -30,21 +32,9 @@ namespace CoopClient.Entities.Player
/// <summary> /// <summary>
/// The latest vehicle rotation (may not have been applied yet) /// The latest vehicle rotation (may not have been applied yet)
/// </summary> /// </summary>
public Quaternion VehicleRotation public Quaternion VehicleRotation { get; set; }
{
get => _vehicleRotation;
set
{
_lastVehicleRotation = _vehicleRotation;
_vehicleRotation = value;
}
}
private Quaternion _vehicleRotation;
private Quaternion _lastVehicleRotation;
internal float VehicleSpeed { get; set; } internal float VehicleSpeed { get; set; }
private float _lastVehicleSpeed;
internal float VehicleSteeringAngle { get; set; } internal float VehicleSteeringAngle { get; set; }
private float _lastVehicleSteeringAngle;
private int _lastVehicleAim = 0; private int _lastVehicleAim = 0;
internal bool VehIsEngineRunning { get; set; } internal bool VehIsEngineRunning { get; set; }
internal float VehRPM { get; set; } internal float VehRPM { get; set; }
@ -87,7 +77,7 @@ namespace CoopClient.Entities.Player
return; return;
} }
MainVehicle.IsInvincible = true; MainVehicle.IsInvincible = true;
MainVehicle.Quaternion = _vehicleRotation; MainVehicle.Quaternion = VehicleRotation;
if (MainVehicle.HasRoof) if (MainVehicle.HasRoof)
{ {
@ -104,7 +94,7 @@ namespace CoopClient.Entities.Player
if (_lastVehicleEnter != 0) if (_lastVehicleEnter != 0)
{ {
if (Util.GetTickCount64() - _lastVehicleEnter < 1500) if (VehicleSpeed == 0f && Util.GetTickCount64() - _lastVehicleEnter < 1500)
{ {
return; return;
} }
@ -300,40 +290,26 @@ namespace CoopClient.Entities.Player
private void UpdateVehiclePosition() private void UpdateVehiclePosition()
{ {
// We cannot calculate without content MainVehicle.CustomSteeringAngle(VehicleSteeringAngle.ToRadians());
if (_latencyAverager.Count == 0)
if (VehicleSpeed != 0f && MainVehicle.IsInRange(Position, 7.0f))
{ {
MainVehicle.PositionNoOffset = Position; int forceMultiplier = (Game.Player.Character.IsInVehicle() && MainVehicle.IsTouching(Game.Player.Character.CurrentVehicle)) ? 1 : 3;
MainVehicle.Quaternion = _vehicleRotation;
return; MainVehicle.Velocity = Velocity + forceMultiplier * (Position - MainVehicle.Position);
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, 0.5f);
} }
else if ((Util.GetTickCount64() - _vehicleStopTime) <= 1000)
float avrLat = Math.Min(1.5f, (Util.GetTickCount64() - LastUpdateReceived) / (float)AverageLatency);
float steerLerp = Util.Lerp(_lastVehicleSteeringAngle.ToRadians(), VehicleSteeringAngle.ToRadians(), avrLat);
_lastVehicleSteeringAngle = VehicleSteeringAngle;
MainVehicle.CustomSteeringAngle(steerLerp);
if (!MainVehicle.IsInRange(Position, 7.0f))
{ {
MainVehicle.PositionNoOffset = Position; Vector3 posTarget = Util.LinearVectorLerp(MainVehicle.Position, Position + (Position - MainVehicle.Position), Util.GetTickCount64() - _vehicleStopTime, 1000);
}
if (VehicleSpeed != 0f) MainVehicle.PositionNoOffset = posTarget;
{ MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, 0.5f);
float speedLerp = Util.Lerp(_lastVehicleSpeed, VehicleSpeed, avrLat);
_lastVehicleSpeed = Speed;
float force = 1.10f + (float)Math.Sqrt(_latencyAverager.Average() / 2500) + (speedLerp / 250);
float forceVelo = 0.77f + (float)Math.Sqrt(_latencyAverager.Average() / 5000) + (speedLerp / 750);
MainVehicle.Velocity = Velocity * forceVelo + ((Position - MainVehicle.Position) * force);
MainVehicle.Quaternion = _lastVehicleRotation != null ? Quaternion.Slerp(_lastVehicleRotation, _vehicleRotation, avrLat) : _vehicleRotation;
} }
else else
{ {
MainVehicle.PositionNoOffset = Position; MainVehicle.PositionNoOffset = Position;
MainVehicle.Quaternion = _vehicleRotation; MainVehicle.Quaternion = VehicleRotation;
} }
} }

View File

@ -178,11 +178,14 @@ namespace CoopClient
return; return;
} }
if (Game.IsControlPressed(GTA.Control.FrontendPauseAlternate))
{
Function.Call(Hash.ACTIVATE_FRONTEND_MENU, Function.Call<int>(Hash.GET_HASH_KEY, "FE_MENU_VERSION_SP_PAUSE"), false, 0);
return;
}
switch (e.KeyCode) switch (e.KeyCode)
{ {
case Keys.Escape:
Function.Call(Hash.ACTIVATE_FRONTEND_MENU, Function.Call<int>(Hash.GET_HASH_KEY, "FE_MENU_VERSION_SP_PAUSE"), false, 0);
break;
case Keys.F9: case Keys.F9:
if (MainMenu.MenuPool.AreAnyVisible) if (MainMenu.MenuPool.AreAnyVisible)
{ {
@ -374,7 +377,7 @@ namespace CoopClient
DebugSyncPed = Players[0]; DebugSyncPed = Players[0];
} }
if ((Util.GetTickCount64() - _artificialLagCounter) < 243) if ((Util.GetTickCount64() - _artificialLagCounter) < 147)
{ {
return; return;
} }

View File

@ -319,7 +319,7 @@ namespace CoopClient
EntitiesPlayer player = Main.Players[packet.NetHandle]; EntitiesPlayer player = Main.Players[packet.NetHandle];
player.Position = packet.Position.ToVector(); player.Position = packet.Position.ToVector();
player.Latency = packet.Latency.HasValue ? packet.Latency.Value : 0; player.Latency = packet.Latency ?? 0;
} }
} }
catch (Exception ex) catch (Exception ex)

View File

@ -35,9 +35,11 @@ namespace CoopClient
return; return;
} }
Game.DisableControlThisFrame(Control.FrontendPause); Game.DisableControlThisFrame(Control.FrontendPauseAlternate);
Function.Call((Hash)0xB96B00E976BE977F, 0.0f); // _SET_WAVES_INTENSITY // Sets a value that determines how aggressive the ocean waves will be.
// Values of 2.0 or more make for very aggressive waves like you see during a thunderstorm.
Function.Call(Hash.SET_DEEP_OCEAN_SCALER, 0.0f); // Works only ~200 meters around the player
Function.Call(Hash.SET_CAN_ATTACK_FRIENDLY, Game.Player.Character.Handle, true, false); Function.Call(Hash.SET_CAN_ATTACK_FRIENDLY, Game.Player.Character.Handle, true, false);
@ -53,8 +55,8 @@ namespace CoopClient
Function.Call(Hash.SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f); Function.Call(Hash.SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f);
Function.Call(Hash.SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f); Function.Call(Hash.SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f);
Function.Call(Hash.SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f); Function.Call(Hash.SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f);
Function.Call((Hash)0x2F9A292AD0A3BD89); Function.Call(Hash.SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME);
Function.Call((Hash)0x5F3B7749C112D552); Function.Call(Hash.SUPPRESS_AGITATION_EVENTS_NEXT_FRAME);
} }
else if (_lastDisableTraffic) else if (_lastDisableTraffic)
{ {
@ -78,7 +80,7 @@ namespace CoopClient
Function.Call(Hash.SET_ALL_VEHICLE_GENERATORS_ACTIVE); Function.Call(Hash.SET_ALL_VEHICLE_GENERATORS_ACTIVE);
Function.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, true); Function.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, true);
Function.Call(Hash.SET_NUMBER_OF_PARKED_VEHICLES, -1); Function.Call(Hash.SET_NUMBER_OF_PARKED_VEHICLES, -1);
Function.Call((Hash)0xF796359A959DF65D, true); // Display distant vehicles Function.Call(Hash.SET_DISTANT_CARS_ENABLED, true);
Function.Call(Hash.DISABLE_VEHICLE_DISTANTLIGHTS, false); Function.Call(Hash.DISABLE_VEHICLE_DISTANTLIGHTS, false);
} }
else else
@ -94,7 +96,7 @@ namespace CoopClient
Function.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, false); Function.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, false);
Function.Call(Hash.SET_FAR_DRAW_VEHICLES, false); Function.Call(Hash.SET_FAR_DRAW_VEHICLES, false);
Function.Call(Hash.SET_NUMBER_OF_PARKED_VEHICLES, 0); Function.Call(Hash.SET_NUMBER_OF_PARKED_VEHICLES, 0);
Function.Call((Hash)0xF796359A959DF65D, false); //Display distant vehicles Function.Call(Hash.SET_DISTANT_CARS_ENABLED, false);
Function.Call(Hash.DISABLE_VEHICLE_DISTANTLIGHTS, true); Function.Call(Hash.DISABLE_VEHICLE_DISTANTLIGHTS, true);
foreach (Ped ped in World.GetAllPeds().Where(p => p.RelationshipGroup != "SYNCPED" && p.Handle != Game.Player.Character?.Handle)) foreach (Ped ped in World.GetAllPeds().Where(p => p.RelationshipGroup != "SYNCPED" && p.Handle != Game.Player.Character?.Handle))