docs: Expand packet documentation with variants, sub-commands, and fixes

- Add Mahjong packets (0xDA) with 18 sub-commands (6 outgoing, 12 incoming)
- Add Bulletin Board incoming packets (0x71) with 4 sub-commands
- Add Corpse Equipment packet (0x89)
- Convert 0x6F Secure Trade to variants (Cancel, Toggle Accept, Update Gold)
- Convert 0xB8 Profile Request to variants (Display, Edit)
- Convert 0xAD Unicode Speech to variants with encoded keyword documentation
- Move 0xD7 base packet from player.json to encoded.json for consistency
- Fix dropdown arrow positioning in HTML template
- Fix packet sorting for embedded subIds (0xBF/0x22 format)
- Add reflexive relationships between related packets
- Update 0x3C container content with corpse usage notes

🤖 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 16:40:39 -08:00
parent 0d3dc75330
commit 91ba9fba88
No known key found for this signature in database
GPG key ID: 7D81DF26D9A5D94A
22 changed files with 2095 additions and 458 deletions

View file

@ -62,6 +62,15 @@
margin-left: 1rem;
padding-left: 0.75rem;
}
select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23d5bf74' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.75rem center;
padding-right: 2rem;
}
</style>
</head>
@ -208,14 +217,6 @@
</div>
</div>
<!-- Related Packets -->
<div id="relatedSection" class="mb-6 hidden">
<h3 class="text-gold-500 font-medium mb-3">Related Packets</h3>
<div id="relatedPackets" class="space-y-2">
<!-- Populated by JavaScript -->
</div>
</div>
<!-- Packet Variants -->
<div id="variantsSection" class="mb-6 hidden">
<div class="flex items-center justify-between mb-3">
@ -229,6 +230,14 @@
</div>
</div>
<!-- Related Packets -->
<div id="relatedSection" class="mb-6 hidden">
<h3 class="text-gold-500 font-medium mb-3">Related Packets</h3>
<div id="relatedPackets" class="space-y-2">
<!-- Populated by JavaScript -->
</div>
</div>
<!-- Floating Back to Top Button -->
<button id="backToTopBtn" class="hidden fixed bottom-6 right-6 bg-modern-black text-gold-300 px-4 py-2 rounded-lg border border-gold-500/30 hover:border-gold-500 hover:bg-gold-500/10 text-sm transition-all shadow-lg z-50" title="Back to Top">
↑ Top
@ -583,15 +592,22 @@ function renderPacketList() {
// Sort by ID
filtered.sort((a, b) => {
const aId = parseInt(a.id, 16);
const bId = parseInt(b.id, 16);
// Extract base ID and subId (handles both "0xBF" and "0xBF/0x22" formats)
const aParts = a.id.split('/');
const bParts = b.id.split('/');
const aId = parseInt(aParts[0], 16);
const bId = parseInt(bParts[0], 16);
if (aId !== bId) return aId - bId;
// If same ID, sort by subId
if (a.subId && b.subId) {
return parseInt(a.subId, 16) - parseInt(b.subId, 16);
// Get subId from property or embedded in id
const aSubId = a.subId || aParts[1];
const bSubId = b.subId || bParts[1];
// If same ID, sort by subId (base packet without subId comes first)
if (aSubId && bSubId) {
return parseInt(aSubId, 16) - parseInt(bSubId, 16);
}
return a.subId ? 1 : -1;
return aSubId ? 1 : -1;
});
packetList.innerHTML = filtered.map(p => {

View file

@ -0,0 +1,250 @@
{
"category": "Bulletin Board",
"packets": [
{
"id": "0x71",
"subId": "0x03",
"name": "Bulletin Board Request Content",
"description": "Client requests the full content of a bulletin board message.",
"direction": "incoming",
"isDynamic": true,
"size": "12",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x71",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x03",
"description": "Request Content command"
},
{
"name": "Board Serial",
"type": "uint",
"size": 4,
"description": "Serial of the bulletin board"
},
{
"name": "Message Serial",
"type": "uint",
"size": 4,
"description": "Serial of the message to read"
}
],
"related": [
{
"id": "0x71",
"subId": "0x02",
"direction": "outgoing",
"relationship": "response",
"note": "Message Content response"
}
],
"source": {
"file": "Projects/UOContent/Items/Bulletin Boards/BulletinBoardPackets.cs",
"line": 78
}
},
{
"id": "0x71",
"subId": "0x04",
"name": "Bulletin Board Request Header",
"description": "Client requests the header (poster, subject, time) of a bulletin board message.",
"direction": "incoming",
"isDynamic": true,
"size": "12",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x71",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x04",
"description": "Request Header command"
},
{
"name": "Board Serial",
"type": "uint",
"size": 4,
"description": "Serial of the bulletin board"
},
{
"name": "Message Serial",
"type": "uint",
"size": 4,
"description": "Serial of the message"
}
],
"related": [
{
"id": "0x71",
"subId": "0x01",
"direction": "outgoing",
"relationship": "response",
"note": "Message Header response"
}
],
"source": {
"file": "Projects/UOContent/Items/Bulletin Boards/BulletinBoardPackets.cs",
"line": 88
}
},
{
"id": "0x71",
"subId": "0x05",
"name": "Bulletin Board Post Message",
"description": "Client posts a new message or reply to the bulletin board.",
"direction": "incoming",
"isDynamic": true,
"size": "12+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x71",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x05",
"description": "Post Message command"
},
{
"name": "Board Serial",
"type": "uint",
"size": 4,
"description": "Serial of the bulletin board"
},
{
"name": "Thread Serial",
"type": "uint",
"size": 4,
"description": "Serial of parent message (0 for new thread)"
},
{
"name": "Subject Length",
"type": "byte",
"size": 1,
"description": "Length of subject string"
},
{
"name": "Subject",
"type": "utf8",
"description": "Message subject"
},
{
"name": "Line Count",
"type": "byte",
"size": 1,
"description": "Number of message lines"
},
{
"name": "Lines",
"type": "loop",
"description": "Message body lines",
"loop": {
"countField": "Line Count",
"fields": [
{
"name": "Line Length",
"type": "byte",
"size": 1,
"description": "Length of this line"
},
{
"name": "Line",
"type": "utf8",
"description": "Line text"
}
]
}
}
],
"source": {
"file": "Projects/UOContent/Items/Bulletin Boards/BulletinBoardPackets.cs",
"line": 98
}
},
{
"id": "0x71",
"subId": "0x06",
"name": "Bulletin Board Remove Message",
"description": "Client requests to delete a bulletin board message.",
"direction": "incoming",
"isDynamic": true,
"size": "12",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x71",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x06",
"description": "Remove Message command"
},
{
"name": "Board Serial",
"type": "uint",
"size": 4,
"description": "Serial of the bulletin board"
},
{
"name": "Message Serial",
"type": "uint",
"size": 4,
"description": "Serial of the message to delete"
}
],
"notes": "Only the message poster or GameMaster+ can delete messages.",
"source": {
"file": "Projects/UOContent/Items/Bulletin Boards/BulletinBoardPackets.cs",
"line": 153
}
}
]
}

