Some changes and bug fixes

This commit is contained in:
EntenKoeniq
2022-04-14 02:08:13 +02:00
parent f6ceb7308b
commit 81733a2c19
9 changed files with 127 additions and 74 deletions

View File

@ -41,12 +41,23 @@ namespace CoopClient.Entities.Player
{ {
if (Character.IsInVehicle()) if (Character.IsInVehicle())
{ {
Character.Task.LeaveVehicle(); Character.Task.ClearAll();
} Character.Task.ClearSecondary();
if (MainVehicle != null) if (MainVehicle == null)
{ {
MainVehicle = null; Character.Task.LeaveVehicle();
}
else
{
MainVehicle.Doors[(VehicleDoorIndex)VehicleSeatIndex + 1]?.Open(true, true);
Character.Task.LeaveVehicle(MainVehicle, false);
MainVehicle = null;
}
Character.PositionNoOffset = Position;
return;
} }
if (IsInParachuteFreeFall) if (IsInParachuteFreeFall)
@ -109,7 +120,7 @@ namespace CoopClient.Entities.Player
return; return;
} }
else if (!IsOnLadder && Function.Call<bool>(Hash.GET_IS_TASK_ACTIVE, Character.Handle, ETasks.CLIMB_LADDER)) if (!IsOnLadder && Function.Call<bool>(Hash.GET_IS_TASK_ACTIVE, Character.Handle, ETasks.CLIMB_LADDER))
{ {
Character.Task.ClearAllImmediately(); Character.Task.ClearAllImmediately();
} }
@ -125,7 +136,7 @@ namespace CoopClient.Entities.Player
return; return;
} }
else if (!IsVaulting && Character.IsVaulting) if (!IsVaulting && Character.IsVaulting)
{ {
Character.Task.ClearAllImmediately(); Character.Task.ClearAllImmediately();
} }
@ -176,7 +187,7 @@ namespace CoopClient.Entities.Player
return; return;
} }
else if (!IsRagdoll && Character.IsRagdoll) if (!IsRagdoll && Character.IsRagdoll)
{ {
Character.CanRagdoll = false; Character.CanRagdoll = false;
Character.Task.ClearAllImmediately(); Character.Task.ClearAllImmediately();

View File

@ -10,8 +10,6 @@ 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)
@ -62,6 +60,8 @@ namespace CoopClient.Entities.Player
internal VehicleDamageModel VehDamageModel { get; set; } internal VehicleDamageModel VehDamageModel { get; set; }
#endregion #endregion
private ulong _lastVehicleEnter = 0;
private void DisplayInVehicle() private void DisplayInVehicle()
{ {
if (MainVehicle == null || !MainVehicle.Exists() || MainVehicle.Model.Hash != VehicleModelHash) if (MainVehicle == null || !MainVehicle.Exists() || MainVehicle.Model.Hash != VehicleModelHash)
@ -89,6 +89,7 @@ namespace CoopClient.Entities.Player
if (!vehFound) if (!vehFound)
{ {
MainVehicle = World.CreateVehicle(vehicleModel, Position); MainVehicle = World.CreateVehicle(vehicleModel, Position);
MainVehicle.IsVisible = false;
MainVehicle.Quaternion = _vehicleRotation; MainVehicle.Quaternion = _vehicleRotation;
MainVehicle.IsInvincible = true; MainVehicle.IsInvincible = true;
@ -104,24 +105,53 @@ namespace CoopClient.Entities.Player
} }
vehicleModel.MarkAsNoLongerNeeded(); vehicleModel.MarkAsNoLongerNeeded();
return;
} }
if (!Character.IsInVehicle() || (int)Character.SeatIndex != VehicleSeatIndex || Character.CurrentVehicle.Handle != MainVehicle.Handle) if (_lastVehicleEnter != 0)
{ {
if (VehicleSeatIndex == -1 && if (Util.GetTickCount64() - _lastVehicleEnter < 1500)
Game.Player.Character.IsInVehicle() && {
(int)Game.Player.Character.SeatIndex == -1 && return;
Game.Player.Character.CurrentVehicle.Handle == MainVehicle.Handle) }
_lastVehicleEnter = 0;
Character.Task.ClearAllImmediately();
Character.SetIntoVehicle(MainVehicle, (VehicleSeat)VehicleSeatIndex);
}
else if (!Character.IsInVehicle() || Character.CurrentVehicle.Handle != MainVehicle.Handle)
{
MainVehicle.IsVisible = true;
if (Game.Player.Character.CurrentVehicle?.Handle == MainVehicle.Handle &&
VehicleSeatIndex == (int)Game.Player.Character.SeatIndex)
{ {
Game.Player.Character.Task.WarpOutOfVehicle(MainVehicle); Game.Player.Character.Task.WarpOutOfVehicle(MainVehicle);
GTA.UI.Notification.Show("~r~Car jacked!"); GTA.UI.Notification.Show("~r~Car jacked!");
} }
Character.SetIntoVehicle(MainVehicle, (VehicleSeat)VehicleSeatIndex); if (VehicleSpeed > 0.2f || !Character.IsInRange(MainVehicle.Position, 4f))
Character.IsVisible = true; {
Character.SetIntoVehicle(MainVehicle, (VehicleSeat)VehicleSeatIndex);
Character.IsVisible = true;
}
else
{
_lastVehicleEnter = Util.GetTickCount64();
Character.Task.ClearAllImmediately();
Character.IsVisible = true;
Character.Task.EnterVehicle(MainVehicle, (VehicleSeat)VehicleSeatIndex, -1, 2f, EnterVehicleFlags.WarpToDoor);
return;
}
}
if ((int)Character.SeatIndex != VehicleSeatIndex)
{
Character.Task.ShuffleToNextVehicleSeat(MainVehicle);
} }
#region -- VEHICLE SYNC --
if (AimCoords != default) if (AimCoords != default)
{ {
if (MainVehicle.IsTurretSeat(VehicleSeatIndex)) if (MainVehicle.IsTurretSeat(VehicleSeatIndex))
@ -140,6 +170,12 @@ namespace CoopClient.Entities.Player
return; return;
} }
UpdateVehicleInfo();
UpdateVehiclePosition();
}
private void UpdateVehicleInfo()
{
if (VehicleColors != null && VehicleColors != _lastVehicleColors) if (VehicleColors != null && VehicleColors != _lastVehicleColors)
{ {
Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]); Function.Call(Hash.SET_VEHICLE_COLOURS, MainVehicle, VehicleColors[0], VehicleColors[1]);
@ -269,7 +305,10 @@ namespace CoopClient.Entities.Player
} }
} }
} }
}
private void UpdateVehiclePosition()
{
float avrLat = Math.Min(1.5f, (Util.GetTickCount64() - LastUpdateReceived) / AverageLatency); float avrLat = Math.Min(1.5f, (Util.GetTickCount64() - LastUpdateReceived) / AverageLatency);
if (_lastVehicleSteeringAngle != VehicleSteeringAngle) if (_lastVehicleSteeringAngle != VehicleSteeringAngle)
@ -280,8 +319,7 @@ namespace CoopClient.Entities.Player
MainVehicle.CustomSteeringAngle(steeringLerp); MainVehicle.CustomSteeringAngle(steeringLerp);
} }
// Good enough for now, but we need to create a better sync if (VehicleSpeed != 0f && MainVehicle.IsInRange(Position, 7.0f))
if (VehicleSpeed > 0.05f && MainVehicle.IsInRange(Position, 7.0f))
{ {
dynamic speedLerp = Util.Lerp(_lastVehicleSpeed, VehicleSpeed, avrLat); dynamic speedLerp = Util.Lerp(_lastVehicleSpeed, VehicleSpeed, avrLat);
_lastVehicleSpeed = Speed; _lastVehicleSpeed = Speed;
@ -291,22 +329,12 @@ namespace CoopClient.Entities.Player
MainVehicle.Velocity = Velocity * forceVelo + ((Position - MainVehicle.Position) * force); MainVehicle.Velocity = Velocity * forceVelo + ((Position - MainVehicle.Position) * force);
MainVehicle.Quaternion = _lastVehicleRotation != null ? Quaternion.Slerp(_lastVehicleRotation.Value, _vehicleRotation, avrLat) : _vehicleRotation; MainVehicle.Quaternion = _lastVehicleRotation != null ? Quaternion.Slerp(_lastVehicleRotation.Value, _vehicleRotation, avrLat) : _vehicleRotation;
_vehicleStopTime = Util.GetTickCount64();
}
else if ((Util.GetTickCount64() - _vehicleStopTime) <= 1000)
{
Vector3 posTarget = Util.LinearVectorLerp(MainVehicle.Position, Position + (Position - MainVehicle.Position), Util.GetTickCount64() - _vehicleStopTime, 1000);
MainVehicle.PositionNoOffset = posTarget;
MainVehicle.Quaternion = Quaternion.Slerp(_lastVehicleRotation.Value, _vehicleRotation, avrLat);
} }
else else
{ {
MainVehicle.PositionNoOffset = Position; MainVehicle.PositionNoOffset = Position;
MainVehicle.Quaternion = _vehicleRotation; MainVehicle.Quaternion = _vehicleRotation;
} }
#endregion
} }
#region -- PEDALING -- #region -- PEDALING --

