Addded Climb and ClimbLadder sync. Small changes
This commit is contained in:
@ -21,6 +21,8 @@ namespace CoopClient.Entities.Player
|
||||
internal byte Speed { get; set; }
|
||||
private bool LastIsJumping = false;
|
||||
internal bool IsJumping { get; set; }
|
||||
internal bool IsOnLadder { get; set; }
|
||||
internal bool IsVaulting { get; set; }
|
||||
internal bool IsInParachuteFreeFall { get; set; }
|
||||
internal bool IsRagdoll { get; set; }
|
||||
internal bool IsOnFire { get; set; }
|
||||
@ -60,6 +62,38 @@ namespace CoopClient.Entities.Player
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsOnLadder)
|
||||
{
|
||||
if (!Function.Call<bool>(Hash.GET_IS_TASK_ACTIVE, Character.Handle, ETasks.CLIMB_LADDER))
|
||||
{
|
||||
Character.Task.ClimbLadder();
|
||||
}
|
||||
|
||||
UpdateOnFootPosition(true, true, false);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (!IsOnLadder && Function.Call<bool>(Hash.GET_IS_TASK_ACTIVE, Character.Handle, ETasks.CLIMB_LADDER))
|
||||
{
|
||||
Character.Task.ClearAllImmediately();
|
||||
}
|
||||
|
||||
if (IsVaulting)
|
||||
{
|
||||
if (!Character.IsVaulting)
|
||||
{
|
||||
Character.Task.Climb();
|
||||
}
|
||||
|
||||
UpdateOnFootPosition(true, true, false);
|
||||
|
||||
return;
|
||||
}
|
||||
else if (!IsVaulting && Character.IsVaulting)
|
||||
{
|
||||
Character.Task.ClearAllImmediately();
|
||||
}
|
||||
|
||||
if (IsOnFire && !Character.IsOnFire)
|
||||
{
|
||||
Character.IsInvincible = false;
|
||||
@ -78,12 +112,18 @@ namespace CoopClient.Entities.Player
|
||||
}
|
||||
}
|
||||
|
||||
if (IsJumping && !LastIsJumping)
|
||||
if (IsJumping)
|
||||
{
|
||||
Character.Task.Jump();
|
||||
}
|
||||
if (!LastIsJumping)
|
||||
{
|
||||
LastIsJumping = true;
|
||||
Character.Task.Jump();
|
||||
}
|
||||
|
||||
LastIsJumping = IsJumping;
|
||||
UpdateOnFootPosition(true, true, false);
|
||||
return;
|
||||
}
|
||||
LastIsJumping = false;
|
||||
|
||||
if (IsRagdoll)
|
||||
{
|
||||
@ -118,12 +158,6 @@ namespace CoopClient.Entities.Player
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsJumping || IsOnFire)
|
||||
{
|
||||
UpdateOnFootPosition(true, true, false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (IsReloading)
|
||||
{
|
||||
if (!Character.IsReloading)
|
||||
|
@ -409,13 +409,15 @@ namespace CoopClient
|
||||
DebugSyncPed.CurrentWeaponHash = (uint)player.Weapons.Current.Hash;
|
||||
DebugSyncPed.WeaponComponents = player.Weapons.Current.GetWeaponComponents();
|
||||
DebugSyncPed.LastSyncWasFull = true;
|
||||
DebugSyncPed.IsAiming = (flags.Value & (byte)PedDataFlags.IsAiming) > 0;
|
||||
DebugSyncPed.IsShooting = (flags.Value & (byte)PedDataFlags.IsShooting) > 0;
|
||||
DebugSyncPed.IsReloading = (flags.Value & (byte)PedDataFlags.IsReloading) > 0;
|
||||
DebugSyncPed.IsJumping = (flags.Value & (byte)PedDataFlags.IsJumping) > 0;
|
||||
DebugSyncPed.IsRagdoll = (flags.Value & (byte)PedDataFlags.IsRagdoll) > 0;
|
||||
DebugSyncPed.IsOnFire = (flags.Value & (byte)PedDataFlags.IsOnFire) > 0;
|
||||
DebugSyncPed.IsInParachuteFreeFall = player.IsInParachuteFreeFall;
|
||||
DebugSyncPed.IsAiming = (flags.Value & (ushort)PedDataFlags.IsAiming) > 0;
|
||||
DebugSyncPed.IsShooting = (flags.Value & (ushort)PedDataFlags.IsShooting) > 0;
|
||||
DebugSyncPed.IsReloading = (flags.Value & (ushort)PedDataFlags.IsReloading) > 0;
|
||||
DebugSyncPed.IsJumping = (flags.Value & (ushort)PedDataFlags.IsJumping) > 0;
|
||||
DebugSyncPed.IsRagdoll = (flags.Value & (ushort)PedDataFlags.IsRagdoll) > 0;
|
||||
DebugSyncPed.IsOnFire = (flags.Value & (ushort)PedDataFlags.IsOnFire) > 0;
|
||||
DebugSyncPed.IsInParachuteFreeFall = (flags.Value & (ushort)PedDataFlags.IsInParachuteFreeFall) > 0;
|
||||
DebugSyncPed.IsOnLadder = (flags.Value & (ushort)PedDataFlags.IsOnLadder) > 0;
|
||||
DebugSyncPed.IsVaulting = (flags.Value & (ushort)PedDataFlags.IsVaulting) > 0;
|
||||
DebugSyncPed.IsInVehicle = false;
|
||||
|
||||
if (DebugSyncPed.Character != null && DebugSyncPed.Character.Exists())
|
||||
|
@ -390,13 +390,15 @@ namespace CoopClient
|
||||
player.CurrentWeaponHash = packet.CurrentWeaponHash;
|
||||
player.WeaponComponents = packet.WeaponComponents;
|
||||
player.AimCoords = packet.AimCoords.ToVector();
|
||||
player.IsAiming = (packet.Flag.Value & (byte)PedDataFlags.IsAiming) > 0;
|
||||
player.IsShooting = (packet.Flag.Value & (byte)PedDataFlags.IsShooting) > 0;
|
||||
player.IsReloading = (packet.Flag.Value & (byte)PedDataFlags.IsReloading) > 0;
|
||||
player.IsJumping = (packet.Flag.Value & (byte)PedDataFlags.IsJumping) > 0;
|
||||
player.IsRagdoll = (packet.Flag.Value & (byte)PedDataFlags.IsRagdoll) > 0;
|
||||
player.IsOnFire = (packet.Flag.Value & (byte)PedDataFlags.IsOnFire) > 0;
|
||||
player.IsInParachuteFreeFall = (packet.Flag.Value & (byte)PedDataFlags.IsInParachuteFreeFall) > 0;
|
||||
player.IsAiming = (packet.Flag.Value & (ushort)PedDataFlags.IsAiming) > 0;
|
||||
player.IsShooting = (packet.Flag.Value & (ushort)PedDataFlags.IsShooting) > 0;
|
||||
player.IsReloading = (packet.Flag.Value & (ushort)PedDataFlags.IsReloading) > 0;
|
||||
player.IsJumping = (packet.Flag.Value & (ushort)PedDataFlags.IsJumping) > 0;
|
||||
player.IsRagdoll = (packet.Flag.Value & (ushort)PedDataFlags.IsRagdoll) > 0;
|
||||
player.IsOnFire = (packet.Flag.Value & (ushort)PedDataFlags.IsOnFire) > 0;
|
||||
player.IsInParachuteFreeFall = (packet.Flag.Value & (ushort)PedDataFlags.IsInParachuteFreeFall) > 0;
|
||||
player.IsOnLadder = (packet.Flag.Value & (ushort)PedDataFlags.IsOnLadder) > 0;
|
||||
player.IsVaulting = (packet.Flag.Value & (ushort)PedDataFlags.IsVaulting) > 0;
|
||||
player.IsInVehicle = false;
|
||||
player.LastSyncWasFull = true;
|
||||
|
||||
@ -457,13 +459,15 @@ namespace CoopClient
|
||||
player.Speed = packet.Speed;
|
||||
player.CurrentWeaponHash = packet.CurrentWeaponHash;
|
||||
player.AimCoords = packet.AimCoords.ToVector();
|
||||
player.IsAiming = (packet.Flag.Value & (byte)PedDataFlags.IsAiming) > 0;
|
||||
player.IsShooting = (packet.Flag.Value & (byte)PedDataFlags.IsShooting) > 0;
|
||||
player.IsReloading = (packet.Flag.Value & (byte)PedDataFlags.IsReloading) > 0;
|
||||
player.IsJumping = (packet.Flag.Value & (byte)PedDataFlags.IsJumping) > 0;
|
||||
player.IsRagdoll = (packet.Flag.Value & (byte)PedDataFlags.IsRagdoll) > 0;
|
||||
player.IsOnFire = (packet.Flag.Value & (byte)PedDataFlags.IsOnFire) > 0;
|
||||
player.IsInParachuteFreeFall = (packet.Flag.Value & (byte)PedDataFlags.IsInParachuteFreeFall) > 0;
|
||||
player.IsAiming = (packet.Flag.Value & (ushort)PedDataFlags.IsAiming) > 0;
|
||||
player.IsShooting = (packet.Flag.Value & (ushort)PedDataFlags.IsShooting) > 0;
|
||||
player.IsReloading = (packet.Flag.Value & (ushort)PedDataFlags.IsReloading) > 0;
|
||||
player.IsJumping = (packet.Flag.Value & (ushort)PedDataFlags.IsJumping) > 0;
|
||||
player.IsRagdoll = (packet.Flag.Value & (ushort)PedDataFlags.IsRagdoll) > 0;
|
||||
player.IsOnFire = (packet.Flag.Value & (ushort)PedDataFlags.IsOnFire) > 0;
|
||||
player.IsInParachuteFreeFall = (packet.Flag.Value & (ushort)PedDataFlags.IsInParachuteFreeFall) > 0;
|
||||
player.IsOnLadder = (packet.Flag.Value & (ushort)PedDataFlags.IsOnLadder) > 0;
|
||||
player.IsVaulting = (packet.Flag.Value & (ushort)PedDataFlags.IsVaulting) > 0;
|
||||
player.IsInVehicle = false;
|
||||
player.LastSyncWasFull = false;
|
||||
|
||||
@ -660,12 +664,12 @@ namespace CoopClient
|
||||
npc.Speed = packet.Speed;
|
||||
npc.CurrentWeaponHash = packet.CurrentWeaponHash;
|
||||
npc.AimCoords = packet.AimCoords.ToVector();
|
||||
npc.IsAiming = (packet.Flag.Value & (byte)PedDataFlags.IsAiming) > 0;
|
||||
npc.IsShooting = (packet.Flag.Value & (byte)PedDataFlags.IsShooting) > 0;
|
||||
npc.IsReloading = (packet.Flag.Value & (byte)PedDataFlags.IsReloading) > 0;
|
||||
npc.IsJumping = (packet.Flag.Value & (byte)PedDataFlags.IsJumping) > 0;
|
||||
npc.IsRagdoll = (packet.Flag.Value & (byte)PedDataFlags.IsRagdoll) > 0;
|
||||
npc.IsOnFire = (packet.Flag.Value & (byte)PedDataFlags.IsOnFire) > 0;
|
||||
npc.IsAiming = (packet.Flag.Value & (ushort)PedDataFlags.IsAiming) > 0;
|
||||
npc.IsShooting = (packet.Flag.Value & (ushort)PedDataFlags.IsShooting) > 0;
|
||||
npc.IsReloading = (packet.Flag.Value & (ushort)PedDataFlags.IsReloading) > 0;
|
||||
npc.IsJumping = (packet.Flag.Value & (ushort)PedDataFlags.IsJumping) > 0;
|
||||
npc.IsRagdoll = (packet.Flag.Value & (ushort)PedDataFlags.IsRagdoll) > 0;
|
||||
npc.IsOnFire = (packet.Flag.Value & (ushort)PedDataFlags.IsOnFire) > 0;
|
||||
npc.IsInVehicle = false;
|
||||
npc.LastSyncWasFull = true;
|
||||
|
||||
@ -684,12 +688,12 @@ namespace CoopClient
|
||||
Speed = packet.Speed,
|
||||
CurrentWeaponHash = packet.CurrentWeaponHash,
|
||||
AimCoords = packet.AimCoords.ToVector(),
|
||||
IsAiming = (packet.Flag.Value & (byte)PedDataFlags.IsAiming) > 0,
|
||||
IsShooting = (packet.Flag.Value & (byte)PedDataFlags.IsShooting) > 0,
|
||||
IsReloading = (packet.Flag.Value & (byte)PedDataFlags.IsReloading) > 0,
|
||||
IsJumping = (packet.Flag.Value & (byte)PedDataFlags.IsJumping) > 0,
|
||||
IsRagdoll = (packet.Flag.Value & (byte)PedDataFlags.IsRagdoll) > 0,
|
||||
IsOnFire = (packet.Flag.Value & (byte)PedDataFlags.IsOnFire) > 0,
|
||||
IsAiming = (packet.Flag.Value & (ushort)PedDataFlags.IsAiming) > 0,
|
||||
IsShooting = (packet.Flag.Value & (ushort)PedDataFlags.IsShooting) > 0,
|
||||
IsReloading = (packet.Flag.Value & (ushort)PedDataFlags.IsReloading) > 0,
|
||||
IsJumping = (packet.Flag.Value & (ushort)PedDataFlags.IsJumping) > 0,
|
||||
IsRagdoll = (packet.Flag.Value & (ushort)PedDataFlags.IsRagdoll) > 0,
|
||||
IsOnFire = (packet.Flag.Value & (ushort)PedDataFlags.IsOnFire) > 0,
|
||||
IsInVehicle = false,
|
||||
LastSyncWasFull = true,
|
||||
|
||||
|
@ -137,7 +137,9 @@ namespace CoopClient
|
||||
IsJumping = 1 << 3,
|
||||
IsRagdoll = 1 << 4,
|
||||
IsOnFire = 1 << 5,
|
||||
IsInParachuteFreeFall = 1 << 6
|
||||
IsInParachuteFreeFall = 1 << 6,
|
||||
IsOnLadder = 1 << 7,
|
||||
IsVaulting = 1 << 8
|
||||
}
|
||||
|
||||
#region ===== VEHICLE DATA =====
|
||||
@ -440,7 +442,7 @@ namespace CoopClient
|
||||
|
||||
public Dictionary<uint, bool> WeaponComponents { get; set; }
|
||||
|
||||
public byte? Flag { get; set; }
|
||||
public ushort? Flag { get; set; }
|
||||
|
||||
public float? Latency { get; set; }
|
||||
|
||||
@ -461,7 +463,7 @@ namespace CoopClient
|
||||
byteArray.AddRange(BitConverter.GetBytes(Health));
|
||||
|
||||
// Write player flags
|
||||
byteArray.Add(Flag.Value);
|
||||
byteArray.AddRange(BitConverter.GetBytes(Flag.Value));
|
||||
|
||||
// Write player model hash
|
||||
byteArray.AddRange(BitConverter.GetBytes(ModelHash));
|
||||
@ -559,7 +561,7 @@ namespace CoopClient
|
||||
Health = reader.ReadInt();
|
||||
|
||||
// Read player flag
|
||||
Flag = reader.ReadByte();
|
||||
Flag = reader.ReadUShort();
|
||||
|
||||
// Read player model hash
|
||||
ModelHash = reader.ReadInt();
|
||||
@ -980,7 +982,7 @@ namespace CoopClient
|
||||
|
||||
public uint CurrentWeaponHash { get; set; }
|
||||
|
||||
public byte? Flag { get; set; }
|
||||
public ushort? Flag { get; set; }
|
||||
|
||||
public float? Latency { get; set; }
|
||||
|
||||
@ -995,7 +997,7 @@ namespace CoopClient
|
||||
byteArray.AddRange(BitConverter.GetBytes(NetHandle));
|
||||
|
||||
// Write player flags
|
||||
byteArray.Add(Flag.Value);
|
||||
byteArray.AddRange(BitConverter.GetBytes(Flag.Value));
|
||||
|
||||
// Write player health
|
||||
byteArray.AddRange(BitConverter.GetBytes(Health));
|
||||
@ -1057,7 +1059,7 @@ namespace CoopClient
|
||||
NetHandle = reader.ReadLong();
|
||||
|
||||
// Read player flags
|
||||
Flag = reader.ReadByte();
|
||||
Flag = reader.ReadUShort();
|
||||
|
||||
// Read player health
|
||||
Health = reader.ReadInt();
|
||||
@ -1678,7 +1680,7 @@ namespace CoopClient
|
||||
|
||||
public uint CurrentWeaponHash { get; set; }
|
||||
|
||||
public byte? Flag { get; set; } = 0;
|
||||
public ushort? Flag { get; set; } = 0;
|
||||
|
||||
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
|
||||
{
|
||||
@ -1691,7 +1693,7 @@ namespace CoopClient
|
||||
byteArray.AddRange(BitConverter.GetBytes(NetHandle));
|
||||
|
||||
// Write npc flags
|
||||
byteArray.Add(Flag.Value);
|
||||
byteArray.AddRange(BitConverter.GetBytes(Flag.Value));
|
||||
|
||||
// Write npc model hash
|
||||
byteArray.AddRange(BitConverter.GetBytes(ModelHash));
|
||||
@ -1762,7 +1764,7 @@ namespace CoopClient
|
||||
NetHandle = reader.ReadLong();
|
||||
|
||||
// Read npc flag
|
||||
Flag = reader.ReadByte();
|
||||
Flag = reader.ReadUShort();
|
||||
|
||||
// Read npc model hash
|
||||
ModelHash = reader.ReadInt();
|
||||
|
@ -10,6 +10,11 @@ using GTA.Math;
|
||||
|
||||
namespace CoopClient
|
||||
{
|
||||
enum ETasks
|
||||
{
|
||||
CLIMB_LADDER = 47
|
||||
}
|
||||
|
||||
static class Util
|
||||
{
|
||||
#region -- POINTER --
|
||||
@ -225,43 +230,53 @@ namespace CoopClient
|
||||
return flags;
|
||||
}
|
||||
|
||||
public static byte? GetPedFlags(this Ped ped, bool isPlayer = false)
|
||||
public static ushort? GetPedFlags(this Ped ped, bool isPlayer = false)
|
||||
{
|
||||
byte? flags = 0;
|
||||
ushort? flags = 0;
|
||||
|
||||
if (ped.IsAiming)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsAiming;
|
||||
flags |= (ushort)PedDataFlags.IsAiming;
|
||||
}
|
||||
|
||||
if ((ped.IsShooting || isPlayer && Game.IsControlPressed(Control.Attack)) && ped.Weapons.Current?.AmmoInClip != 0)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsShooting;
|
||||
flags |= (ushort)PedDataFlags.IsShooting;
|
||||
}
|
||||
|
||||
if (ped.IsReloading)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsReloading;
|
||||
flags |= (ushort)PedDataFlags.IsReloading;
|
||||
}
|
||||
|
||||
if (ped.IsJumping)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsJumping;
|
||||
flags |= (ushort)PedDataFlags.IsJumping;
|
||||
}
|
||||
|
||||
if (ped.IsRagdoll)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsRagdoll;
|
||||
flags |= (ushort)PedDataFlags.IsRagdoll;
|
||||
}
|
||||
|
||||
if (ped.IsOnFire)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsOnFire;
|
||||
flags |= (ushort)PedDataFlags.IsOnFire;
|
||||
}
|
||||
|
||||
if (ped.IsInParachuteFreeFall)
|
||||
{
|
||||
flags |= (byte)PedDataFlags.IsInParachuteFreeFall;
|
||||
flags |= (ushort)PedDataFlags.IsInParachuteFreeFall;
|
||||
}
|
||||
|
||||
if (Function.Call<bool>(Hash.GET_IS_TASK_ACTIVE, ped.Handle, ETasks.CLIMB_LADDER)) // USING_LADDER
|
||||
{
|
||||
flags |= (ushort)PedDataFlags.IsOnLadder;
|
||||
}
|
||||
|
||||
if (ped.IsVaulting && !Function.Call<bool>(Hash.GET_IS_TASK_ACTIVE, ped.Handle, ETasks.CLIMB_LADDER))
|
||||
{
|
||||
flags |= (ushort)PedDataFlags.IsVaulting;
|
||||
}
|
||||
|
||||
return flags;
|
||||
|
@ -123,7 +123,9 @@ namespace CoopServer
|
||||
IsJumping = 1 << 3,
|
||||
IsRagdoll = 1 << 4,
|
||||
IsOnFire = 1 << 5,
|
||||
IsInParachuteFreeFall = 1 << 6
|
||||
IsInParachuteFreeFall = 1 << 6,
|
||||
IsOnLadder = 1 << 7,
|
||||
IsVaulting = 1 << 8
|
||||
}
|
||||
|
||||
#region ===== VEHICLE DATA =====
|
||||
@ -423,7 +425,7 @@ namespace CoopServer
|
||||
|
||||
public Dictionary<uint, bool> WeaponComponents { get; set; }
|
||||
|
||||
public byte? Flag { get; set; }
|
||||
public ushort? Flag { get; set; }
|
||||
|
||||
public float? Latency { get; set; }
|
||||
|
||||
@ -444,7 +446,7 @@ namespace CoopServer
|
||||
byteArray.AddRange(BitConverter.GetBytes(Health));
|
||||
|
||||
// Write player flags
|
||||
byteArray.Add(Flag.Value);
|
||||
byteArray.AddRange(BitConverter.GetBytes(Flag.Value));
|
||||
|
||||
// Write player model hash
|
||||
byteArray.AddRange(BitConverter.GetBytes(ModelHash));
|
||||
@ -542,7 +544,7 @@ namespace CoopServer
|
||||
Health = reader.ReadInt();
|
||||
|
||||
// Read player flag
|
||||
Flag = reader.ReadByte();
|
||||
Flag = reader.ReadUShort();
|
||||
|
||||
// Read player model hash
|
||||
ModelHash = reader.ReadInt();
|
||||
@ -963,7 +965,7 @@ namespace CoopServer
|
||||
|
||||
public uint CurrentWeaponHash { get; set; }
|
||||
|
||||
public byte? Flag { get; set; }
|
||||
public ushort? Flag { get; set; }
|
||||
|
||||
public float? Latency { get; set; }
|
||||
|
||||
@ -978,7 +980,7 @@ namespace CoopServer
|
||||
byteArray.AddRange(BitConverter.GetBytes(NetHandle));
|
||||
|
||||
// Write player flags
|
||||
byteArray.Add(Flag.Value);
|
||||
byteArray.AddRange(BitConverter.GetBytes(Flag.Value));
|
||||
|
||||
// Write player health
|
||||
byteArray.AddRange(BitConverter.GetBytes(Health));
|
||||
@ -1040,7 +1042,7 @@ namespace CoopServer
|
||||
NetHandle = reader.ReadLong();
|
||||
|
||||
// Read player flags
|
||||
Flag = reader.ReadByte();
|
||||
Flag = reader.ReadUShort();
|
||||
|
||||
// Read player health
|
||||
Health = reader.ReadInt();
|
||||
@ -1661,7 +1663,7 @@ namespace CoopServer
|
||||
|
||||
public uint CurrentWeaponHash { get; set; }
|
||||
|
||||
public byte? Flag { get; set; } = 0;
|
||||
public ushort? Flag { get; set; } = 0;
|
||||
|
||||
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
|
||||
{
|
||||
@ -1674,7 +1676,7 @@ namespace CoopServer
|
||||
byteArray.AddRange(BitConverter.GetBytes(NetHandle));
|
||||
|
||||
// Write npc flags
|
||||
byteArray.Add(Flag.Value);
|
||||
byteArray.AddRange(BitConverter.GetBytes(Flag.Value));
|
||||
|
||||
// Write npc model hash
|
||||
byteArray.AddRange(BitConverter.GetBytes(ModelHash));
|
||||
@ -1745,7 +1747,7 @@ namespace CoopServer
|
||||
NetHandle = reader.ReadLong();
|
||||
|
||||
// Read npc flag
|
||||
Flag = reader.ReadByte();
|
||||
Flag = reader.ReadUShort();
|
||||
|
||||
// Read npc model hash
|
||||
ModelHash = reader.ReadInt();
|
||||
|
Reference in New Issue
Block a user