Files
RAGECOOP-V/Core/Packets/PedSync.cs

214 lines
6.2 KiB
C#
Raw Normal View History

2022-09-08 12:41:56 -07:00
using GTA;
using GTA.Math;
2022-05-22 15:55:26 +08:00
using Lidgren.Network;
2022-09-08 12:41:56 -07:00
using System.Collections.Generic;
2022-05-22 15:55:26 +08:00
namespace RageCoop.Core
{
2022-07-01 14:39:43 +08:00
internal partial class Packets
2022-05-22 15:55:26 +08:00
{
2022-07-01 14:39:43 +08:00
internal class PedSync : Packet
2022-05-22 15:55:26 +08:00
{
2022-09-08 12:41:56 -07:00
public override PacketType Type => PacketType.PedSync;
2022-05-22 15:55:26 +08:00
public int ID { get; set; }
public int OwnerID { get; set; }
public int VehicleID { get; set; }
public VehicleSeat Seat { get; set; }
2022-07-17 12:22:11 +08:00
public PedDataFlags Flags { get; set; }
2022-05-22 15:55:26 +08:00
public int Health { get; set; }
public Vector3 Position { get; set; }
2022-05-22 15:55:26 +08:00
public Vector3 Rotation { get; set; }
2022-05-22 15:55:26 +08:00
public Vector3 Velocity { get; set; }
2022-05-22 15:55:26 +08:00
2022-07-17 18:44:16 +08:00
#region RAGDOLL
public Vector3 HeadPosition { get; set; }
public Vector3 RightFootPosition { get; set; }
public Vector3 LeftFootPosition { get; set; }
#endregion
2022-05-22 15:55:26 +08:00
public byte Speed { get; set; }
public Vector3 AimCoords { get; set; }
2022-05-22 15:55:26 +08:00
public float Heading { get; set; }
2022-09-08 12:41:56 -07:00
#region FULL
public int ModelHash { get; set; }
2022-08-08 17:29:15 +08:00
public uint CurrentWeaponHash { get; set; }
public byte[] Clothes { 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;
2022-09-08 12:41:56 -07:00
#endregion
2022-05-22 15:55:26 +08:00
protected override void Serialize(NetOutgoingMessage m)
2022-05-22 15:55:26 +08:00
{
2022-09-08 12:41:56 -07:00
m.Write(ID);
m.Write(OwnerID);
m.Write((ushort)Flags);
m.Write(Health);
m.Write(Speed);
2022-07-17 18:44:16 +08:00
if (Flags.HasPedFlag(PedDataFlags.IsRagdoll))
{
m.Write(HeadPosition);
m.Write(RightFootPosition);
m.Write(LeftFootPosition);
2022-07-17 18:44:16 +08:00
}
else
{
2022-09-08 12:41:56 -07:00
if (Speed >= 4)
{
m.Write(VehicleID);
2022-09-08 12:41:56 -07:00
m.Write((byte)(Seat + 3));
}
m.Write(Position);
2022-07-17 18:44:16 +08:00
}
m.Write(Rotation);
m.Write(Velocity);
2022-05-22 15:55:26 +08:00
2022-07-17 12:22:11 +08:00
if (Flags.HasPedFlag(PedDataFlags.IsAiming))
2022-05-22 15:55:26 +08:00
{
m.Write(AimCoords);
2022-05-22 15:55:26 +08:00
}
m.Write(Heading);
2022-05-22 15:55:26 +08:00
2022-07-17 12:22:11 +08:00
if (Flags.HasPedFlag(PedDataFlags.IsFullSync))
{
m.Write(ModelHash);
m.Write(CurrentWeaponHash);
m.Write(Clothes);
if (WeaponComponents != null)
{
m.Write(true);
m.Write((ushort)WeaponComponents.Count);
foreach (KeyValuePair<uint, bool> component in WeaponComponents)
{
m.Write(component.Key);
m.Write(component.Value);
}
}
else
{
// Player weapon doesn't have any components
m.Write(false);
}
m.Write(WeaponTint);
m.Write((byte)BlipColor);
2022-09-08 12:41:56 -07:00
if ((byte)BlipColor != 255)
{
m.Write((ushort)BlipSprite);
m.Write(BlipScale);
}
}
2022-05-22 15:55:26 +08:00
}
public override void Deserialize(NetIncomingMessage m)
2022-05-22 15:55:26 +08:00
{
#region NetIncomingMessageToPacket
ID = m.ReadInt32();
2022-09-08 12:41:56 -07:00
OwnerID = m.ReadInt32();
Flags = (PedDataFlags)m.ReadUInt16();
Health = m.ReadInt32();
Speed = m.ReadByte();
2022-05-22 15:55:26 +08:00
2022-07-17 18:44:16 +08:00
if (Flags.HasPedFlag(PedDataFlags.IsRagdoll))
{
2022-09-08 12:41:56 -07:00
HeadPosition = m.ReadVector3();
RightFootPosition = m.ReadVector3();
LeftFootPosition = m.ReadVector3();
Position = HeadPosition;
2022-07-17 18:44:16 +08:00
}
else
{
// Vehicle related
2022-09-08 12:41:56 -07:00
if (Speed >= 4)
{
2022-09-08 12:41:56 -07:00
VehicleID = m.ReadInt32();
Seat = (VehicleSeat)(m.ReadByte() - 3);
}
2022-07-17 18:44:16 +08:00
// Read player position
Position = m.ReadVector3();
2022-07-17 18:44:16 +08:00
}
2022-05-22 15:55:26 +08:00
Rotation = m.ReadVector3();
Velocity = m.ReadVector3();
2022-05-22 15:55:26 +08:00
2022-07-17 12:22:11 +08:00
if (Flags.HasPedFlag(PedDataFlags.IsAiming))
2022-05-22 15:55:26 +08:00
{
// Read player aim coords
AimCoords = m.ReadVector3();
2022-05-22 15:55:26 +08:00
}
2022-09-08 12:41:56 -07:00
Heading = m.ReadFloat();
2022-07-17 12:22:11 +08:00
if (Flags.HasPedFlag(PedDataFlags.IsFullSync))
{
// Read player model hash
ModelHash = m.ReadInt32();
2022-08-08 17:29:15 +08:00
// Read player weapon hash
CurrentWeaponHash = m.ReadUInt32();
2022-08-08 17:29:15 +08:00
// Read player clothes
2022-09-08 12:41:56 -07:00
Clothes = m.ReadBytes(36);
// Read player weapon components
if (m.ReadBoolean())
{
WeaponComponents = new Dictionary<uint, bool>();
ushort comCount = m.ReadUInt16();
for (ushort i = 0; i < comCount; i++)
{
WeaponComponents.Add(m.ReadUInt32(), m.ReadBoolean());
}
}
2022-09-08 12:41:56 -07:00
WeaponTint = m.ReadByte();
2022-09-08 12:41:56 -07:00
BlipColor = (BlipColor)m.ReadByte();
2022-09-08 12:41:56 -07:00
if ((byte)BlipColor != 255)
{
2022-09-08 12:41:56 -07:00
BlipSprite = (BlipSprite)m.ReadUInt16();
BlipScale = m.ReadFloat();
}
}
2022-05-22 15:55:26 +08:00
#endregion
}
}
}
}