CoopSerializer class added

This commit is contained in:
EntenKoeniq
2021-07-07 18:05:08 +02:00
parent 8cc3ea1e3a
commit 8fb530df2d
4 changed files with 159 additions and 191 deletions

View File

@ -23,7 +23,7 @@ namespace CoopClient
Client.SendMessage(outgoingMessage, NetDeliveryMethod.ReliableOrdered);
Client.FlushSendQueue();
Client.Disconnect("Disconnected");
Client.Disconnect("Bye!");
}
else
{
@ -143,7 +143,7 @@ namespace CoopClient
}
break;
case NetConnectionStatus.Disconnected:
GTA.UI.Notification.Show("~r~" + reason);
GTA.UI.Notification.Show("~r~Disconnected: " + reason);
// Reset all values
FullPlayerSync = true;

View File

@ -113,12 +113,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.HandshakePacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -128,11 +123,7 @@ namespace CoopClient
{
int len = message.ReadInt32();
HandshakePacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<HandshakePacket>(stream);
}
HandshakePacket data = CoopSerializer.Deserialize<HandshakePacket>(message.ReadBytes(len));
ID = data.ID;
SocialClubName = data.SocialClubName;
@ -158,12 +149,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.PlayerConnectPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -173,11 +159,7 @@ namespace CoopClient
{
int len = message.ReadInt32();
PlayerConnectPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerConnectPacket>(stream);
}
PlayerConnectPacket data = CoopSerializer.Deserialize<PlayerConnectPacket>(message.ReadBytes(len));
Player = data.Player;
SocialClubName = data.SocialClubName;
@ -195,12 +177,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.PlayerDisconnectPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -210,11 +187,7 @@ namespace CoopClient
{
int len = message.ReadInt32();
PlayerDisconnectPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerDisconnectPacket>(stream);
}
PlayerDisconnectPacket data = CoopSerializer.Deserialize<PlayerDisconnectPacket>(message.ReadBytes(len));
Player = data.Player;
}
@ -260,12 +233,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.FullSyncPlayerPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -275,11 +243,7 @@ namespace CoopClient
{
int len = message.ReadInt32();
FullSyncPlayerPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncPlayerPacket>(stream);
}
FullSyncPlayerPacket data = CoopSerializer.Deserialize<FullSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
ModelHash = data.ModelHash;
@ -335,12 +299,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.FullSyncNpcPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -350,11 +309,7 @@ namespace CoopClient
{
int len = message.ReadInt32();
FullSyncNpcPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncNpcPacket>(stream);
}
FullSyncNpcPacket data = CoopSerializer.Deserialize<FullSyncNpcPacket>(message.ReadBytes(len));
ID = data.ID;
ModelHash = data.ModelHash;
@ -404,12 +359,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -419,11 +369,7 @@ namespace CoopClient
{
int len = message.ReadInt32();
LightSyncPlayerPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<LightSyncPlayerPacket>(stream);
}
LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
Health = data.Health;
@ -450,12 +396,7 @@ namespace CoopClient
{
message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -465,14 +406,37 @@ namespace CoopClient
{
int len = message.ReadInt32();
ChatMessagePacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<ChatMessagePacket>(stream);
}
ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
Username = data.Username;
Message = data.Message;
}
}
class CoopSerializer
{
public static T Deserialize<T>(byte[] data) where T : new()
{
try
{
using (MemoryStream stream = new MemoryStream(data))
{
return Serializer.Deserialize<T>(stream);
}
}
catch
{
throw new Exception(string.Format("The deserialization of the packet {0} failed!", typeof(T).Name));
}
}
public static byte[] Serialize<T>(T packet)
{
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, packet);
return stream.ToArray();
}
}
}
}

View File

@ -94,12 +94,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.HandshakePacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -109,11 +104,7 @@ namespace CoopServer
{
int len = message.ReadInt32();
HandshakePacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<HandshakePacket>(stream);
}
HandshakePacket data = CoopSerializer.Deserialize<HandshakePacket>(message.ReadBytes(len));
ID = data.ID;
SocialClubName = data.SocialClubName;
@ -139,12 +130,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.PlayerConnectPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -154,11 +140,7 @@ namespace CoopServer
{
int len = message.ReadInt32();
PlayerConnectPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerConnectPacket>(stream);
}
PlayerConnectPacket data = CoopSerializer.Deserialize<PlayerConnectPacket>(message.ReadBytes(len));
Player = data.Player;
SocialClubName = data.SocialClubName;
@ -176,12 +158,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.PlayerDisconnectPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -191,11 +168,7 @@ namespace CoopServer
{
int len = message.ReadInt32();
PlayerDisconnectPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerDisconnectPacket>(stream);
}
PlayerDisconnectPacket data = CoopSerializer.Deserialize<PlayerDisconnectPacket>(message.ReadBytes(len));
Player = data.Player;
}
@ -241,12 +214,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.FullSyncPlayerPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -256,11 +224,7 @@ namespace CoopServer
{
int len = message.ReadInt32();
FullSyncPlayerPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncPlayerPacket>(stream);
}
FullSyncPlayerPacket data = CoopSerializer.Deserialize<FullSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
ModelHash = data.ModelHash;
@ -316,12 +280,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.FullSyncNpcPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -331,11 +290,7 @@ namespace CoopServer
{
int len = message.ReadInt32();
FullSyncNpcPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncNpcPacket>(stream);
}
FullSyncNpcPacket data = CoopSerializer.Deserialize<FullSyncNpcPacket>(message.ReadBytes(len));
ID = data.ID;
ModelHash = data.ModelHash;
@ -385,12 +340,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -400,11 +350,7 @@ namespace CoopServer
{
int len = message.ReadInt32();
LightSyncPlayerPacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<LightSyncPlayerPacket>(stream);
}
LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
Player = data.Player;
Health = data.Health;
@ -431,12 +377,7 @@ namespace CoopServer
{
message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result;
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
byte[] result = CoopSerializer.Serialize(this);
message.Write(result.Length);
message.Write(result);
@ -446,14 +387,37 @@ namespace CoopServer
{
int len = message.ReadInt32();
ChatMessagePacket data;
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<ChatMessagePacket>(stream);
}
ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
Username = data.Username;
Message = data.Message;
}
}
class CoopSerializer
{
public static T Deserialize<T>(byte[] data) where T : new()
{
try
{
using (MemoryStream stream = new MemoryStream(data))
{
return Serializer.Deserialize<T>(stream);
}
}
catch
{
throw new Exception(string.Format("The deserialization of the packet {0} failed!", typeof(T).Name));
}
}
public static byte[] Serialize<T>(T packet)
{
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, packet);
return stream.ToArray();
}
}
}
}