View file

@ -1,6 +1,148 @@
{
"category": "Encoded Commands (0xD7)",
"packets": [
{
"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": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Entity Serial",
"type": "uint",
"size": 4,
"description": "Serial of target entity"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"description": "Encoded command ID"
},
{
"name": "Data",
"type": "byte[]",
"description": "Subcommand-specific data"
}
],
"subpackets": [
{
"subId": "0x02",
"name": "Backup",
"description": "Backup current house design state",
"direction": "incoming"
},
{
"subId": "0x03",
"name": "Restore",
"description": "Restore house design from backup",
"direction": "incoming"
},
{
"subId": "0x04",
"name": "Commit",
"description": "Commit house design changes",
"direction": "incoming"
},
{
"subId": "0x05",
"name": "Delete Component",
"description": "Delete component from house",
"direction": "incoming"
},
{
"subId": "0x06",
"name": "Build Component",
"description": "Place component in house",
"direction": "incoming"
},
{
"subId": "0x0C",
"name": "Close Tool",
"description": "Close house design tool",
"direction": "incoming"
},
{
"subId": "0x0D",
"name": "Add Stairs",
"description": "Add stairs to house design",
"direction": "incoming"
},
{
"subId": "0x0E",
"name": "Sync Request",
"description": "Synchronize house design state",
"direction": "incoming"
},
{
"subId": "0x10",
"name": "Clear Floor",
"description": "Clear a floor in house design",
"direction": "incoming"
},
{
"subId": "0x12",
"name": "Change Floor Level",
"description": "Change visible floor level",
"direction": "incoming"
},
{
"subId": "0x13",
"name": "Add Roof",
"description": "Add roof tile (SE+)",
"direction": "incoming"
},
{
"subId": "0x14",
"name": "Delete Roof",
"description": "Delete roof tile (SE+)",
"direction": "incoming"
},
{
"subId": "0x19",
"name": "Set Weapon Ability",
"description": "Select weapon special ability",
"direction": "incoming"
},
{
"subId": "0x1A",
"name": "Revert",
"description": "Revert house to original state",
"direction": "incoming"
},
{
"subId": "0x28",
"name": "Guild Gump Request",
"description": "Open guild gump",
"direction": "incoming"
},
{
"subId": "0x32",
"name": "Quest Gump Request",
"description": "Open quest/MLB gump",
"direction": "incoming"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
"line": 457
}
},
{
"id": "0xD7/0x02",
"subId": "0x02",

View file

@ -1,13 +1,168 @@
{
{
"category": "Mahjong",
"packets": [
{
"id": "0xDA",
"name": "Mahjong Command",
"description": "Client sends Mahjong game commands. Various subcommands control game actions like moving tiles, rolling dice, and managing players.",
"direction": "incoming",
"name": "Mahjong Game",
"description": "Mahjong game packets for controlling the in-game Mahjong table. Used for both client commands and server updates.",
"direction": "both",
"isDynamic": true,
"size": "7+",
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"description": "Command ID (incoming uses byte prefix + byte command)"
},
{
"name": "Data",
"type": "byte[]",
"description": "Command-specific data"
}
],
"subpackets": [
{
"subId": "0x02",
"name": "Players Info",
"description": "Sends player information for all seats",
"direction": "outgoing"
},
{
"subId": "0x03",
"name": "Tile Info",
"description": "Sends information about a single tile",
"direction": "outgoing"
},
{
"subId": "0x04",
"name": "Tiles Info",
"description": "Sends information about all tiles",
"direction": "outgoing"
},
{
"subId": "0x05",
"name": "General Info",
"description": "Sends game state (dice, dealer, wall break)",
"direction": "outgoing"
},
{
"subId": "0x06",
"name": "Exit Game",
"description": "Client exits the game",
"direction": "incoming"
},
{
"subId": "0x0A",
"name": "Give Points",
"description": "Transfer points to another player",
"direction": "incoming"
},
{
"subId": "0x0B",
"name": "Roll Dice",
"description": "Client requests to roll dice",
"direction": "incoming"
},
{
"subId": "0x0C",
"name": "Build Walls",
"description": "Dealer builds/resets tile walls",
"direction": "incoming"
},
{
"subId": "0x0D",
"name": "Reset Scores",
"description": "Dealer resets all scores",
"direction": "incoming"
},
{
"subId": "0x0F",
"name": "Assign Dealer",
"description": "Assign a new dealer",
"direction": "incoming"
},
{
"subId": "0x10",
"name": "Open Seat",
"description": "Open a seat for new players",
"direction": "incoming"
},
{
"subId": "0x11",
"name": "Change Option",
"description": "Change game options",
"direction": "incoming"
},
{
"subId": "0x15",
"name": "Move Wall Break",
"description": "Move wall break indicator",
"direction": "incoming"
},
{
"subId": "0x16",
"name": "Toggle Public Hand",
"description": "Toggle hand visibility",
"direction": "incoming"
},
{
"subId": "0x17",
"name": "Move Tile",
"description": "Move a tile on the board",
"direction": "incoming"
},
{
"subId": "0x18",
"name": "Move Dealer Indicator",
"description": "Move dealer indicator",
"direction": "incoming"
},
{
"subId": "0x19",
"name": "Join Game",
"description": "Server opens game interface",
"direction": "outgoing"
},
{
"subId": "0x1A",
"name": "Relieve",
"description": "Server closes game interface",
"direction": "outgoing"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 46
}
},
{
"id": "0xDA",
"subId": "0x06",
"name": "Mahjong Exit Game",
"description": "Client requests to exit the Mahjong game.",
"direction": "incoming",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
@ -38,19 +193,715 @@
"name": "Command",
"type": "byte",
"size": 1,
"description": "Subcommand: 0x06=Exit, 0x0A=GivePoints, 0x0B=RollDice, 0x0C=BuildWalls, 0x0D=ResetScores, 0x0F=AssignDealer, 0x10=OpenSeat, 0x11=ChangeOption, 0x15=MoveWallBreak, 0x16=TogglePublicHand, 0x17=MoveTile, 0x18=MoveDealerIndicator"
},
{
"name": "Data",
"type": "byte[]",
"size": "var",
"description": "Command-specific data (varies by subcommand)"
"value": "0x06",
"description": "Exit Game command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 64
"line": 108
}
},
{
"id": "0xDA",
"subId": "0x0A",
"name": "Mahjong Give Points",
"description": "Client transfers points to another player.",
"direction": "incoming",
"isDynamic": false,
"size": 14,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x0A",
"description": "Give Points command"
},
{
"name": "To Position",
"type": "byte",
"size": 1,
"description": "Target player seat position"
},
{
"name": "Amount",
"type": "int",
"size": 4,
"description": "Points to transfer"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 120
}
},
{
"id": "0xDA",
"subId": "0x0B",
"name": "Mahjong Roll Dice",
"description": "Client requests to roll the dice.",
"direction": "incoming",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x0B",
"description": "Roll Dice command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 133
}
},
{
"id": "0xDA",
"subId": "0x0C",
"name": "Mahjong Build Walls",
"description": "Dealer requests to reset and build the tile walls.",
"direction": "incoming",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x0C",
"description": "Build Walls command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 143
}
},
{
"id": "0xDA",
"subId": "0x0D",
"name": "Mahjong Reset Scores",
"description": "Dealer requests to reset all player scores to base value.",
"direction": "incoming",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x0D",
"description": "Reset Scores command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 153
}
},
{
"id": "0xDA",
"subId": "0x0F",
"name": "Mahjong Assign Dealer",
"description": "Dealer assigns another player as the new dealer.",
"direction": "incoming",
"isDynamic": false,
"size": 10,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x0F",
"description": "Assign Dealer command"
},
{
"name": "Position",
"type": "byte",
"size": 1,
"description": "Seat position of new dealer"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 163
}
},
{
"id": "0xDA",
"subId": "0x10",
"name": "Mahjong Open Seat",
"description": "Dealer opens a seat, removing the current player.",
"direction": "incoming",
"isDynamic": false,
"size": 10,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x10",
"description": "Open Seat command"
},
{
"name": "Position",
"type": "byte",
"size": 1,
"description": "Seat position to open"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 175
}
},
{
"id": "0xDA",
"subId": "0x11",
"name": "Mahjong Change Option",
"description": "Dealer changes game options (show scores, spectator vision).",
"direction": "incoming",
"isDynamic": false,
"size": 13,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x11",
"description": "Change Option command"
},
{
"name": "Reserved",
"type": "short",
"size": 2,
"description": "Reserved (not used)"
},
{
"name": "Reserved 2",
"type": "byte",
"size": 1,
"description": "Reserved (not used)"
},
{
"name": "Options",
"type": "bitflags",
"size": 1,
"description": "Game options",
"values": [
{ "value": "0x01", "name": "Show Scores", "description": "Display player scores" },
{ "value": "0x02", "name": "Spectator Vision", "description": "Spectators can see all tiles" }
]
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 192
}
},
{
"id": "0xDA",
"subId": "0x15",
"name": "Mahjong Move Wall Break Indicator",
"description": "Dealer moves the wall break indicator position.",
"direction": "incoming",
"isDynamic": false,
"size": 13,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x15",
"description": "Move Wall Break Indicator command"
},
{
"name": "Y Position",
"type": "short",
"size": 2,
"description": "New Y coordinate"
},
{
"name": "X Position",
"type": "short",
"size": 2,
"description": "New X coordinate"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 208
}
},
{
"id": "0xDA",
"subId": "0x16",
"name": "Mahjong Toggle Public Hand",
"description": "Player toggles whether their hand is visible to others.",
"direction": "incoming",
"isDynamic": false,
"size": 13,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x16",
"description": "Toggle Public Hand command"
},
{
"name": "Reserved",
"type": "short",
"size": 2,
"description": "Reserved (not used)"
},
{
"name": "Reserved 2",
"type": "byte",
"size": 1,
"description": "Reserved (not used)"
},
{
"name": "Public Hand",
"type": "bool",
"size": 1,
"description": "True to show hand publicly"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 221
}
},
{
"id": "0xDA",
"subId": "0x17",
"name": "Mahjong Move Tile",
"description": "Player moves a tile to a new position with direction and flip state.",
"direction": "incoming",
"isDynamic": false,
"size": 22,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x17",
"description": "Move Tile command"
},
{
"name": "Tile Number",
"type": "byte",
"size": 1,
"description": "Tile index number"
},
{
"name": "Current Direction",
"type": "byte",
"size": 1,
"description": "Current tile direction (unused)"
},
{
"name": "New Direction",
"type": "enum",
"size": 1,
"description": "New tile direction",
"values": [
{ "value": "0", "name": "Up", "description": "Facing up" },
{ "value": "1", "name": "Left", "description": "Facing left" },
{ "value": "2", "name": "Down", "description": "Facing down" },
{ "value": "3", "name": "Right", "description": "Facing right" }
]
},
{
"name": "Reserved",
"type": "byte",
"size": 1,
"description": "Reserved byte"
},
{
"name": "Flip",
"type": "bool",
"size": 1,
"description": "True to flip tile face-up"
},
{
"name": "Current Y",
"type": "short",
"size": 2,
"description": "Current Y position (unused)"
},
{
"name": "Current X",
"type": "short",
"size": 2,
"description": "Current X position (unused)"
},
{
"name": "Reserved 2",
"type": "byte",
"size": 1,
"description": "Reserved byte"
},
{
"name": "New Y",
"type": "short",
"size": 2,
"description": "New Y position"
},
{
"name": "New X",
"type": "short",
"size": 2,
"description": "New X position"
},
{
"name": "Reserved 3",
"type": "byte",
"size": 1,
"description": "Reserved byte"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 236
}
},
{
"id": "0xDA",
"subId": "0x18",
"name": "Mahjong Move Dealer Indicator",
"description": "Dealer moves the dealer indicator with direction and wind.",
"direction": "incoming",
"isDynamic": false,
"size": 15,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown byte"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x18",
"description": "Move Dealer Indicator command"
},
{
"name": "Direction",
"type": "enum",
"size": 1,
"description": "Indicator direction",
"values": [
{ "value": "0", "name": "Up", "description": "Facing up" },
{ "value": "1", "name": "Left", "description": "Facing left" },
{ "value": "2", "name": "Down", "description": "Facing down" },
{ "value": "3", "name": "Right", "description": "Facing right" }
]
},
{
"name": "Wind",
"type": "enum",
"size": 1,
"description": "Wind direction displayed",
"values": [
{ "value": "0", "name": "North", "description": "North wind" },
{ "value": "1", "name": "East", "description": "East wind" },
{ "value": "2", "name": "South", "description": "South wind" },
{ "value": "3", "name": "West", "description": "West wind" }
]
},
{
"name": "Y Position",
"type": "short",
"size": 2,
"description": "New Y position"
},
{
"name": "X Position",
"type": "short",
"size": 2,
"description": "New X position"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 271
}
}
]
}
}