View File

@ -440,8 +440,8 @@ namespace CoopClient
{ {
BrokenDoors = reader.ReadByte(), BrokenDoors = reader.ReadByte(),
BrokenWindows = reader.ReadByte(), BrokenWindows = reader.ReadByte(),
BurstedTires = reader.ReadUShort(), BurstedTires = reader.ReadShort(),
PuncturedTires = reader.ReadUShort(), PuncturedTires = reader.ReadShort(),
LeftHeadLightBroken = reader.ReadByte(), LeftHeadLightBroken = reader.ReadByte(),
RightHeadLightBroken = reader.ReadByte() RightHeadLightBroken = reader.ReadByte()
}; };

View File

@ -168,8 +168,8 @@ namespace CoopClient
{ {
public byte BrokenWindows { get; set; } public byte BrokenWindows { get; set; }
public byte BrokenDoors { get; set; } public byte BrokenDoors { get; set; }
public ushort BurstedTires { get; set; } public short BurstedTires { get; set; }
public ushort PuncturedTires { get; set; } public short PuncturedTires { get; set; }
public byte LeftHeadLightBroken { get; set; } public byte LeftHeadLightBroken { get; set; }
public byte RightHeadLightBroken { get; set; } public byte RightHeadLightBroken { get; set; }
} }

