2015-08-27 10:19:00 -04:00
|
|
|
|
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)]
|
2015-09-02 14:07:45 -04:00
|
|
|
|
public UInt64 sequence;
|
2015-08-27 10:19:00 -04:00
|
|
|
|
[FieldOffset(0x50)]
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
|
|
|
|
|
public String version;
|
|
|
|
|
[FieldOffset(0x70)]
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
|
|
|
|
|
public String session;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-02 14:07:45 -04:00
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct WorldListPacket
|
|
|
|
|
{
|
2015-09-03 01:02:55 -04:00
|
|
|
|
public UInt64 sequence;
|
|
|
|
|
public uint isEndListANDNumWorlds;
|
|
|
|
|
public uint unknown1;
|
2015-09-02 14:07:45 -04:00
|
|
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
|
|
|
|
public WorldListEntry[] worlds;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct WorldListEntry
|
|
|
|
|
{
|
|
|
|
|
public ushort id;
|
|
|
|
|
public ushort listPosition;
|
|
|
|
|
public uint population;
|
|
|
|
|
public UInt64 unknown;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x40)]
|
|
|
|
|
public String name;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-27 10:19:00 -04:00
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct CharacterRequestPacket
|
|
|
|
|
{
|
2015-09-02 14:07:45 -04:00
|
|
|
|
public UInt64 sequence;
|
2015-08-27 10:19:00 -04:00
|
|
|
|
public uint characterId;
|
2015-09-02 14:07:45 -04:00
|
|
|
|
public uint personType;
|
2015-08-27 10:19:00 -04:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-02 14:07:45 -04:00
|
|
|
|
//Response Packets
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct ReserveCharaResponse
|
|
|
|
|
{
|
|
|
|
|
public UInt64 sequence;
|
|
|
|
|
public uint errorCode;
|
|
|
|
|
public uint statusCode;
|
|
|
|
|
public uint errorId;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
|
|
|
|
public String errorMessage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct MakeCharaResponse
|
|
|
|
|
{
|
|
|
|
|
public UInt64 sequence;
|
|
|
|
|
public uint errorCode;
|
|
|
|
|
public uint statusCode;
|
|
|
|
|
public uint errorId;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
|
|
|
|
public String errorMessage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct DeleteCharaResponse
|
|
|
|
|
{
|
|
|
|
|
public UInt64 sequence;
|
|
|
|
|
public uint errorCode;
|
|
|
|
|
public uint statusCode;
|
|
|
|
|
public uint errorId;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
|
|
|
|
public String errorMessage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
|
|
|
public unsafe struct ErrorPacket
|
|
|
|
|
{
|
|
|
|
|
public UInt64 sequence;
|
|
|
|
|
public uint errorCode;
|
|
|
|
|
public uint statusCode;
|
|
|
|
|
public uint errorId;
|
|
|
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x2BB)]
|
|
|
|
|
public String errorMessage;
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-27 10:19:00 -04:00
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-09-02 14:07:45 -04:00
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
2015-08-27 10:19:00 -04:00
|
|
|
|
}
|
|
|
|
|
}
|