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

View File

@ -113,12 +113,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.HandshakePacket); message.Write((byte)PacketTypes.HandshakePacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -128,11 +123,7 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
HandshakePacket data; HandshakePacket data = CoopSerializer.Deserialize<HandshakePacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<HandshakePacket>(stream);
}
ID = data.ID; ID = data.ID;
SocialClubName = data.SocialClubName; SocialClubName = data.SocialClubName;
@ -158,12 +149,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.PlayerConnectPacket); message.Write((byte)PacketTypes.PlayerConnectPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -173,11 +159,7 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
PlayerConnectPacket data; PlayerConnectPacket data = CoopSerializer.Deserialize<PlayerConnectPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerConnectPacket>(stream);
}
Player = data.Player; Player = data.Player;
SocialClubName = data.SocialClubName; SocialClubName = data.SocialClubName;
@ -195,12 +177,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.PlayerDisconnectPacket); message.Write((byte)PacketTypes.PlayerDisconnectPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -210,11 +187,7 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
PlayerDisconnectPacket data; PlayerDisconnectPacket data = CoopSerializer.Deserialize<PlayerDisconnectPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerDisconnectPacket>(stream);
}
Player = data.Player; Player = data.Player;
} }
@ -260,12 +233,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.FullSyncPlayerPacket); message.Write((byte)PacketTypes.FullSyncPlayerPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -275,11 +243,7 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
FullSyncPlayerPacket data; FullSyncPlayerPacket data = CoopSerializer.Deserialize<FullSyncPlayerPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncPlayerPacket>(stream);
}
Player = data.Player; Player = data.Player;
ModelHash = data.ModelHash; ModelHash = data.ModelHash;
@ -335,12 +299,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.FullSyncNpcPacket); message.Write((byte)PacketTypes.FullSyncNpcPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -350,11 +309,7 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
FullSyncNpcPacket data; FullSyncNpcPacket data = CoopSerializer.Deserialize<FullSyncNpcPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncNpcPacket>(stream);
}
ID = data.ID; ID = data.ID;
ModelHash = data.ModelHash; ModelHash = data.ModelHash;
@ -404,12 +359,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.LightSyncPlayerPacket); message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -419,11 +369,7 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
LightSyncPlayerPacket data; LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<LightSyncPlayerPacket>(stream);
}
Player = data.Player; Player = data.Player;
Health = data.Health; Health = data.Health;
@ -450,12 +396,7 @@ namespace CoopClient
{ {
message.Write((byte)PacketTypes.ChatMessagePacket); message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -465,14 +406,37 @@ namespace CoopClient
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
ChatMessagePacket data; ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<ChatMessagePacket>(stream);
}
Username = data.Username; Username = data.Username;
Message = data.Message; 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); message.Write((byte)PacketTypes.HandshakePacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -109,11 +104,7 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
HandshakePacket data; HandshakePacket data = CoopSerializer.Deserialize<HandshakePacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<HandshakePacket>(stream);
}
ID = data.ID; ID = data.ID;
SocialClubName = data.SocialClubName; SocialClubName = data.SocialClubName;
@ -139,12 +130,7 @@ namespace CoopServer
{ {
message.Write((byte)PacketTypes.PlayerConnectPacket); message.Write((byte)PacketTypes.PlayerConnectPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -154,11 +140,7 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
PlayerConnectPacket data; PlayerConnectPacket data = CoopSerializer.Deserialize<PlayerConnectPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerConnectPacket>(stream);
}
Player = data.Player; Player = data.Player;
SocialClubName = data.SocialClubName; SocialClubName = data.SocialClubName;
@ -176,12 +158,7 @@ namespace CoopServer
{ {
message.Write((byte)PacketTypes.PlayerDisconnectPacket); message.Write((byte)PacketTypes.PlayerDisconnectPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -191,11 +168,7 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
PlayerDisconnectPacket data; PlayerDisconnectPacket data = CoopSerializer.Deserialize<PlayerDisconnectPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<PlayerDisconnectPacket>(stream);
}
Player = data.Player; Player = data.Player;
} }
@ -241,12 +214,7 @@ namespace CoopServer
{ {
message.Write((byte)PacketTypes.FullSyncPlayerPacket); message.Write((byte)PacketTypes.FullSyncPlayerPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -256,11 +224,7 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
FullSyncPlayerPacket data; FullSyncPlayerPacket data = CoopSerializer.Deserialize<FullSyncPlayerPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncPlayerPacket>(stream);
}
Player = data.Player; Player = data.Player;
ModelHash = data.ModelHash; ModelHash = data.ModelHash;
@ -316,12 +280,7 @@ namespace CoopServer
{ {
message.Write((byte)PacketTypes.FullSyncNpcPacket); message.Write((byte)PacketTypes.FullSyncNpcPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -331,11 +290,7 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
FullSyncNpcPacket data; FullSyncNpcPacket data = CoopSerializer.Deserialize<FullSyncNpcPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<FullSyncNpcPacket>(stream);
}
ID = data.ID; ID = data.ID;
ModelHash = data.ModelHash; ModelHash = data.ModelHash;
@ -385,12 +340,7 @@ namespace CoopServer
{ {
message.Write((byte)PacketTypes.LightSyncPlayerPacket); message.Write((byte)PacketTypes.LightSyncPlayerPacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -400,11 +350,7 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
LightSyncPlayerPacket data; LightSyncPlayerPacket data = CoopSerializer.Deserialize<LightSyncPlayerPacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<LightSyncPlayerPacket>(stream);
}
Player = data.Player; Player = data.Player;
Health = data.Health; Health = data.Health;
@ -431,12 +377,7 @@ namespace CoopServer
{ {
message.Write((byte)PacketTypes.ChatMessagePacket); message.Write((byte)PacketTypes.ChatMessagePacket);
byte[] result; byte[] result = CoopSerializer.Serialize(this);
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, this);
result = stream.ToArray();
}
message.Write(result.Length); message.Write(result.Length);
message.Write(result); message.Write(result);
@ -446,14 +387,37 @@ namespace CoopServer
{ {
int len = message.ReadInt32(); int len = message.ReadInt32();
ChatMessagePacket data; ChatMessagePacket data = CoopSerializer.Deserialize<ChatMessagePacket>(message.ReadBytes(len));
using (MemoryStream stream = new MemoryStream(message.ReadBytes(len)))
{
data = Serializer.Deserialize<ChatMessagePacket>(stream);
}
Username = data.Username; Username = data.Username;
Message = data.Message; 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()); Logging.Info("New incoming connection from: " + message.SenderConnection.RemoteEndPoint.ToString());
if (message.ReadByte() != (byte)PacketTypes.HandshakePacket) 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!"); message.SenderConnection.Deny("Wrong packet!");
} }
else else
{
try
{ {
Packet approvalPacket; Packet approvalPacket;
approvalPacket = new HandshakePacket(); approvalPacket = new HandshakePacket();
approvalPacket.NetIncomingMessageToPacket(message); approvalPacket.NetIncomingMessageToPacket(message);
GetHandshake(message.SenderConnection, (HandshakePacket)approvalPacket); 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; break;
case NetIncomingMessageType.StatusChanged: case NetIncomingMessageType.StatusChanged:
NetConnectionStatus status = (NetConnectionStatus)message.ReadByte(); NetConnectionStatus status = (NetConnectionStatus)message.ReadByte();
string reason = message.ReadString();
string player = NetUtility.ToHexString(message.SenderConnection.RemoteUniqueIdentifier); 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: SendPlayerDisconnectPacket(new PlayerDisconnectPacket() { Player = player }, message.ReadString());
//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;
} }
break; break;
case NetIncomingMessageType.Data: case NetIncomingMessageType.Data:
@ -164,42 +163,83 @@ namespace CoopServer
switch (type) switch (type)
{ {
case (byte)PacketTypes.PlayerConnectPacket: case (byte)PacketTypes.PlayerConnectPacket:
try
{
packet = new PlayerConnectPacket(); packet = new PlayerConnectPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
SendPlayerConnectPacket(message.SenderConnection, (PlayerConnectPacket)packet); SendPlayerConnectPacket(message.SenderConnection, (PlayerConnectPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break; break;
case (byte)PacketTypes.PlayerDisconnectPacket: case (byte)PacketTypes.PlayerDisconnectPacket:
try
{
packet = new PlayerDisconnectPacket(); packet = new PlayerDisconnectPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
SendPlayerDisconnectPacket((PlayerDisconnectPacket)packet); SendPlayerDisconnectPacket((PlayerDisconnectPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break; break;
case (byte)PacketTypes.FullSyncPlayerPacket: case (byte)PacketTypes.FullSyncPlayerPacket:
try
{
packet = new FullSyncPlayerPacket(); packet = new FullSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
FullSyncPlayer((FullSyncPlayerPacket)packet); FullSyncPlayer((FullSyncPlayerPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break; break;
case (byte)PacketTypes.FullSyncNpcPacket: case (byte)PacketTypes.FullSyncNpcPacket:
if (MainSettings.NpcsAllowed) if (MainSettings.NpcsAllowed)
{
try
{ {
packet = new FullSyncNpcPacket(); packet = new FullSyncNpcPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
FullSyncNpc(message.SenderConnection, (FullSyncNpcPacket)packet); FullSyncNpc(message.SenderConnection, (FullSyncNpcPacket)packet);
} }
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
}
else else
{ {
Logging.Warning(Players[NetUtility.ToHexString(message.SenderConnection.RemoteUniqueIdentifier)].Username + " tries to send Npcs!");
message.SenderConnection.Disconnect("Npcs are not allowed!"); message.SenderConnection.Disconnect("Npcs are not allowed!");
} }
break; break;
case (byte)PacketTypes.LightSyncPlayerPacket: case (byte)PacketTypes.LightSyncPlayerPacket:
try
{
packet = new LightSyncPlayerPacket(); packet = new LightSyncPlayerPacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
LightSyncPlayer((LightSyncPlayerPacket)packet); LightSyncPlayer((LightSyncPlayerPacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break; break;
case (byte)PacketTypes.ChatMessagePacket: case (byte)PacketTypes.ChatMessagePacket:
try
{
packet = new ChatMessagePacket(); packet = new ChatMessagePacket();
packet.NetIncomingMessageToPacket(message); packet.NetIncomingMessageToPacket(message);
SendChatMessage((ChatMessagePacket)packet); SendChatMessage((ChatMessagePacket)packet);
}
catch (Exception e)
{
message.SenderConnection.Disconnect(e.Message);
}
break; break;
default: default:
Logging.Error("Unhandled Data / Packet type"); Logging.Error("Unhandled Data / Packet type");