feat: Add interactive packet documentation system

- 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>
This commit is contained in:
Kamron Batman 2026-01-01 11:47:31 -08:00
parent ec287d7691
commit f0b65fecb7
No known key found for this signature in database
GPG key ID: 7D81DF26D9A5D94A
28 changed files with 6011 additions and 0 deletions

View file

@ -0,0 +1,262 @@
{
"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."
}
]
}

View file

@ -0,0 +1,82 @@
{
"category": "Entity",
"packets": [
{
"id": "0x06",
"name": "Use Request (Double-Click)",
"description": "Sent when the player double-clicks an item or mobile. Can also trigger paperdoll if high bit is set.",
"direction": "incoming",
"isDynamic": false,
"size": 5,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x06", "description": "Packet identifier" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of the target. If high bit (0x80000000) is set, opens player's paperdoll instead." }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingEntityPackets.cs",
"line": 61
}
},
{
"id": "0x09",
"name": "Look Request (Single-Click)",
"description": "Sent when the player single-clicks an item or mobile to see its name/properties.",
"direction": "incoming",
"isDynamic": false,
"size": 5,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x09", "description": "Packet identifier" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of the target entity" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingEntityPackets.cs",
"line": 105
}
},
{
"id": "0xB6",
"name": "Object Help Request",
"description": "Sent when the player requests help/info about an object (Shift+Click or context menu).",
"direction": "incoming",
"isDynamic": false,
"size": 9,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xB6", "description": "Packet identifier" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of the target entity" },
{ "name": "unknown", "type": "byte", "size": 1, "description": "Unknown" },
{ "name": "language", "type": "ascii", "size": 3, "description": "Language code (e.g., 'ENU')" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingEntityPackets.cs",
"line": 32
}
},
{
"id": "0xD6",
"name": "Batch Query Properties",
"description": "Sent by the client to request Object Property Lists (tooltips) for multiple entities at once.",
"direction": "incoming",
"isDynamic": true,
"size": "3 + (4 * entityCount)",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xD6", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{
"name": "serials",
"type": "array",
"description": "List of entity serials to query",
"loop": {
"countField": "(length-3)/4",
"fields": [
{ "name": "serial", "type": "uint", "size": 4, "description": "Entity serial" }
]
}
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingEntityPackets.cs",
"line": 154
}
}
]
}

View file