View File

@ -124,34 +124,33 @@ namespace CoopServer
Logging.Info("New incoming connection from: " + message.SenderConnection.RemoteEndPoint.ToString());
if (message.ReadByte() != (byte)PacketTypes.HandshakePacket)
{
Logging.Info(string.Format("Player with IP {0} blocked, reason: Wrong packet!", message.SenderConnection.RemoteEndPoint.ToString()));
message.SenderConnection.Deny("Wrong packet!");
}
else
{
Packet approvalPacket;
approvalPacket = new HandshakePacket();
approvalPacket.NetIncomingMessageToPacket(message);
GetHandshake(message.SenderConnection, (HandshakePacket)approvalPacket);
try
{
Packet approvalPacket;
approvalPacket = new HandshakePacket();
approvalPacket.NetIncomingMessageToPacket(message);
GetHandshake(message.SenderConnection, (HandshakePacket)approvalPacket);
}
catch (Exception e)
{
Logging.Info(string.Format("Player with IP {0} blocked, reason: {1}", message.SenderConnection.RemoteEndPoint.ToString(), e.Message));
message.SenderConnection.Deny(e.Message);
}
}
break;
case NetIncomingMessageType.StatusChanged:
NetConnectionStatus status = (NetConnectionStatus)message.ReadByte();
string reason = message.ReadString();
string player = NetUtility.ToHexString(message.SenderConnection.RemoteUniqueIdentifier);
//Logging.Debug(NetUtility.ToHexString(message.SenderConnection.RemoteUniqueIdentifier) + " " + status + ": " + reason);
switch (status)
if (status == NetConnectionStatus.Disconnected && Players.ContainsKey(player))
{
case NetConnectionStatus.Connected:
//Logging.Info("New incoming connection from: " + message.SenderConnection.RemoteEndPoint.ToString());
break;
case NetConnectionStatus.Disconnected:
if (Players.ContainsKey(player))
{
SendPlayerDisconnectPacket(new PlayerDisconnectPacket() { Player = player }, reason);
}
break;
SendPlayerDisconnectPacket(new PlayerDisconnectPacket() { Player = player }, message.ReadString());
}
break;
case NetIncomingMessageType.Data:
@ -164,42 +163,83 @@ namespace CoopServer
switch (type)
{
case (byte)PacketTypes.PlayerConnectPacket:
packet = new PlayerConnectPacket();
packet.NetIncomingMessageToPacket(message);
SendPlayerConnectPacket(message.SenderConnection, (PlayerConnectPacket)packet);
try
{
packet = new PlayerConnectPacket();
packet.NetIncomingMessageToPacket(message);
SendPlayerConnectPacket(message.SenderConnection, (PlayerConnectPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.PlayerDisconnectPacket:
packet = new PlayerDisconnectPacket();
packet.NetIncomingMessageToPacket(message);
SendPlayerDisconnectPacket((PlayerDisconnectPacket)packet);
try
{
packet = new PlayerDisconnectPacket();
packet.NetIncomingMessageToPacket(message);
SendPlayerDisconnectPacket((PlayerDisconnectPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.FullSyncPlayerPacket:
packet = new FullSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message);
FullSyncPlayer((FullSyncPlayerPacket)packet);
try
{
packet = new FullSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message);
FullSyncPlayer((FullSyncPlayerPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.FullSyncNpcPacket:
if (MainSettings.NpcsAllowed)
{
packet = new FullSyncNpcPacket();
packet.NetIncomingMessageToPacket(message);
FullSyncNpc(message.SenderConnection, (FullSyncNpcPacket)packet);
try
{
packet = new FullSyncNpcPacket();
packet.NetIncomingMessageToPacket(message);
FullSyncNpc(message.SenderConnection, (FullSyncNpcPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
}
else
{
Logging.Warning(Players[NetUtility.ToHexString(message.SenderConnection.RemoteUniqueIdentifier)].Username + " tries to send Npcs!");
message.SenderConnection.Disconnect("Npcs are not allowed!");
}
break;
case (byte)PacketTypes.LightSyncPlayerPacket:
packet = new LightSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message);
LightSyncPlayer((LightSyncPlayerPacket)packet);
try
{
packet = new LightSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message);
LightSyncPlayer((LightSyncPlayerPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
case (byte)PacketTypes.ChatMessagePacket:
packet = new ChatMessagePacket();
packet.NetIncomingMessageToPacket(message);
SendChatMessage((ChatMessagePacket)packet);
try
{
packet = new ChatMessagePacket();
packet.NetIncomingMessageToPacket(message);
SendChatMessage((ChatMessagePacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break;
default:
Logging.Error("Unhandled Data / Packet type");