View File

@ -672,8 +672,8 @@ namespace CoopClient
{ {
BrokenDoors = reader.ReadByte(), BrokenDoors = reader.ReadByte(),
BrokenWindows = reader.ReadByte(), BrokenWindows = reader.ReadByte(),
BurstedTires = reader.ReadUShort(), BurstedTires = reader.ReadShort(),
PuncturedTires = reader.ReadUShort(), PuncturedTires = reader.ReadShort(),
LeftHeadLightBroken = reader.ReadByte(), LeftHeadLightBroken = reader.ReadByte(),
RightHeadLightBroken = reader.ReadByte() RightHeadLightBroken = reader.ReadByte()
}; };

View File

@ -359,49 +359,52 @@ namespace CoopClient
public static VehicleDamageModel GetVehicleDamageModel(this Vehicle veh) public static VehicleDamageModel GetVehicleDamageModel(this Vehicle veh)
{ {
VehicleDamageModel result = new VehicleDamageModel()
{
BrokenDoors = 0,
BrokenWindows = 0,
BurstedTires = 0,
PuncturedTires = 0,
LeftHeadLightBroken = (byte)(veh.IsLeftHeadLightBroken ? 1 : 0),
RightHeadLightBroken = (byte)(veh.IsRightHeadLightBroken ? 1 : 0)
};
// Broken windows // Broken windows
byte brokenWindows = 0;
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
if (!veh.Windows[(VehicleWindowIndex)i].IsIntact) if (!veh.Windows[(VehicleWindowIndex)i].IsIntact)
{ {
result.BrokenWindows |= (byte)(1 << i); brokenWindows |= (byte)(1 << i);
} }
} }
// Broken doors // Broken doors
byte brokenDoors = 0;
foreach (VehicleDoor door in veh.Doors) foreach (VehicleDoor door in veh.Doors)
{ {
if (door.IsBroken) if (door.IsBroken)
{ {
result.BrokenDoors |= (byte)(1 << (byte)door.Index); brokenDoors |= (byte)(1 << (byte)door.Index);
} }
} }
// Bursted and Punctured tires // Bursted and Punctured tires
short puncturedTires = 0;
short burstedTires = 0;
foreach (VehicleWheel wheel in veh.Wheels.GetAllWheels()) foreach (VehicleWheel wheel in veh.Wheels.GetAllWheels())
{ {
if (wheel.IsPunctured)
{
result.PuncturedTires |= (ushort)(1 << (int)wheel.BoneId);
}
if (wheel.IsBursted) if (wheel.IsBursted)
{ {
result.BurstedTires |= (ushort)(1 << (int)wheel.BoneId); burstedTires |= (short)(1 << (int)wheel.BoneId);
continue;
}
if (wheel.IsPunctured)
{
puncturedTires |= (short)(1 << (int)wheel.BoneId);
} }
} }
return result; return new VehicleDamageModel()
{
BrokenDoors = brokenDoors,
BrokenWindows = brokenWindows,
BurstedTires = burstedTires,
PuncturedTires = puncturedTires,
LeftHeadLightBroken = (byte)(veh.IsLeftHeadLightBroken ? 1 : 0),
RightHeadLightBroken = (byte)(veh.IsRightHeadLightBroken ? 1 : 0)
};
} }
public static void SetVehicleDamageModel(this Vehicle veh, VehicleDamageModel model, bool leavedoors = true) public static void SetVehicleDamageModel(this Vehicle veh, VehicleDamageModel model, bool leavedoors = true)
@ -431,7 +434,22 @@ namespace CoopClient
foreach (VehicleWheel wheel in veh.Wheels) foreach (VehicleWheel wheel in veh.Wheels)
{ {
if ((model.PuncturedTires & (ushort)(1 << (int)wheel.BoneId)) != 0) if ((model.BurstedTires & (short)(1 << (int)wheel.BoneId)) != 0)
{
if (!wheel.IsBursted)
{
wheel.Puncture();
wheel.Burst();
}
continue;
}
else if (wheel.IsBursted)
{
wheel.Fix();
}
if ((model.PuncturedTires & (short)(1 << (int)wheel.BoneId)) != 0)
{ {
if (!wheel.IsPunctured) if (!wheel.IsPunctured)
{ {
@ -442,18 +460,6 @@ namespace CoopClient
{ {
wheel.Fix(); wheel.Fix();
} }
if ((model.BurstedTires & (ushort)(1 << (int)wheel.BoneId)) != 0)
{
if (!wheel.IsBursted)
{
wheel.Burst();
}
}
else if (wheel.IsBursted)
{
wheel.Fix();
}
} }
veh.IsLeftHeadLightBroken = model.LeftHeadLightBroken > 0; veh.IsLeftHeadLightBroken = model.LeftHeadLightBroken > 0;

View File

@ -315,6 +315,8 @@ namespace CoopServer
byteArray.Add(VehDamageModel.BrokenWindows); byteArray.Add(VehDamageModel.BrokenWindows);
byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.BurstedTires)); byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.BurstedTires));
byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.PuncturedTires)); byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.PuncturedTires));
byteArray.Add(VehDamageModel.LeftHeadLightBroken);
byteArray.Add(VehDamageModel.RightHeadLightBroken);
} }
else else
{ {
@ -438,8 +440,10 @@ namespace CoopServer
{ {
BrokenDoors = reader.ReadByte(), BrokenDoors = reader.ReadByte(),
BrokenWindows = reader.ReadByte(), BrokenWindows = reader.ReadByte(),
BurstedTires = reader.ReadUShort(), BurstedTires = reader.ReadShort(),
PuncturedTires = reader.ReadUShort() PuncturedTires = reader.ReadShort(),
LeftHeadLightBroken = reader.ReadByte(),
RightHeadLightBroken = reader.ReadByte()
}; };
} }
#endregion #endregion

