mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Merge branch 'fix_connection' into multiplayer
This commit is contained in:
		| @@ -13,10 +13,15 @@ namespace FFXIVClassic_Lobby_Server.packets | ||||
|     public struct SubPacketHeader | ||||
|     { | ||||
|         public ushort       subpacketSize; | ||||
|         public ushort       unknown0; //Always 0x03 | ||||
|         public ushort       type; | ||||
|         public uint         sourceId;  | ||||
|         public uint         targetId; | ||||
|         public uint         unknown1; | ||||
|     } | ||||
|  | ||||
|     [StructLayout(LayoutKind.Sequential)] | ||||
|     public struct GameMessageHeader | ||||
|     { | ||||
|         public ushort       unknown4; //Always 0x14 | ||||
|         public ushort       opcode; | ||||
|         public uint         unknown5;  | ||||
| @@ -26,9 +31,11 @@ namespace FFXIVClassic_Lobby_Server.packets | ||||
|  | ||||
|     public class SubPacket | ||||
|     { | ||||
|         public const int SUBPACKET_SIZE = 0x20; | ||||
|         public const int SUBPACKET_SIZE = 0x10; | ||||
|         public const int GAMEMESSAGE_SIZE = 0x10; | ||||
|  | ||||
|         public SubPacketHeader  header; | ||||
|         public GameMessageHeader gameMessage; | ||||
|         public byte[]           data; | ||||
|  | ||||
|         public unsafe SubPacket(byte[] bytes, ref int offset) | ||||
| @@ -41,11 +48,27 @@ namespace FFXIVClassic_Lobby_Server.packets | ||||
|                 header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|             } | ||||
|  | ||||
|             if (header.type == 0x3) | ||||
|             { | ||||
|                 fixed (byte* pdata = &bytes[offset + SUBPACKET_SIZE]) | ||||
|                 { | ||||
|                     gameMessage = (GameMessageHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (bytes.Length < offset + header.subpacketSize) | ||||
|                 throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); | ||||
|  | ||||
|             data = new byte[header.subpacketSize - SUBPACKET_SIZE]; | ||||
|             Array.Copy(bytes, offset + SUBPACKET_SIZE, data, 0, data.Length); | ||||
|             if (header.type == 0x3) | ||||
|             { | ||||
|                 data = new byte[header.subpacketSize - SUBPACKET_SIZE - GAMEMESSAGE_SIZE]; | ||||
|                 Array.Copy(bytes, offset + SUBPACKET_SIZE + GAMEMESSAGE_SIZE, data, 0, data.Length); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 data = new byte[header.subpacketSize - SUBPACKET_SIZE]; | ||||
|                 Array.Copy(bytes, offset + SUBPACKET_SIZE, data, 0, data.Length); | ||||
|             } | ||||
|  | ||||
|             offset += header.subpacketSize; | ||||
|         } | ||||
| @@ -53,21 +76,23 @@ namespace FFXIVClassic_Lobby_Server.packets | ||||
|         public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) | ||||
|         { | ||||
|             this.header = new SubPacketHeader(); | ||||
|             header.opcode = opcode; | ||||
|             this.gameMessage = new GameMessageHeader(); | ||||
|  | ||||
|             gameMessage.opcode = opcode; | ||||
|             header.sourceId = sourceId; | ||||
|             header.targetId = targetId; | ||||
|  | ||||
|             header.timestamp = Utils.UnixTimeStampUTC(); | ||||
|             gameMessage.timestamp = Utils.UnixTimeStampUTC(); | ||||
|  | ||||
|             header.unknown0 = 0x03; | ||||
|             header.type = 0x03; | ||||
|             header.unknown1 = 0x00; | ||||
|             header.unknown4 = 0x14; | ||||
|             header.unknown5 = 0x00; | ||||
|             header.unknown6 = 0x00; | ||||
|             gameMessage.unknown4 = 0x14; | ||||
|             gameMessage.unknown5 = 0x00; | ||||
|             gameMessage.unknown6 = 0x00; | ||||
|  | ||||
|             this.data = data; | ||||
|  | ||||
|             header.subpacketSize = (ushort)(0x20 + data.Length); | ||||
|             header.subpacketSize = (ushort)(SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); | ||||
|         } | ||||
|  | ||||
|         public byte[] getHeaderBytes() | ||||
| @@ -82,11 +107,27 @@ namespace FFXIVClassic_Lobby_Server.packets | ||||
|             return arr; | ||||
|         } | ||||
|  | ||||
|         public byte[] getGameMessageBytes() | ||||
|         { | ||||
|             int size = Marshal.SizeOf(gameMessage); | ||||
|             byte[] arr = new byte[size]; | ||||
|  | ||||
|             IntPtr ptr = Marshal.AllocHGlobal(size); | ||||
|             Marshal.StructureToPtr(gameMessage, ptr, true); | ||||
|             Marshal.Copy(ptr, arr, 0, size); | ||||
|             Marshal.FreeHGlobal(ptr); | ||||
|             return arr; | ||||
|         } | ||||
|  | ||||
|         public byte[] getBytes() | ||||
|         { | ||||
|             byte[] outBytes = new byte[header.subpacketSize]; | ||||
|             Array.Copy(getHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE); | ||||
|             Array.Copy(data, 0, outBytes, SUBPACKET_SIZE, data.Length); | ||||
|  | ||||
|             if (header.type == 0x3) | ||||
|                 Array.Copy(getGameMessageBytes(), 0, outBytes, SUBPACKET_SIZE, GAMEMESSAGE_SIZE); | ||||
|  | ||||
|             Array.Copy(data, 0, outBytes, SUBPACKET_SIZE + (header.type == 0x3 ? GAMEMESSAGE_SIZE : 0), data.Length); | ||||
|             return outBytes; | ||||
|         } | ||||
|  | ||||
| @@ -94,8 +135,12 @@ namespace FFXIVClassic_Lobby_Server.packets | ||||
|         { | ||||
| #if DEBUG | ||||
|             Console.BackgroundColor = ConsoleColor.DarkRed; | ||||
|             Console.WriteLine("Size: 0x{0:X}, Opcode: 0x{1:X}", header.subpacketSize, header.opcode);             | ||||
|             Console.WriteLine("Size: 0x{0:X}", header.subpacketSize); | ||||
|             if (header.type == 0x03) | ||||
|                 Console.WriteLine("Opcode: 0x{0:X}", gameMessage.opcode); | ||||
|             Console.WriteLine("{0}", Utils.ByteArrayToHex(getHeaderBytes())); | ||||
|             if (header.type == 0x03) | ||||
|                 Console.WriteLine("{0}", Utils.ByteArrayToHex(getGameMessageBytes())); | ||||
|             Console.BackgroundColor = ConsoleColor.DarkMagenta; | ||||
|             Console.WriteLine("{0}", Utils.ByteArrayToHex(data)); | ||||
|             Console.BackgroundColor = ConsoleColor.Black; | ||||
|   | ||||
| @@ -10,9 +10,9 @@ namespace FFXIVClassic_Map_Server.packets.send.login | ||||
| { | ||||
|     class InitPacket | ||||
|     { | ||||
|         public static BasePacket buildPacket(uint unknown, uint time) | ||||
|         public static BasePacket buildPacket(uint actorID, uint time) | ||||
|         { | ||||
|             byte[] data = new byte[18]; | ||||
|             byte[] data = new byte[0x18]; | ||||
|  | ||||
|             using (MemoryStream mem = new MemoryStream(data)) | ||||
|             { | ||||
| @@ -26,7 +26,7 @@ namespace FFXIVClassic_Map_Server.packets.send.login | ||||
|                         binWriter.Write((uint)0); | ||||
|                         binWriter.Write((uint)0xFFFFFD7F); | ||||
|  | ||||
|                         binWriter.Write((uint)unknown); | ||||
|                         binWriter.Write((uint)actorID); | ||||
|                         binWriter.Write((uint)time); | ||||
|                     } | ||||
|                     catch (Exception) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user