#pragma pack(push)

#pragma pack(1)

// General
typedef struct UO_Code {
  BYTE code;
} UO_Code;

typedef struct UO_ServerInfo {
  WORD id;
  char name[32];
  char percentfull;
  char timezone;
  DWORD ipaddress;
} UO_ServerInfo;

// Client->Server
typedef struct UO_GetServerList {
  BYTE code;                        // 0x80
  char userid[30];
  char password[30];
  BYTE unknown;                     // 0xFF <- why?
} UO_GetServerList;

typedef struct UO_ClientLogin {
  BYTE code;                        // 0x91
  DWORD unknown;
  char userid[30];
  char password[30];
} UO_ClientLogin;

typedef struct UO_RedirectClientRequest {
  BYTE code;                        // 0xA0
  WORD serverid;
} UO_RedirectClientRequest;

// Server->Client
typedef struct UO_ServerAndLocations {
  BYTE code;                        // 0x81
  WORD unknown1;
  WORD unknown2;
  BYTE data[300];
} UO_ServerAndLocations;

typedef struct UO_BadLogin {
  BYTE code;                        // 0x82
  BYTE reason;                      // 0x00 = invalid account
                                    // 0x01 = too many logins       <-- not verified
                                    // 0x02 = account blocked
                                    // 0x03 = invalid credentials
                                    // 0x04 = bad login
} UO_BadLogin;

typedef struct UO_RedirectClient {
  BYTE code;                        // 0x8C
  DWORD ipaddress;
  WORD port;
  DWORD accountid;
} UO_RedirectClient;

typedef struct UO_ServerList {
  BYTE code;                        // 0xA8
  BYTE unknown1;
  BYTE unknown2;
  BYTE unknown3;
  WORD servercount;
  //UO_ServerInfo servers[];
} UO_ServerList;

typedef union UO_CodeData {
  BYTE code;                      // is the same as : UO_Code code;
  UO_GetServerList getserverlist;                 // 0x80
  UO_ServerAndLocations serverandlocations;       // 0x81
  UO_BadLogin badlogin;                           // 0x82
  UO_RedirectClientRequest redirectclientrequest; // 0x8C
  UO_ClientLogin clientlogin;                     // 0x91
  UO_ServerList serverlist;                       // 0xA0
  UO_RedirectClient redirectclient;               // 0xA8
} UO_CodeData;