View file

@ -24,10 +24,10 @@
},
{
"name": "Command",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Map pin command type",
"enum": [
"values": [
{ "value": "1", "name": "AddPin", "description": "Add a new pin" },
{ "value": "2", "name": "InsertPin", "description": "Insert pin at position" },
{ "value": "3", "name": "ChangePin", "description": "Change existing pin" },
@ -55,6 +55,26 @@
"description": "Y coordinate of pin"
}
],
"related": [
{
"id": "0x56",
"direction": "outgoing",
"relationship": "related",
"note": "Server map pin commands"
},
{
"id": "0x90",
"direction": "outgoing",
"relationship": "related",
"note": "Map Details packet (old)"
},
{
"id": "0xF5",
"direction": "outgoing",
"relationship": "related",
"note": "Map Details packet (new)"
}
],
"source": {
"file": "Projects/UOContent/Items/Maps/MapItemPackets.cs",
"line": 28

View file

@ -119,99 +119,174 @@
{
"id": "0xAD",
"name": "Unicode Speech",
"description": "Client sends Unicode-encoded speech message with optional keywords.",
"description": "Client sends Unicode-encoded speech message. Type byte upper bits (0xC0) indicate if keywords are encoded.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"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": "3-0",
"name": "Message Type",
"description": "Base message type (see 0x03)"
},
{
"bit": "7-6",
"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., \u0027ENU\u0027)"
},
{
"name": "Encoded Keywords",
"type": "conditional",
"condition": "type \u0026 0xC0 != 0",
"fields": [
{
"name": "Keyword Value",
"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-t",
"description": "Speech text (UTF-8 when encoded)"
}
]
},
{
"name": "Unicode Text",
"type": "conditional",
"condition": "type \u0026 0xC0 == 0",
"fields": [
{
"name": "Text",
"type": "utf16be-t",
"description": "Speech text (Big Endian Unicode)"
}
]
}
],
"size": "Varies",
"variants": [
{
"name": "Standard Unicode",
"condition": "type & 0xC0 == 0",
"size": "12+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xAD",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Type",
"type": "enum",
"size": 1,
"description": "Message type (0xC0 bits clear)",
"values": [
{
"value": 0,
"name": "Regular",
"description": "Normal speech"
},
{
"value": 1,
"name": "System",
"description": "System message"
},
{
"value": 2,
"name": "Emote",
"description": "Emote (*action*)"
},
{
"value": 8,
"name": "Whisper",
"description": "Whisper"
},
{
"value": 9,
"name": "Yell",
"description": "Yell"
},
{
"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": "Language",
"type": "ascii",
"size": 4,
"description": "Language code (e.g., 'ENU')"
},
{
"name": "Text",
"type": "utf16be-t",
"description": "Speech text (Big Endian Unicode, null-terminated)"
}
]
},
{
"name": "Encoded Keywords",
"condition": "type & 0xC0 != 0",
"size": "14+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xAD",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Type",
"type": "byte",
"size": 1,
"description": "Message type with 0xC0 flag set. Lower 4 bits = message type (see Standard variant)"
},
{
"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": "Keyword Header",
"type": "ushort",
"size": 2,
"description": "Bits 15-4: keyword count (0-50), Bits 3-0: first hold value for packed IDs"
},
{
"name": "Packed Keywords",
"type": "byte[]",
"description": "12-bit keyword IDs packed alternating: even indices use hold<<8|byte, odd indices use (short&0xFFF0)>>4 with new hold"
},
{
"name": "Text",
"type": "utf8-t",
"description": "Speech text (UTF-8, null-terminated)"
}
]
}
],
"notes": "Encoded keywords use 12-bit speech IDs packed efficiently. Keyword count must be 0-50. The packing alternates: even-indexed keywords combine the previous 4-bit hold with a new byte (12 bits total), odd-indexed keywords read a short and extract bits 15-4 as the ID, bits 3-0 as the next hold.",
"related": [
{
"id": "0x03",
"direction": "incoming",
"relationship": "variant",
"note": "ASCII Speech (simpler format)"
},
{
"id": "0xAE",
"direction": "outgoing",
"relationship": "response",
"note": "Unicode Message sent to other clients"
}

View file

@ -1,95 +1,6 @@
{
"category": "Mobile",
"packets": [
{
"id": "0x6F",
"name": "Secure Trade",
"description": "Client interacts with a secure trade window.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"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": "Update Gold",
"description": "Update virtual gold/platinum amounts"
}
]
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of the trade container"
},
{
"name": "Check Data",
"type": "conditional",
"condition": "action == 2",
"fields": [
{
"name": "Accepted",
"type": "int",
"size": 4,
"description": "Non-zero if accepting trade"
}
]
},
{
"name": "Gold Data",
"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"
}
]
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 93
}
},
{
"id": "0x75",
"name": "Rename Request",
@ -159,74 +70,95 @@
{
"id": "0xB8",
"name": "Profile Request",
"description": "Client requests to view or edit a mobile\u0027s profile.",
"description": "Client requests to view or edit a mobile's profile.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"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": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of target mobile"
},
{
"name": "Edit Data",
"type": "conditional",
"condition": "mode == 1",
"fields": [
{
"name": "Padding",
"type": "short",
"size": 2,
"description": "Unused padding"
},
{
"name": "Text Length",
"type": "ushort",
"size": 2,
"description": "Length of text in characters"
},
{
"name": "Text",
"type": "utf16be",
"description": "New profile text"
}
]
}
],
"size": "Varies",
"variants": [
{
"name": "Display Profile",
"condition": "mode == Display (0)",
"size": 8,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xB8",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Mode",
"type": "byte",
"size": 1,
"value": "0",
"description": "Display mode"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of target mobile"
}
]
},
{
"name": "Edit Profile",
"condition": "mode == Edit (1)",
"size": "12+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xB8",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Mode",
"type": "byte",
"size": 1,
"value": "1",
"description": "Edit mode"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of target mobile"
},
{
"name": "Padding",
"type": "short",
"size": 2,
"description": "Unused padding"
},
{
"name": "Text Length",
"type": "ushort",
"size": 2,
"description": "Length of text in characters"
},
{
"name": "Text",
"type": "utf16be",
"description": "New profile text (Big Endian Unicode)"
}
]
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 53

