diff --git a/RageCoop.Client/Networking/Receive.cs b/RageCoop.Client/Networking/Receive.cs index e277d59..bc28b2a 100644 --- a/RageCoop.Client/Networking/Receive.cs +++ b/RageCoop.Client/Networking/Receive.cs @@ -222,27 +222,6 @@ namespace RageCoop.Client } break; - case PacketType.VehicleStateSync: - { - - Packets.VehicleStateSync packet = new Packets.VehicleStateSync(); - packet.Unpack(data); - VehicleStateSync(packet); - - } - break; - /* - case PacketType.PedStateSync: - { - - - Packets.PedStateSync packet = new Packets.PedStateSync(); - packet.Unpack(data); - PedStateSync(packet); - - } - break; - */ case PacketType.ProjectileSync: { Packets.ProjectileSync packet = new Packets.ProjectileSync(); @@ -339,27 +318,10 @@ namespace RageCoop.Client c.BlipColor=packet.BlipColor; c.BlipSprite=packet.BlipSprite; c.BlipScale=packet.BlipScale; - c.LastStateSynced = Main.Ticked; + c.LastFullSynced = Main.Ticked; } } - /* - private static void PedStateSync(Packets.PedStateSync packet) - { - SyncedPed c = EntityPool.GetPedByID(packet.ID); - if (c==null) { return; } - c.ID=packet.ID; - c.OwnerID=packet.OwnerID; - c.Clothes=packet.Clothes; - c.WeaponComponents=packet.WeaponComponents; - c.WeaponTint=packet.WeaponTint; - c.Model=packet.ModelHash; - c.BlipColor=packet.BlipColor; - c.BlipSprite=packet.BlipSprite; - c.BlipScale=packet.BlipScale; - c.LastStateSynced = Main.Ticked; - } - */ private static void VehicleSync(Packets.VehicleSync packet) { SyncedVehicle v = EntityPool.GetVehicleByID(packet.ID); @@ -369,6 +331,8 @@ namespace RageCoop.Client } if (v.IsLocal) { return; } v.ID= packet.ID; + v.OwnerID= packet.OwnerID; + v.Flags=packet.Flag; v.Position=packet.Position; v.Quaternion=packet.Quaternion; v.SteeringAngle=packet.SteeringAngle; @@ -378,44 +342,37 @@ namespace RageCoop.Client v.RotationVelocity=packet.RotationVelocity; v.DeluxoWingRatio=packet.DeluxoWingRatio; v.LastSynced=Main.Ticked; - } - private static void VehicleStateSync(Packets.VehicleStateSync packet) - { - SyncedVehicle v = EntityPool.GetVehicleByID(packet.ID); - if (v==null||v.IsLocal) { return; } - v.ID= packet.ID; - v.OwnerID= packet.OwnerID; - v.DamageModel=packet.DamageModel; - v.EngineHealth=packet.EngineHealth; - v.OwnerID=packet.OwnerID; - v.Mods=packet.Mods; - v.Model=packet.ModelHash; - v.Colors=packet.Colors; - v.LandingGear=packet.LandingGear; - v.RoofState=(VehicleRoofState)packet.RoofState; - v.EngineRunning = packet.Flag.HasVehFlag(VehicleDataFlags.IsEngineRunning); - v.LightsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreLightsOn); - v.BrakeLightsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreBrakeLightsOn); - v.HighBeamsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreHighBeamsOn); - v.SireneActive = packet.Flag.HasVehFlag(VehicleDataFlags.IsSirenActive); - v.IsDead = packet.Flag.HasVehFlag(VehicleDataFlags.IsDead); - v.HornActive = packet.Flag.HasVehFlag(VehicleDataFlags.IsHornActive); - v.Transformed = packet.Flag.HasVehFlag(VehicleDataFlags.IsTransformed); - v.Passengers=new Dictionary(); - v.LockStatus=packet.LockStatus; - v.RadioStation=packet.RadioStation; - v.LicensePlate=packet.LicensePlate; - v.Livery=packet.Livery; - v.Flags=packet.Flag; - foreach (KeyValuePair pair in packet.Passengers) + if (packet.Flag.HasVehFlag(VehicleDataFlags.IsFullSync)) { - if (EntityPool.PedExists(pair.Value)) + v.DamageModel=packet.DamageModel; + v.EngineHealth=packet.EngineHealth; + v.Mods=packet.Mods; + v.Model=packet.ModelHash; + v.Colors=packet.Colors; + v.LandingGear=packet.LandingGear; + v.RoofState=(VehicleRoofState)packet.RoofState; + v.EngineRunning = packet.Flag.HasVehFlag(VehicleDataFlags.IsEngineRunning); + v.LightsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreLightsOn); + v.BrakeLightsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreBrakeLightsOn); + v.HighBeamsOn = packet.Flag.HasVehFlag(VehicleDataFlags.AreHighBeamsOn); + v.SireneActive = packet.Flag.HasVehFlag(VehicleDataFlags.IsSirenActive); + v.IsDead = packet.Flag.HasVehFlag(VehicleDataFlags.IsDead); + v.HornActive = packet.Flag.HasVehFlag(VehicleDataFlags.IsHornActive); + v.Transformed = packet.Flag.HasVehFlag(VehicleDataFlags.IsTransformed); + v.Passengers=new Dictionary(); + v.LockStatus=packet.LockStatus; + v.RadioStation=packet.RadioStation; + v.LicensePlate=packet.LicensePlate; + v.Livery=packet.Livery; + foreach (KeyValuePair pair in packet.Passengers) { - v.Passengers.Add((VehicleSeat)pair.Key, EntityPool.GetPedByID(pair.Value)); + if (EntityPool.PedExists(pair.Value)) + { + v.Passengers.Add((VehicleSeat)pair.Key, EntityPool.GetPedByID(pair.Value)); + } } + v.LastFullSynced= Main.Ticked; } - v.LastStateSynced= Main.Ticked; - } private static void ProjectileSync(Packets.ProjectileSync packet) { diff --git a/RageCoop.Client/Networking/Send.cs b/RageCoop.Client/Networking/Send.cs index a4bb04c..95440f9 100644 --- a/RageCoop.Client/Networking/Send.cs +++ b/RageCoop.Client/Networking/Send.cs @@ -72,56 +72,50 @@ namespace RageCoop.Client } Send(packet, ConnectionChannel.PedSync); } - public static void SendVehicle(SyncedVehicle v) + public static void SendVehicle(SyncedVehicle v,bool full) { Vehicle veh = v.MainVehicle; var packet = new Packets.VehicleSync() { ID =v.ID, + OwnerID=v.OwnerID, + Flag = veh.GetVehicleFlags(), SteeringAngle = veh.SteeringAngle, Position = veh.PredictPosition(), Quaternion=veh.Quaternion, - // Rotation = veh.Rotation, Velocity = veh.Velocity, RotationVelocity=veh.RotationVelocity, ThrottlePower = veh.ThrottlePower, BrakePower = veh.BrakePower, }; - if (v.MainVehicle.Model.Hash==1483171323) { packet.DeluxoWingRatio=v.MainVehicle.GetDeluxoWingRatio(); } + if (packet.Flag.HasVehFlag(VehicleDataFlags.IsDeluxoHovering)) { packet.DeluxoWingRatio=v.MainVehicle.GetDeluxoWingRatio(); } + if (full) + { + byte primaryColor = 0; + byte secondaryColor = 0; + unsafe + { + Function.Call(Hash.GET_VEHICLE_COLOURS, veh, &primaryColor, &secondaryColor); + } + packet.Flag |= VehicleDataFlags.IsFullSync; + packet.Colors = new byte[] { primaryColor, secondaryColor }; + packet.DamageModel=veh.GetVehicleDamageModel(); + packet.LandingGear = veh.IsAircraft ? (byte)veh.LandingGearState : (byte)0; + packet.RoofState=(byte)veh.RoofState; + packet.Mods = veh.Mods.GetVehicleMods(); + packet.ModelHash=veh.Model.Hash; + packet.EngineHealth=veh.EngineHealth; + packet.Passengers=veh.GetPassengers(); + packet.LockStatus=veh.LockStatus; + packet.LicensePlate=Function.Call(Hash.GET_VEHICLE_NUMBER_PLATE_TEXT, veh); + packet.Livery=Function.Call(Hash.GET_VEHICLE_LIVERY, veh); + if (v.MainVehicle==Game.Player.LastVehicle) + { + packet.RadioStation=Util.GetPlayerRadioIndex(); + } + } Send(packet,ConnectionChannel.VehicleSync); } - public static void SendVehicleState(SyncedVehicle v) - { - Vehicle veh = v.MainVehicle; - byte primaryColor = 0; - byte secondaryColor = 0; - unsafe - { - Function.Call(Hash.GET_VEHICLE_COLOURS, veh, &primaryColor, &secondaryColor); - } - var packet = new Packets.VehicleStateSync() - { - ID =v.ID, - OwnerID = v.OwnerID, - Flag = veh.GetVehicleFlags(), - Colors=new byte[] { primaryColor, secondaryColor }, - DamageModel=veh.GetVehicleDamageModel(), - LandingGear = veh.IsAircraft ? (byte)veh.LandingGearState : (byte)0, - RoofState=(byte)veh.RoofState, - Mods = veh.Mods.GetVehicleMods(), - ModelHash=veh.Model.Hash, - EngineHealth=veh.EngineHealth, - Passengers=veh.GetPassengers(), - LockStatus=veh.LockStatus, - LicensePlate=Function.Call(Hash.GET_VEHICLE_NUMBER_PLATE_TEXT, veh), - Livery=Function.Call(Hash.GET_VEHICLE_LIVERY, veh) - }; - if (v.MainVehicle==Game.Player.LastVehicle) - { - packet.RadioStation=Util.GetPlayerRadioIndex(); - } - Send(packet, ConnectionChannel.VehicleSync); - } public static void SendProjectile(SyncedProjectile sp) { var p = sp.MainProjectile; diff --git a/RageCoop.Client/Sync/Entities/SyncedEntity.cs b/RageCoop.Client/Sync/Entities/SyncedEntity.cs index f4059d0..69c5d48 100644 --- a/RageCoop.Client/Sync/Entities/SyncedEntity.cs +++ b/RageCoop.Client/Sync/Entities/SyncedEntity.cs @@ -45,12 +45,12 @@ namespace RageCoop.Client } internal bool IsReady { - get {return (LastSynced>0||LastStateSynced==0);} + get {return (LastSynced>0||LastFullSynced==0);} } internal bool IsInvincible { get; set; } = false; internal bool NeedUpdate { - get { return LastSynced>LastUpdated; } + get { return LastSynced>=LastUpdated; } } #region LAST STATE /// @@ -60,7 +60,7 @@ namespace RageCoop.Client /// /// Last time a new sync message arrived. /// - public ulong LastStateSynced { get; internal set; } = 0; + public ulong LastFullSynced { get; internal set; } = 0; /// /// Last time the local entity has been updated, /// diff --git a/RageCoop.Client/Sync/Entities/SyncedPed.cs b/RageCoop.Client/Sync/Entities/SyncedPed.cs index f736869..8423aa5 100644 --- a/RageCoop.Client/Sync/Entities/SyncedPed.cs +++ b/RageCoop.Client/Sync/Entities/SyncedPed.cs @@ -116,7 +116,7 @@ namespace RageCoop.Client // Need to update state - if (LastStateSynced>=LastUpdated) + if (LastFullSynced>=LastUpdated) { if (MainPed!=null&& (Model != MainPed.Model.Hash)) { diff --git a/RageCoop.Client/Sync/Entities/SyncedVehicle.cs b/RageCoop.Client/Sync/Entities/SyncedVehicle.cs index 2ee5f5d..bd4106c 100644 --- a/RageCoop.Client/Sync/Entities/SyncedVehicle.cs +++ b/RageCoop.Client/Sync/Entities/SyncedVehicle.cs @@ -165,7 +165,7 @@ namespace RageCoop.Client MainVehicle.SetDeluxoWingRatio(DeluxoWingRatio); } #endregion - if (LastStateSynced>LastUpdated) + if (LastFullSynced>LastUpdated) { #region -- SYNC STATE -- #region -- PASSENGER SYNC -- diff --git a/RageCoop.Client/Sync/EntityPool.cs b/RageCoop.Client/Sync/EntityPool.cs index 1776d6f..f65dacf 100644 --- a/RageCoop.Client/Sync/EntityPool.cs +++ b/RageCoop.Client/Sync/EntityPool.cs @@ -541,13 +541,7 @@ namespace RageCoop.Client if (!v.MainVehicle.IsVisible) { continue; } SyncEvents.Check(v); - Networking.SendVehicle(v); - - // Send state - if ((i-vehStateIndex) - /// For non-critical properties, synced every 20 frames. - /// - internal class PedStateSync : Packet - { - public int ID { get; set; } - - public int ModelHash { get; set; } - - public byte[] Clothes { get; set; } - - public int OwnerID { get; set; } - - public Dictionary WeaponComponents { get; set; } - - public byte WeaponTint { get;set; } - public BlipColor BlipColor { get; set; } = (BlipColor)255; - - public BlipSprite BlipSprite { get; set; }= 0; - public float BlipScale { get; set; } = 1; - - public override void Pack(NetOutgoingMessage message) - { - #region PacketToNetOutGoingMessage - message.Write((byte)PacketType.PedStateSync); - - List byteArray = new List(); - - // Write ID - byteArray.AddInt(ID); - - // Write model hash - byteArray.AddInt(ModelHash); - - byteArray.AddRange(Clothes); - - //Write OwnerID for this ped - byteArray.AddRange(BitConverter.GetBytes(OwnerID)); - - // Write player weapon components - if (WeaponComponents != null) - { - byteArray.Add(0x01); - byteArray.AddRange(BitConverter.GetBytes((ushort)WeaponComponents.Count)); - foreach (KeyValuePair component in WeaponComponents) - { - byteArray.AddRange(BitConverter.GetBytes(component.Key)); - byteArray.AddRange(BitConverter.GetBytes(component.Value)); - } - } - else - { - // Player weapon doesn't have any components - byteArray.Add(0x00); - } - - byteArray.Add(WeaponTint); - - byteArray.Add((byte)BlipColor); - if ((byte)BlipColor!=255) - { - byteArray.AddUshort((ushort)BlipSprite); - byteArray.AddFloat(BlipScale); - } - - byte[] result = byteArray.ToArray(); - message.Write(result.Length); - message.Write(result); - #endregion - } - - public override void Unpack(byte[] array) - { - #region NetIncomingMessageToPacket - BitReader reader = new BitReader(array); - - // Read player netHandle - ID = reader.ReadInt(); - - // Read player model hash - ModelHash = reader.ReadInt(); - - // Read player clothes - Clothes =reader.ReadByteArray(36); - - // Read ped OwnerID - OwnerID= reader.ReadInt(); - - // Read player weapon components - if (reader.ReadBool()) - { - WeaponComponents = new Dictionary(); - ushort comCount = reader.ReadUShort(); - for (ushort i = 0; i < comCount; i++) - { - WeaponComponents.Add(reader.ReadUInt(), reader.ReadBool()); - } - } - WeaponTint=reader.ReadByte(); - - BlipColor=(BlipColor)reader.ReadByte(); - - if ((byte)BlipColor!=255) - { - BlipSprite=(BlipSprite)reader.ReadUShort(); - BlipScale=reader.ReadFloat(); - } - #endregion - } - } - internal class PedSync : Packet { diff --git a/RageCoop.Core/Packets/VehiclePackets.cs b/RageCoop.Core/Packets/VehiclePackets.cs index 35cf5d9..5876d56 100644 --- a/RageCoop.Core/Packets/VehiclePackets.cs +++ b/RageCoop.Core/Packets/VehiclePackets.cs @@ -10,241 +10,15 @@ namespace RageCoop.Core { internal partial class Packets { - /// - /// Non-critical stuff, such as damage model, landing gear, health, etc.. - /// - internal class VehicleStateSync : Packet - { - public int ID { get; set; } - - // ID of player responsible for syncing this vehicle - public int OwnerID { get; set; } - - public int ModelHash { get; set; } - - public float EngineHealth { get; set; } - - public byte[] Colors { get; set; } - - public Dictionary Mods { get; set; } - - public VehicleDamageModel DamageModel { get; set; } - - public byte LandingGear { get; set; } - public byte RoofState { get; set; } - - public VehicleDataFlags Flag { get; set; } - - - public VehicleLockStatus LockStatus { get; set; } - - public int Livery { get; set; } = -1; - - /// - /// VehicleSeat,PedID - /// - public Dictionary Passengers { get; set; } - - public byte RadioStation { get; set; } = 255; - public string LicensePlate { get; set; } - public override void Pack(NetOutgoingMessage message) - { - #region PacketToNetOutGoingMessage - message.Write((byte)PacketType.VehicleStateSync); - - List byteArray = new List(); - - // Write player netHandle - byteArray.AddRange(BitConverter.GetBytes(ID)); - - //Write vehicle flag - byteArray.AddRange(BitConverter.GetBytes((ushort)Flag)); - - // Write vehicle model hash - byteArray.AddRange(BitConverter.GetBytes(ModelHash)); - - - // Write vehicle engine health - byteArray.AddRange(BitConverter.GetBytes(EngineHealth)); - - // Check - if (Flag.HasVehFlag(VehicleDataFlags.IsAircraft)) - { - // Write the vehicle landing gear - byteArray.Add(LandingGear); - } - if (Flag.HasVehFlag(VehicleDataFlags.HasRoof)) - { - byteArray.Add(RoofState); - } - - // Write vehicle colors - byteArray.Add(Colors[0]); - byteArray.Add(Colors[1]); - - // Write vehicle mods - // Write the count of mods - byteArray.AddRange(BitConverter.GetBytes((short)Mods.Count)); - // Loop the dictionary and add the values - foreach (KeyValuePair mod in Mods) - { - // Write the mod value - byteArray.AddRange(BitConverter.GetBytes(mod.Key)); - byteArray.AddRange(BitConverter.GetBytes(mod.Value)); - } - - if (!DamageModel.Equals(default(VehicleDamageModel))) - { - // Write boolean = true - byteArray.Add(0x01); - // Write vehicle damage model - byteArray.Add(DamageModel.BrokenDoors); - byteArray.Add(DamageModel.OpenedDoors); - byteArray.Add(DamageModel.BrokenWindows); - byteArray.AddRange(BitConverter.GetBytes(DamageModel.BurstedTires)); - byteArray.Add(DamageModel.LeftHeadLightBroken); - byteArray.Add(DamageModel.RightHeadLightBroken); - } - else - { - // Write boolean = false - byteArray.Add(0x00); - } - - // Write OwnerID - byteArray.AddRange(BitConverter.GetBytes(OwnerID)); - - // Write passengers - byteArray.AddRange(BitConverter.GetBytes(Passengers.Count)); - - foreach (KeyValuePair p in Passengers) - { - byteArray.AddRange(BitConverter.GetBytes(p.Key)); - byteArray.AddRange(BitConverter.GetBytes(p.Value)); - } - - - - // Write LockStatus - byteArray.Add((byte)LockStatus); - - // Write RadioStation - byteArray.Add(RadioStation); - - // Write LicensePlate - while (LicensePlate.Length<8) - { - LicensePlate+=" "; - } - if (LicensePlate.Length>8) - { - LicensePlate=new string(LicensePlate.Take(8).ToArray()); - } - byteArray.AddRange(Encoding.ASCII.GetBytes(LicensePlate)); - - byteArray.Add((byte)(Livery+1)); - - byte[] result = byteArray.ToArray(); - - message.Write(result.Length); - message.Write(result); - #endregion - } - - public override void Unpack(byte[] array) - { - #region NetIncomingMessageToPacket - BitReader reader = new BitReader(array); - - // Read vehicle id - ID = reader.ReadInt(); - - // Read vehicle flags - Flag = (VehicleDataFlags)reader.ReadUShort(); - - // Read vehicle model hash - ModelHash = reader.ReadInt(); - - // Read vehicle engine health - EngineHealth = reader.ReadFloat(); - - - // Check - if (Flag.HasVehFlag(VehicleDataFlags.IsAircraft)) - { - // Read vehicle landing gear - LandingGear = reader.ReadByte(); - } - if (Flag.HasVehFlag(VehicleDataFlags.HasRoof)) - { - RoofState=reader.ReadByte(); - } - - // Read vehicle colors - byte vehColor1 = reader.ReadByte(); - byte vehColor2 = reader.ReadByte(); - Colors = new byte[] { vehColor1, vehColor2 }; - - // Read vehicle mods - // Create new Dictionary - Mods = new Dictionary(); - // Read count of mods - short vehModCount = reader.ReadShort(); - // Loop - for (int i = 0; i < vehModCount; i++) - { - // Read the mod value - Mods.Add(reader.ReadInt(), reader.ReadInt()); - } - - if (reader.ReadBool()) - { - // Read vehicle damage model - DamageModel = new VehicleDamageModel() - { - BrokenDoors = reader.ReadByte(), - OpenedDoors=reader.ReadByte(), - BrokenWindows = reader.ReadByte(), - BurstedTires = reader.ReadShort(), - LeftHeadLightBroken = reader.ReadByte(), - RightHeadLightBroken = reader.ReadByte() - }; - } - - // Read OwnerID - OwnerID= reader.ReadInt(); - - - // Read Passengers - Passengers=new Dictionary(); - int count = reader.ReadInt(); - for (int i = 0; i Mods { get; set; } + + public VehicleDamageModel DamageModel { get; set; } + + public byte LandingGear { get; set; } + public byte RoofState { get; set; } + + + + public VehicleLockStatus LockStatus { get; set; } + + public int Livery { get; set; } = -1; + + /// + /// VehicleSeat,PedID + /// + public Dictionary Passengers { get; set; } + + public byte RadioStation { get; set; } = 255; + public string LicensePlate { get; set; } + #endregion + public override void Pack(NetOutgoingMessage message) { #region PacketToNetOutGoingMessage @@ -266,37 +69,101 @@ namespace RageCoop.Core List byteArray = new List(); - // Write vehicle id byteArray.AddInt(ID); - - // Write position + byteArray.AddInt(OwnerID); + byteArray.AddUshort((ushort)Flag); byteArray.AddVector3(Position); - - - // Write quaternion - //byteArray.AddVector3(Rotation); byteArray.AddQuaternion(Quaternion); - - // Write velocity byteArray.AddVector3(Velocity); - - // Write rotation velocity byteArray.AddVector3(RotationVelocity); - - byteArray.AddFloat(ThrottlePower); - byteArray.AddFloat(BrakePower); - - // Write vehicle steering angle byteArray.AddFloat(SteeringAngle); - if (DeluxoWingRatio!=-1) + if (Flag.HasVehFlag(VehicleDataFlags.IsDeluxoHovering)) { byteArray.AddFloat(DeluxoWingRatio); } + if (Flag.HasVehFlag(VehicleDataFlags.IsFullSync)) + { + byteArray.AddInt(ModelHash); + byteArray.AddFloat(EngineHealth); + // Check + if (Flag.HasVehFlag(VehicleDataFlags.IsAircraft)) + { + // Write the vehicle landing gear + byteArray.Add(LandingGear); + } + if (Flag.HasVehFlag(VehicleDataFlags.HasRoof)) + { + byteArray.Add(RoofState); + } + + // Write vehicle colors + byteArray.Add(Colors[0]); + byteArray.Add(Colors[1]); + + // Write vehicle mods + // Write the count of mods + byteArray.AddRange(BitConverter.GetBytes((short)Mods.Count)); + // Loop the dictionary and add the values + foreach (KeyValuePair mod in Mods) + { + // Write the mod value + byteArray.AddRange(BitConverter.GetBytes(mod.Key)); + byteArray.AddRange(BitConverter.GetBytes(mod.Value)); + } + + if (!DamageModel.Equals(default(VehicleDamageModel))) + { + // Write boolean = true + byteArray.Add(0x01); + // Write vehicle damage model + byteArray.Add(DamageModel.BrokenDoors); + byteArray.Add(DamageModel.OpenedDoors); + byteArray.Add(DamageModel.BrokenWindows); + byteArray.AddRange(BitConverter.GetBytes(DamageModel.BurstedTires)); + byteArray.Add(DamageModel.LeftHeadLightBroken); + byteArray.Add(DamageModel.RightHeadLightBroken); + } + else + { + // Write boolean = false + byteArray.Add(0x00); + } + + // Write passengers + byteArray.AddRange(BitConverter.GetBytes(Passengers.Count)); + + foreach (KeyValuePair p in Passengers) + { + byteArray.AddRange(BitConverter.GetBytes(p.Key)); + byteArray.AddRange(BitConverter.GetBytes(p.Value)); + } + + + + // Write LockStatus + byteArray.Add((byte)LockStatus); + + // Write RadioStation + byteArray.Add(RadioStation); + + // Write LicensePlate + while (LicensePlate.Length<8) + { + LicensePlate+=" "; + } + if (LicensePlate.Length>8) + { + LicensePlate=new string(LicensePlate.Take(8).ToArray()); + } + byteArray.AddRange(Encoding.ASCII.GetBytes(LicensePlate)); + + byteArray.Add((byte)(Livery+1)); + } byte[] result = byteArray.ToArray(); message.Write(result.Length); @@ -312,11 +179,14 @@ namespace RageCoop.Core // Read vehicle id ID = reader.ReadInt(); + OwnerID = reader.ReadInt(); + + Flag=(VehicleDataFlags)reader.ReadUShort(); + // Read position Position = reader.ReadVector3(); // Read quaternion - // Rotation = reader.ReadVector3(); Quaternion=reader.ReadQuaternion(); // Read velocity @@ -335,9 +205,85 @@ namespace RageCoop.Core SteeringAngle = reader.ReadFloat(); - if (reader.CanRead(4)) + if (Flag.HasVehFlag(VehicleDataFlags.IsDeluxoHovering)) { - DeluxoWingRatio= reader.ReadFloat(); + DeluxoWingRatio = reader.ReadFloat(); + } + + if (Flag.HasVehFlag(VehicleDataFlags.IsFullSync)) + { + // Read vehicle model hash + ModelHash = reader.ReadInt(); + + // Read vehicle engine health + EngineHealth = reader.ReadFloat(); + + + // Check + if (Flag.HasVehFlag(VehicleDataFlags.IsAircraft)) + { + // Read vehicle landing gear + LandingGear = reader.ReadByte(); + } + if (Flag.HasVehFlag(VehicleDataFlags.HasRoof)) + { + RoofState=reader.ReadByte(); + } + + // Read vehicle colors + byte vehColor1 = reader.ReadByte(); + byte vehColor2 = reader.ReadByte(); + Colors = new byte[] { vehColor1, vehColor2 }; + + // Read vehicle mods + // Create new Dictionary + Mods = new Dictionary(); + // Read count of mods + short vehModCount = reader.ReadShort(); + // Loop + for (int i = 0; i < vehModCount; i++) + { + // Read the mod value + Mods.Add(reader.ReadInt(), reader.ReadInt()); + } + + if (reader.ReadBool()) + { + // Read vehicle damage model + DamageModel = new VehicleDamageModel() + { + BrokenDoors = reader.ReadByte(), + OpenedDoors=reader.ReadByte(), + BrokenWindows = reader.ReadByte(), + BurstedTires = reader.ReadShort(), + LeftHeadLightBroken = reader.ReadByte(), + RightHeadLightBroken = reader.ReadByte() + }; + } + + + // Read Passengers + Passengers=new Dictionary(); + int count = reader.ReadInt(); + for (int i = 0; i Entities.Update(packet, client)); - - - foreach (var c in Clients.Values) - { - if (c.NetID==client.NetID) { continue; } - NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage(); - packet.Pack(outgoingMessage); - MainNetServer.SendMessage(outgoingMessage, c.Connection, NetDeliveryMethod.UnreliableSequenced, (byte)ConnectionChannel.PedSync); - } - } private void PedSync(Packets.PedSync packet, Client client) { _worker.QueueJob(() => Entities.Update(packet, client));