- Create JSON-based packet documentation for 145 packets (66 incoming, 79 outgoing) - Add HTML template with search, filtering, and navigation - Support enum/bitfield field display with values and descriptions - Support packet variants for version-specific structures - Include 0xBF extended command subpackets documentation - Add PowerShell build script to generate final HTML 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
320 lines
14 KiB
JSON
320 lines
14 KiB
JSON
{
|
|
"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": "packetId", "type": "byte", "size": 1, "value": "0x82", "description": "Packet identifier" },
|
|
{ "name": "reason", "type": "byte", "size": 1, "description": "Rejection reason: 0=Invalid, 1=InUse, 2=Blocked, 3=BadPass, 254=Idle, 255=BadComm" }
|
|
],
|
|
"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 * serverCount)",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA8", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "systemInfoFlag", "type": "byte", "size": 1, "value": "0x5D", "description": "System info flag" },
|
|
{ "name": "serverCount", "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": "fullPercent", "type": "byte", "size": 1, "description": "Server load percentage" },
|
|
{ "name": "timezone", "type": "sbyte", "size": 1, "description": "Server timezone offset" },
|
|
{ "name": "ipAddress", "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": "packetId", "type": "byte", "size": 1, "value": "0x8C", "description": "Packet identifier" },
|
|
{ "name": "ipAddress", "type": "uint", "size": 4, "description": "Game server IP address (little-endian)" },
|
|
{ "name": "port", "type": "short", "size": 2, "description": "Game server port" },
|
|
{ "name": "authId", "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.",
|
|
"direction": "outgoing",
|
|
"isDynamic": true,
|
|
"size": "variable (client version dependent)",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA9", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "charCount", "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" }
|
|
]
|
|
}
|
|
},
|
|
{ "name": "cityCount", "type": "byte", "size": 1, "description": "Number of starting cities" },
|
|
{
|
|
"name": "cities",
|
|
"type": "array",
|
|
"description": "Starting city entries",
|
|
"loop": {
|
|
"countField": "cityCount",
|
|
"fields": [
|
|
{ "name": "index", "type": "byte", "size": 1, "description": "City index" },
|
|
{ "name": "cityName", "type": "ascii", "size": 31, "description": "City name (32 for 7.0.13.0+)" },
|
|
{ "name": "buildingName", "type": "ascii", "size": 31, "description": "Building name (32 for 7.0.13.0+)" },
|
|
{ "name": "x", "type": "int", "size": 4, "description": "X coordinate (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" },
|
|
{ "name": "y", "type": "int", "size": 4, "description": "Y coordinate (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" },
|
|
{ "name": "z", "type": "int", "size": 4, "description": "Z coordinate (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" },
|
|
{ "name": "mapId", "type": "int", "size": 4, "description": "Map ID (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" },
|
|
{ "name": "cliloc", "type": "int", "size": 4, "description": "Description cliloc (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" },
|
|
{ "name": "unknown", "type": "int", "size": 4, "description": "Unknown (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" }
|
|
]
|
|
}
|
|
},
|
|
{ "name": "flags", "type": "int", "size": 4, "description": "Character list flags (slot limits, features)" },
|
|
{ "name": "lastCharSlot", "type": "short", "size": 2, "description": "Last played character slot (7.0.13.0+ only)", "condition": "client >= 7.0.13.0" }
|
|
],
|
|
"clientVersion": {
|
|
"feature": "NewCharacterList",
|
|
"notes": "Clients 7.0.13.0+ use extended city format with coordinates"
|
|
},
|
|
"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's mobile serial and initial position.",
|
|
"direction": "outgoing",
|
|
"isDynamic": false,
|
|
"size": 37,
|
|
"fields": [
|
|
{ "name": "packetId", "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": "mapWidth", "type": "short", "size": 2, "description": "Map width in tiles" },
|
|
{ "name": "mapHeight", "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": "packetId", "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": "packetId", "type": "byte", "size": 1, "value": "0xBD", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "value": "0x0003", "description": "Packet length" }
|
|
],
|
|
"related": [
|
|
{ "id": "0xBD", "relationship": "response", "note": "Client responds with version string" }
|
|
],
|
|
"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.",
|
|
"direction": "outgoing",
|
|
"isDynamic": false,
|
|
"size": "3 or 5 (client version dependent)",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xB9", "description": "Packet identifier" },
|
|
{ "name": "features", "type": "ushort/uint", "size": "2 or 4", "description": "Feature flags bitmask. Extended (4 bytes) for newer clients." }
|
|
],
|
|
"clientVersion": {
|
|
"feature": "ExtendedSupportedFeatures",
|
|
"notes": "Clients with ExtendedSupportedFeatures use 4-byte flags instead of 2-byte"
|
|
},
|
|
"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": "packetId", "type": "byte", "size": 1, "value": "0x85", "description": "Packet identifier" },
|
|
{ "name": "result", "type": "byte", "size": 1, "description": "Result: 0=PasswordInvalid, 1=CharNotExist, 2=CharBeingPlayed, 3=CharTooYoung, 4=CharQueued, 5=BadRequest" }
|
|
],
|
|
"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": "packetId", "type": "byte", "size": 1, "value": "0x53", "description": "Packet identifier" },
|
|
{ "name": "messageId", "type": "byte", "size": 1, "description": "Message ID: 1=CharNoExist, 2=CharExists, 5=CharInWorld, 6=LoginSyncError, 7=IdleWarning" }
|
|
],
|
|
"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 * charCount)",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x81", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "charCount", "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 * charCount)",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x86", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "charCount", "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
|
|
}
|
|
}
|
|
]
|
|
}
|