{ "category": "Account", "packets": [ { "id": "0x82", "name": "Account Login Rejected", "description": "Sent when account login fails. Contains the reason for rejection.", "direction": "outgoing", "isDynamic": false, "size": 2, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x82", "description": "Packet identifier" }, { "name": "Reason", "type": "enum", "size": 1, "description": "Rejection reason code", "values": [ { "value": "0", "name": "Invalid", "description": "Invalid credentials" }, { "value": "1", "name": "InUse", "description": "Account already in use" }, { "value": "2", "name": "Blocked", "description": "Account blocked" }, { "value": "3", "name": "BadPass", "description": "Incorrect password" }, { "value": "254", "name": "Idle", "description": "Idle timeout" }, { "value": "255", "name": "BadComm", "description": "Communication error" } ] } ], "related": [ { "id": "0x80", "relationship": "request", "note": "The login attempt that failed" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 402 } }, { "id": "0xA8", "name": "Account Login Ack (Server List)", "description": "Sent after successful account login. Contains the list of available game servers.", "direction": "outgoing", "isDynamic": true, "size": "6 + (40 x serverCount)", "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0xA8", "description": "Packet identifier" }, { "name": "Length", "type": "ushort", "size": 2, "description": "Packet length" }, { "name": "System Info Flag", "type": "byte", "size": 1, "value": "0x5D", "description": "System info flag" }, { "name": "Server Count", "type": "ushort", "size": 2, "description": "Number of servers in list" }, { "name": "Servers", "type": "array", "description": "Server list entries", "loop": { "countField": "serverCount", "fields": [ { "name": "Index", "type": "ushort", "size": 2, "description": "Server index" }, { "name": "Name", "type": "ascii", "size": 32, "description": "Server name" }, { "name": "Full Percent", "type": "byte", "size": 1, "description": "Server load percentage" }, { "name": "Timezone", "type": "sbyte", "size": 1, "description": "Server timezone offset" }, { "name": "IP Address", "type": "uint", "size": 4, "description": "Server IP address (IPv4)" } ] } } ], "related": [ { "id": "0x80", "relationship": "request", "note": "The successful login request" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 411 } }, { "id": "0x8C", "name": "Play Server Ack", "description": "Sent after selecting a server. Contains connection details for the game server.", "direction": "outgoing", "isDynamic": false, "size": 11, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x8C", "description": "Packet identifier" }, { "name": "IP Address", "type": "uint", "size": 4, "description": "Game server IP address (little-endian)" }, { "name": "Port", "type": "short", "size": 2, "description": "Game server port" }, { "name": "Auth ID", "type": "int", "size": 4, "description": "Authentication ID for game login" } ], "related": [ { "id": "0xA0", "relationship": "request", "note": "The server selection request" }, { "id": "0x91", "relationship": "response", "note": "Client sends game login with this authId" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 447 } }, { "id": "0xA9", "name": "Character List", "description": "Sent after game login. Contains the list of characters on the account and starting city information. Extended format in 7.0.13.0+ includes city coordinates.", "direction": "outgoing", "isDynamic": true, "size": "Varies", "variants": [ { "version": "Classic", "name": "Pre-7.0.13.0 Format", "condition": "Client version \u003c 7.0.13.0", "size": "9+", "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0xA9", "description": "Packet identifier" }, { "name": "Length", "type": "ushort", "size": 2, "description": "Packet length" }, { "name": "Char Count", "type": "byte", "size": 1, "description": "Number of character slots (1, 5, 6, or 7)" }, { "name": "Characters", "type": "loop", "description": "Character list entries (60 bytes each)", "loop": { "countField": "charCount", "itemSize": 60, "fields": [ { "name": "Name", "type": "ascii", "size": 30, "description": "Character name (empty if slot unused)" }, { "name": "Password", "type": "ascii", "size": 30, "description": "Always empty (legacy field)" } ] } }, { "name": "City Count", "type": "byte", "size": 1, "description": "Number of starting cities" }, { "name": "Cities", "type": "loop", "description": "Starting city entries (63 bytes each)", "loop": { "countField": "cityCount", "itemSize": 63, "fields": [ { "name": "Index", "type": "byte", "size": 1, "description": "City index" }, { "name": "City Name", "type": "ascii", "size": 31, "description": "City name" }, { "name": "Building Name", "type": "ascii", "size": 31, "description": "Building/tavern name" } ] } }, { "name": "Flags", "type": "bitfield", "size": 4, "description": "Character list flags", "flags": [ { "bit": "0", "name": "Unknown1", "description": "Unknown" }, { "bit": "1", "name": "Overwrite Config", "description": "Overwrite configuration file" }, { "bit": "2", "name": "One Character Slot", "description": "Limit to 1 character slot" }, { "bit": "3", "name": "Context Menus", "description": "Enable context menus" }, { "bit": "4", "name": "Slot Limit", "description": "Limit character slots" }, { "bit": "5", "name": "AOS", "description": "Age of Shadows features" }, { "bit": "6", "name": "Sixth Character Slot", "description": "Enable 6th character slot" }, { "bit": "7", "name": "SE", "description": "Samurai Empire features" }, { "bit": "8", "name": "ML", "description": "Mondain\u0027s Legacy features" }, { "bit": "9", "name": "Unknown2", "description": "Unknown" }, { "bit": "10", "name": "KR", "description": "Kingdom Reborn features" }, { "bit": "11", "name": "SA", "description": "Stygian Abyss features" }, { "bit": "12", "name": "HS", "description": "High Seas features" }, { "bit": "13", "name": "Seventh Character Slot", "description": "Enable 7th character slot" }, { "bit": "14", "name": "Unknown3", "description": "Unknown" }, { "bit": "15", "name": "New Movement", "description": "New movement system" }, { "bit": "16", "name": "New Felucca Areas", "description": "New Felucca areas" } ] } ] }, { "version": "NewCharacterList (7.0.13.0+)", "name": "Extended City Format", "condition": "Client version \u003e= 7.0.13.0 (NewCharacterList)", "size": "11+", "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0xA9", "description": "Packet identifier" }, { "name": "Length", "type": "ushort", "size": 2, "description": "Packet length" }, { "name": "Char Count", "type": "byte", "size": 1, "description": "Number of character slots (1, 5, 6, or 7)" }, { "name": "Characters", "type": "loop", "description": "Character list entries (60 bytes each)", "loop": { "countField": "charCount", "itemSize": 60, "fields": [ { "name": "Name", "type": "ascii", "size": 30, "description": "Character name (empty if slot unused)" }, { "name": "Password", "type": "ascii", "size": 30, "description": "Always empty (legacy field)" } ] } }, { "name": "City Count", "type": "byte", "size": 1, "description": "Number of starting cities" }, { "name": "Cities", "type": "loop", "description": "Starting city entries (89 bytes each, extended format)", "loop": { "countField": "cityCount", "itemSize": 89, "fields": [ { "name": "Index", "type": "byte", "size": 1, "description": "City index" }, { "name": "City Name", "type": "ascii", "size": 32, "description": "City name (1 byte longer than classic)" }, { "name": "Building Name", "type": "ascii", "size": 32, "description": "Building/tavern name (1 byte longer than classic)" }, { "name": "X", "type": "int", "size": 4, "description": "X coordinate of starting location" }, { "name": "Y", "type": "int", "size": 4, "description": "Y coordinate of starting location" }, { "name": "Z", "type": "int", "size": 4, "description": "Z coordinate of starting location" }, { "name": "Map ID", "type": "int", "size": 4, "description": "Map ID for starting location" }, { "name": "Cliloc", "type": "int", "size": 4, "description": "Cliloc ID for city description" }, { "name": "Unknown", "type": "int", "size": 4, "value": "0", "description": "Unknown (always 0)" } ] } }, { "name": "Flags", "type": "bitfield", "size": 4, "description": "Character list flags (same as classic format)", "flags": [ { "bit": "2", "name": "One Character Slot", "description": "Limit to 1 character slot" }, { "bit": "3", "name": "Context Menus", "description": "Enable context menus" }, { "bit": "4", "name": "Slot Limit", "description": "Limit character slots" }, { "bit": "5", "name": "AOS", "description": "Age of Shadows features" }, { "bit": "6", "name": "Sixth Character Slot", "description": "Enable 6th character slot" }, { "bit": "7", "name": "SE", "description": "Samurai Empire features" }, { "bit": "8", "name": "ML", "description": "Mondain\u0027s Legacy features" }, { "bit": "11", "name": "SA", "description": "Stygian Abyss features" }, { "bit": "12", "name": "HS", "description": "High Seas features" }, { "bit": "13", "name": "Seventh Character Slot", "description": "Enable 7th character slot" } ] }, { "name": "Last Char Slot", "type": "short", "size": 2, "value": "-1", "description": "Last played character slot index (-1 if none)" } ] } ], "related": [ { "id": "0x91", "relationship": "request", "note": "Game login request" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 293 } }, { "id": "0x1B", "name": "Login Confirmation", "description": "Sent when entering the world. Confirms the player\u0027s mobile serial and initial position.", "direction": "outgoing", "isDynamic": false, "size": 37, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x1B", "description": "Packet identifier" }, { "name": "Serial", "type": "uint", "size": 4, "description": "Player mobile serial" }, { "name": "Unknown", "type": "int", "size": 4, "value": "0", "description": "Unknown (always 0)" }, { "name": "Body", "type": "short", "size": 2, "description": "Player body ID" }, { "name": "X", "type": "short", "size": 2, "description": "X coordinate" }, { "name": "Y", "type": "short", "size": 2, "description": "Y coordinate" }, { "name": "Z", "type": "short", "size": 2, "description": "Z coordinate" }, { "name": "Direction", "type": "byte", "size": 1, "description": "Facing direction" }, { "name": "Unknown2", "type": "byte", "size": 1, "value": "0", "description": "Unknown" }, { "name": "Unknown3", "type": "int", "size": 4, "value": "-1", "description": "Unknown (always -1)" }, { "name": "Unknown4", "type": "int", "size": 4, "value": "0", "description": "Unknown" }, { "name": "Map Width", "type": "short", "size": 2, "description": "Map width in tiles" }, { "name": "Map Height", "type": "short", "size": 2, "description": "Map height in tiles" }, { "name": "Unknown5", "type": "byte[6]", "size": 6, "description": "Unknown (zeros)" } ], "related": [ { "id": "0x5D", "relationship": "request", "note": "Play character request" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 190 } }, { "id": "0x55", "name": "Login Complete", "description": "Final packet in the login sequence. Signals that the client can begin normal gameplay.", "direction": "outgoing", "isDynamic": false, "size": 1, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x55", "description": "Packet identifier" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 231 } }, { "id": "0xBD", "name": "Client Version Request", "description": "Request for the client to send its version string.", "direction": "outgoing", "isDynamic": false, "size": 3, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0xBD", "description": "Packet identifier" }, { "name": "Length", "type": "ushort", "size": 2, "value": "0x0003", "description": "Packet length" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 112 }, "notes": "Same packet ID (0xBD) is used for both request (server) and response (client)." }, { "id": "0xB9", "name": "Supported Features", "description": "Informs the client which features are enabled on the server. Feature flags control T2A, LBR, AOS, SE, ML, SA, HS features and character slot limits.", "direction": "outgoing", "isDynamic": false, "size": "Varies", "variants": [ { "version": "Classic", "name": "16-bit Feature Flags", "condition": "Client without ExtendedSupportedFeatures", "size": 3, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0xB9", "description": "Packet identifier" }, { "name": "Features", "type": "bitfield", "size": 2, "description": "16-bit feature flags bitmask", "flags": [ { "bit": "0", "name": "T2A", "description": "The Second Age features" }, { "bit": "1", "name": "Renaissance", "description": "Renaissance features" }, { "bit": "2", "name": "Third Dawn", "description": "Third Dawn (3D client) features" }, { "bit": "3", "name": "LBR", "description": "Lord Blackthorn\u0027s Revenge features" }, { "bit": "4", "name": "AOS", "description": "Age of Shadows features" }, { "bit": "5", "name": "Sixth Character Slot", "description": "Enable 6th character slot" }, { "bit": "6", "name": "SE", "description": "Samurai Empire features" }, { "bit": "7", "name": "ML", "description": "Mondain\u0027s Legacy features" }, { "bit": "8", "name": "Eighth Age", "description": "Eighth Age splash screen" }, { "bit": "9", "name": "Ninth Age", "description": "Ninth Age splash screen" }, { "bit": "10", "name": "Tenth Age", "description": "Tenth Age splash screen" }, { "bit": "11", "name": "Increased Storage", "description": "Increased storage" }, { "bit": "12", "name": "Seventh Character Slot", "description": "Enable 7th character slot" }, { "bit": "13", "name": "Roleplay Faces", "description": "Roleplay face selection" }, { "bit": "14", "name": "Trial Account", "description": "Trial account flag" }, { "bit": "15", "name": "Live Account", "description": "Live (paid) account flag" } ] } ] }, { "version": "Extended", "name": "32-bit Feature Flags", "condition": "Client with ExtendedSupportedFeatures", "size": 5, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0xB9", "description": "Packet identifier" }, { "name": "Features", "type": "bitfield", "size": 4, "description": "32-bit feature flags bitmask (includes all 16-bit flags plus expansion flags)", "flags": [ { "bit": "0", "name": "T2A", "description": "The Second Age features" }, { "bit": "1", "name": "Renaissance", "description": "Renaissance features" }, { "bit": "2", "name": "Third Dawn", "description": "Third Dawn (3D client) features" }, { "bit": "3", "name": "LBR", "description": "Lord Blackthorn\u0027s Revenge features" }, { "bit": "4", "name": "AOS", "description": "Age of Shadows features" }, { "bit": "5", "name": "Sixth Character Slot", "description": "Enable 6th character slot" }, { "bit": "6", "name": "SE", "description": "Samurai Empire features" }, { "bit": "7", "name": "ML", "description": "Mondain\u0027s Legacy features" }, { "bit": "8", "name": "Eighth Age", "description": "Eighth Age splash screen" }, { "bit": "9", "name": "Ninth Age", "description": "Ninth Age splash screen" }, { "bit": "10", "name": "Tenth Age", "description": "Tenth Age splash screen" }, { "bit": "11", "name": "Increased Storage", "description": "Increased storage" }, { "bit": "12", "name": "Seventh Character Slot", "description": "Enable 7th character slot" }, { "bit": "13", "name": "Roleplay Faces", "description": "Roleplay face selection" }, { "bit": "14", "name": "Trial Account", "description": "Trial account flag" }, { "bit": "15", "name": "Live Account", "description": "Live (paid) account flag" }, { "bit": "16", "name": "SA", "description": "Stygian Abyss features" }, { "bit": "17", "name": "HS", "description": "High Seas features" }, { "bit": "18", "name": "Gothic", "description": "Gothic housing tiles" }, { "bit": "19", "name": "Rustic", "description": "Rustic housing tiles" }, { "bit": "20", "name": "Jungle", "description": "Jungle housing tiles" }, { "bit": "21", "name": "Shadowguard", "description": "Shadowguard content" }, { "bit": "22", "name": "TOL", "description": "Time of Legends features" }, { "bit": "23", "name": "EJ", "description": "Endless Journey (F2P) features" } ] } ] } ], "clientVersion": { "classic": {}, "enhanced": {}, "notes": "ExtendedSupportedFeatures determines which variant is sent" }, "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 140 } }, { "id": "0x85", "name": "Character Delete Result", "description": "Result of a character deletion request.", "direction": "outgoing", "isDynamic": false, "size": 2, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x85", "description": "Packet identifier" }, { "name": "Result", "type": "enum", "size": 1, "description": "Deletion result code", "values": [ { "value": "0", "name": "PasswordInvalid", "description": "Password is invalid" }, { "value": "1", "name": "CharNotExist", "description": "Character does not exist" }, { "value": "2", "name": "CharBeingPlayed", "description": "Character is being played" }, { "value": "3", "name": "CharTooYoung", "description": "Character too young to delete" }, { "value": "4", "name": "CharQueued", "description": "Character queued for deletion" }, { "value": "5", "name": "BadRequest", "description": "Invalid request" } ] } ], "related": [ { "id": "0x83", "relationship": "request", "note": "The delete request" } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 121 } }, { "id": "0x53", "name": "Popup Message", "description": "Displays a predefined popup message to the client.", "direction": "outgoing", "isDynamic": false, "size": 2, "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x53", "description": "Packet identifier" }, { "name": "Message ID", "type": "enum", "size": 1, "description": "Predefined message identifier", "values": [ { "value": "1", "name": "CharNoExist", "description": "Character does not exist" }, { "value": "2", "name": "CharExists", "description": "Character already exists" }, { "value": "5", "name": "CharInWorld", "description": "Character is in world" }, { "value": "6", "name": "LoginSyncError", "description": "Login synchronization error" }, { "value": "7", "name": "IdleWarning", "description": "Idle timeout warning" } ] } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 131 } }, { "id": "0x81", "name": "Change Character", "description": "Updates the character list during reconnection. Currently unused.", "direction": "outgoing", "isDynamic": true, "size": "5 + (60 x charCount)", "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x81", "description": "Packet identifier" }, { "name": "Length", "type": "ushort", "size": 2, "description": "Packet length" }, { "name": "Char Count", "type": "ushort", "size": 2, "description": "Number of characters" }, { "name": "Characters", "type": "array", "description": "Character list entries", "loop": { "countField": "charCount", "fields": [ { "name": "Name", "type": "ascii", "size": 30, "description": "Character name" }, { "name": "Password", "type": "ascii", "size": 30, "description": "Always empty" } ] } } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 63 }, "notes": "Currently unused in ModernUO." }, { "id": "0x86", "name": "Character List Update", "description": "Updates the character list after character creation or deletion.", "direction": "outgoing", "isDynamic": true, "size": "4 + (60 x charCount)", "fields": [ { "name": "Packet ID", "type": "byte", "size": 1, "value": "0x86", "description": "Packet identifier" }, { "name": "Length", "type": "ushort", "size": 2, "description": "Packet length" }, { "name": "Char Count", "type": "byte", "size": 1, "description": "Number of character slots" }, { "name": "Characters", "type": "array", "description": "Character list entries", "loop": { "countField": "charCount", "fields": [ { "name": "Name", "type": "ascii", "size": 30, "description": "Character name (empty if slot unused)" }, { "name": "Password", "type": "ascii", "size": 30, "description": "Always empty" } ] } } ], "source": { "file": "Projects/Server/Network/Packets/OutgoingAccountPackets.cs", "line": 242 } } ] }