static int UO_StructureSize[256] = {
  0, // 0x00
  0, // 0x01
  0, // 0x02
  0, // 0x03
  0, // 0x04
  0, // 0x05
  0, // 0x06
  0, // 0x07
  0, // 0x08
  0, // 0x09
  0, // 0x0A
  0, // 0x0B
  0, // 0x0C
  0, // 0x0D
  0, // 0x0E
  0, // 0x0F
  0, // 0x10
  0, // 0x11
  0, // 0x12
  0, // 0x13
  0, // 0x14
  0, // 0x15
  0, // 0x16
  0, // 0x17
  0, // 0x18
  0, // 0x19
  0, // 0x1A
  0, // 0x1B
  0, // 0x1C
  0, // 0x1D
  0, // 0x1E
  0, // 0x1F
  0, // 0x20
  0, // 0x21
  0, // 0x22
  0, // 0x23
  0, // 0x24
  0, // 0x25
  0, // 0x26
  0, // 0x27
  0, // 0x28
  0, // 0x29
  0, // 0x2a
  0, // 0x2B
  0, // 0x2C
  0, // 0x2D
  0, // 0x2E
  0, // 0x2F
  0, // 0x30
  0, // 0x31
  0, // 0x32
  0, // 0x33
  0, // 0x34
  0, // 0x35
  0, // 0x36
  0, // 0x37
  0, // 0x38
  0, // 0x39
  0, // 0x3A
  0, // 0x3B
  0, // 0x3C
  0, // 0x3D
  0, // 0x3E
  0, // 0x3F
  0, // 0x40
  0, // 0x41
  0, // 0x42
  0, // 0x43
  0, // 0x44
  0, // 0x45
  0, // 0x46
  0, // 0x47
  0, // 0x48
  0, // 0x49
  0, // 0x4A
  0, // 0x4B
  0, // 0x4C
  0, // 0x4D
  0, // 0x4E
  0, // 0x4F
  0, // 0x50
  0, // 0x51
  0, // 0x52
  0, // 0x53
  0, // 0x54
  0, // 0x55
  0, // 0x56
  0, // 0x57
  0, // 0x58
  0, // 0x59
  0, // 0x5A
  0, // 0x5B
  0, // 0x5C
  0, // 0x5D
  0, // 0x5E
  0, // 0x5F
  0, // 0x60
  0, // 0x61
  0, // 0x62
  0, // 0x63
  0, // 0x64
  0, // 0x65
  0, // 0x66
  0, // 0x67
  0, // 0x68
  0, // 0x69
  0, // 0x6A
  0, // 0x6B
  0, // 0x6C
  0, // 0x6D
  0, // 0x6E
  0, // 0x6F
  0, // 0x70
  0, // 0x71
  0, // 0x72
  0, // 0x73
  0, // 0x74
  0, // 0x75
  0, // 0x76
  0, // 0x77
  0, // 0x78
  0, // 0x79
  0, // 0x7A
  0, // 0x7B
  0, // 0x7C
  0, // 0x7D
  0, // 0x7E
  0, // 0x7F
  sizeof(UO_GetServerList), // 0x80
  0,//sizeof(UO_ServerAndLocations), // 0x81
  sizeof(UO_BadLogin),      // 0x82
  0, // 0x83
  0, // 0x84
  0, // 0x85
  0, // 0x86
  0, // 0x87
  0, // 0x88
  0, // 0x89
  0, // 0x8A
  0, // 0x8B
  sizeof(UO_RedirectClient), // 0x8C
  0, // 0x8D
  0, // 0x8E
  0, // 0x8F
  0, // 0x90
  sizeof(UO_ClientLogin), // 0x91
  0, // 0x92
  0, // 0x93
  0, // 0x94
  0, // 0x95
  0, // 0x96
  0, // 0x97
  0, // 0x98
  0, // 0x99
  0, // 0x9A
  0, // 0x9B
  0, // 0x9C
  0, // 0x9D
  0, // 0x9E
  0, // 0x9F
  sizeof(UO_RedirectClientRequest), // 0xA0
  0, // 0xA1
  0, // 0xA2
  0, // 0xA3
  0, // 0xA4
  0, // 0xA5
  0, // 0xA6
  0, // 0xA7
  sizeof(UO_ServerList), // 0xA8
  0, // 0xA9
  0, // 0xAA
  0, // 0xAB
  0, // 0xAC
  0, // 0xAD
  0, // 0xAE
  0, // 0xAF
  0, // 0xB0
  0, // 0xB1
  0, // 0xB2
  0, // 0xB3
  0, // 0xB4
  0, // 0xB5
  0, // 0xB6
  0, // 0xB7
  0, // 0xB8
  0, // 0xB9
  0, // 0xBA
  0, // 0xBB
  0, // 0xBC
  0, // 0xBD
  0, // 0xBE
  0, // 0xBF
  0, // 0xC0
  0, // 0xC1
  0, // 0xC2
  0, // 0xC3
  0, // 0xC4
  0, // 0xC5
  0, // 0xC6
  0, // 0xC7
  0, // 0xC8
  0, // 0xC9
  0, // 0xCA
  0, // 0xCB
  0, // 0xCC
  0, // 0xCD
  0, // 0xCE
  0, // 0xCF
  0, // 0xD0
  0, // 0xD1
  0, // 0xD2
  0, // 0xD3
  0, // 0xD4
  0, // 0xD5
  0, // 0xD6
  0, // 0xD7
  0, // 0xD8
  0, // 0xD9
  0, // 0xDA
  0, // 0xDB
  0, // 0xDC
  0, // 0xDD
  0, // 0xDE
  0, // 0xDF
  0, // 0xE0
  0, // 0xE1
  0, // 0xE2
  0, // 0xE3
  0, // 0xE4
  0, // 0xE5
  0, // 0xE6
  0, // 0xE7
  0, // 0xE8
  0, // 0xE9
  0, // 0xEA
  0, // 0xEB
  0, // 0xEC
  0, // 0xED
  0, // 0xEE
  0, // 0xEF
  0, // 0xF0
  0, // 0xF1
  0, // 0xF2
  0, // 0xF3
  0, // 0xF4
  0, // 0xF5
  0, // 0xF6
  0, // 0xF7
  0, // 0xF8
  0, // 0xF9
  0, // 0xFA
  0, // 0xFB
  0, // 0xFC
  0, // 0xFD
  0, // 0xFE
  0, // 0xFF
};

#pragma pack(pop)