View file

@ -733,6 +733,14 @@
"description": "Response text (max 128 chars)"
}
],
"related": [
{
"id": "0xC2",
"direction": "outgoing",
"relationship": "request",
"note": "Prompt packet that triggered this response"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
"line": 250
@ -824,148 +832,6 @@
"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": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Entity Serial",
"type": "uint",
"size": 4,
"description": "Serial of target entity"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"description": "Encoded command ID"
},
{
"name": "Data",
"type": "byte[]",
"description": "Subcommand-specific data"
}
],
"subpackets": [
{
"subId": "0x02",
"name": "Backup",
"description": "Backup current house design state",
"direction": "incoming"
},
{
"subId": "0x03",
"name": "Restore",
"description": "Restore house design from backup",
"direction": "incoming"
},
{
"subId": "0x04",
"name": "Commit",
"description": "Commit house design changes",
"direction": "incoming"
},
{
"subId": "0x05",
"name": "Delete Component",
"description": "Delete component from house",
"direction": "incoming"
},
{
"subId": "0x06",
"name": "Build Component",
"description": "Place component in house",
"direction": "incoming"
},
{
"subId": "0x0C",
"name": "Close Tool",
"description": "Close house design tool",
"direction": "incoming"
},
{
"subId": "0x0D",
"name": "Add Stairs",
"description": "Add stairs to house design",
"direction": "incoming"
},
{
"subId": "0x0E",
"name": "Sync Request",
"description": "Synchronize house design state",
"direction": "incoming"
},
{
"subId": "0x10",
"name": "Clear Floor",
"description": "Clear a floor in house design",
"direction": "incoming"
},
{
"subId": "0x12",
"name": "Change Floor Level",
"description": "Change visible floor level",
"direction": "incoming"
},
{
"subId": "0x13",
"name": "Add Roof",
"description": "Add roof tile (SE+)",
"direction": "incoming"
},
{
"subId": "0x14",
"name": "Delete Roof",
"description": "Delete roof tile (SE+)",
"direction": "incoming"
},
{
"subId": "0x19",
"name": "Set Weapon Ability",
"description": "Select weapon special ability",
"direction": "incoming"
},
{
"subId": "0x1A",
"name": "Revert",
"description": "Revert house to original state",
"direction": "incoming"
},
{
"subId": "0x28",
"name": "Guild Gump Request",
"description": "Open guild gump",
"direction": "incoming"
},
{
"subId": "0x32",
"name": "Quest Gump Request",
"description": "Open quest/MLB gump",
"direction": "incoming"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
"line": 457
}
},
{
"id": "0xF4",
"name": "Crash Report",

View file

@ -0,0 +1,144 @@
{
"category": "Secure Trade",
"packets": [
{
"id": "0x6F",
"name": "Secure Trade",
"description": "Client interacts with a secure trade window.",
"direction": "incoming",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Cancel Trade",
"condition": "action == Cancel (1)",
"size": 8,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Action",
"type": "byte",
"size": 1,
"value": "1",
"description": "Cancel action"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of the trade container"
}
]
},
{
"name": "Toggle Accept",
"condition": "action == Check (2)",
"size": 12,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Action",
"type": "byte",
"size": 1,
"value": "2",
"description": "Check/toggle action"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of the trade container"
},
{
"name": "Accepted",
"type": "bool",
"size": 4,
"description": "True if accepting the trade"
}
]
},
{
"name": "Update Gold/Platinum",
"condition": "action == UpdateGold (3)",
"size": 16,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Action",
"type": "byte",
"size": 1,
"value": "3",
"description": "Update gold action"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of the trade container"
},
{
"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",
"direction": "outgoing",
"relationship": "response",
"note": "Server sends trade window updates"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMobilePackets.cs",
"line": 93
}
}
]
}

