- 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>
262 lines
14 KiB
JSON
262 lines
14 KiB
JSON
{
|
|
"category": "Account",
|
|
"packets": [
|
|
{
|
|
"id": "0x80",
|
|
"name": "Account Login",
|
|
"description": "Initial login request sent to the login server. Contains account credentials for authentication.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 62,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x80", "description": "Packet identifier" },
|
|
{ "name": "username", "type": "ascii", "size": 30, "description": "Account username (null-terminated)" },
|
|
{ "name": "password", "type": "ascii", "size": 30, "description": "Account password (null-terminated)" },
|
|
{ "name": "nextLoginKey", "type": "byte", "size": 1, "description": "Next login key" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x82", "relationship": "rej", "note": "Sent if login fails" },
|
|
{ "id": "0xA8", "relationship": "ack", "note": "Sent if login succeeds (server list)" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 439
|
|
}
|
|
},
|
|
{
|
|
"id": "0x91",
|
|
"name": "Game Login",
|
|
"description": "Login request sent to the game server after selecting a shard from the server list.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 65,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x91", "description": "Packet identifier" },
|
|
{ "name": "authId", "type": "int", "size": 4, "description": "Authentication ID from PlayServerAck (0x8C)" },
|
|
{ "name": "username", "type": "ascii", "size": 30, "description": "Account username" },
|
|
{ "name": "password", "type": "ascii", "size": 30, "description": "Account password" }
|
|
],
|
|
"related": [
|
|
{ "id": "0xA9", "relationship": "response", "note": "Character list sent on success" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 345
|
|
}
|
|
},
|
|
{
|
|
"id": "0x5D",
|
|
"name": "Play Character",
|
|
"description": "Request to enter the world with a selected character from the character list.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 73,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x5D", "description": "Packet identifier" },
|
|
{ "name": "pattern", "type": "uint", "size": 4, "value": "0xEDEDEDED", "description": "Fixed pattern" },
|
|
{ "name": "name", "type": "ascii", "size": 30, "description": "Character name (unused)" },
|
|
{ "name": "unknown", "type": "byte[2]", "size": 2, "description": "Unknown" },
|
|
{ "name": "flags", "type": "int", "size": 4, "description": "Client flags" },
|
|
{ "name": "unknown2", "type": "byte[24]", "size": 24, "description": "Unknown" },
|
|
{ "name": "charSlot", "type": "int", "size": 4, "description": "Character slot index (0-based)" },
|
|
{ "name": "clientIP", "type": "int", "size": 4, "description": "Client IP address" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x1B", "relationship": "response", "note": "Login confirmation sent on success" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 210
|
|
}
|
|
},
|
|
{
|
|
"id": "0xA0",
|
|
"name": "Play Server",
|
|
"description": "Request to connect to a specific game server from the server list.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 3,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA0", "description": "Packet identifier" },
|
|
{ "name": "serverIndex", "type": "short", "size": 2, "description": "Index of selected server in the list" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x8C", "relationship": "response", "note": "Server connection details" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 398
|
|
}
|
|
},
|
|
{
|
|
"id": "0x83",
|
|
"name": "Delete Character",
|
|
"description": "Request to delete a character from the account.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 39,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x83", "description": "Packet identifier" },
|
|
{ "name": "password", "type": "ascii", "size": 30, "description": "Account password for verification" },
|
|
{ "name": "charIndex", "type": "int", "size": 4, "description": "Character slot index to delete" },
|
|
{ "name": "clientIP", "type": "int", "size": 4, "description": "Client IP address" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x85", "relationship": "response", "note": "Delete result" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 185
|
|
}
|
|
},
|
|
{
|
|
"id": "0xEF",
|
|
"name": "Login Server Seed",
|
|
"description": "Initial connection packet sent before account login. Contains seed and client version information.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 21,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xEF", "description": "Packet identifier" },
|
|
{ "name": "seed", "type": "int", "size": 4, "description": "Random seed for encryption" },
|
|
{ "name": "clientMajor", "type": "int", "size": 4, "description": "Client major version" },
|
|
{ "name": "clientMinor", "type": "int", "size": 4, "description": "Client minor version" },
|
|
{ "name": "clientRevision", "type": "int", "size": 4, "description": "Client revision" },
|
|
{ "name": "clientPatch", "type": "int", "size": 4, "description": "Client patch level" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 419
|
|
}
|
|
},
|
|
{
|
|
"id": "0xBD",
|
|
"name": "Client Version",
|
|
"description": "Response to server's version request (0xBD). Contains the client version string.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "3 + version string length",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBD", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "version", "type": "ascii", "description": "Client version string (e.g., '7.0.95.0')" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 193
|
|
}
|
|
},
|
|
{
|
|
"id": "0xE1",
|
|
"name": "Client Type",
|
|
"description": "Sent by the client to identify the client type and version.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "variable",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xE1", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "unknown", "type": "ushort", "size": 2, "description": "Unknown" },
|
|
{ "name": "clientType", "type": "ushort", "size": 2, "description": "Client type identifier" },
|
|
{ "name": "version", "type": "ascii", "description": "Client version string" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 200
|
|
}
|
|
},
|
|
{
|
|
"id": "0x00",
|
|
"name": "Create Character (Old)",
|
|
"description": "Request to create a new character. This is the older 104-byte version.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 104,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x00", "description": "Packet identifier" },
|
|
{ "name": "unknown1", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "unknown2", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "unknown3", "type": "byte", "size": 1, "description": "Unknown" },
|
|
{ "name": "name", "type": "ascii", "size": 30, "description": "Character name" },
|
|
{ "name": "unknown4", "type": "byte[2]", "size": 2, "description": "Unknown" },
|
|
{ "name": "flags", "type": "int", "size": 4, "description": "Client flags" },
|
|
{ "name": "unknown5", "type": "byte[8]", "size": 8, "description": "Unknown" },
|
|
{ "name": "profession", "type": "byte", "size": 1, "description": "Starting profession" },
|
|
{ "name": "unknown6", "type": "byte[15]", "size": 15, "description": "Unknown" },
|
|
{ "name": "genderRace", "type": "byte", "size": 1, "description": "Gender and race combined value" },
|
|
{ "name": "strength", "type": "byte", "size": 1, "description": "Starting strength" },
|
|
{ "name": "dexterity", "type": "byte", "size": 1, "description": "Starting dexterity" },
|
|
{ "name": "intelligence", "type": "byte", "size": 1, "description": "Starting intelligence" },
|
|
{ "name": "skill1Id", "type": "byte", "size": 1, "description": "First skill ID" },
|
|
{ "name": "skill1Value", "type": "byte", "size": 1, "description": "First skill value" },
|
|
{ "name": "skill2Id", "type": "byte", "size": 1, "description": "Second skill ID" },
|
|
{ "name": "skill2Value", "type": "byte", "size": 1, "description": "Second skill value" },
|
|
{ "name": "skill3Id", "type": "byte", "size": 1, "description": "Third skill ID" },
|
|
{ "name": "skill3Value", "type": "byte", "size": 1, "description": "Third skill value" },
|
|
{ "name": "skinHue", "type": "ushort", "size": 2, "description": "Skin color hue" },
|
|
{ "name": "hairStyle", "type": "short", "size": 2, "description": "Hair style ID" },
|
|
{ "name": "hairHue", "type": "short", "size": 2, "description": "Hair color hue" },
|
|
{ "name": "facialHairStyle", "type": "short", "size": 2, "description": "Facial hair style ID" },
|
|
{ "name": "facialHairHue", "type": "short", "size": 2, "description": "Facial hair color hue" },
|
|
{ "name": "unknown7", "type": "byte", "size": 1, "description": "Unknown" },
|
|
{ "name": "cityIndex", "type": "byte", "size": 1, "description": "Starting city index" },
|
|
{ "name": "charSlot", "type": "int", "size": 4, "description": "Character slot" },
|
|
{ "name": "clientIP", "type": "int", "size": 4, "description": "Client IP" },
|
|
{ "name": "shirtHue", "type": "short", "size": 2, "description": "Starting shirt hue" },
|
|
{ "name": "pantsHue", "type": "short", "size": 2, "description": "Starting pants hue" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 58
|
|
}
|
|
},
|
|
{
|
|
"id": "0xF8",
|
|
"name": "Create Character (New)",
|
|
"description": "Request to create a new character. This is the newer 106-byte version with support for 4 skills.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 106,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xF8", "description": "Packet identifier" },
|
|
{ "name": "unknown1", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "unknown2", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "unknown3", "type": "byte", "size": 1, "description": "Unknown" },
|
|
{ "name": "name", "type": "ascii", "size": 30, "description": "Character name" },
|
|
{ "name": "unknown4", "type": "byte[2]", "size": 2, "description": "Unknown" },
|
|
{ "name": "flags", "type": "int", "size": 4, "description": "Client flags" },
|
|
{ "name": "unknown5", "type": "byte[8]", "size": 8, "description": "Unknown" },
|
|
{ "name": "profession", "type": "byte", "size": 1, "description": "Starting profession" },
|
|
{ "name": "unknown6", "type": "byte[15]", "size": 15, "description": "Unknown" },
|
|
{ "name": "genderRace", "type": "byte", "size": 1, "description": "Gender and race combined value" },
|
|
{ "name": "strength", "type": "byte", "size": 1, "description": "Starting strength" },
|
|
{ "name": "dexterity", "type": "byte", "size": 1, "description": "Starting dexterity" },
|
|
{ "name": "intelligence", "type": "byte", "size": 1, "description": "Starting intelligence" },
|
|
{ "name": "skill1Id", "type": "byte", "size": 1, "description": "First skill ID" },
|
|
{ "name": "skill1Value", "type": "byte", "size": 1, "description": "First skill value" },
|
|
{ "name": "skill2Id", "type": "byte", "size": 1, "description": "Second skill ID" },
|
|
{ "name": "skill2Value", "type": "byte", "size": 1, "description": "Second skill value" },
|
|
{ "name": "skill3Id", "type": "byte", "size": 1, "description": "Third skill ID" },
|
|
{ "name": "skill3Value", "type": "byte", "size": 1, "description": "Third skill value" },
|
|
{ "name": "skill4Id", "type": "byte", "size": 1, "description": "Fourth skill ID (newer clients)" },
|
|
{ "name": "skill4Value", "type": "byte", "size": 1, "description": "Fourth skill value (newer clients)" },
|
|
{ "name": "skinHue", "type": "ushort", "size": 2, "description": "Skin color hue" },
|
|
{ "name": "hairStyle", "type": "short", "size": 2, "description": "Hair style ID" },
|
|
{ "name": "hairHue", "type": "short", "size": 2, "description": "Hair color hue" },
|
|
{ "name": "facialHairStyle", "type": "short", "size": 2, "description": "Facial hair style ID" },
|
|
{ "name": "facialHairHue", "type": "short", "size": 2, "description": "Facial hair color hue" },
|
|
{ "name": "unknown7", "type": "byte", "size": 1, "description": "Unknown" },
|
|
{ "name": "cityIndex", "type": "byte", "size": 1, "description": "Starting city index" },
|
|
{ "name": "charSlot", "type": "int", "size": 4, "description": "Character slot" },
|
|
{ "name": "clientIP", "type": "int", "size": 4, "description": "Client IP" },
|
|
{ "name": "shirtHue", "type": "short", "size": 2, "description": "Starting shirt hue" },
|
|
{ "name": "pantsHue", "type": "short", "size": 2, "description": "Starting pants hue" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingAccountPackets.cs",
|
|
"line": 58
|
|
},
|
|
"notes": "Uses the same handler as 0x00 but with 2 additional bytes for the 4th skill."
|
|
}
|
|
]
|
|
}
|