@ -0,0 +1,356 @@
{
"category": "Extended Commands (0xBF)",
"packets": [
{
"id": "0xBF",
"name": "Extended Command",
"description": "Wrapper packet for extended command subpackets.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "description": "Extended command ID" },
{ "name": "data", "type": "byte[]", "description": "Subcommand-specific data" }
],
"notes": "See individual 0xBF/0xXX packets for subcommand details.",
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 43
}
},
{
"id": "0xBF/0x05",
"subId": "0x05",
"name": "Screen Size",
"description": "Client reports screen size.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x05", "description": "Screen Size subcommand" },
{ "name": "width", "type": "int", "size": 4, "description": "Screen width" },
{ "name": "unknown", "type": "int", "size": 4, "description": "Unknown value" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 136
}
},
{
"id": "0xBF/0x06",
"subId": "0x06",
"name": "Party Message",
"description": "Client sends party-related commands.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x06", "description": "Party Message subcommand" },
{
"name": "partyCommand",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Party command type",
"values": [
{ "value": 1, "name": "AddMember", "description": "Add member to party" },
{ "value": 2, "name": "RemoveMember", "description": "Remove member from party" },
{ "value": 3, "name": "PrivateMessage", "description": "Send private message to party member" },
{ "value": 4, "name": "PublicMessage", "description": "Send public message to party" },
{ "value": 6, "name": "SetCanLoot", "description": "Set loot permission" },
{ "value": 8, "name": "Accept", "description": "Accept party invitation" },
{ "value": 9, "name": "Decline", "description": "Decline party invitation" }
]
},
{ "name": "data", "type": "byte[]", "description": "Command-specific data (target serial, message text)" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 142
}
},
{
"id": "0xBF/0x09",
"subId": "0x09",
"name": "Disarm Request",
"description": "Client requests to disarm opponent.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x09", "description": "Disarm Request subcommand" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 289
}
},
{
"id": "0xBF/0x0A",
"subId": "0x0A",
"name": "Stun Request",
"description": "Client requests to stun opponent.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x0A", "description": "Stun Request subcommand" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 277
}
},
{
"id": "0xBF/0x0B",
"subId": "0x0B",
"name": "Language",
"description": "Client sets language preference.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x0B", "description": "Language subcommand" },
{ "name": "language", "type": "ascii", "size": 4, "description": "Language code (e.g., 'ENU')" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 343
}
},
{
"id": "0xBF/0x0C",
"subId": "0x0C",
"name": "Close Status",
"description": "Client closes a status gump.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x0C", "description": "Close Status subcommand" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of mobile whose status to close" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 338
}
},
{
"id": "0xBF/0x0E",
"subId": "0x0E",
"name": "Animate",
"description": "Client requests to play an animation.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x0E", "description": "Animate subcommand" },
{ "name": "action", "type": "int", "size": 4, "description": "Animation action ID (must be in valid list)" }
],
"notes": "Only specific animation IDs are allowed for security.",
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 233
}
},
{
"id": "0xBF/0x10",
"subId": "0x10",
"name": "Query Properties",
"description": "Client queries Object Property List (tooltip) for an entity.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x10", "description": "Query Properties subcommand" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of entity to query" }
],
"related": [
{ "id": "0xDC", "relationship": "response", "note": "OPL Info packet" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 355
}
},
{
"id": "0xBF/0x1A",
"subId": "0x1A",
"name": "Stat Lock Change",
"description": "Client changes stat lock (STR/DEX/INT).",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x1A", "description": "Stat Lock Change subcommand" },
{
"name": "stat",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Which stat to change",
"values": [
{ "value": 0, "name": "Strength", "description": "Strength lock" },
{ "value": 1, "name": "Dexterity", "description": "Dexterity lock" },
{ "value": 2, "name": "Intelligence", "description": "Intelligence lock" }
]
},
{
"name": "lockValue",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "New lock state",
"values": [
{ "value": 0, "name": "Up", "description": "Stat gains enabled" },
{ "value": 1, "name": "Down", "description": "Stat decreases enabled" },
{ "value": 2, "name": "Locked", "description": "Stat locked" }
]
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 301
}
},
{
"id": "0xBF/0x1C",
"subId": "0x1C",
"name": "Cast Spell",
"description": "Client casts a spell (optionally from spellbook).",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x1C", "description": "Cast Spell subcommand" },
{ "name": "hasBook", "type": "short", "size": 2, "description": "1 if casting from book, 0 otherwise" },
{ "name": "bookSerial", "type": "uint", "size": 4, "description": "Serial of spellbook (if hasBook)", "condition": "hasBook == 1" },
{ "name": "spellId", "type": "short", "size": 2, "description": "Spell ID + 1 (1-based)" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 257
}
},
{
"id": "0xBF/0x2C",
"subId": "0x2C",
"name": "Bandage Target",
"description": "Client uses bandage on a target.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x2C", "description": "Bandage Target subcommand" },
{ "name": "bandageSerial", "type": "uint", "size": 4, "description": "Serial of the bandage item" },
{ "name": "targetSerial", "type": "uint", "size": 4, "description": "Serial of target mobile" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 387
}
},
{
"id": "0xBF/0x2D",
"subId": "0x2D",
"name": "Targeted Spell",
"description": "Client casts spell with pre-selected target.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x2D", "description": "Targeted Spell subcommand" },
{ "name": "spellId", "type": "short", "size": 2, "description": "Spell ID + 1 (1-based)" },
{ "name": "targetSerial", "type": "uint", "size": 4, "description": "Serial of target entity" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 422
}
},
{
"id": "0xBF/0x2E",
"subId": "0x2E",
"name": "Targeted Skill Use",
"description": "Client uses skill with pre-selected target.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x2E", "description": "Targeted Skill Use subcommand" },
{ "name": "skillId", "type": "short", "size": 2, "description": "Skill ID" },
{ "name": "targetSerial", "type": "uint", "size": 4, "description": "Serial of target entity" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 429
}
},
{
"id": "0xBF/0x30",
"subId": "0x30",
"name": "Target By Resource Macro",
"description": "Client uses resource-based targeting macro.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x30", "description": "Target By Resource Macro subcommand" },
{ "name": "itemSerial", "type": "uint", "size": 4, "description": "Serial of item" },
{ "name": "resourceType", "type": "short", "size": 2, "description": "Resource type ID" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 439
}
},
{
"id": "0xBF/0x32",
"subId": "0x32",
"name": "Toggle Flying",
"description": "Client toggles gargoyle flying mode.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "subCommand", "type": "ushort", "size": 2, "value": "0x32", "description": "Toggle Flying subcommand" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingExtendedCommandPackets.cs",
"line": 272
}
}
]
}

