diff --git a/RageCoop.Client/Networking/Send.cs b/RageCoop.Client/Networking/Send.cs
index e4d48818..386dc612 100644
--- a/RageCoop.Client/Networking/Send.cs
+++ b/RageCoop.Client/Networking/Send.cs
@@ -121,7 +121,7 @@ public static void SendVehicle(SyncedVehicle v, bool full)
var packet = SendPackets.VehicelPacket;
packet.ID =v.ID;
packet.OwnerID=v.OwnerID;
- packet.Flags = veh.GetVehicleFlags();
+ packet.Flags = v.GetVehicleFlags();
packet.SteeringAngle = veh.SteeringAngle;
packet.Position = veh.ReadPosition();
packet.Velocity=veh.Velocity;
@@ -129,9 +129,7 @@ public static void SendVehicle(SyncedVehicle v, bool full)
packet.RotationVelocity=veh.RotationVelocity;
packet.ThrottlePower = veh.ThrottlePower;
packet.BrakePower = veh.BrakePower;
- if (v.LastVelocity==default) {v.LastVelocity=packet.Velocity; }
v.LastSentStopWatch.Restart();
- v.LastVelocity= packet.Velocity;
if (packet.Flags.HasVehFlag(VehicleDataFlags.IsDeluxoHovering)) { packet.DeluxoWingRatio=v.MainVehicle.GetDeluxoWingRatio(); }
if (full)
{
diff --git a/RageCoop.Client/RageCoop.Client.csproj b/RageCoop.Client/RageCoop.Client.csproj
index 88568f76..4d78bf10 100644
--- a/RageCoop.Client/RageCoop.Client.csproj
+++ b/RageCoop.Client/RageCoop.Client.csproj
@@ -61,6 +61,7 @@
+
diff --git a/RageCoop.Client/Sync/Entities/SyncedVehicle.Members.cs b/RageCoop.Client/Sync/Entities/SyncedVehicle.Members.cs
new file mode 100644
index 00000000..61362460
--- /dev/null
+++ b/RageCoop.Client/Sync/Entities/SyncedVehicle.Members.cs
@@ -0,0 +1,85 @@
+using System;
+using RageCoop.Core;
+using GTA;
+using System.Diagnostics;
+using System.Collections.Generic;
+using GTA.Math;
+using GTA.Native;
+
+namespace RageCoop.Client{
+ public partial class SyncedVehicle{
+ public Vehicle MainVehicle { get; internal set; }
+ public Stopwatch LastSyncedStopWatch = new Stopwatch();
+
+
+ #region -- SYNC DATA --
+ internal Vector3 RotationVelocity { get; set; }
+ internal float SteeringAngle { get; set; }
+ internal float ThrottlePower { get; set; }
+ internal float BrakePower { get; set; }
+ internal float DeluxoWingRatio { get; set; } = -1;
+
+
+ internal byte LandingGear { get; set; }
+ internal VehicleRoofState RoofState { get; set; }
+ internal VehicleDamageModel DamageModel { get; set; }
+ internal byte[] Colors { get; set; }
+ internal Dictionary Mods { get; set; }
+ internal float EngineHealth { get; set; }
+ internal VehicleLockStatus LockStatus { get; set; }
+ internal byte RadioStation = 255;
+ internal string LicensePlate { get; set; }
+ internal int Livery { get; set; } = -1;
+ internal VehicleDataFlags Flags { get; set; }
+
+ #endregion
+
+ #region FLAGS
+
+ internal bool EngineRunning { get => Flags.HasVehFlag(VehicleDataFlags.IsEngineRunning); }
+ internal bool Transformed { get => Flags.HasVehFlag(VehicleDataFlags.IsTransformed); }
+ internal bool HornActive { get => Flags.HasVehFlag(VehicleDataFlags.IsHornActive); }
+ internal bool LightsOn { get => Flags.HasVehFlag(VehicleDataFlags.AreLightsOn); }
+ internal bool BrakeLightsOn { get => Flags.HasVehFlag(VehicleDataFlags.AreBrakeLightsOn); }
+ internal bool HighBeamsOn { get => Flags.HasVehFlag(VehicleDataFlags.AreHighBeamsOn); }
+ internal bool SireneActive { get => Flags.HasVehFlag(VehicleDataFlags.IsSirenActive); }
+ internal bool IsDead { get => Flags.HasVehFlag(VehicleDataFlags.IsDead); }
+ internal bool IsDeluxoHovering { get => Flags.HasVehFlag(VehicleDataFlags.IsDeluxoHovering); }
+ #endregion
+
+ #region FIXED-DATA
+
+ internal bool IsFlipped
+ {
+ get => IsMotorcycle || ((Quaternion * Vector3.RelativeTop).Z - (Quaternion * Vector3.RelativeBottom).Z) < 0.5;
+ }
+ internal bool IsMotorcycle;
+ internal bool IsAircraft;
+ internal bool HasRocketBoost;
+ internal bool HasParachute;
+ internal bool HasRoof;
+ internal bool IsSubmarineCar;
+ internal bool IsDeluxo;
+
+ #endregion
+
+ #region PRIVATE
+ private byte[] _lastVehicleColors = new byte[] { 0, 0 };
+ private Dictionary _lastVehicleMods = new Dictionary();
+ private bool _lastHornActive = false;
+ private bool _lastTransformed = false;
+ internal int _lastLivery = -1;
+ List _predictedTrace = new List();
+ List _orgTrace = new List();
+
+ float _elapsed;
+ #endregion
+
+ #region OUTGOING
+ internal float LastNozzleAngle { get; set; }
+
+ internal float LastEngineHealth { get; set; }
+ internal Vector3 LastVelocity { get; set; }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/RageCoop.Client/Sync/Entities/SyncedVehicle.cs b/RageCoop.Client/Sync/Entities/SyncedVehicle.cs
index fefc0b97..e3fd2305 100644
--- a/RageCoop.Client/Sync/Entities/SyncedVehicle.cs
+++ b/RageCoop.Client/Sync/Entities/SyncedVehicle.cs
@@ -12,7 +12,7 @@ namespace RageCoop.Client
///
/// A synchronized vehicle instance
///
- public class SyncedVehicle : SyncedEntity
+ public partial class SyncedVehicle : SyncedEntity
{
#region -- CONSTRUCTORS --
@@ -28,7 +28,18 @@ internal SyncedVehicle(Vehicle v)
MainVehicle=v;
MainVehicle.CanPretendOccupants=false;
OwnerID=Main.LocalPlayerID;
-
+ SetUpFixedData();
+
+ }
+ private void SetUpFixedData(){
+
+ IsAircraft = MainVehicle.IsAircraft;
+ IsMotorcycle = MainVehicle.IsMotorcycle;
+ HasRocketBoost = MainVehicle.HasRocketBoost;
+ HasParachute = MainVehicle.HasParachute;
+ HasRoof = MainVehicle.HasRoof;
+ IsSubmarineCar=MainVehicle.IsSubmarineCar;
+ IsDeluxo=MainVehicle.Model==1483171323;
}
///
@@ -47,59 +58,7 @@ internal SyncedVehicle(int id)
///
/// VehicleSeat,ID
///
- public Vehicle MainVehicle { get; internal set; }
- public Stopwatch LastSyncedStopWatch = new Stopwatch();
-
-
- #region LAST STATE
- private byte[] _lastVehicleColors = new byte[] { 0, 0 };
- private Dictionary _lastVehicleMods = new Dictionary();
- #endregion
-
- #region -- CRITICAL STUFF --
- internal Vector3 RotationVelocity { get; set; }
- internal float SteeringAngle { get; set; }
- internal float ThrottlePower { get; set; }
- internal float BrakePower { get; set; }
- internal float DeluxoWingRatio { get; set; } = -1;
- internal bool IsFlipped
- {
- get => _isMotorcycle || ((Quaternion * Vector3.RelativeTop).Z - (Quaternion * Vector3.RelativeBottom).Z) < 0.5;
- }
- private bool _isMotorcycle;
- #endregion
- #region FLAGS
- internal bool EngineRunning { get => Flags.HasVehFlag(VehicleDataFlags.IsEngineRunning); }
- private bool _lastTransformed = false;
- internal bool Transformed { get => Flags.HasVehFlag(VehicleDataFlags.IsTransformed); }
- private bool _lastHornActive = false;
- internal bool HornActive { get => Flags.HasVehFlag(VehicleDataFlags.IsHornActive); }
- internal bool LightsOn { get => Flags.HasVehFlag(VehicleDataFlags.AreLightsOn); }
- internal bool BrakeLightsOn { get => Flags.HasVehFlag(VehicleDataFlags.AreBrakeLightsOn); }
- internal bool HighBeamsOn { get => Flags.HasVehFlag(VehicleDataFlags.AreHighBeamsOn); }
- internal bool SireneActive { get => Flags.HasVehFlag(VehicleDataFlags.IsSirenActive); }
- internal bool IsDead { get => Flags.HasVehFlag(VehicleDataFlags.IsDead); }
- internal bool IsDeluxoHovering { get => Flags.HasVehFlag(VehicleDataFlags.IsDeluxoHovering); }
- #endregion
-
- #region -- VEHICLE STATE --
- internal VehicleDataFlags Flags { get; set; }
-
- internal byte LandingGear { get; set; }
- internal VehicleRoofState RoofState { get; set; }
- internal VehicleDamageModel DamageModel { get; set; }
- internal byte[] Colors { get; set; }
- internal Dictionary Mods { get; set; }
- internal float EngineHealth { get; set; }
- internal VehicleLockStatus LockStatus { get; set; }
- internal byte RadioStation = 255;
- internal string LicensePlate { get; set; }
- internal int _lastLivery = -1;
- internal int Livery { get; set; } = -1;
- List _predictedTrace = new List();
- List _orgTrace = new List();
-
- #endregion
+
internal override void Update()
{
#if DEBUG_VEH
@@ -113,12 +72,11 @@ internal override void Update()
}
#endif
-#region -- INITIAL CHECK --
// Check if all data avalible
- if (!IsReady || Owner==null ) { return; }
-#endregion
-#region -- CHECK EXISTENCE --
+ if (!IsReady || Owner == null) { return; }
+
+ // Check existence
if ((MainVehicle == null) || (!MainVehicle.Exists()) || (MainVehicle.Model != Model))
{
if (!CreateVehicle())
@@ -126,12 +84,12 @@ internal override void Update()
return;
}
}
+
// Skip update if no new sync message has arrived.
- if (!NeedUpdate) {
- return;
+ if (!NeedUpdate)
+ {
+ return;
}
-#endregion
-#region -- SYNC CRITICAL --
if (SteeringAngle != MainVehicle.SteeringAngle)
{
@@ -141,7 +99,7 @@ internal override void Update()
MainVehicle.BrakePower=BrakePower;
var v = Main.P.CurrentVehicle;
DisplayVehicle(v != null && MainVehicle.IsTouching(v));
-#region FLAGS
+
if (IsDead)
{
if (MainVehicle.IsDead)
@@ -191,24 +149,9 @@ internal override void Update()
MainVehicle.AreHighBeamsOn = HighBeamsOn;
}
- if (MainVehicle.IsSubmarineCar)
- {
- if (Transformed)
- {
- if (!_lastTransformed)
- {
- _lastTransformed = true;
- Function.Call(Hash._TRANSFORM_VEHICLE_TO_SUBMARINE, MainVehicle.Handle, false);
- }
- }
- else if (_lastTransformed)
- {
- _lastTransformed = false;
- Function.Call(Hash._TRANSFORM_SUBMARINE_TO_VEHICLE, MainVehicle.Handle, false);
- }
- }
+
- if (MainVehicle.IsAircraft)
+ if (IsAircraft)
{
if (LandingGear != (byte)MainVehicle.LandingGearState)
{
@@ -236,30 +179,37 @@ internal override void Update()
MainVehicle.SoundHorn(1);
}
- if (MainVehicle.HasRoof && MainVehicle.RoofState!=RoofState)
+ if (HasRoof && MainVehicle.RoofState!=RoofState)
{
MainVehicle.RoofState=RoofState;
}
- if(MainVehicle.HasRocketBoost){
- if(Flags.HasFlag(VehicleDataFlags.IsRocketBoostActive) )
+ if(HasRocketBoost && Flags.HasFlag(VehicleDataFlags.IsRocketBoostActive) != MainVehicle.IsRocketBoostActive()){
+ MainVehicle.SetRocketBoostActive(Flags.HasFlag(VehicleDataFlags.IsRocketBoostActive));
+ }
+ if(HasParachute && Flags.HasFlag(VehicleDataFlags.IsParachuteActive) != MainVehicle.IsParachuteActive()){
+ MainVehicle.SetParachuteActive(Flags.HasFlag(VehicleDataFlags.IsParachuteActive));
+ }
+ if (IsSubmarineCar)
+ {
+ if (Transformed)
{
- if(!MainVehicle.IsRocketBoostActive()){
- MainVehicle.SetRocketBoostActive(true);
+ if (!_lastTransformed)
+ {
+ _lastTransformed = true;
+ Function.Call(Hash._TRANSFORM_VEHICLE_TO_SUBMARINE, MainVehicle.Handle, false);
}
}
- else if(MainVehicle.IsRocketBoostActive()){
- MainVehicle.SetRocketBoostActive(false);
+ else if (_lastTransformed)
+ {
+ _lastTransformed = false;
+ Function.Call(Hash._TRANSFORM_SUBMARINE_TO_VEHICLE, MainVehicle.Handle, false);
}
}
- if(MainVehicle.HasParachute){
- if(Flags.HasFlag(VehicleDataFlags.IsParachuteActive)){
- if(!MainVehicle.IsParachuteActive()){
- MainVehicle.SetParachuteActive(true);
- }
- }
- else if(MainVehicle.IsParachuteActive()){
- MainVehicle.SetParachuteActive(false);
+ else if(IsDeluxo && IsDeluxoHovering!=MainVehicle.IsDeluxoHovering()){
+ MainVehicle.SetDeluxoHoverState(IsDeluxoHovering);
+ if(IsDeluxoHovering){
+ MainVehicle.SetDeluxoWingRatio(DeluxoWingRatio);
}
}
@@ -268,24 +218,7 @@ internal override void Update()
}
MainVehicle.LockStatus=LockStatus;
- if (IsDeluxoHovering)
- {
- if (!MainVehicle.IsDeluxoHovering())
- {
- MainVehicle.SetDeluxoHoverState(true);
- }
- MainVehicle.SetDeluxoWingRatio(DeluxoWingRatio);
- }
- else if (Model==1483171323)
- {
- if (MainVehicle.IsDeluxoHovering())
- {
- MainVehicle.SetDeluxoHoverState(false);
- }
- }
-#endregion
-#endregion
if (LastFullSynced>=LastUpdated)
{
#region -- SYNC STATE --
@@ -326,25 +259,24 @@ internal override void Update()
}
LastUpdated=Main.Ticked;
}
- float _elapsed;
- Vector3 _predictedPos;
void DisplayVehicle(bool touching)
{
_elapsed = Owner.PacketTravelTime+0.001f*LastSyncedStopWatch.ElapsedMilliseconds;
- _predictedPos = Position+_elapsed*Velocity;
+ Position += _elapsed*Velocity;
var current = MainVehicle.ReadPosition();
- var dist = current.DistanceTo(_predictedPos);
- var cali = dist*(_predictedPos - current);
+ var dist = current.DistanceTo(Position);
+ var cali = dist*(Position - current);
if (Velocity.Length()<0.1) { cali*=10; }
if (dist>10)
{
- MainVehicle.Position = _predictedPos;
+ MainVehicle.Position = Position;
MainVehicle.Velocity = Velocity;
MainVehicle.Quaternion = Quaternion;
return;
}
MainVehicle.Velocity = Velocity+cali;
+
if (IsFlipped)
{
MainVehicle.Quaternion = Quaternion.Slerp(MainVehicle.ReadQuaternion(), Quaternion, 0.5f);
@@ -420,7 +352,7 @@ private bool CreateVehicle()
w.Fix();
}
if (IsInvincible) { MainVehicle.IsInvincible=true; }
- _isMotorcycle=Model.IsMotorcycle;
+ SetUpFixedData();
Model.MarkAsNoLongerNeeded();
return true;
}
@@ -461,11 +393,6 @@ private void StopPedalingAnim(bool fast)
}
#endregion
-#region OUTGOING
- internal float LastNozzleAngle { get; set; }
- internal float LastEngineHealth { get; set; }
- internal Vector3 LastVelocity { get; set; }
-#endregion
}
}
diff --git a/RageCoop.Client/Util/VehicleExtensions.cs b/RageCoop.Client/Util/VehicleExtensions.cs
index d48a2b40..cf2aa578 100644
--- a/RageCoop.Client/Util/VehicleExtensions.cs
+++ b/RageCoop.Client/Util/VehicleExtensions.cs
@@ -10,8 +10,9 @@ internal static class VehicleExtensions
{
#region VEHICLE
- public static VehicleDataFlags GetVehicleFlags(this Vehicle veh)
+ public static VehicleDataFlags GetVehicleFlags(this SyncedVehicle v)
{
+ var veh=v.MainVehicle;
VehicleDataFlags flags = 0;
if (veh.IsEngineRunning)
@@ -49,27 +50,27 @@ public static VehicleDataFlags GetVehicleFlags(this Vehicle veh)
flags |= VehicleDataFlags.IsHornActive;
}
- if (veh.IsSubmarineCar && Function.Call(Hash._GET_IS_SUBMARINE_VEHICLE_TRANSFORMED, veh.Handle))
+ if (v.IsSubmarineCar && Function.Call(Hash._GET_IS_SUBMARINE_VEHICLE_TRANSFORMED, veh.Handle))
{
flags |= VehicleDataFlags.IsTransformed;
}
- if (veh.IsAircraft)
+ if (v.IsAircraft)
{
flags |= VehicleDataFlags.IsAircraft;
}
- if (veh.Model.Hash==1483171323 && veh.IsDeluxoHovering())
+ if (v.IsDeluxo && veh.IsDeluxoHovering())
{
flags|= VehicleDataFlags.IsDeluxoHovering;
}
- if (veh.HasRoof)
+ if (v.HasRoof)
{
flags|=VehicleDataFlags.HasRoof;
}
- if (veh.IsRocketBoostActive())
+ if (v.HasRocketBoost && veh.IsRocketBoostActive())
{
flags|=VehicleDataFlags.IsRocketBoostActive;
}
- if(veh.IsParachuteActive()){
+ if(v.HasParachute && veh.IsParachuteActive()){
flags|=VehicleDataFlags.IsParachuteActive;
}
if (veh.IsOnFire)