Started with player vehicle synchronization

This commit is contained in:
EntenKoeniq
2021-07-12 04:33:23 +02:00
parent ce79c7f064
commit 2d8f9b2a80
4 changed files with 494 additions and 193 deletions

View File

@ -6,7 +6,6 @@ using CoopClient.Entities;
using Lidgren.Network;
using GTA;
using GTA.Math;
using GTA.Native;
namespace CoopClient

View File

@ -95,7 +95,8 @@ namespace CoopClient
public enum ModVersion
{
V0_1_0
V0_1_0,
V0_2_0
}
public enum PacketTypes
@ -104,8 +105,10 @@ namespace CoopClient
PlayerConnectPacket,
PlayerDisconnectPacket,
FullSyncPlayerPacket,
FullSyncNpcPacket,
FullSyncPlayerVehPacket,
LightSyncPlayerPacket,
LightSyncPlayerVehPacket,
FullSyncNpcPacket,
FullSyncNpcVehPacket,
ChatMessagePacket
}
@ -145,6 +148,7 @@ namespace CoopClient
public abstract void NetIncomingMessageToPacket(NetIncomingMessage message);
}
#region -- PLAYER --
[ProtoContract]
public class HandshakePacket : Packet
{
@ -313,6 +317,240 @@ namespace CoopClient
}
}
[ProtoContract]
public class FullSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int ModelHash { get; set; }
[ProtoMember(3)]
public Dictionary<int, int> Props { get; set; }
[ProtoMember(4)]
public int Health { get; set; }
[ProtoMember(5)]
public LVector3 Position { get; set; }
[ProtoMember(6)]
public int VehModelHash { get; set; }
[ProtoMember(7)]
public int VehSeatIndex { get; set; }
[ProtoMember(8)]
public LVector3 VehPosition { get; set; }
[ProtoMember(9)]
public LQuaternion VehRotation { get; set; }
[ProtoMember(10)]
public LVector3 VehVelocity { get; set; }
[ProtoMember(11)]
public float VehSpeed { get; set; }
[ProtoMember(12)]
public float VehSteeringAngle { get; set; }
[ProtoMember(13)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.FullSyncPlayerVehPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
FullSyncPlayerVehPacket data = CoopSerializer.Deserialize<FullSyncPlayerVehPacket>(message.ReadBytes(len));
Player = data.Player;
ModelHash = data.ModelHash;
Props = data.Props;
Health = data.Health;
Position = data.Position;
VehModelHash = data.VehModelHash;
VehSeatIndex = data.VehSeatIndex;
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
Flag = data.Flag;
}
}
[ProtoContract]
public class LightSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int Health { get; set; }
[ProtoMember(3)]
public LVector3 Position { get; set; }
[ProtoMember(4)]
public LVector3 Rotation { get; set; }
[ProtoMember(5)]
public LVector3 Velocity { get; set; }
[ProtoMember(6)]
public byte Speed { get; set; }
[ProtoMember(7)]
public LVector3 AimCoords { get; set; }
[ProtoMember(8)]
public int CurrentWeaponHash { get; set; }
[ProtoMember(9)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
Health = data.Health;
Position = data.Position;
Rotation = data.Rotation;
Velocity = data.Velocity;
Speed = data.Speed;
AimCoords = data.AimCoords;
CurrentWeaponHash = data.CurrentWeaponHash;
Flag = data.Flag;
}
}
[ProtoContract]
public class LightSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int ModelHash { get; set; }
[ProtoMember(3)]
public int Health { get; set; }
[ProtoMember(4)]
public LVector3 Position { get; set; }
[ProtoMember(5)]
public int VehModelHash { get; set; }
[ProtoMember(6)]
public int VehSeatIndex { get; set; }
[ProtoMember(7)]
public LVector3 VehPosition { get; set; }
[ProtoMember(8)]
public LQuaternion VehRotation { get; set; }
[ProtoMember(9)]
public LVector3 VehVelocity { get; set; }
[ProtoMember(10)]
public float VehSpeed { get; set; }
[ProtoMember(11)]
public float VehSteeringAngle { get; set; }
[ProtoMember(12)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.LightSyncPlayerVehPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
LightSyncPlayerVehPacket data = CoopSerializer.Deserialize<LightSyncPlayerVehPacket>(message.ReadBytes(len));
Player = data.Player;
ModelHash = data.ModelHash;
Health = data.Health;
Position = data.Position;
VehModelHash = data.VehModelHash;
VehSeatIndex = data.VehSeatIndex;
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
Flag = data.Flag;
}
}
[ProtoContract]
public class ChatMessagePacket : Packet
{
[ProtoMember(1)]
public string Username { get; set; }
[ProtoMember(2)]
public string Message { get; set; }
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
Username = data.Username;
Message = data.Message;
}
}
#endregion
#region -- NPC --
[ProtoContract]
public class FullSyncNpcPacket : Packet
{
@ -379,64 +617,6 @@ namespace CoopClient
}
}
[ProtoContract]
public class LightSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int Health { get; set; }
[ProtoMember(3)]
public LVector3 Position { get; set; }
[ProtoMember(4)]
public LVector3 Rotation { get; set; }
[ProtoMember(5)]
public LVector3 Velocity { get; set; }
[ProtoMember(6)]
public byte Speed { get; set; }
[ProtoMember(7)]
public LVector3 AimCoords { get; set; }
[ProtoMember(8)]
public int CurrentWeaponHash { get; set; }
[ProtoMember(9)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
Health = data.Health;
Position = data.Position;
Rotation = data.Rotation;
Velocity = data.Velocity;
Speed = data.Speed;
AimCoords = data.AimCoords;
CurrentWeaponHash = data.CurrentWeaponHash;
Flag = data.Flag;
}
}
[ProtoContract]
public class FullSyncNpcVehPacket : Packet
{
@ -510,36 +690,7 @@ namespace CoopClient
Flag = data.Flag;
}
}
[ProtoContract]
public class ChatMessagePacket : Packet
{
[ProtoMember(1)]
public string Username { get; set; }
[ProtoMember(2)]
public string Message { get; set; }
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
Username = data.Username;
Message = data.Message;
}
}
#endregion
class CoopSerializer
{

View File

@ -58,7 +58,8 @@ namespace CoopServer
public enum ModVersion
{
V0_1_0
V0_1_0,
V0_2_0
}
public enum PacketTypes
@ -67,8 +68,10 @@ namespace CoopServer
PlayerConnectPacket,
PlayerDisconnectPacket,
FullSyncPlayerPacket,
FullSyncNpcPacket,
FullSyncPlayerVehPacket,
LightSyncPlayerPacket,
LightSyncPlayerVehPacket,
FullSyncNpcPacket,
FullSyncNpcVehPacket,
ChatMessagePacket
}
@ -108,6 +111,7 @@ namespace CoopServer
public abstract void NetIncomingMessageToPacket(NetIncomingMessage message);
}
#region -- PLAYER --
[ProtoContract]
public class HandshakePacket : Packet
{
@ -276,6 +280,240 @@ namespace CoopServer
}
}
[ProtoContract]
public class FullSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int ModelHash { get; set; }
[ProtoMember(3)]
public Dictionary<int, int> Props { get; set; }
[ProtoMember(4)]
public int Health { get; set; }
[ProtoMember(5)]
public LVector3 Position { get; set; }
[ProtoMember(6)]
public int VehModelHash { get; set; }
[ProtoMember(7)]
public int VehSeatIndex { get; set; }
[ProtoMember(8)]
public LVector3 VehPosition { get; set; }
[ProtoMember(9)]
public LQuaternion VehRotation { get; set; }
[ProtoMember(10)]
public LVector3 VehVelocity { get; set; }
[ProtoMember(11)]
public float VehSpeed { get; set; }
[ProtoMember(12)]
public float VehSteeringAngle { get; set; }
[ProtoMember(13)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.FullSyncPlayerVehPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
FullSyncPlayerVehPacket data = CoopSerializer.Deserialize<FullSyncPlayerVehPacket>(message.ReadBytes(len));
Player = data.Player;
ModelHash = data.ModelHash;
Props = data.Props;
Health = data.Health;
Position = data.Position;
VehModelHash = data.VehModelHash;
VehSeatIndex = data.VehSeatIndex;
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
Flag = data.Flag;
}
}
[ProtoContract]
public class LightSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int Health { get; set; }
[ProtoMember(3)]
public LVector3 Position { get; set; }
[ProtoMember(4)]
public LVector3 Rotation { get; set; }
[ProtoMember(5)]
public LVector3 Velocity { get; set; }
[ProtoMember(6)]
public byte Speed { get; set; }
[ProtoMember(7)]
public LVector3 AimCoords { get; set; }
[ProtoMember(8)]
public int CurrentWeaponHash { get; set; }
[ProtoMember(9)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
Health = data.Health;
Position = data.Position;
Rotation = data.Rotation;
Velocity = data.Velocity;
Speed = data.Speed;
AimCoords = data.AimCoords;
CurrentWeaponHash = data.CurrentWeaponHash;
Flag = data.Flag;
}
}
[ProtoContract]
public class LightSyncPlayerVehPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int ModelHash { get; set; }
[ProtoMember(3)]
public int Health { get; set; }
[ProtoMember(4)]
public LVector3 Position { get; set; }
[ProtoMember(5)]
public int VehModelHash { get; set; }
[ProtoMember(6)]
public int VehSeatIndex { get; set; }
[ProtoMember(7)]
public LVector3 VehPosition { get; set; }
[ProtoMember(8)]
public LQuaternion VehRotation { get; set; }
[ProtoMember(9)]
public LVector3 VehVelocity { get; set; }
[ProtoMember(10)]
public float VehSpeed { get; set; }
[ProtoMember(11)]
public float VehSteeringAngle { get; set; }
[ProtoMember(12)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.LightSyncPlayerVehPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
LightSyncPlayerVehPacket data = CoopSerializer.Deserialize<LightSyncPlayerVehPacket>(message.ReadBytes(len));
Player = data.Player;
ModelHash = data.ModelHash;
Health = data.Health;
Position = data.Position;
VehModelHash = data.VehModelHash;
VehSeatIndex = data.VehSeatIndex;
VehPosition = data.VehPosition;
VehRotation = data.VehRotation;
VehVelocity = data.VehVelocity;
VehSpeed = data.VehSpeed;
VehSteeringAngle = data.VehSteeringAngle;
Flag = data.Flag;
}
}
[ProtoContract]
public class ChatMessagePacket : Packet
{
[ProtoMember(1)]
public string Username { get; set; }
[ProtoMember(2)]
public string Message { get; set; }
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
Username = data.Username;
Message = data.Message;
}
}
#endregion
#region -- NPC --
[ProtoContract]
public class FullSyncNpcPacket : Packet
{
@ -342,64 +580,6 @@ namespace CoopServer
}
}
[ProtoContract]
public class LightSyncPlayerPacket : Packet
{
[ProtoMember(1)]
public string Player { get; set; }
[ProtoMember(2)]
public int Health { get; set; }
[ProtoMember(3)]
public LVector3 Position { get; set; }
[ProtoMember(4)]
public LVector3 Rotation { get; set; }
[ProtoMember(5)]
public LVector3 Velocity { get; set; }
[ProtoMember(6)]
public byte Speed { get; set; }
[ProtoMember(7)]
public LVector3 AimCoords { get; set; }
[ProtoMember(8)]
public int CurrentWeaponHash { get; set; }
[ProtoMember(9)]
public byte? Flag { get; set; } = 0;
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
Health = data.Health;
Position = data.Position;
Rotation = data.Rotation;
Velocity = data.Velocity;
Speed = data.Speed;
AimCoords = data.AimCoords;
CurrentWeaponHash = data.CurrentWeaponHash;
Flag = data.Flag;
}
}
[ProtoContract]
public class FullSyncNpcVehPacket : Packet
{
@ -473,36 +653,7 @@ namespace CoopServer
Flag = data.Flag;
}
}
[ProtoContract]
public class ChatMessagePacket : Packet
{
[ProtoMember(1)]
public string Username { get; set; }
[ProtoMember(2)]
public string Message { get; set; }
public override void PacketToNetOutGoingMessage(NetOutgoingMessage message)
{
message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
}
public override void NetIncomingMessageToPacket(NetIncomingMessage message)
{
int len = message.ReadInt32();
ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
Username = data.Username;
Message = data.Message;
}
}
#endregion
class CoopSerializer
{

View File

@ -216,6 +216,18 @@ namespace CoopServer
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.LightSyncPlayerPacket:
try
{
packet = new LightSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message);
LightSyncPlayer((LightSyncPlayerPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.FullSyncNpcPacket:
if (MainSettings.NpcsAllowed)
{
@ -235,18 +247,6 @@ namespace CoopServer
message.SenderConnection.Disconnect("Npcs are not allowed!");
}
break;
case (byte)PacketTypes.LightSyncPlayerPacket:
try
{
packet = new LightSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message);
LightSyncPlayer((LightSyncPlayerPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.FullSyncNpcVehPacket:
if (MainSettings.NpcsAllowed)
{