View file

@ -0,0 +1,142 @@
{
"category": "Items",
"packets": [
{
"id": "0x07",
"name": "Lift Request",
"description": "Client requests to pick up an item from the world or a container.",
"direction": "incoming",
"isDynamic": false,
"size": 7,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x07", "description": "Packet identifier" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of the item to lift" },
{ "name": "amount", "type": "ushort", "size": 2, "description": "Amount to pick up" }
],
"related": [
{ "id": "0x27", "relationship": "rej", "note": "Sent if lift is rejected" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingItemPackets.cs",
"line": 35
}
},
{
"id": "0x08",
"name": "Drop Request",
"description": "Client requests to drop an item at a location or into a container. Size varies by client version.",
"direction": "incoming",
"isDynamic": false,
"size": "14 (pre-6017) or 15 (6017+)",
"variants": [
{
"version": "pre-6017",
"name": "Classic",
"size": 14,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x08", "description": "Packet identifier" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of item being dropped (ignored)" },
{ "name": "x", "type": "short", "size": 2, "description": "Target X coordinate" },
{ "name": "y", "type": "short", "size": 2, "description": "Target Y coordinate" },
{ "name": "z", "type": "sbyte", "size": 1, "description": "Target Z coordinate" },
{ "name": "dest", "type": "uint", "size": 4, "description": "Target container/mobile serial, or 0xFFFFFFFF for world" }
]
},
{
"version": "6017+",
"name": "Container Grid Lines",
"condition": "Client version >= 6.0.1.7 (ContainerGridLines)",
"size": 15,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x08", "description": "Packet identifier" },
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of item being dropped (ignored)" },
{ "name": "x", "type": "short", "size": 2, "description": "Target X coordinate" },
{ "name": "y", "type": "short", "size": 2, "description": "Target Y coordinate" },
{ "name": "z", "type": "sbyte", "size": 1, "description": "Target Z coordinate" },
{ "name": "gridLocation", "type": "byte", "size": 1, "description": "Grid slot position in container" },
{ "name": "dest", "type": "uint", "size": 4, "description": "Target container/mobile serial, or 0xFFFFFFFF for world" }
]
}
],
"clientVersion": {
"feature": "ContainerGridLines adds gridLocation byte"
},
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingItemPackets.cs",
"line": 69
}
},
{
"id": "0x13",
"name": "Equip Request",
"description": "Client requests to equip a held item on a mobile.",
"direction": "incoming",
"isDynamic": false,
"size": 10,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x13", "description": "Packet identifier" },
{ "name": "itemSerial", "type": "uint", "size": 4, "description": "Serial of item to equip" },
{ "name": "layer", "type": "byte", "size": 1, "description": "Equipment layer" },
{ "name": "mobileSerial", "type": "uint", "size": 4, "description": "Serial of target mobile" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingItemPackets.cs",
"line": 44
}
},
{
"id": "0xEC",
"name": "Equip Macro",
"description": "Client requests to equip multiple items from a saved macro.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xEC", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "count", "type": "byte", "size": 1, "description": "Number of items to equip" },
{
"name": "items",
"type": "loop",
"loop": {
"countField": "count",
"fields": [
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of item to equip" }
]
}
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingItemPackets.cs",
"line": 112
}
},
{
"id": "0xED",
"name": "Unequip Macro",
"description": "Client requests to unequip items from specific layers via macro.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xED", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "count", "type": "byte", "size": 1, "description": "Number of layers to unequip" },
{
"name": "layers",
"type": "loop",
"loop": {
"countField": "count",
"fields": [
{ "name": "layer", "type": "ushort", "size": 2, "description": "Layer to unequip from" }
]
}
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingItemPackets.cs",
"line": 125
}
}
]
}