View File

@ -156,8 +156,8 @@ namespace CoopServer
{ {
public byte BrokenWindows { get; set; } public byte BrokenWindows { get; set; }
public byte BrokenDoors { get; set; } public byte BrokenDoors { get; set; }
public ushort BurstedTires { get; set; } public short BurstedTires { get; set; }
public ushort PuncturedTires { get; set; } public short PuncturedTires { get; set; }
public byte LeftHeadLightBroken { get; set; } public byte LeftHeadLightBroken { get; set; }
public byte RightHeadLightBroken { get; set; } public byte RightHeadLightBroken { get; set; }
} }

View File

@ -526,6 +526,8 @@ namespace CoopServer
byteArray.Add(VehDamageModel.BrokenWindows); byteArray.Add(VehDamageModel.BrokenWindows);
byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.BurstedTires)); byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.BurstedTires));
byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.PuncturedTires)); byteArray.AddRange(BitConverter.GetBytes(VehDamageModel.PuncturedTires));
byteArray.Add(VehDamageModel.LeftHeadLightBroken);
byteArray.Add(VehDamageModel.RightHeadLightBroken);
} }
else else
{ {
@ -670,8 +672,10 @@ namespace CoopServer
{ {
BrokenDoors = reader.ReadByte(), BrokenDoors = reader.ReadByte(),
BrokenWindows = reader.ReadByte(), BrokenWindows = reader.ReadByte(),
BurstedTires = reader.ReadUShort(), BurstedTires = reader.ReadShort(),
PuncturedTires = reader.ReadUShort() PuncturedTires = reader.ReadShort(),
LeftHeadLightBroken = reader.ReadByte(),
RightHeadLightBroken = reader.ReadByte()
}; };
} }