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:
@ -7,7 +7,6 @@ using GTA.Native;
|
||||
using GTA.Math;
|
||||
|
||||
using LemonUI.Elements;
|
||||
using System.Linq;
|
||||
|
||||
namespace CoopClient.Entities.Player
|
||||
{
|
||||
@ -26,26 +25,7 @@ namespace CoopClient.Entities.Player
|
||||
/// <summary>
|
||||
/// Get the last update = TickCount64()
|
||||
/// </summary>
|
||||
public ulong LastUpdateReceived
|
||||
{
|
||||
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>();
|
||||
public ulong LastUpdateReceived { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// Get the player latency
|
||||
/// </summary>
|
||||
|
@ -11,6 +11,8 @@ namespace CoopClient.Entities.Player
|
||||
public partial class EntitiesPlayer
|
||||
{
|
||||
#region -- VARIABLES --
|
||||
private ulong _vehicleStopTime { get; set; }
|
||||
|
||||
internal bool IsInVehicle { get; set; }
|
||||
/// <summary>
|
||||
/// The latest vehicle model hash (may not have been applied yet)
|
||||
@ -30,21 +32,9 @@ namespace CoopClient.Entities.Player
|
||||
/// <summary>
|
||||
/// The latest vehicle rotation (may not have been applied yet)
|
||||
/// </summary>
|
||||
public Quaternion VehicleRotation
|
||||
{
|
||||
get => _vehicleRotation;
|
||||
set
|
||||
{
|
||||
_lastVehicleRotation = _vehicleRotation;
|
||||
_vehicleRotation = value;
|
||||
}
|
||||
}
|
||||
private Quaternion _vehicleRotation;
|
||||
private Quaternion _lastVehicleRotation;
|
||||
public Quaternion VehicleRotation { get; set; }
|
||||
internal float VehicleSpeed { get; set; }
|
||||
private float _lastVehicleSpeed;
|
||||
internal float VehicleSteeringAngle { get; set; }
|
||||
private float _lastVehicleSteeringAngle;
|
||||
private int _lastVehicleAim = 0;
|
||||
internal bool VehIsEngineRunning { get; set; }
|
||||
internal float VehRPM { get; set; }
|
||||
@ -87,7 +77,7 @@ namespace CoopClient.Entities.Player
|
||||
return;
|
||||
}
|
||||
MainVehicle.IsInvincible = true;
|
||||
MainVehicle.Quaternion = _vehicleRotation;
|
||||
MainVehicle.Quaternion = VehicleRotation;
|
||||
|
||||
if (MainVehicle.HasRoof)
|
||||
{
|
||||
@ -104,7 +94,7 @@ namespace CoopClient.Entities.Player
|
||||
|
||||
if (_lastVehicleEnter != 0)
|
||||
{
|
||||
if (Util.GetTickCount64() - _lastVehicleEnter < 1500)
|
||||
if (VehicleSpeed == 0f && Util.GetTickCount64() - _lastVehicleEnter < 1500)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -300,40 +290,26 @@ namespace CoopClient.Entities.Player
|
||||
|
||||
private void UpdateVehiclePosition()
|
||||
{
|
||||
// We cannot calculate without content
|
||||
if (_latencyAverager.Count == 0)
|
||||
MainVehicle.CustomSteeringAngle(VehicleSteeringAngle.ToRadians());
|
||||
|
||||
if (VehicleSpeed != 0f && MainVehicle.IsInRange(Position, 7.0f))
|
||||
{
|
||||
MainVehicle.PositionNoOffset = Position;
|
||||
MainVehicle.Quaternion = _vehicleRotation;
|
||||
return;
|
||||
int forceMultiplier = (Game.Player.Character.IsInVehicle() && MainVehicle.IsTouching(Game.Player.Character.CurrentVehicle)) ? 1 : 3;
|
||||
|
||||
MainVehicle.Velocity = Velocity + forceMultiplier * (Position - MainVehicle.Position);
|
||||
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, 0.5f);
|
||||
}
|
||||
|
||||
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))
|
||||
else if ((Util.GetTickCount64() - _vehicleStopTime) <= 1000)
|
||||
{
|
||||
MainVehicle.PositionNoOffset = Position;
|
||||
}
|
||||
Vector3 posTarget = Util.LinearVectorLerp(MainVehicle.Position, Position + (Position - MainVehicle.Position), Util.GetTickCount64() - _vehicleStopTime, 1000);
|
||||
|
||||
if (VehicleSpeed != 0f)
|
||||
{
|
||||
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;
|
||||
MainVehicle.PositionNoOffset = posTarget;
|
||||
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.Quaternion, VehicleRotation, 0.5f);
|
||||
}
|
||||
else
|
||||
{
|
||||
MainVehicle.PositionNoOffset = Position;
|
||||
MainVehicle.Quaternion = _vehicleRotation;
|
||||
MainVehicle.Quaternion = VehicleRotation;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,11 +178,14 @@ namespace CoopClient
|
||||
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)
|
||||
{
|
||||
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:
|
||||
if (MainMenu.MenuPool.AreAnyVisible)
|
||||
{
|
||||
@ -374,7 +377,7 @@ namespace CoopClient
|
||||
DebugSyncPed = Players[0];
|
||||
}
|
||||
|
||||
if ((Util.GetTickCount64() - _artificialLagCounter) < 243)
|
||||
if ((Util.GetTickCount64() - _artificialLagCounter) < 147)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -319,7 +319,7 @@ namespace CoopClient
|
||||
EntitiesPlayer player = Main.Players[packet.NetHandle];
|
||||
|
||||
player.Position = packet.Position.ToVector();
|
||||
player.Latency = packet.Latency.HasValue ? packet.Latency.Value : 0;
|
||||
player.Latency = packet.Latency ?? 0;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -35,9 +35,11 @@ namespace CoopClient
|
||||
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);
|
||||
|
||||
@ -53,8 +55,8 @@ namespace CoopClient
|
||||
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_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME, 0f);
|
||||
Function.Call((Hash)0x2F9A292AD0A3BD89);
|
||||
Function.Call((Hash)0x5F3B7749C112D552);
|
||||
Function.Call(Hash.SUPPRESS_SHOCKING_EVENTS_NEXT_FRAME);
|
||||
Function.Call(Hash.SUPPRESS_AGITATION_EVENTS_NEXT_FRAME);
|
||||
}
|
||||
else if (_lastDisableTraffic)
|
||||
{
|
||||
@ -78,7 +80,7 @@ namespace CoopClient
|
||||
Function.Call(Hash.SET_ALL_VEHICLE_GENERATORS_ACTIVE);
|
||||
Function.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, true);
|
||||
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);
|
||||
}
|
||||
else
|
||||
@ -94,7 +96,7 @@ namespace CoopClient
|
||||
Function.Call(Hash.SET_ALL_LOW_PRIORITY_VEHICLE_GENERATORS_ACTIVE, false);
|
||||
Function.Call(Hash.SET_FAR_DRAW_VEHICLES, false);
|
||||
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);
|
||||
|
||||
foreach (Ped ped in World.GetAllPeds().Where(p => p.RelationshipGroup != "SYNCPED" && p.Handle != Game.Player.Character?.Handle))
|
||||
|
Reference in New Issue
Block a user