View file

@ -0,0 +1,97 @@
{
"category": "Message",
"packets": [
{
"id": "0x03",
"name": "ASCII Speech",
"description": "Client sends ASCII-encoded speech message.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x03", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{
"name": "type",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Message type",
"values": [
{ "value": 0, "name": "Regular", "description": "Normal speech" },
{ "value": 1, "name": "System", "description": "System message" },
{ "value": 2, "name": "Emote", "description": "Emote (*action*)" },
{ "value": 6, "name": "Label", "description": "Object label" },
{ "value": 7, "name": "Focus", "description": "Focused message" },
{ "value": 8, "name": "Whisper", "description": "Whisper" },
{ "value": 9, "name": "Yell", "description": "Yell" },
{ "value": 10, "name": "Spell", "description": "Spell words" },
{ "value": 13, "name": "Guild", "description": "Guild chat" },
{ "value": 14, "name": "Alliance", "description": "Alliance chat" },
{ "value": 15, "name": "Command", "description": "Command" }
]
},
{ "name": "hue", "type": "short", "size": 2, "description": "Text color hue" },
{ "name": "font", "type": "short", "size": 2, "description": "Font ID" },
{ "name": "text", "type": "ascii-null", "description": "Speech text (max 128 chars)" }
],
"related": [
{ "id": "0x1C", "relationship": "response", "note": "ASCII Message sent to other clients" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMessagePackets.cs",
"line": 31
}
},
{
"id": "0xAD",
"name": "Unicode Speech",
"description": "Client sends Unicode-encoded speech message with optional keywords.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xAD", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{
"name": "type",
"type": "bitfield",
"size": 1,
"description": "Message type with possible Encoded flag",
"flags": [
{ "bit": "0x0F", "name": "MessageType", "description": "Base message type (see 0x03)" },
{ "bit": "0xC0", "name": "Encoded", "description": "If set, packet contains encoded keywords" }
]
},
{ "name": "hue", "type": "short", "size": 2, "description": "Text color hue" },
{ "name": "font", "type": "short", "size": 2, "description": "Font ID" },
{ "name": "language", "type": "ascii", "size": 4, "description": "Language code (e.g., 'ENU')" },
{
"name": "encodedKeywords",
"type": "conditional",
"condition": "type & 0xC0 != 0",
"fields": [
{ "name": "keywordValue", "type": "short", "size": 2, "description": "Keyword count (upper 12 bits) and first hold value (lower 4 bits)" },
{ "name": "keywords", "type": "byte[]", "description": "Packed keyword IDs" },
{ "name": "text", "type": "utf8-null", "description": "Speech text (UTF-8 when encoded)" }
]
},
{
"name": "unicodeText",
"type": "conditional",
"condition": "type & 0xC0 == 0",
"fields": [
{ "name": "text", "type": "unicode-be-null", "description": "Speech text (Big Endian Unicode)" }
]
}
],
"related": [
{ "id": "0xAE", "relationship": "response", "note": "Unicode Message sent to other clients" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMessagePackets.cs",
"line": 58
}
}
]
}

View file

