Merge vehicle sync packet, comment cleanup
This commit is contained in:
@ -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<VehicleSeat, SyncedPed>();
|
||||
v.LockStatus=packet.LockStatus;
|
||||
v.RadioStation=packet.RadioStation;
|
||||
v.LicensePlate=packet.LicensePlate;
|
||||
v.Livery=packet.Livery;
|
||||
v.Flags=packet.Flag;
|
||||
foreach (KeyValuePair<int, int> 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<VehicleSeat, SyncedPed>();
|
||||
v.LockStatus=packet.LockStatus;
|
||||
v.RadioStation=packet.RadioStation;
|
||||
v.LicensePlate=packet.LicensePlate;
|
||||
v.Livery=packet.Livery;
|
||||
foreach (KeyValuePair<int, int> 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)
|
||||
{
|
||||
|
@ -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<byte>(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<string>(Hash.GET_VEHICLE_NUMBER_PLATE_TEXT, veh);
|
||||
packet.Livery=Function.Call<int>(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<byte>(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<string>(Hash.GET_VEHICLE_NUMBER_PLATE_TEXT, veh),
|
||||
Livery=Function.Call<int>(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;
|
||||
|
@ -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
|
||||
/// <summary>
|
||||
@ -60,7 +60,7 @@ namespace RageCoop.Client
|
||||
/// <summary>
|
||||
/// Last time a new sync message arrived.
|
||||
/// </summary>
|
||||
public ulong LastStateSynced { get; internal set; } = 0;
|
||||
public ulong LastFullSynced { get; internal set; } = 0;
|
||||
/// <summary>
|
||||
/// Last time the local entity has been updated,
|
||||
/// </summary>
|
||||
|
@ -116,7 +116,7 @@ namespace RageCoop.Client
|
||||
|
||||
|
||||
// Need to update state
|
||||
if (LastStateSynced>=LastUpdated)
|
||||
if (LastFullSynced>=LastUpdated)
|
||||
{
|
||||
if (MainPed!=null&& (Model != MainPed.Model.Hash))
|
||||
{
|
||||
|
@ -165,7 +165,7 @@ namespace RageCoop.Client
|
||||
MainVehicle.SetDeluxoWingRatio(DeluxoWingRatio);
|
||||
}
|
||||
#endregion
|
||||
if (LastStateSynced>LastUpdated)
|
||||
if (LastFullSynced>LastUpdated)
|
||||
{
|
||||
#region -- SYNC STATE --
|
||||
#region -- PASSENGER SYNC --
|
||||
|
@ -541,13 +541,7 @@ namespace RageCoop.Client
|
||||
if (!v.MainVehicle.IsVisible) { continue; }
|
||||
SyncEvents.Check(v);
|
||||
|
||||
Networking.SendVehicle(v);
|
||||
|
||||
// Send state
|
||||
if ((i-vehStateIndex)<vehStatesPerFrame)
|
||||
{
|
||||
Networking.SendVehicleState(v);
|
||||
}
|
||||
Networking.SendVehicle(v, (i-vehStateIndex)<vehStatesPerFrame);
|
||||
|
||||
}
|
||||
else // Incoming sync
|
||||
|
@ -36,9 +36,7 @@ namespace RageCoop.Core
|
||||
|
||||
#region INTERVAL
|
||||
VehicleSync = 20,
|
||||
VehicleStateSync = 21,
|
||||
PedSync = 22,
|
||||
PedStateSync = 23,
|
||||
ProjectileSync=24,
|
||||
#endregion
|
||||
|
||||
@ -117,6 +115,7 @@ namespace RageCoop.Core
|
||||
IsAircraft = 1 << 10,
|
||||
IsDeluxoHovering=1 << 11,
|
||||
HasRoof=1 << 12,
|
||||
IsFullSync = 1<<13,
|
||||
}
|
||||
|
||||
internal enum PlayerConfigFlags : byte
|
||||
|
@ -10,117 +10,6 @@ namespace RageCoop.Core
|
||||
internal partial class Packets
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// For non-critical properties, synced every 20 frames.
|
||||
/// </summary>
|
||||
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<uint, bool> 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<byte> byteArray = new List<byte>();
|
||||
|
||||
// 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<uint, bool> 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<uint, bool>();
|
||||
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
|
||||
{
|
||||
|
@ -10,241 +10,15 @@ namespace RageCoop.Core
|
||||
{
|
||||
internal partial class Packets
|
||||
{
|
||||
/// <summary>
|
||||
/// Non-critical stuff, such as damage model, landing gear, health, etc..
|
||||
/// </summary>
|
||||
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<int, int> 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;
|
||||
|
||||
/// <summary>
|
||||
/// VehicleSeat,PedID
|
||||
/// </summary>
|
||||
public Dictionary<int, int> 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<byte> byteArray = new List<byte>();
|
||||
|
||||
// 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<int, int> 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<int, int> 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<int, int>();
|
||||
// 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, int>();
|
||||
int count = reader.ReadInt();
|
||||
for (int i = 0; i<count; i++)
|
||||
{
|
||||
int seat, id;
|
||||
seat = reader.ReadInt();
|
||||
id = reader.ReadInt();
|
||||
Passengers.Add(seat, id);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Read LockStatus
|
||||
LockStatus=(VehicleLockStatus)reader.ReadByte();
|
||||
|
||||
// Read RadioStation
|
||||
RadioStation=reader.ReadByte();
|
||||
|
||||
LicensePlate=Encoding.ASCII.GetString(reader.ReadByteArray(8));
|
||||
|
||||
Livery=(int)(reader.ReadByte()-1);
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
public class VehicleSync : Packet
|
||||
{
|
||||
public int ID { get; set; }
|
||||
|
||||
public int OwnerID { get; set; }
|
||||
|
||||
public VehicleDataFlags Flag { get; set; }
|
||||
|
||||
public Vector3 Position { get; set; }
|
||||
|
||||
public Quaternion Quaternion { get; set; }
|
||||
@ -259,6 +33,35 @@ namespace RageCoop.Core
|
||||
public float SteeringAngle { get; set; }
|
||||
public float DeluxoWingRatio { get; set; } = -1;
|
||||
|
||||
#region FULL-SYNC
|
||||
public int ModelHash { get; set; }
|
||||
|
||||
public float EngineHealth { get; set; }
|
||||
|
||||
public byte[] Colors { get; set; }
|
||||
|
||||
public Dictionary<int, int> 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;
|
||||
|
||||
/// <summary>
|
||||
/// VehicleSeat,PedID
|
||||
/// </summary>
|
||||
public Dictionary<int, int> 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<byte> byteArray = new List<byte>();
|
||||
|
||||
// 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<int, int> 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<int, int> 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<int, int>();
|
||||
// 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, int>();
|
||||
int count = reader.ReadInt();
|
||||
for (int i = 0; i<count; i++)
|
||||
{
|
||||
int seat, id;
|
||||
seat = reader.ReadInt();
|
||||
id = reader.ReadInt();
|
||||
Passengers.Add(seat, id);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Read LockStatus
|
||||
LockStatus=(VehicleLockStatus)reader.ReadByte();
|
||||
|
||||
// Read RadioStation
|
||||
RadioStation=reader.ReadByte();
|
||||
|
||||
LicensePlate=Encoding.ASCII.GetString(reader.ReadByteArray(8));
|
||||
|
||||
Livery=(int)(reader.ReadByte()-1);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
@ -212,23 +212,6 @@ namespace RageCoop.Server.Scripting
|
||||
ped._rot=p.Rotation;
|
||||
ped.Owner=sender;
|
||||
}
|
||||
internal void Update(Packets.PedStateSync p, Client sender)
|
||||
{
|
||||
ServerPed ped;
|
||||
if (!Peds.TryGetValue(p.ID, out ped))
|
||||
{
|
||||
Peds.Add(p.ID, ped=new ServerPed(Server));
|
||||
ped.ID=p.ID;
|
||||
}
|
||||
if ((byte)p.BlipColor!=255)
|
||||
{
|
||||
if (ped.AttachedBlip==null) { ped.AttachedBlip=new(ped); }
|
||||
ped.AttachedBlip.Color=p.BlipColor;
|
||||
ped.AttachedBlip.Sprite=p.BlipSprite;
|
||||
ped.AttachedBlip.Scale=p.BlipScale;
|
||||
}
|
||||
ped.Owner=sender;
|
||||
}
|
||||
internal void Update(Packets.VehicleSync p, Client sender)
|
||||
{
|
||||
ServerVehicle veh;
|
||||
@ -240,21 +223,14 @@ namespace RageCoop.Server.Scripting
|
||||
veh._pos = p.Position;
|
||||
veh.Owner=sender;
|
||||
veh._quat=p.Quaternion;
|
||||
}
|
||||
internal void Update(Packets.VehicleStateSync p, Client sender)
|
||||
{
|
||||
ServerVehicle veh;
|
||||
if (!Vehicles.TryGetValue(p.ID, out veh))
|
||||
if (p.Flag.HasVehFlag(VehicleDataFlags.IsFullSync))
|
||||
{
|
||||
Vehicles.Add(p.ID, veh=new ServerVehicle(Server));
|
||||
}
|
||||
veh.ID=p.ID;
|
||||
veh.Owner=sender;
|
||||
foreach (var pair in p.Passengers)
|
||||
{
|
||||
if(Peds.TryGetValue(pair.Value,out var ped))
|
||||
foreach (var pair in p.Passengers)
|
||||
{
|
||||
ped.LastVehicle=veh;
|
||||
if (Peds.TryGetValue(pair.Value, out var ped))
|
||||
{
|
||||
ped.LastVehicle=veh;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -436,27 +436,7 @@ namespace RageCoop.Server
|
||||
|
||||
switch (type)
|
||||
{
|
||||
|
||||
#region SyncData
|
||||
/*
|
||||
case PacketType.PedStateSync:
|
||||
{
|
||||
Packets.PedStateSync packet = new();
|
||||
packet.Unpack(data);
|
||||
|
||||
PedStateSync(packet, sender);
|
||||
break;
|
||||
}
|
||||
*/
|
||||
case PacketType.VehicleStateSync:
|
||||
{
|
||||
Packets.VehicleStateSync packet = new();
|
||||
packet.Unpack(data);
|
||||
|
||||
VehicleStateSync(packet, sender);
|
||||
|
||||
break;
|
||||
}
|
||||
#region INTERVAL-SYNC
|
||||
case PacketType.PedSync:
|
||||
{
|
||||
|
||||
@ -714,33 +694,7 @@ namespace RageCoop.Server
|
||||
}
|
||||
|
||||
#region SyncEntities
|
||||
private void PedStateSync(Packets.PedStateSync packet, Client client)
|
||||
{
|
||||
|
||||
|
||||
|
||||
|
||||
foreach (var c in Clients.Values)
|
||||
{
|
||||
NetOutgoingMessage outgoingMessage = MainNetServer.CreateMessage();
|
||||
packet.Pack(outgoingMessage);
|
||||
if (c.NetID==client.NetID) { continue; }
|
||||
MainNetServer.SendMessage(outgoingMessage, c.Connection, NetDeliveryMethod.UnreliableSequenced, (byte)ConnectionChannel.PedSync);
|
||||
}
|
||||
}
|
||||
private void VehicleStateSync(Packets.VehicleStateSync packet, Client client)
|
||||
{
|
||||
_worker.QueueJob(() => 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));
|
||||
|
Reference in New Issue
Block a user