diff --git a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
index 48f326c4..f9da3622 100644
--- a/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
+++ b/FFXIVClassic_Lobby_Server/FFXIVClassic_Lobby_Server.csproj
@@ -71,17 +71,19 @@
-
-
-
+
+
+
+
+
+
-
-
+
-
-
-
-
+
+
+
+
diff --git a/FFXIVClassic_Lobby_Server/PacketProcessor.cs b/FFXIVClassic_Lobby_Server/PacketProcessor.cs
index 87fe9a7b..06d934cc 100644
--- a/FFXIVClassic_Lobby_Server/PacketProcessor.cs
+++ b/FFXIVClassic_Lobby_Server/PacketProcessor.cs
@@ -1,6 +1,7 @@
using FFXIVClassic_Lobby_Server.common;
using FFXIVClassic_Lobby_Server.dataobjects;
using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Lobby_Server.packets.receive;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
@@ -79,7 +80,7 @@ namespace FFXIVClassic_Lobby_Server
private void ProcessSessionAcknowledgement(ClientConnection client, SubPacket packet)
{
- PacketStructs.SessionPacket sessionPacket = PacketStructs.toSessionStruct(packet.data);
+ SessionPacket sessionPacket = new SessionPacket(packet.data);
String clientVersion = sessionPacket.version;
Log.info(String.Format("Got acknowledgment for secure session."));
@@ -127,7 +128,7 @@ namespace FFXIVClassic_Lobby_Server
private void ProcessSelectCharacter(ClientConnection client, SubPacket packet)
{
- FFXIVClassic_Lobby_Server.packets.PacketStructs.SelectCharRequestPacket selectCharRequest = PacketStructs.toSelectCharRequestStruct(packet.data);
+ SelectCharacterPacket selectCharRequest = new SelectCharacterPacket(packet.data);
Log.info(String.Format("{0} => Select character id {1}", client.currentUserId == 0 ? client.getAddress() : "User " + client.currentUserId, selectCharRequest.characterId));
@@ -156,8 +157,7 @@ namespace FFXIVClassic_Lobby_Server
private void ProcessModifyCharacter(ClientConnection client, SubPacket packet)
{
-
- PacketStructs.CharacterRequestPacket charaReq = PacketStructs.toCharacterRequestStruct(packet.data);
+ CharacterModifyPacket charaReq = new CharacterModifyPacket(packet.data);
var slot = charaReq.slot;
var code = charaReq.command;
var name = charaReq.characterName;
diff --git a/FFXIVClassic_Lobby_Server/packets/PacketStructs.cs b/FFXIVClassic_Lobby_Server/packets/PacketStructs.cs
deleted file mode 100644
index 683954ca..00000000
--- a/FFXIVClassic_Lobby_Server/packets/PacketStructs.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace FFXIVClassic_Lobby_Server.packets
-{
- class PacketStructs
- {
- [StructLayout(LayoutKind.Explicit)]
- public unsafe struct SessionPacket
- {
- [FieldOffset(0)]
- public UInt64 sequence;
- [FieldOffset(0x10)]
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)]
- public String session;
- [FieldOffset(0x50)]
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
- public String version;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public unsafe struct CharacterRequestPacket
- {
- public UInt64 sequence;
- public uint characterId;
- public uint personType;
- public byte slot;
- public byte command;
- public ushort worldId;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
- public String characterName;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x190)]
- public String characterInfoEncoded;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public unsafe struct SelectCharRequestPacket
- {
- public UInt64 sequence;
- public uint characterId;
- public uint unknownId;
- public UInt64 ticket;
- }
-
- public static unsafe CharacterRequestPacket toCharacterRequestStruct(byte[] bytes)
- {
- fixed (byte* pdata = &bytes[0])
- {
- return (CharacterRequestPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(CharacterRequestPacket));
- }
- }
-
- public static unsafe SessionPacket toSessionStruct(byte[] bytes)
- {
- fixed (byte* pdata = &bytes[0])
- {
- return (SessionPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SessionPacket));
- }
- }
-
- public static unsafe SelectCharRequestPacket toSelectCharRequestStruct(byte[] bytes)
- {
- fixed (byte* pdata = &bytes[0])
- {
- return (SelectCharRequestPacket)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SelectCharRequestPacket));
- }
- }
-
- public static byte[] StructureToByteArray(object obj)
- {
- int len = Marshal.SizeOf(obj);
-
- byte[] arr = new byte[len];
-
- IntPtr ptr = Marshal.AllocHGlobal(len);
-
- Marshal.StructureToPtr(obj, ptr, true);
-
- Marshal.Copy(ptr, arr, 0, len);
-
- Marshal.FreeHGlobal(ptr);
-
- return arr;
- }
- }
-}
diff --git a/FFXIVClassic_Lobby_Server/packets/receive/CharacterModifyPacket.cs b/FFXIVClassic_Lobby_Server/packets/receive/CharacterModifyPacket.cs
new file mode 100644
index 00000000..cc4ebc7f
--- /dev/null
+++ b/FFXIVClassic_Lobby_Server/packets/receive/CharacterModifyPacket.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Lobby_Server.packets.receive
+{
+ class CharacterModifyPacket
+ {
+ public UInt64 sequence;
+ public uint characterId;
+ public uint personType;
+ public byte slot;
+ public byte command;
+ public ushort worldId;
+ public String characterName;
+ public String characterInfoEncoded;
+
+ public bool invalidPacket = false;
+
+ public CharacterModifyPacket(byte[] data)
+ {
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryReader binReader = new BinaryReader(mem))
+ {
+ try
+ {
+ sequence = binReader.ReadUInt64();
+ characterId = binReader.ReadUInt32();
+ personType = binReader.ReadUInt32();
+ slot = binReader.ReadByte();
+ command = binReader.ReadByte();
+ worldId = binReader.ReadUInt16();
+
+ characterName = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
+ characterInfoEncoded = Encoding.ASCII.GetString(binReader.ReadBytes(0x190)).Trim(new[] { '\0' });
+ }
+ catch (Exception){
+ invalidPacket = true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FFXIVClassic_Lobby_Server/packets/receive/SelectCharacterPacket.cs b/FFXIVClassic_Lobby_Server/packets/receive/SelectCharacterPacket.cs
new file mode 100644
index 00000000..4e93d593
--- /dev/null
+++ b/FFXIVClassic_Lobby_Server/packets/receive/SelectCharacterPacket.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Lobby_Server.packets.receive
+{
+ class SelectCharacterPacket
+ {
+ public UInt64 sequence;
+ public uint characterId;
+ public uint unknownId;
+ public UInt64 ticket;
+
+ public bool invalidPacket = false;
+
+ public SelectCharacterPacket(byte[] data)
+ {
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryReader binReader = new BinaryReader(mem))
+ {
+ try
+ {
+ sequence = binReader.ReadUInt64();
+ characterId = binReader.ReadUInt32();
+ unknownId = binReader.ReadUInt32();
+ ticket = binReader.ReadUInt64();
+ }
+ catch (Exception){
+ invalidPacket = true;
+ }
+ }
+ }
+ }
+
+ }
+}
diff --git a/FFXIVClassic_Lobby_Server/packets/receive/SessionPacket.cs b/FFXIVClassic_Lobby_Server/packets/receive/SessionPacket.cs
new file mode 100644
index 00000000..53555a8a
--- /dev/null
+++ b/FFXIVClassic_Lobby_Server/packets/receive/SessionPacket.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Lobby_Server.packets.receive
+{
+ class SessionPacket
+ {
+ public bool invalidPacket = false;
+ public UInt64 sequence;
+ public String session;
+ public String version;
+
+ public SessionPacket(byte[] data)
+ {
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryReader binReader = new BinaryReader(mem))
+ {
+ try
+ {
+ sequence = binReader.ReadUInt64();
+ binReader.ReadUInt32();
+ binReader.ReadUInt32();
+ session = Encoding.ASCII.GetString(binReader.ReadBytes(0x40)).Trim(new[] { '\0' });
+ version = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
+ }
+ catch (Exception){
+ invalidPacket = true;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/FFXIVClassic_Lobby_Server/packets/AccountListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/AccountListPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/AccountListPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/AccountListPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/CharaCreatorPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/CharaCreatorPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/CharaCreatorPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/CharaCreatorPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/CharacterListPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/CharacterListPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/CharacterListPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/ErrorPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/ErrorPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/ErrorPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/ImportListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/ImportListPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/ImportListPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/ImportListPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/RetainerListPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/RetainerListPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/RetainerListPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/SelectCharacterConfirmPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/SelectCharacterConfirmPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/SelectCharacterConfirmPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/SelectCharacterConfirmPacket.cs
diff --git a/FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs b/FFXIVClassic_Lobby_Server/packets/send/WorldListPacket.cs
similarity index 100%
rename from FFXIVClassic_Lobby_Server/packets/WorldListPacket.cs
rename to FFXIVClassic_Lobby_Server/packets/send/WorldListPacket.cs