- 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>
470 lines
20 KiB
JSON
470 lines
20 KiB
JSON
{
|
|
"category": "Player",
|
|
"packets": [
|
|
{
|
|
"id": "0x01",
|
|
"name": "Disconnect",
|
|
"description": "Client sends disconnect notification.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 5,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x01", "description": "Packet identifier" },
|
|
{ "name": "minusOne", "type": "int", "size": 4, "value": "0xFFFFFFFF", "description": "Always -1" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 317
|
|
}
|
|
},
|
|
{
|
|
"id": "0x05",
|
|
"name": "Attack Request",
|
|
"description": "Client requests to attack a mobile.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 5,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x05", "description": "Packet identifier" },
|
|
{ "name": "targetSerial", "type": "uint", "size": 4, "description": "Serial of mobile to attack" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 69
|
|
}
|
|
},
|
|
{
|
|
"id": "0x12",
|
|
"name": "Text Command",
|
|
"description": "Client sends text-based commands for skills, spells, virtues, etc.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x12", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{
|
|
"name": "commandType",
|
|
"type": "enum",
|
|
"enumType": "sequential",
|
|
"size": 1,
|
|
"description": "Type of text command",
|
|
"values": [
|
|
{ "value": "0x24", "name": "UseSkill", "description": "Use a skill by ID" },
|
|
{ "value": "0x27", "name": "CastSpellFromBook", "description": "Cast spell from spellbook" },
|
|
{ "value": "0x2F", "name": "OldScrollClick", "description": "Old scroll double-click" },
|
|
{ "value": "0x43", "name": "OpenSpellbook", "description": "Open spellbook of type" },
|
|
{ "value": "0x56", "name": "CastSpellMacro", "description": "Cast spell from macro" },
|
|
{ "value": "0x58", "name": "OpenDoor", "description": "Open door macro" },
|
|
{ "value": "0xC7", "name": "Animate", "description": "Play animation" },
|
|
{ "value": "0xF4", "name": "InvokeVirtue", "description": "Invoke virtue from macro" }
|
|
]
|
|
},
|
|
{ "name": "command", "type": "ascii-null", "description": "Command-specific text (skill ID, spell ID, etc.)" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 119
|
|
}
|
|
},
|
|
{
|
|
"id": "0x22",
|
|
"name": "Resynchronize",
|
|
"description": "Client requests full world state resync.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 3,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x22", "description": "Packet identifier" },
|
|
{ "name": "padding", "type": "ushort", "size": 2, "description": "Unused padding" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 349
|
|
}
|
|
},
|
|
{
|
|
"id": "0x2C",
|
|
"name": "Death Status Response",
|
|
"description": "Client acknowledges death status packet. Currently ignored by server.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 2,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x2C", "description": "Packet identifier" },
|
|
{ "name": "unknown", "type": "byte", "size": 1, "description": "Unknown" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 58
|
|
}
|
|
},
|
|
{
|
|
"id": "0x34",
|
|
"name": "Mobile Query",
|
|
"description": "Client queries information about a mobile (stats or skills).",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 10,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x34", "description": "Packet identifier" },
|
|
{ "name": "pattern", "type": "uint", "size": 4, "value": "0xEDEDEDED", "description": "Fixed pattern" },
|
|
{
|
|
"name": "queryType",
|
|
"type": "enum",
|
|
"enumType": "sequential",
|
|
"size": 1,
|
|
"description": "Type of query",
|
|
"values": [
|
|
{ "value": "0x04", "name": "Stats", "description": "Request mobile stats" },
|
|
{ "value": "0x05", "name": "Skills", "description": "Request mobile skills" }
|
|
]
|
|
},
|
|
{ "name": "mobileSerial", "type": "uint", "size": 4, "description": "Serial of mobile to query" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x11", "relationship": "response", "note": "Mobile Status packet sent in response to stats query" },
|
|
{ "id": "0x3A", "relationship": "response", "note": "Skills Update sent in response to skills query" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 376
|
|
}
|
|
},
|
|
{
|
|
"id": "0x3A",
|
|
"name": "Change Skill Lock",
|
|
"description": "Client changes the lock state of a skill.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x3A", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "skillIndex", "type": "short", "size": 2, "description": "Skill index to change" },
|
|
{
|
|
"name": "lockState",
|
|
"type": "enum",
|
|
"enumType": "sequential",
|
|
"size": 1,
|
|
"description": "New lock state",
|
|
"values": [
|
|
{ "value": 0, "name": "Up", "description": "Skill gains enabled" },
|
|
{ "value": 1, "name": "Down", "description": "Skill decreases enabled" },
|
|
{ "value": 2, "name": "Locked", "description": "Skill locked at current value" }
|
|
]
|
|
}
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 331
|
|
}
|
|
},
|
|
{
|
|
"id": "0x72",
|
|
"name": "Set War Mode",
|
|
"description": "Client toggles war/peace mode.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 5,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x72", "description": "Packet identifier" },
|
|
{ "name": "warmode", "type": "bool", "size": 1, "description": "True = war mode, False = peace mode" },
|
|
{ "name": "padding", "type": "byte", "size": 3, "description": "Unused padding (0x00, 0x32, 0x00)" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x72", "relationship": "response", "note": "Server echoes back war mode state" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 343
|
|
}
|
|
},
|
|
{
|
|
"id": "0x73",
|
|
"name": "Ping Request",
|
|
"description": "Client sends ping for latency measurement.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 2,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x73", "description": "Packet identifier" },
|
|
{ "name": "sequence", "type": "byte", "size": 1, "description": "Ping sequence number" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x73", "relationship": "response", "note": "Server echoes back same sequence" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 366
|
|
}
|
|
},
|
|
{
|
|
"id": "0x7D",
|
|
"name": "Menu Response",
|
|
"description": "Client responds to a displayed item menu.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 13,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x7D", "description": "Packet identifier" },
|
|
{ "name": "serial", "type": "uint", "size": 4, "description": "Menu dialog serial" },
|
|
{ "name": "menuId", "type": "short", "size": 2, "description": "Menu ID (unused in implementation)" },
|
|
{ "name": "index", "type": "short", "size": 2, "description": "Selected item index (1-based, 0 = cancel)" },
|
|
{ "name": "itemId", "type": "short", "size": 2, "description": "Item graphic ID of selection" },
|
|
{ "name": "hue", "type": "short", "size": 2, "description": "Hue of selection" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x7C", "relationship": "request", "note": "Display Item List Menu packet" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 287
|
|
}
|
|
},
|
|
{
|
|
"id": "0x95",
|
|
"name": "Hue Picker Response",
|
|
"description": "Client responds to a hue picker dialog.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 9,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x95", "description": "Packet identifier" },
|
|
{ "name": "serial", "type": "uint", "size": 4, "description": "Hue picker serial" },
|
|
{ "name": "itemId", "type": "short", "size": 2, "description": "Item ID (unused)" },
|
|
{ "name": "hue", "type": "short", "size": 2, "description": "Selected hue (masked with 0x3FFF)" }
|
|
],
|
|
"related": [
|
|
{ "id": "0x95", "relationship": "request", "note": "Display Hue Picker packet" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 86
|
|
}
|
|
},
|
|
{
|
|
"id": "0x9A",
|
|
"name": "ASCII Prompt Response",
|
|
"description": "Client responds to an ASCII text prompt.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x9A", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "serial", "type": "uint", "size": 4, "description": "Prompt serial" },
|
|
{ "name": "promptId", "type": "int", "size": 4, "description": "Prompt ID" },
|
|
{ "name": "type", "type": "int", "size": 4, "description": "Response type: 0 = cancel, other = submit" },
|
|
{ "name": "text", "type": "ascii-null", "description": "Response text (max 128 chars)" }
|
|
],
|
|
"related": [
|
|
{ "id": "0xC2", "relationship": "request", "note": "Prompt packet that triggered this response" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 214
|
|
}
|
|
},
|
|
{
|
|
"id": "0x9B",
|
|
"name": "Help Request",
|
|
"description": "Client requests help/GM assistance.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 258,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x9B", "description": "Packet identifier" },
|
|
{ "name": "data", "type": "byte[]", "size": 257, "description": "Help request data (format TBD)" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 338
|
|
}
|
|
},
|
|
{
|
|
"id": "0xA4",
|
|
"name": "System Info",
|
|
"description": "Client sends system/hardware information.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 149,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA4", "description": "Packet identifier" },
|
|
{ "name": "unknown1", "type": "byte", "size": 1, "description": "Unknown" },
|
|
{ "name": "unknown2", "type": "ushort", "size": 2, "description": "Unknown" },
|
|
{ "name": "unknown3", "type": "byte", "size": 1, "description": "Unknown" },
|
|
{ "name": "string1", "type": "ascii", "size": 32, "description": "System string 1" },
|
|
{ "name": "string2", "type": "ascii", "size": 32, "description": "System string 2" },
|
|
{ "name": "string3", "type": "ascii", "size": 32, "description": "System string 3" },
|
|
{ "name": "string4", "type": "ascii", "size": 32, "description": "System string 4" },
|
|
{ "name": "unknown4", "type": "ushort", "size": 2, "description": "Unknown" },
|
|
{ "name": "unknown5", "type": "ushort", "size": 2, "description": "Unknown" },
|
|
{ "name": "unknown6", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "unknown7", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "unknown8", "type": "int", "size": 4, "description": "Unknown" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 103
|
|
}
|
|
},
|
|
{
|
|
"id": "0xA7",
|
|
"name": "Request Scroll Window",
|
|
"description": "Client requests a tips/scroll window.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 4,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA7", "description": "Packet identifier" },
|
|
{ "name": "lastTip", "type": "short", "size": 2, "description": "Last tip ID viewed" },
|
|
{ "name": "type", "type": "byte", "size": 1, "description": "Scroll type" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 63
|
|
}
|
|
},
|
|
{
|
|
"id": "0xC2",
|
|
"name": "Unicode Prompt Response",
|
|
"description": "Client responds to a Unicode text prompt.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xC2", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "serial", "type": "uint", "size": 4, "description": "Prompt serial" },
|
|
{ "name": "promptId", "type": "int", "size": 4, "description": "Prompt ID" },
|
|
{ "name": "type", "type": "int", "size": 4, "description": "Response type: 0 = cancel, other = submit" },
|
|
{ "name": "language", "type": "ascii", "size": 4, "description": "Language code (e.g., 'ENU')" },
|
|
{ "name": "text", "type": "unicode-le-null", "description": "Response text (max 128 chars)" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 250
|
|
}
|
|
},
|
|
{
|
|
"id": "0xC8",
|
|
"name": "Set Update Range",
|
|
"description": "Client requests to change update range. Server ignores and sends back fixed range.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 2,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xC8", "description": "Packet identifier" },
|
|
{ "name": "range", "type": "byte", "size": 1, "description": "Requested update range (ignored)" }
|
|
],
|
|
"related": [
|
|
{ "id": "0xC8", "relationship": "response", "note": "Server sends back fixed range (18)" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 371
|
|
}
|
|
},
|
|
{
|
|
"id": "0xD0",
|
|
"name": "Configuration File",
|
|
"description": "Client sends configuration data. Currently ignored by server.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xD0", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "data", "type": "byte[]", "description": "Configuration data (ignored)" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 322
|
|
}
|
|
},
|
|
{
|
|
"id": "0xD1",
|
|
"name": "Logout Request",
|
|
"description": "Client requests to logout.",
|
|
"direction": "incoming",
|
|
"isDynamic": false,
|
|
"size": 2,
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xD1", "description": "Packet identifier" },
|
|
{ "name": "unknown", "type": "byte", "size": 1, "description": "Unknown (typically 0x01)" }
|
|
],
|
|
"related": [
|
|
{ "id": "0xD1", "relationship": "response", "note": "Server sends Logout Ack" }
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 326
|
|
}
|
|
},
|
|
{
|
|
"id": "0xD7",
|
|
"name": "Encoded Command",
|
|
"description": "Wrapper packet for encoded commands (0xD7 subpackets). Used for house design, abilities, guild/quest requests.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xD7", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "entitySerial", "type": "uint", "size": 4, "description": "Serial of target entity" },
|
|
{ "name": "subCommand", "type": "ushort", "size": 2, "description": "Encoded command ID" },
|
|
{ "name": "data", "type": "byte[]", "description": "Subcommand-specific data" }
|
|
],
|
|
"notes": "See encoded.json for subpacket definitions",
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 457
|
|
}
|
|
},
|
|
{
|
|
"id": "0xF4",
|
|
"name": "Crash Report",
|
|
"description": "Client sends crash/error report.",
|
|
"direction": "incoming",
|
|
"isDynamic": true,
|
|
"size": "Dynamic",
|
|
"fields": [
|
|
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xF4", "description": "Packet identifier" },
|
|
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
|
{ "name": "clientMajor", "type": "byte", "size": 1, "description": "Client major version" },
|
|
{ "name": "clientMinor", "type": "byte", "size": 1, "description": "Client minor version" },
|
|
{ "name": "clientRev", "type": "byte", "size": 1, "description": "Client revision" },
|
|
{ "name": "clientPat", "type": "byte", "size": 1, "description": "Client patch" },
|
|
{ "name": "x", "type": "ushort", "size": 2, "description": "Player X coordinate at crash" },
|
|
{ "name": "y", "type": "ushort", "size": 2, "description": "Player Y coordinate at crash" },
|
|
{ "name": "z", "type": "sbyte", "size": 1, "description": "Player Z coordinate at crash" },
|
|
{ "name": "map", "type": "byte", "size": 1, "description": "Map ID at crash" },
|
|
{ "name": "accountName", "type": "ascii", "size": 32, "description": "Account name" },
|
|
{ "name": "characterName", "type": "ascii", "size": 32, "description": "Character name" },
|
|
{ "name": "ipAddress", "type": "ascii", "size": 15, "description": "Client IP address" },
|
|
{ "name": "unknown1", "type": "int", "size": 4, "description": "Unknown" },
|
|
{ "name": "exceptionCode", "type": "int", "size": 4, "description": "Exception code" },
|
|
{ "name": "processName", "type": "ascii", "size": 100, "description": "Process name" },
|
|
{ "name": "reportText", "type": "ascii", "size": 100, "description": "Report text" },
|
|
{ "name": "terminator", "type": "byte", "size": 1, "value": "0x00", "description": "Null terminator" },
|
|
{ "name": "offset", "type": "int", "size": 4, "description": "Crash offset" },
|
|
{ "name": "stackCount", "type": "byte", "size": 1, "description": "Number of stack trace entries" },
|
|
{
|
|
"name": "stackAddresses",
|
|
"type": "loop",
|
|
"loop": {
|
|
"countField": "stackCount",
|
|
"fields": [
|
|
{ "name": "address", "type": "int", "size": 4, "description": "Stack frame address" }
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"source": {
|
|
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
|
|
"line": 413
|
|
}
|
|
}
|
|
]
|
|
}
|