@ -0,0 +1,132 @@
{
"category": "Mobile",
"packets": [
{
"id": "0x6F",
"name": "Secure Trade",
"description": "Client interacts with a secure trade window.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x6F", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{
"name": "action",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Trade action type",
"values": [
{ "value": 1, "name": "Cancel", "description": "Cancel the trade" },
{ "value": 2, "name": "Check", "description": "Toggle accept checkbox" },
{ "value": 3, "name": "UpdateGold", "description": "Update virtual gold/platinum amounts" }
]
},
{ "name": "containerSerial", "type": "uint", "size": 4, "description": "Serial of the trade container" },
{
"name": "checkData",
"type": "conditional",
"condition": "action == 2",
"fields": [
{ "name": "accepted", "type": "int", "size": 4, "description": "Non-zero if accepting trade" }
]
},
{
"name": "goldData",
"type": "conditional",
"condition": "action == 3",
"fields": [
{ "name": "gold", "type": "int", "size": 4, "description": "Gold amount to trade" },
{ "name": "platinum", "type": "int", "size": 4, "description": "Platinum amount to trade" }
]
}
],
"related": [
{ "id": "0x6F", "relationship": "response", "note": "Server sends Secure Trade packet updates" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 93
}
},
{
"id": "0x75",
"name": "Rename Request",
"description": "Client requests to rename a mobile (pet).",
"direction": "incoming",
"isDynamic": false,
"size": 35,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x75", "description": "Packet identifier" },
{ "name": "targetSerial", "type": "uint", "size": 4, "description": "Serial of mobile to rename" },
{ "name": "newName", "type": "ascii", "size": 30, "description": "New name for the mobile" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 32
}
},
{
"id": "0x98",
"name": "Mobile Name Request",
"description": "Client requests the name of a mobile.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x98", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "mobileSerial", "type": "uint", "size": 4, "description": "Serial of mobile to query" }
],
"related": [
{ "id": "0x98", "relationship": "response", "note": "Server sends Mobile Name response" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 43
}
},
{
"id": "0xB8",
"name": "Profile Request",
"description": "Client requests to view or edit a mobile's profile.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xB8", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{
"name": "mode",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Request mode",
"values": [
{ "value": 0, "name": "Display", "description": "Request to view profile" },
{ "value": 1, "name": "Edit", "description": "Request to edit profile" }
]
},
{ "name": "mobileSerial", "type": "uint", "size": 4, "description": "Serial of target mobile" },
{
"name": "editData",
"type": "conditional",
"condition": "mode == 1",
"fields": [
{ "name": "padding", "type": "short", "size": 2, "description": "Unused padding" },
{ "name": "textLength", "type": "ushort", "size": 2, "description": "Length of text in characters" },
{ "name": "text", "type": "unicode-be", "description": "New profile text" }
]
}
],
"related": [
{ "id": "0xB8", "relationship": "response", "note": "Display Profile packet" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 53
}
}
]
}

View file

@ -0,0 +1,27 @@
{
"category": "Movement",
"packets": [
{
"id": "0x02",
"name": "Movement Request",
"description": "Sent by the client when the player attempts to move in a direction. The server responds with either MovementAck (0x22) if successful or MovementRej (0x21) if blocked.",
"direction": "incoming",
"isDynamic": false,
"size": 7,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x02", "description": "Packet identifier" },
{ "name": "direction", "type": "byte", "size": 1, "description": "Movement direction (0-7). Bit 0x80 indicates running." },
{ "name": "sequence", "type": "byte", "size": 1, "description": "Movement sequence number (1-255, wraps). Used for ack/rej matching." },
{ "name": "fastwalkKey", "type": "uint", "size": 4, "description": "Anti-speedhack prevention key. Set to 0 if fastwalk prevention is disabled." }
],
"related": [
{ "id": "0x21", "relationship": "rej", "note": "Sent if movement is blocked" },
{ "id": "0x22", "relationship": "ack", "note": "Sent if movement is successful" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMovementPackets.cs",
"line": 83
}
}
]
}

View file