View file

@ -18,10 +18,10 @@
},
{
"name": "Reason",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Rejection reason code",
"enum": [
"values": [
{ "value": "0", "name": "Invalid", "description": "Invalid credentials" },
{ "value": "1", "name": "InUse", "description": "Account already in use" },
{ "value": "2", "name": "Blocked", "description": "Account blocked" },
@ -1007,10 +1007,10 @@
},
{
"name": "Result",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Deletion result code",
"enum": [
"values": [
{ "value": "0", "name": "PasswordInvalid", "description": "Password is invalid" },
{ "value": "1", "name": "CharNotExist", "description": "Character does not exist" },
{ "value": "2", "name": "CharBeingPlayed", "description": "Character is being played" },
@ -1049,10 +1049,10 @@
},
{
"name": "Message ID",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Predefined message identifier",
"enum": [
"values": [
{ "value": "1", "name": "CharNoExist", "description": "Character does not exist" },
{ "value": "2", "name": "CharExists", "description": "Character already exists" },
{ "value": "5", "name": "CharInWorld", "description": "Character is in world" },

View file

@ -231,7 +231,7 @@
{
"id": "0x3C",
"name": "Container \u0026 Old Spellbook Content",
"description": "Sends full contents of a container. Also used for old-style spellbook content (pre-AOS clients without NewSpellbook support). For AOS+ clients with NewSpellbook, use 0xBF/0x1B instead for spellbooks.",
"description": "Sends full contents of a container. Also used for corpse contents and old-style spellbook content (pre-AOS clients). For AOS+ spellbooks, use 0xBF/0x1B instead.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
@ -420,11 +420,17 @@
"id": "0xBF/0x1B",
"relationship": "variant",
"note": "New Spellbook Content for AOS+ clients"
},
{
"id": "0x89",
"relationship": "related",
"note": "Corpse Equipment (layer mappings for corpse items)"
}
],
"clientVersion": {
"feature": "ContainerGridLines (6.0.1.7+) adds gridLocation byte per item"
},
"notes": "Also used for corpse contents. Corpses are special containers that display equipped items on a body graphic. Use with 0x89 Corpse Equipment for full corpse display.",
"source": {
"file": "Projects/Server/Network/Packets/OutgoingContainerPackets.cs",
"line": 169

View file

@ -0,0 +1,76 @@
{
"category": "Corpse",
"packets": [
{
"id": "0x89",
"name": "Corpse Equipment",
"description": "Sends the equipment layer mapping for items on a corpse, including virtual hair and facial hair items.",
"direction": "outgoing",
"isDynamic": true,
"size": "8+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x89",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Corpse Serial",
"type": "uint",
"size": 4,
"description": "Serial of the corpse"
},
{
"name": "Equipment",
"type": "loop",
"description": "Equipment layer mappings (5 bytes each, until terminator)",
"loop": {
"terminator": "Layer == 0",
"fields": [
{
"name": "Layer",
"type": "byte",
"size": 1,
"description": "Equipment layer + 1 (0 = terminator)"
},
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of item in this layer"
}
]
}
},
{
"name": "Terminator",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Layer.Invalid (0) marks end of list"
}
],
"notes": "Layer values are offset by +1 (e.g., Layer.Hair (0x0B) is sent as 0x0C). Hair and facial hair use virtual serials.",
"related": [
{
"id": "0x3C",
"direction": "outgoing",
"relationship": "related",
"note": "Container Content (also used for corpse items)"
}
],
"source": {
"file": "Projects/UOContent/Items/Misc/Corpses/CorpsePackets.cs",
"line": 24
}
}
]
}

View file

@ -192,10 +192,10 @@
},
{
"name": "Entity Type",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Entity type",
"enum": [
"values": [
{ "value": "0", "name": "Item", "description": "World item" },
{ "value": "1", "name": "Mobile", "description": "Mobile/creature" },
{ "value": "2", "name": "Multi", "description": "Multi/structure" }
@ -291,10 +291,10 @@
},
{
"name": "Entity Type",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Entity type",
"enum": [
"values": [
{ "value": "0", "name": "Item", "description": "World item" },
{ "value": "1", "name": "Mobile", "description": "Mobile/creature" },
{ "value": "2", "name": "Multi", "description": "Multi/structure" }

View file

@ -720,9 +720,9 @@
},
{
"name": "Type",
"type": "int",
"type": "enum",
"description": "Button type",
"enum": [
"values": [
{ "value": "0", "name": "PageChange", "description": "Navigate to different page" },
{ "value": "1", "name": "ServerReply", "description": "Send response to server" }
]
@ -765,9 +765,9 @@
},
{
"name": "Type",
"type": "int",
"type": "enum",
"description": "Button type",
"enum": [
"values": [
{ "value": "0", "name": "PageChange", "description": "Navigate to different page" },
{ "value": "1", "name": "ServerReply", "description": "Send response to server" }
]

View file

@ -43,6 +43,189 @@
"line": 288
}
},
{
"id": "0xDA",
"subId": "0x03",
"name": "Mahjong Tile Info",
"description": "Sends information about a single Mahjong tile.",
"direction": "outgoing",
"isDynamic": false,
"size": 18,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0012",
"description": "Packet length (18)"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"value": "0x0003",
"description": "Tile Info command"
},
{
"name": "Tile Number",
"type": "byte",
"size": 1,
"description": "Tile index number"
},
{
"name": "Tile Value",
"type": "byte",
"size": 1,
"description": "Tile face value (0 if hidden)"
},
{
"name": "Y Position",
"type": "short",
"size": 2,
"description": "Tile Y coordinate"
},
{
"name": "X Position",
"type": "short",
"size": 2,
"description": "Tile X coordinate"
},
{
"name": "Stack Level",
"type": "byte",
"size": 1,
"description": "Stack level for overlapping tiles"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Tile direction (0=Up, 1=Left, 2=Down, 3=Right)"
},
{
"name": "Flipped",
"type": "byte",
"size": 1,
"description": "0x10 if flipped/face-up, 0x00 if face-down"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 362
}
},
{
"id": "0xDA",
"subId": "0x04",
"name": "Mahjong Tiles Info",
"description": "Sends information about all tiles in the Mahjong game.",
"direction": "outgoing",
"isDynamic": true,
"size": "11+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"value": "0x0004",
"description": "Tiles Info command"
},
{
"name": "Tile Count",
"type": "short",
"size": 2,
"description": "Number of tiles"
},
{
"name": "Tiles",
"type": "loop",
"description": "Tile data for each tile",
"loop": {
"countField": "Tile Count",
"fields": [
{
"name": "Tile Number",
"type": "byte",
"size": 1,
"description": "Tile index number"
},
{
"name": "Tile Value",
"type": "byte",
"size": 1,
"description": "Tile face value (0 if hidden)"
},
{
"name": "Y Position",
"type": "short",
"size": 2,
"description": "Tile Y coordinate"
},
{
"name": "X Position",
"type": "short",
"size": 2,
"description": "Tile X coordinate"
},
{
"name": "Stack Level",
"type": "byte",
"size": 1,
"description": "Stack level"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Tile direction"
},
{
"name": "Flipped",
"type": "byte",
"size": 1,
"description": "0x10 if flipped, 0x00 otherwise"
}
]
}
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 408
}
},
{
"id": "0xDA",
"subId": "0x02",
@ -226,10 +409,10 @@
},
{
"name": "Dealer Wind",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Dealer indicator wind direction",
"enum": [
"values": [
{ "value": "0", "name": "North", "description": "North wind" },
{ "value": "1", "name": "East", "description": "East wind" },
{ "value": "2", "name": "South", "description": "South wind" },

View file

@ -185,10 +185,10 @@
},
{
"name": "Command",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Map command type",
"enum": [
"values": [
{ "value": "1", "name": "AddPin", "description": "Add a pin to the map" },
{ "value": "5", "name": "DisplayMap", "description": "Display the map to client" },
{ "value": "7", "name": "SetEditable", "description": "Set map editable state" }
@ -214,10 +214,21 @@
}
],
"related": [
{
"id": "0x56",
"direction": "incoming",
"relationship": "related",
"note": "Client map pin commands"
},
{
"id": "0x90",
"relationship": "related",
"note": "Map Details packet"
"note": "Map Details packet (old)"
},
{
"id": "0xF5",
"relationship": "related",
"note": "Map Details packet (new)"
}
],
"source": {
@ -291,6 +302,12 @@
}
],
"related": [
{
"id": "0x56",
"direction": "both",
"relationship": "related",
"note": "Map pin commands (client and server)"
},
{
"id": "0xF5",
"relationship": "variant",
@ -368,10 +385,10 @@
},
{
"name": "Facet ID",
"type": "short",
"type": "enum",
"size": 2,
"description": "Map facet/world identifier",
"enum": [
"values": [
{ "value": "0", "name": "Felucca", "description": "Felucca facet" },
{ "value": "1", "name": "Trammel", "description": "Trammel facet" },
{ "value": "2", "name": "Ilshenar", "description": "Ilshenar facet" },
@ -382,6 +399,12 @@
}
],
"related": [
{
"id": "0x56",
"direction": "both",
"relationship": "related",
"note": "Map pin commands (client and server)"
},
{
"id": "0x90",
"relationship": "variant",

View file

@ -411,8 +411,15 @@
"related": [
{
"id": "0x9A",
"direction": "incoming",
"relationship": "response",
"note": "ASCII Prompt Response"
},
{
"id": "0xC2",
"direction": "incoming",
"relationship": "response",
"note": "Unicode Prompt Response"
}
],
"source": {

View file

@ -895,6 +895,14 @@
}
],
"notes": "ModernUO supports 15 AOS status values (indices 0-14). Enhanced Client extends this to 29 values (indices 0-28), but ModernUO does not support Enhanced Client.",
"related": [
{
"id": "0x34",
"direction": "incoming",
"relationship": "request",
"note": "Mobile Query (stats) triggers this response"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMobilePackets.cs",
"line": 497
@ -1624,20 +1632,20 @@
},
{
"name": "Healthbar Type",
"type": "short",
"type": "enum",
"size": 2,
"description": "Type of healthbar overlay",
"enum": [
"values": [
{ "value": "1", "name": "Poison", "description": "Poison status bar" },
{ "value": "2", "name": "Yellow", "description": "Yellow/invulnerable bar" }
]
},
{
"name": "Level",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Status level",
"enum": [
"values": [
{ "value": "0", "name": "Off", "description": "Status disabled" },
{ "value": "1", "name": "Level1/On", "description": "Poison level 1 or yellow on" },
{ "value": "2", "name": "Level2", "description": "Poison level 2 (Greater)" },

View file

@ -198,10 +198,10 @@
},
{
"name": "Speed Setting",
"type": "byte",
"type": "enum",
"size": 1,
"description": "Movement speed mode",
"enum": [
"values": [
{ "value": "0", "name": "Disable", "description": "Normal speed (remove override)" },
{ "value": "1", "name": "MountSpeed", "description": "Force mounted movement speed" },
{ "value": "2", "name": "WalkOnly", "description": "Force walk speed only" }

View file

@ -337,6 +337,20 @@
}
}
],
"related": [
{
"id": "0x34",
"direction": "incoming",
"relationship": "request",
"note": "Mobile Query (skills) triggers this response"
},
{
"id": "0x3A",
"direction": "incoming",
"relationship": "related",
"note": "Change Skill Lock may trigger update"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
"line": 121

View file

@ -258,6 +258,14 @@
]
}
],
"related": [
{
"id": "0x6F",
"direction": "incoming",
"relationship": "request",
"note": "Client trade actions"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingSecureTradePackets.cs",
"line": 32

File diff suppressed because one or more lines are too long