@ -0,0 +1,470 @@
{
"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
}
}
]
}

View file

@ -0,0 +1,55 @@
{
"category": "Targeting",
"packets": [
{
"id": "0x6C",
"name": "Target Response",
"description": "Client responds to a target cursor request.",
"direction": "incoming",
"isDynamic": false,
"size": 19,
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x6C", "description": "Packet identifier" },
{
"name": "type",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Target type",
"values": [
{ "value": 0, "name": "Object", "description": "Targeting a specific object (mobile/item)" },
{ "value": 1, "name": "Location", "description": "Targeting a location/tile" }
]
},
{ "name": "targetId", "type": "int", "size": 4, "description": "Target cursor ID to match request" },
{
"name": "flags",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Target flags",
"values": [
{ "value": 0, "name": "Neutral", "description": "Neutral targeting" },
{ "value": 1, "name": "Harmful", "description": "Harmful action" },
{ "value": 2, "name": "Beneficial", "description": "Beneficial action" },
{ "value": 3, "name": "Cancel", "description": "Targeting canceled" }
]
},
{ "name": "targetSerial", "type": "uint", "size": 4, "description": "Serial of targeted object (0 for ground)" },
{ "name": "x", "type": "short", "size": 2, "description": "Target X coordinate (-1 if canceled)" },
{ "name": "y", "type": "short", "size": 2, "description": "Target Y coordinate (-1 if canceled)" },
{ "name": "unknown", "type": "byte", "size": 1, "description": "Unknown (typically 0)" },
{ "name": "z", "type": "sbyte", "size": 1, "description": "Target Z coordinate" },
{ "name": "graphic", "type": "ushort", "size": 2, "description": "Graphic ID of targeted tile (0 for land)" }
],
"related": [
{ "id": "0x6C", "relationship": "request", "note": "Target Request packet that initiated this" }
],
"notes": "If x == -1 && y == -1 && serial is invalid, user pressed Escape to cancel targeting.",
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingTargetingPackets.cs",
"line": 28
}
}
]
}

View file

@ -0,0 +1,70 @@
{
"category": "Vendor",
"packets": [
{
"id": "0x3B",
"name": "Vendor Buy Reply",
"description": "Client confirms items to purchase from a vendor.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x3B", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "vendorSerial", "type": "uint", "size": 4, "description": "Serial of the vendor" },
{ "name": "flag", "type": "byte", "size": 1, "description": "0x00 = buy, 0x02 = cancel" },
{
"name": "items",
"type": "loop",
"loop": {
"untilEnd": true,
"fields": [
{ "name": "layer", "type": "byte", "size": 1, "description": "Layer/container index" },
{ "name": "itemSerial", "type": "uint", "size": 4, "description": "Serial of item to buy" },
{ "name": "amount", "type": "short", "size": 2, "description": "Amount to purchase" }
]
}
}
],
"related": [
{ "id": "0x74", "relationship": "request", "note": "Vendor Buy List packet that initiated this" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingVendorPackets.cs",
"line": 25
}
},
{
"id": "0x9F",
"name": "Vendor Sell Reply",
"description": "Client confirms items to sell to a vendor.",
"direction": "incoming",
"isDynamic": true,
"size": "Dynamic",
"fields": [
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x9F", "description": "Packet identifier" },
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
{ "name": "vendorSerial", "type": "uint", "size": 4, "description": "Serial of the vendor" },
{ "name": "itemCount", "type": "ushort", "size": 2, "description": "Number of items to sell" },
{
"name": "items",
"type": "loop",
"loop": {
"countField": "itemCount",
"fields": [
{ "name": "itemSerial", "type": "uint", "size": 4, "description": "Serial of item to sell" },
{ "name": "amount", "type": "short", "size": 2, "description": "Amount to sell" }
]
}
}
],
"related": [
{ "id": "0x9E", "relationship": "request", "note": "Vendor Sell List packet that initiated this" }
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingVendorPackets.cs",
"line": 26
}
}
]
}