feat: Adds Network Packet Documentation (#2302)

This commit is contained in:
Kamron Batman 2026-01-01 17:52:56 -08:00 committed by GitHub
parent ec287d7691
commit 1a7c94a442
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
60 changed files with 24753 additions and 22 deletions

View file

@ -10,18 +10,31 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- run: pip install mkdocs-material
- run: mkdocs gh-deploy --force
- name: Extract commands web file
- name: Install mkdocs-material
run: pip install mkdocs-material
- name: Build mkdocs site
run: mkdocs build --strict
- name: Build packets documentation
shell: pwsh
run: ./docs/tools/build-packets.ps1
- name: Copy commands and packets to site
run: |
7z x ./docs/commands/commands.7z -o./docs/commands
rm ./docs/commands/commands.7z
- name: Deploy commands file
cp ./docs/commands/commands.html ./site/
cp ./docs/packets/packets.html ./site/
- name: Deploy to GitHub Pages
uses: JamesIves/github-pages-deploy-action@v4
with:
folder: ./docs/commands
clean: false
force: false
folder: ./site
branch: gh-pages
clean: true
clean-exclude: |
.nojekyll

View file

@ -56,12 +56,10 @@ public static class OutgoingPlayerPackets
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SendChangeUpdateRange(this NetState ns, byte range) =>
ns?.Send(stackalloc byte[] { 0xC8, range });
public static void SendChangeUpdateRange(this NetState ns, byte range) => ns?.Send(stackalloc byte[] { 0xC8, range });
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SendDeathStatus(this NetState ns) =>
ns?.Send(stackalloc byte[] { 0x2C, 2 });
public static void SendDeathStatus(this NetState ns) => ns?.Send(stackalloc byte[] { 0x2C, 2 });
public static void SendDisplayProfile(this NetState ns, Serial m, string header, string body, string footer)
{

View file

@ -29,9 +29,7 @@ public enum TradeFlag : byte
public static class OutgoingSecureTradePackets
{
public static void SendDisplaySecureTrade(
this NetState ns, Mobile them, Container first, Container second, string name
)
public static void SendDisplaySecureTrade(this NetState ns, Mobile them, Container first, Container second, string name)
{
if (ns.CannotSendPackets())
{

View file

@ -57,15 +57,18 @@ public static class GenCommands
options
);
var template = File.ReadAllText(Path.Combine(Core.BaseDirectory, "Data", "commands.html"))
// Template is in Distribution/Data/commands
var templatePath = Path.Combine(Core.BaseDirectory, "Data", "commands", "template.html");
var template = File.ReadAllText(templatePath)
.Replace("<!-- COMMANDS -->", commandsJson.EscapeHtml())
.Replace("<!-- MODIFIERS -->", modifiersJson.EscapeHtml());
// Write the new file to the web folder
// Output to Distribution/web folder (typically ignored by servers for external systems)
var webFolder = Path.Combine(Core.BaseDirectory, "web");
PathUtility.EnsureDirectory(webFolder);
var webPath = Path.Combine(webFolder, "commands.html");
File.WriteAllText(webPath, template, Encoding.UTF8);
e.Mobile.SendMessage($"Commands webpage generated at {webPath}.");
Directory.CreateDirectory(webFolder);
var outputPath = Path.Combine(webFolder, "commands.html");
File.WriteAllText(outputPath, template, Encoding.UTF8);
e.Mobile.SendMessage($"Commands webpage generated at {outputPath}.");
}
}

Binary file not shown.

2619
docs/commands/commands.html Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,817 @@
{
"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": "Packet ID",
"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": "Next Login Key",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x91",
"description": "Packet identifier"
},
{
"name": "Auth ID",
"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": "Packet ID",
"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": "Char Slot",
"type": "int",
"size": 4,
"description": "Character slot index (0-based)"
},
{
"name": "Client IP",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xA0",
"description": "Packet identifier"
},
{
"name": "Server Index",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x83",
"description": "Packet identifier"
},
{
"name": "Password",
"type": "ascii",
"size": 30,
"description": "Account password for verification"
},
{
"name": "Char Index",
"type": "int",
"size": 4,
"description": "Character slot index to delete"
},
{
"name": "Client IP",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xEF",
"description": "Packet identifier"
},
{
"name": "Seed",
"type": "int",
"size": 4,
"description": "Random seed for encryption"
},
{
"name": "Client Major",
"type": "int",
"size": 4,
"description": "Client major version"
},
{
"name": "Client Minor",
"type": "int",
"size": 4,
"description": "Client minor version"
},
{
"name": "Client Revision",
"type": "int",
"size": 4,
"description": "Client revision"
},
{
"name": "Client Patch",
"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\u0027s version request (0xBD). Contains the client version string.",
"direction": "incoming",
"isDynamic": true,
"size": "3 + version string length",
"fields": [
{
"name": "Packet ID",
"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., \u00277.0.95.0\u0027)"
}
],
"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": "var",
"fields": [
{
"name": "Packet ID",
"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": "Client Type",
"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 with 3 starting skills. Replaced by 0xF8 in client 7.0.16.0+.",
"direction": "incoming",
"isDynamic": false,
"size": 104,
"fields": [
{
"name": "Packet ID",
"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": "Gender Race",
"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": "Skin Hue",
"type": "ushort",
"size": 2,
"description": "Skin color hue"
},
{
"name": "Hair Style",
"type": "short",
"size": 2,
"description": "Hair style ID"
},
{
"name": "Hair Hue",
"type": "short",
"size": 2,
"description": "Hair color hue"
},
{
"name": "Facial Hair Style",
"type": "short",
"size": 2,
"description": "Facial hair style ID"
},
{
"name": "Facial Hair Hue",
"type": "short",
"size": 2,
"description": "Facial hair color hue"
},
{
"name": "Unknown7",
"type": "byte",
"size": 1,
"description": "Unknown"
},
{
"name": "City Index",
"type": "byte",
"size": 1,
"description": "Starting city index"
},
{
"name": "Char Slot",
"type": "int",
"size": 4,
"description": "Character slot"
},
{
"name": "Client IP",
"type": "int",
"size": 4,
"description": "Client IP"
},
{
"name": "Shirt Hue",
"type": "short",
"size": 2,
"description": "Starting shirt hue"
},
{
"name": "Pants Hue",
"type": "short",
"size": 2,
"description": "Starting pants hue"
}
],
"related": [
{
"id": "0xF8",
"relationship": "variant",
"note": "Create Character (New) for 7.0.16.0+ with 4th skill"
}
],
"clientVersion": {
"max": "7.0.15.x",
"notes": "Replaced by 0xF8 in client 7.0.16.0+"
},
"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": "Packet ID",
"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": "Gender Race",
"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": "Skin Hue",
"type": "ushort",
"size": 2,
"description": "Skin color hue"
},
{
"name": "Hair Style",
"type": "short",
"size": 2,
"description": "Hair style ID"
},
{
"name": "Hair Hue",
"type": "short",
"size": 2,
"description": "Hair color hue"
},
{
"name": "Facial Hair Style",
"type": "short",
"size": 2,
"description": "Facial hair style ID"
},
{
"name": "Facial Hair Hue",
"type": "short",
"size": 2,
"description": "Facial hair color hue"
},
{
"name": "Unknown7",
"type": "byte",
"size": 1,
"description": "Unknown"
},
{
"name": "City Index",
"type": "byte",
"size": 1,
"description": "Starting city index"
},
{
"name": "Char Slot",
"type": "int",
"size": 4,
"description": "Character slot"
},
{
"name": "Client IP",
"type": "int",
"size": 4,
"description": "Client IP"
},
{
"name": "Shirt Hue",
"type": "short",
"size": 2,
"description": "Starting shirt hue"
},
{
"name": "Pants Hue",
"type": "short",
"size": 2,
"description": "Starting pants hue"
}
],
"related": [
{
"id": "0x00",
"relationship": "variant",
"note": "Create Character (Old) for pre-7.0.16.0 with 3 skills"
}
],
"clientVersion": {
"min": "7.0.16.0",
"notes": "Replaces 0x00, adds 4th starting skill"
},
"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,39 @@
{
"category": "Assistant",
"packets": [
{
"id": "0xBE",
"name": "Assistant Version",
"description": "Client sends assistant version information. Razor CE sends version as ASCII string.",
"direction": "incoming",
"isDynamic": true,
"size": "3+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBE",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Version String",
"type": "ascii",
"size": "var",
"description": "Assistant version string (Razor CE sends \u0027version\u0027 or \u0027ProductName version\u0027)"
}
],
"notes": "Razor Community Edition sends version as ASCII. Legacy UOAssist would send int32 + ASCII client version.",
"source": {
"file": "Projects/UOContent/Assistants/AssistantHandler.cs",
"line": 69
}
}
]
}

View file

@ -0,0 +1,216 @@
{
"category": "Book",
"packets": [
{
"id": "0x66",
"name": "Book Content Change",
"description": "Client sends updated book page content when player edits a writable book.",
"direction": "incoming",
"isDynamic": true,
"size": "9+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x66",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the book being edited"
},
{
"name": "Page Count",
"type": "ushort",
"size": 2,
"description": "Number of pages being updated"
},
{
"name": "Pages",
"type": "loop",
"description": "Page contents being updated",
"loop": {
"countField": "pageCount",
"fields": [
{
"name": "Page Index",
"type": "ushort",
"size": 2,
"description": "Page number (1-indexed)"
},
{
"name": "Line Count",
"type": "ushort",
"size": 2,
"description": "Number of lines on page (max 8)"
},
{
"name": "Lines",
"type": "loop",
"description": "Lines on the page",
"loop": {
"countField": "lineCount",
"fields": [
{
"name": "Text",
"type": "utf8-t",
"description": "Line text (max 80 characters)"
}
]
}
}
]
}
}
],
"source": {
"file": "Projects/UOContent/Items/Books/BookPackets.cs",
"line": 87
}
},
{
"id": "0xD4",
"name": "Book Header Change",
"description": "Client sends updated book title and author when player edits a writable book\u0027s cover.",
"direction": "incoming",
"isDynamic": true,
"size": "13+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD4",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the book being edited"
},
{
"name": "Flags",
"type": "ushort",
"size": 2,
"description": "Book flags (ignored by server)"
},
{
"name": "Page Count",
"type": "ushort",
"size": 2,
"description": "Number of pages (ignored by server)"
},
{
"name": "Title Length",
"type": "ushort",
"size": 2,
"description": "Length of title string including null terminator (max 61)"
},
{
"name": "Title",
"type": "utf8-t",
"description": "Book title (max 60 characters)"
},
{
"name": "Author Length",
"type": "ushort",
"size": 2,
"description": "Length of author string including null terminator (max 31)"
},
{
"name": "Author",
"type": "utf8-t",
"description": "Book author (max 30 characters)"
}
],
"related": [
{
"id": "0x93",
"direction": "incoming",
"relationship": "variant",
"note": "Old Header Change format for older clients"
}
],
"source": {
"file": "Projects/UOContent/Items/Books/BookPackets.cs",
"line": 51
}
},
{
"id": "0x93",
"name": "Old Book Header Change",
"description": "Legacy format for book header changes. Uses fixed-size ASCII strings.",
"direction": "incoming",
"isDynamic": false,
"size": 99,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x93",
"description": "Packet identifier"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the book being edited"
},
{
"name": "Flags",
"type": "ushort",
"size": 2,
"description": "Book flags (ignored by server)"
},
{
"name": "Page Count",
"type": "ushort",
"size": 2,
"description": "Number of pages (ignored by server)"
},
{
"name": "Title",
"type": "ascii",
"size": 60,
"description": "Book title (fixed 60 bytes, null-padded)"
},
{
"name": "Author",
"type": "ascii",
"size": 30,
"description": "Book author (fixed 30 bytes, null-padded)"
}
],
"related": [
{
"id": "0xD4",
"direction": "incoming",
"relationship": "variant",
"note": "New Header Change format for newer clients"
}
],
"notes": "Old format used by older clients. Title and author are fixed-size ASCII.",
"source": {
"file": "Projects/UOContent/Items/Books/BookPackets.cs",
"line": 32
}
}
]
}

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

@ -0,0 +1,93 @@
{
"category": "Chat",
"packets": [
{
"id": "0xB5",
"name": "Open Chat Window Request",
"description": "Client requests to open the chat window. Newer clients don\u0027t send chat username.",
"direction": "incoming",
"isDynamic": false,
"size": 64,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xB5",
"description": "Packet identifier"
},
{
"name": "Reserved",
"type": "byte[]",
"size": 63,
"description": "Reserved/unused (newer clients don\u0027t send chat username)"
}
],
"related": [
{
"id": "0xB2",
"direction": "outgoing",
"relationship": "response",
"note": "Server responds with Chat Message (OpenChatWindow command)"
}
],
"source": {
"file": "Projects/UOContent/Engines/Chat/ChatPackets.cs",
"line": 30
}
},
{
"id": "0xB3",
"name": "Chat Action",
"description": "Client sends chat action commands like sending messages, joining channels, etc.",
"direction": "incoming",
"isDynamic": true,
"size": "8+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xB3",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Language",
"type": "ascii",
"size": 4,
"description": "Language code (e.g., \u0027enu\u0027 for English)"
},
{
"name": "Action ID",
"type": "short",
"size": 2,
"description": "Chat action ID"
},
{
"name": "Parameter",
"type": "utf16be",
"size": "var",
"description": "Action parameter (Big Endian Unicode)"
}
],
"related": [
{
"id": "0xB2",
"direction": "outgoing",
"relationship": "response",
"note": "Server responds with Chat Message"
}
],
"source": {
"file": "Projects/UOContent/Engines/Chat/ChatPackets.cs",
"line": 51
}
}
]
}

View file

@ -0,0 +1,959 @@
{
"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",
"name": "House Design: Backup",
"description": "Client requests to backup current house design state.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x02",
"description": "Backup subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1024
}
},
{
"id": "0xD7/0x03",
"subId": "0x03",
"name": "House Design: Restore",
"description": "Client requests to restore house design from backup.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x03",
"description": "Restore subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1025
}
},
{
"id": "0xD7/0x04",
"subId": "0x04",
"name": "House Design: Commit",
"description": "Client commits the current house design changes.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x04",
"description": "Commit subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1026
}
},
{
"id": "0xD7/0x05",
"subId": "0x05",
"name": "House Design: Delete Component",
"description": "Client requests to delete a component from house design.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x05",
"description": "Delete subcommand"
},
{
"name": "Tile ID",
"type": "int",
"size": 4,
"description": "Tile graphic ID to delete"
},
{
"name": "X",
"type": "int",
"size": 4,
"description": "X offset from foundation"
},
{
"name": "Y",
"type": "int",
"size": 4,
"description": "Y offset from foundation"
},
{
"name": "Z",
"type": "int",
"size": 4,
"description": "Z offset from foundation"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1027
}
},
{
"id": "0xD7/0x06",
"subId": "0x06",
"name": "House Design: Build Component",
"description": "Client requests to place a component in house design.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x06",
"description": "Build subcommand"
},
{
"name": "Tile ID",
"type": "int",
"size": 4,
"description": "Tile graphic ID to place"
},
{
"name": "X",
"type": "int",
"size": 4,
"description": "X offset from foundation"
},
{
"name": "Y",
"type": "int",
"size": 4,
"description": "Y offset from foundation"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1028
}
},
{
"id": "0xD7/0x0C",
"subId": "0x0C",
"name": "House Design: Close Tool",
"description": "Client closes the house design tool.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0C",
"description": "Close subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1029
}
},
{
"id": "0xD7/0x0D",
"subId": "0x0D",
"name": "House Design: Add Stairs",
"description": "Client requests to add stairs to house design.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0D",
"description": "Stairs subcommand"
},
{
"name": "Tile ID",
"type": "int",
"size": 4,
"description": "Stair tile graphic ID"
},
{
"name": "X",
"type": "int",
"size": 4,
"description": "X offset from foundation"
},
{
"name": "Y",
"type": "int",
"size": 4,
"description": "Y offset from foundation"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1030
}
},
{
"id": "0xD7/0x0E",
"subId": "0x0E",
"name": "House Design: Sync Request",
"description": "Client requests to synchronize house design state.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0E",
"description": "Sync subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1031
}
},
{
"id": "0xD7/0x10",
"subId": "0x10",
"name": "House Design: Clear Floor",
"description": "Client requests to clear a floor in house design.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x10",
"description": "Clear subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1032
}
},
{
"id": "0xD7/0x12",
"subId": "0x12",
"name": "House Design: Change Floor Level",
"description": "Client changes the visible floor level in house design.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x12",
"description": "Level subcommand"
},
{
"name": "Floor",
"type": "int",
"size": 4,
"description": "Floor level (1-4)"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1033
}
},
{
"id": "0xD7/0x13",
"subId": "0x13",
"name": "House Design: Add Roof",
"description": "Client requests to add a roof tile (Samurai Empire+).",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x13",
"description": "Roof subcommand"
},
{
"name": "Tile ID",
"type": "int",
"size": 4,
"description": "Roof tile graphic ID"
},
{
"name": "X",
"type": "int",
"size": 4,
"description": "X offset from foundation"
},
{
"name": "Y",
"type": "int",
"size": 4,
"description": "Y offset from foundation"
},
{
"name": "Z",
"type": "int",
"size": 4,
"description": "Z offset for roof placement"
}
],
"clientVersion": {
"min": "Samurai Empire",
"notes": "Added with Samurai Empire expansion"
},
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1035
}
},
{
"id": "0xD7/0x14",
"subId": "0x14",
"name": "House Design: Delete Roof",
"description": "Client requests to delete a roof tile (Samurai Empire+).",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x14",
"description": "Roof Delete subcommand"
},
{
"name": "Tile ID",
"type": "int",
"size": 4,
"description": "Roof tile graphic ID"
},
{
"name": "X",
"type": "int",
"size": 4,
"description": "X offset from foundation"
},
{
"name": "Y",
"type": "int",
"size": 4,
"description": "Y offset from foundation"
},
{
"name": "Z",
"type": "int",
"size": 4,
"description": "Z offset of roof to delete"
}
],
"clientVersion": {
"min": "Samurai Empire",
"notes": "Added with Samurai Empire expansion"
},
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1036
}
},
{
"id": "0xD7/0x19",
"subId": "0x19",
"name": "Set Weapon Ability",
"description": "Client selects a weapon special ability.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["Combat"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Player serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x19",
"description": "Set Ability subcommand"
},
{
"name": "Ability Index",
"type": "int",
"size": 4,
"description": "Ability index (0 = clear, 1+ = ability index)"
}
],
"related": [
{
"id": "0xBF/0x21",
"relationship": "response",
"note": "Clear Weapon Ability"
},
{
"id": "0xBF/0x25",
"relationship": "response",
"note": "Toggle Special Ability"
}
],
"source": {
"file": "Projects/UOContent/Items/Weapons/Abilities/WeaponAbilityPackets.cs",
"line": 11
}
},
{
"id": "0xD7/0x1A",
"subId": "0x1A",
"name": "House Design: Revert",
"description": "Client requests to revert house design to original state.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "House foundation serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x1A",
"description": "Revert subcommand"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HouseFoundation.cs",
"line": 1038
}
},
{
"id": "0xD7/0x28",
"subId": "0x28",
"name": "Guild Gump Request",
"description": "Client requests to open the guild gump.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["Guild"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Player serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x28",
"description": "Guild Gump subcommand"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
"line": 54
}
},
{
"id": "0xD7/0x32",
"subId": "0x32",
"name": "Quest Gump Request",
"description": "Client requests to open the quest/MLB gump.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"tags": ["Quest"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Player serial"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x32",
"description": "Quest Gump subcommand"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
"line": 55
}
}
]
}

View file

@ -0,0 +1,142 @@
{
"category": "Item",
"tags": ["Mobile"],
"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": "Packet ID",
"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\u0027s 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": "Packet ID",
"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": "Packet ID",
"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., \u0027ENU\u0027)"
}
],
"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 x entityCount)",
"fields": [
{
"name": "Packet ID",
"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
}
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,292 @@
{
"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": "Packet ID",
"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": "Varies",
"variants": [
{
"version": "pre-6017",
"name": "Classic",
"size": 14,
"fields": [
{
"name": "Packet ID",
"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 \u003e= 6.0.1.7 (ContainerGridLines)",
"size": 15,
"fields": [
{
"name": "Packet ID",
"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": "Grid Location",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x13",
"description": "Packet identifier"
},
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of item to equip"
},
{
"name": "Layer",
"type": "byte",
"size": 1,
"description": "Equipment layer"
},
{
"name": "Mobile Serial",
"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": "var",
"fields": [
{
"name": "Packet ID",
"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": "var",
"fields": [
{
"name": "Packet ID",
"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,907 @@
{
"category": "Mahjong",
"packets": [
{
"id": "0xDA",
"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": "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",
"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": "0x06",
"description": "Exit Game command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"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

@ -0,0 +1,84 @@
{
"category": "Map",
"packets": [
{
"id": "0x56",
"name": "Map Command",
"description": "Client sends map pin commands for editable map items. Commands include adding, inserting, changing, and removing pins.",
"direction": "incoming",
"isDynamic": false,
"size": 11,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x56",
"description": "Packet identifier"
},
{
"name": "Map Serial",
"type": "uint",
"size": 4,
"description": "Serial of the map item"
},
{
"name": "Command",
"type": "enum",
"size": 1,
"description": "Map pin command type",
"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" },
{ "value": "4", "name": "RemovePin", "description": "Remove a pin" },
{ "value": "5", "name": "ClearPins", "description": "Clear all pins" },
{ "value": "6", "name": "ToggleEditable", "description": "Toggle edit mode" }
]
},
{
"name": "Number",
"type": "byte",
"size": 1,
"description": "Pin number (for insert, change, remove commands)"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X coordinate of pin"
},
{
"name": "Y",
"type": "short",
"size": 2,
"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

@ -0,0 +1,300 @@
{
"category": "Message",
"packets": [
{
"id": "0x03",
"name": "ASCII Speech",
"description": "Client sends ASCII-encoded speech message.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"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-t",
"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. Type byte upper bits (0xC0) indicate if keywords are encoded.",
"direction": "incoming",
"isDynamic": true,
"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"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingMessagePackets.cs",
"line": 58
}
}
]
}

View file

@ -0,0 +1,168 @@
{
"category": "Mobile",
"packets": [
{
"id": "0x75",
"name": "Rename Request",
"description": "Client requests to rename a mobile (pet).",
"direction": "incoming",
"isDynamic": false,
"size": 35,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x75",
"description": "Packet identifier"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of mobile to rename"
},
{
"name": "New Name",
"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": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x98",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of mobile to query"
}
],
"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": "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

@ -0,0 +1,56 @@
{
"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": "Packet ID",
"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": "Fastwalk Key",
"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,989 @@
{
"category": "Player",
"packets": [
{
"id": "0x01",
"name": "Disconnect",
"description": "Client sends disconnect notification.",
"direction": "incoming",
"isDynamic": false,
"size": 5,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x01",
"description": "Packet identifier"
},
{
"name": "Minus One",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x05",
"description": "Packet identifier"
},
{
"name": "Target Serial",
"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": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x12",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Command Type",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Type of text command",
"values": [
{
"value": "0x24",
"name": "Use Skill",
"description": "Use a skill by ID"
},
{
"value": "0x27",
"name": "Cast Spell From Book",
"description": "Cast spell from spellbook"
},
{
"value": "0x2F",
"name": "Old Scroll Click",
"description": "Old scroll double-click"
},
{
"value": "0x43",
"name": "Open Spellbook",
"description": "Open spellbook of type"
},
{
"value": "0x56",
"name": "Cast Spell Macro",
"description": "Cast spell from macro"
},
{
"value": "0x58",
"name": "Open Door",
"description": "Open door macro"
},
{
"value": "0xC7",
"name": "Animate",
"description": "Play animation"
},
{
"value": "0xF4",
"name": "Invoke Virtue",
"description": "Invoke virtue from macro"
}
]
},
{
"name": "Command",
"type": "ascii-t",
"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",
"noMerge": true,
"isDynamic": false,
"size": 3,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x22",
"description": "Packet identifier"
},
{
"name": "Padding",
"type": "ushort",
"size": 2,
"description": "Unused padding"
}
],
"notes": "Not related to outgoing 0x22 (Movement Acknowledgment) despite sharing the same packet ID.",
"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": "Packet ID",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x34",
"description": "Packet identifier"
},
{
"name": "Pattern",
"type": "uint",
"size": 4,
"value": "0xEDEDEDED",
"description": "Fixed pattern"
},
{
"name": "Query Type",
"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": "Mobile Serial",
"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": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x3A",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Skill Index",
"type": "short",
"size": 2,
"description": "Skill index to change"
},
{
"name": "Lock State",
"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": "Packet ID",
"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)"
}
],
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x73",
"description": "Packet identifier"
},
{
"name": "Sequence",
"type": "byte",
"size": 1,
"description": "Ping sequence number"
}
],
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x7D",
"description": "Packet identifier"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Menu dialog serial"
},
{
"name": "Menu ID",
"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": "Item ID",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x95",
"description": "Packet identifier"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Hue picker serial"
},
{
"name": "Item ID",
"type": "short",
"size": 2,
"description": "Item ID (unused)"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Selected hue (masked with 0x3FFF)"
}
],
"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": "var",
"tags": ["Menu"],
"fields": [
{
"name": "Packet ID",
"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": "Prompt ID",
"type": "int",
"size": 4,
"description": "Prompt ID"
},
{
"name": "Type",
"type": "int",
"size": 4,
"description": "Response type: 0 = cancel, other = submit"
},
{
"name": "Text",
"type": "ascii-t",
"description": "Response text (max 128 chars)"
}
],
"related": [
{
"id": "0xC2",
"relationship": "request",
"note": "Unicode 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": "Packet ID",
"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": "Packet ID",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xA7",
"description": "Packet identifier"
},
{
"name": "Last Tip",
"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": "var",
"tags": ["Menu"],
"fields": [
{
"name": "Packet ID",
"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": "Prompt ID",
"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., \u0027ENU\u0027)"
},
{
"name": "Text",
"type": "utf16le-t",
"description": "Response text (max 128 chars)"
}
],
"related": [
{
"id": "0xC2",
"direction": "outgoing",
"relationship": "request",
"note": "Unicode Prompt packet that triggered this response"
}
],
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xC8",
"description": "Packet identifier"
},
{
"name": "Range",
"type": "byte",
"size": 1,
"description": "Requested update range (ignored)"
}
],
"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": "var",
"fields": [
{
"name": "Packet ID",
"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": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD1",
"description": "Packet identifier"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"description": "Unknown (typically 0x01)"
}
],
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingPlayerPackets.cs",
"line": 326
}
},
{
"id": "0xF4",
"name": "Crash Report",
"description": "Client sends crash/error report.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF4",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Client Major",
"type": "byte",
"size": 1,
"description": "Client major version"
},
{
"name": "Client Minor",
"type": "byte",
"size": 1,
"description": "Client minor version"
},
{
"name": "Client Rev",
"type": "byte",
"size": 1,
"description": "Client revision"
},
{
"name": "Client Pat",
"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": "Account Name",
"type": "ascii",
"size": 32,
"description": "Account name"
},
{
"name": "Character Name",
"type": "ascii",
"size": 32,
"description": "Character name"
},
{
"name": "IP Address",
"type": "ascii",
"size": 15,
"description": "Client IP address"
},
{
"name": "Unknown1",
"type": "int",
"size": 4,
"description": "Unknown"
},
{
"name": "Exception Code",
"type": "int",
"size": 4,
"description": "Exception code"
},
{
"name": "Process Name",
"type": "ascii",
"size": 100,
"description": "Process name"
},
{
"name": "Report Text",
"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": "Stack Count",
"type": "byte",
"size": 1,
"description": "Number of stack trace entries"
},
{
"name": "Stack Addresses",
"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,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

@ -0,0 +1,117 @@
{
"category": "Targeting",
"packets": [
{
"id": "0x6C",
"name": "Target Response",
"description": "Client responds to a target cursor request.",
"direction": "incoming",
"isDynamic": false,
"size": 19,
"fields": [
{
"name": "Packet ID",
"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": "Target ID",
"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": "Target Serial",
"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)"
}
],
"notes": "If x == -1 \u0026\u0026 y == -1 \u0026\u0026 serial is invalid, user pressed Escape to cancel targeting.",
"source": {
"file": "Projects/UOContent/Network/Packets/IncomingTargetingPackets.cs",
"line": 28
}
}
]
}

View file

@ -0,0 +1,145 @@
{
"category": "Vendor",
"packets": [
{
"id": "0x3B",
"name": "Vendor Buy Reply",
"description": "Client confirms items to purchase from a vendor.",
"direction": "incoming",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x3B",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Vendor Serial",
"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": "Item Serial",
"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": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x9F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Vendor Serial",
"type": "uint",
"size": 4,
"description": "Serial of the vendor"
},
{
"name": "Item Count",
"type": "ushort",
"size": 2,
"description": "Number of items to sell"
},
{
"name": "Items",
"type": "loop",
"loop": {
"countField": "itemCount",
"fields": [
{
"name": "Item Serial",
"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
}
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,138 @@
{
"category": "Quest",
"packets": [
{
"id": "0xBA",
"name": "Quest Arrow",
"description": "Sets or cancels the quest tracking arrow on the client.",
"direction": "outgoing",
"isDynamic": false,
"size": "Varies",
"variants": [
{
"name": "Pre-High Seas Set Arrow",
"version": "pre-HS",
"condition": "command == 1 (Set), pre-HighSeas client",
"size": 6,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBA",
"description": "Packet identifier"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x01",
"description": "Set arrow command"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "Target X coordinate"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Target Y coordinate"
}
]
},
{
"name": "Pre-High Seas Cancel Arrow",
"version": "pre-HS",
"condition": "command == 0 (Cancel), pre-HighSeas client",
"size": 6,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBA",
"description": "Packet identifier"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Cancel arrow command"
},
{
"name": "X",
"type": "short",
"size": 2,
"value": "-1",
"description": "X coordinate (-1)"
},
{
"name": "Y",
"type": "short",
"size": 2,
"value": "-1",
"description": "Y coordinate (-1)"
}
]
},
{
"name": "High Seas",
"version": "HS+",
"condition": "HighSeas client (7.0.9.0+)",
"size": 10,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBA",
"description": "Packet identifier"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"description": "Command (0 = cancel, 1 = set)"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "Target X coordinate"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Target Y coordinate"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of tracked target"
}
]
}
],
"related": [
{
"id": "0xBF/0x07",
"relationship": "request",
"note": "Quest Arrow Click from client"
}
],
"clientVersion": {
"feature": "HighSeas (7.0.9.0+) adds target serial"
},
"source": {
"file": "Projects/UOContent/Skills/Tracking/OutgoingArrowPackets.cs",
"line": 29
}
}
]
}

View file

@ -0,0 +1,75 @@
{
"category": "Assistant",
"packets": [
{
"id": "0xF0",
"name": "Assistant Handshake",
"description": "Server sends handshake to negotiate assistant features with Razor-style clients. Contains disallowed feature flags.",
"direction": "outgoing",
"isDynamic": false,
"size": 12,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF0",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x000C",
"description": "Packet length (12)"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0xFE",
"description": "Handshake command"
},
{
"name": "Disallowed Features",
"type": "ulong",
"size": 8,
"description": "Bitmask of disallowed assistant features"
}
],
"notes": "Used for assistant negotiation with Razor Community Edition and similar clients. If negotiation fails within 30 seconds, the server may kick the player.",
"source": {
"file": "Projects/UOContent/Assistants/AssistantHandler.cs",
"line": 132
}
},
{
"id": "0xBE",
"name": "Assistant Version Request",
"description": "Server requests assistant version information from the client.",
"direction": "outgoing",
"isDynamic": false,
"size": 3,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBE",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0003",
"description": "Packet length (3)"
}
],
"source": {
"file": "Projects/UOContent/Assistants/AssistantHandler.cs",
"line": 122
}
}
]
}

View file

@ -0,0 +1,182 @@
{
"category": "Boat",
"packets": [
{
"id": "0xF6",
"name": "Boat Move (High Seas)",
"description": "Sent when a boat moves, containing the boat\u0027s new position and all entities on board with their updated positions.",
"direction": "outgoing",
"isDynamic": true,
"size": "18 + (entityCount x 10)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF6",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Boat Serial",
"type": "uint",
"size": 4,
"description": "Serial of the boat"
},
{
"name": "Speed",
"type": "byte",
"size": 1,
"description": "Boat movement speed"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Movement direction (0-7)"
},
{
"name": "Facing",
"type": "byte",
"size": 1,
"description": "Boat facing direction"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "Boat X coordinate"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Boat Y coordinate"
},
{
"name": "Z",
"type": "short",
"size": 2,
"description": "Boat Z coordinate"
},
{
"name": "Entity Count",
"type": "short",
"size": 2,
"description": "Number of entities on boat (max 65535)"
},
{
"name": "Entities",
"type": "array",
"description": "Entities on the boat with their positions",
"loop": {
"countField": "entityCount",
"fields": [
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Entity serial"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "Entity X coordinate (boat offset applied)"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Entity Y coordinate (boat offset applied)"
},
{
"name": "Z",
"type": "short",
"size": 2,
"description": "Entity Z coordinate"
}
]
}
}
],
"clientVersion": {
"feature": "HighSeas"
},
"source": {
"file": "Projects/UOContent/Multis/Boats/BoatPackets.cs",
"line": 27
},
"notes": "High Seas expansion only. Entities include mobiles and items on the boat. Coordinates include the boat\u0027s movement offset."
},
{
"id": "0xF7",
"name": "Packet Container",
"description": "Container packet for batching multiple entity packets. Used for efficient display of boats and other groups of entities.",
"direction": "outgoing",
"isDynamic": true,
"size": "5+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Total packet length"
},
{
"name": "Packet Count",
"type": "ushort",
"size": 2,
"description": "Number of embedded packets"
},
{
"name": "Packets",
"type": "array",
"description": "Embedded packets (typically 0xF3 World Entity packets)",
"loop": {
"countField": "packetCount",
"fields": [
{
"name": "Embedded Packet",
"type": "packet",
"description": "Complete embedded packet (0xF3 World Entity or similar)"
}
]
}
}
],
"related": [
{
"id": "0xF3",
"relationship": "contains",
"note": "Typically contains World Entity packets"
},
{
"id": "0xF6",
"relationship": "variant",
"note": "Used alongside Move Boat HS for boat display"
}
],
"clientVersion": {
"feature": "HighSeas"
},
"notes": "Uses PacketContainerBuilder for dynamic growth when embedding many packets. Minimum packet length is 5 bytes (header only).",
"source": {
"file": "Projects/Server/Network/Packets/PacketContainerBuilder.cs",
"line": 23
}
}
]
}

View file

@ -0,0 +1,217 @@
{
"category": "Book",
"packets": [
{
"id": "0x66",
"name": "Book Content",
"description": "Sends full book content including all pages and lines.",
"direction": "outgoing",
"isDynamic": true,
"size": "9+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x66",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the book"
},
{
"name": "Page Count",
"type": "ushort",
"size": 2,
"description": "Number of pages"
},
{
"name": "Pages",
"type": "loop",
"description": "Page contents",
"loop": {
"countField": "pageCount",
"fields": [
{
"name": "Page Number",
"type": "ushort",
"size": 2,
"description": "Page number (1-indexed)"
},
{
"name": "Line Count",
"type": "ushort",
"size": 2,
"description": "Number of lines on page"
},
{
"name": "Lines",
"type": "loop",
"description": "Lines on the page",
"loop": {
"countField": "lineCount",
"fields": [
{
"name": "Text",
"type": "utf8-t",
"description": "Line text"
}
]
}
}
]
}
}
],
"source": {
"file": "Projects/UOContent/Items/Books/BookPackets.cs",
"line": 136
}
},
{
"id": "0xD4",
"name": "Book Header",
"description": "Sends book cover information (title, author, writable status).",
"direction": "outgoing",
"isDynamic": true,
"size": "17+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD4",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the book"
},
{
"name": "Flag On",
"type": "byte",
"size": 1,
"value": "0x01",
"description": "Flag on (always 1)"
},
{
"name": "Writable",
"type": "bool",
"size": 1,
"description": "True if book is writable and in range"
},
{
"name": "Page Count",
"type": "ushort",
"size": 2,
"description": "Number of pages"
},
{
"name": "Title Length",
"type": "ushort",
"size": 2,
"description": "Length of title + 1 (for null)"
},
{
"name": "Title",
"type": "utf8-t",
"description": "Book title"
},
{
"name": "Author Length",
"type": "ushort",
"size": 2,
"description": "Length of author + 1 (for null)"
},
{
"name": "Author",
"type": "utf8-t",
"description": "Book author"
}
],
"related": [
{
"id": "0x93",
"relationship": "variant",
"note": "Old Book Header format (outgoing)"
}
],
"source": {
"file": "Projects/UOContent/Items/Books/BookPackets.cs",
"line": 184
}
},
{
"id": "0x93",
"name": "Old Book Header",
"description": "Old format for book cover (fixed-size ASCII strings).",
"direction": "outgoing",
"isDynamic": false,
"size": 99,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x93",
"description": "Packet identifier"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the book"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"description": "Book flags"
},
{
"name": "Page Count",
"type": "ushort",
"size": 2,
"description": "Number of pages"
},
{
"name": "Title",
"type": "ascii",
"size": 60,
"description": "Book title (fixed 60 bytes)"
},
{
"name": "Author",
"type": "ascii",
"size": 30,
"description": "Book author (fixed 30 bytes)"
}
],
"related": [
{
"id": "0xD4",
"relationship": "variant",
"note": "New Book Header format (outgoing)"
}
],
"notes": "Old format used by older clients. Title and author are fixed-size ASCII."
}
]
}

View file

@ -0,0 +1,304 @@
{
"category": "Buff Icon",
"packets": [
{
"id": "0xDF",
"name": "Buff/Debuff System",
"description": "Manages buff and debuff icons displayed on the client.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Remove Buff",
"condition": "command == 0 (Remove)",
"size": 15,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "15",
"description": "Packet length"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of the mobile"
},
{
"name": "Icon ID",
"type": "short",
"size": 2,
"description": "Buff icon ID"
},
{
"name": "Command",
"type": "short",
"size": 2,
"value": "0x0000",
"description": "Remove command"
},
{
"name": "Unused",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
}
]
},
{
"name": "Add Buff (No Args)",
"condition": "command == 1 (Add), no arguments",
"size": 46,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "46",
"description": "Packet length"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of the mobile"
},
{
"name": "Icon ID",
"type": "short",
"size": 2,
"description": "Buff icon ID"
},
{
"name": "Command1",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Add command"
},
{
"name": "Unused1",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Icon Id2",
"type": "short",
"size": 2,
"description": "Buff icon ID (repeated)"
},
{
"name": "Command2",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Add command (repeated)"
},
{
"name": "Unused2",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Duration",
"type": "short",
"size": 2,
"description": "Duration in seconds"
},
{
"name": "Padding",
"type": "byte[]",
"size": 3,
"description": "Padding (zeros)"
},
{
"name": "Title Cliloc",
"type": "int",
"size": 4,
"description": "Title cliloc number"
},
{
"name": "Secondary Cliloc",
"type": "int",
"size": 4,
"description": "Secondary cliloc number"
},
{
"name": "Empty Args",
"type": "byte[]",
"size": 10,
"description": "Empty arguments (zeros)"
}
]
},
{
"name": "Add Buff (With Args)",
"condition": "command == 1 (Add), with arguments",
"size": "52 + (args.Length x 2)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of the mobile"
},
{
"name": "Icon ID",
"type": "short",
"size": 2,
"description": "Buff icon ID"
},
{
"name": "Command1",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Add command"
},
{
"name": "Unused1",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Icon Id2",
"type": "short",
"size": 2,
"description": "Buff icon ID (repeated)"
},
{
"name": "Command2",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Add command (repeated)"
},
{
"name": "Unused2",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Duration",
"type": "short",
"size": 2,
"description": "Duration in seconds"
},
{
"name": "Padding",
"type": "byte[]",
"size": 3,
"description": "Padding (zeros)"
},
{
"name": "Title Cliloc",
"type": "int",
"size": 4,
"description": "Title cliloc number"
},
{
"name": "Secondary Cliloc",
"type": "int",
"size": 4,
"description": "Secondary cliloc number"
},
{
"name": "Unused3",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Has Args",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Has arguments flag"
},
{
"name": "Unused4",
"type": "ushort",
"size": 2,
"value": "0",
"description": "Unused"
},
{
"name": "Tab Prefix",
"type": "utf16le",
"size": 2,
"value": "\\t",
"description": "Tab character prefix"
},
{
"name": "Arguments",
"type": "utf16le-t",
"description": "Cliloc arguments"
},
{
"name": "Has Args2",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Has arguments flag (repeated)"
},
{
"name": "Unused5",
"type": "ushort",
"size": 2,
"value": "0",
"description": "Unused"
}
]
}
],
"clientVersion": {
"min": "5.0.2b",
"feature": "BuffIcon"
},
"source": {
"file": "Projects/UOContent/Engines/BuffIcons/BuffIconPackets.cs",
"line": 8
}
}
]
}

View file

@ -0,0 +1,279 @@
{
"category": "Bulletin Board",
"packets": [
{
"id": "0x71",
"name": "Bulletin Board",
"description": "Bulletin board display and message packets.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Display Board",
"version": "0x00",
"condition": "command == 0x00",
"size": 38,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x71",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "38",
"description": "Packet length"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Display board command"
},
{
"name": "Board Serial",
"type": "uint",
"size": 4,
"description": "Serial of the bulletin board"
},
{
"name": "Board Name",
"type": "utf8",
"size": 30,
"description": "Board name (null-padded to 30 bytes)"
}
]
},
{
"name": "Message Header",
"version": "0x01",
"condition": "command == 0x01",
"size": "22+",
"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": "0x01",
"description": "Message 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"
},
{
"name": "Thread Serial",
"type": "uint",
"size": 4,
"description": "Serial of parent thread (0 if root)"
},
{
"name": "Poster Length",
"type": "byte",
"size": 1,
"description": "Length of poster name"
},
{
"name": "Poster",
"type": "utf8-t",
"description": "Poster name"
},
{
"name": "Subject Length",
"type": "byte",
"size": 1,
"description": "Length of subject"
},
{
"name": "Subject",
"type": "utf8-t",
"description": "Message subject"
},
{
"name": "Time Length",
"type": "byte",
"size": 1,
"description": "Length of time string"
},
{
"name": "Time",
"type": "utf8-t",
"description": "Posted time string"
}
]
},
{
"name": "Message Content",
"version": "0x02",
"condition": "command == 0x02",
"size": "22+",
"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": "0x02",
"description": "Message 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"
},
{
"name": "Poster Length",
"type": "byte",
"size": 1,
"description": "Length of poster name"
},
{
"name": "Poster",
"type": "utf8-t",
"description": "Poster name"
},
{
"name": "Subject Length",
"type": "byte",
"size": 1,
"description": "Length of subject"
},
{
"name": "Subject",
"type": "utf8-t",
"description": "Message subject"
},
{
"name": "Time Length",
"type": "byte",
"size": 1,
"description": "Length of time string"
},
{
"name": "Time",
"type": "utf8-t",
"description": "Posted time string"
},
{
"name": "Poster Body",
"type": "short",
"size": 2,
"description": "Poster body graphic"
},
{
"name": "Poster Hue",
"type": "short",
"size": 2,
"description": "Poster body hue"
},
{
"name": "Equip Count",
"type": "byte",
"size": 1,
"description": "Number of equipment items"
},
{
"name": "Equipment",
"type": "loop",
"description": "Poster\u0027s equipment",
"loop": {
"countField": "equipCount",
"fields": [
{
"name": "Item ID",
"type": "short",
"size": 2,
"description": "Equipment item graphic"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Equipment hue"
}
]
}
},
{
"name": "Line Count",
"type": "byte",
"size": 1,
"description": "Number of text lines"
},
{
"name": "Lines",
"type": "loop",
"description": "Message lines",
"loop": {
"countField": "lineCount",
"fields": [
{
"name": "Line Length",
"type": "byte",
"size": 1,
"description": "Line length"
},
{
"name": "Line",
"type": "utf8",
"description": "Line text with 2-byte terminator (old client bug)"
}
]
}
}
]
}
],
"source": {
"file": "Projects/UOContent/Items/Bulletin Boards/BulletinBoardPackets.cs",
"line": 168
}
}
]
}

View file

@ -0,0 +1,69 @@
{
"category": "Chat",
"packets": [
{
"id": "0xB2",
"name": "Chat Message",
"description": "Server sends chat system messages and commands to the client.",
"direction": "outgoing",
"isDynamic": true,
"size": "13+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xB2",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"description": "Chat command number (original number minus 20)"
},
{
"name": "Language",
"type": "ascii",
"size": 4,
"description": "Language code (e.g., \u0027enu\u0027 for English)"
},
{
"name": "Param 1",
"type": "utf16be-t",
"description": "First parameter (Big Endian Unicode, null-terminated)"
},
{
"name": "Param 2",
"type": "utf16be-t",
"description": "Second parameter (Big Endian Unicode, null-terminated)"
}
],
"related": [
{
"id": "0xB3",
"direction": "incoming",
"relationship": "request",
"note": "Client sends Chat Action"
},
{
"id": "0xB5",
"direction": "incoming",
"relationship": "request",
"note": "Client sends Open Chat Window Request"
}
],
"notes": "Part of the in-game chat system. Command numbers are offset by -20 from original values.",
"source": {
"file": "Projects/UOContent/Engines/Chat/ChatPackets.cs",
"line": 104
}
}
]
}

View file

@ -0,0 +1,120 @@
{
"category": "Combat",
"packets": [
{
"id": "0x2F",
"name": "Swing",
"description": "Notifies client of a melee swing between two mobiles.",
"direction": "outgoing",
"isDynamic": false,
"size": 10,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x2F",
"description": "Packet identifier"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
},
{
"name": "Attacker Serial",
"type": "uint",
"size": 4,
"description": "Serial of attacker"
},
{
"name": "Defender Serial",
"type": "uint",
"size": 4,
"description": "Serial of defender"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingCombatPackets.cs",
"line": 23
}
},
{
"id": "0x72",
"name": "Set War Mode",
"description": "Sets the client\u0027s war/peace mode state.",
"direction": "outgoing",
"isDynamic": false,
"size": 5,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x72",
"description": "Packet identifier"
},
{
"name": "Warmode",
"type": "bool",
"size": 1,
"description": "True = war mode, False = peace mode"
},
{
"name": "Unknown1",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
},
{
"name": "Unknown2",
"type": "byte",
"size": 1,
"value": "0x32",
"description": "Unknown (50)"
},
{
"name": "Unknown3",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingCombatPackets.cs",
"line": 40
}
},
{
"id": "0xAA",
"name": "Change Combatant",
"description": "Notifies client of current combat target.",
"direction": "outgoing",
"isDynamic": false,
"size": 5,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xAA",
"description": "Packet identifier"
},
{
"name": "Combatant Serial",
"type": "uint",
"size": 4,
"description": "Serial of current combatant (0 = none)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingCombatPackets.cs",
"line": 43
}
}
]
}

View file

@ -0,0 +1,582 @@
{
"category": "Container",
"packets": [
{
"id": "0x24",
"name": "Display Container",
"description": "Opens a container gump on the client.",
"direction": "outgoing",
"isDynamic": false,
"size": "Varies",
"variants": [
{
"version": "pre-HighSeas",
"name": "Classic",
"size": 7,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x24",
"description": "Packet identifier"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of the container"
},
{
"name": "Gump ID",
"type": "ushort",
"size": 2,
"description": "Gump graphic ID"
}
]
},
{
"version": "HighSeas+",
"name": "High Seas Extended",
"condition": "Client version \u003e= 7.0.9.0 (HighSeas)",
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x24",
"description": "Packet identifier"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of the container"
},
{
"name": "Gump ID",
"type": "ushort",
"size": 2,
"description": "Gump graphic ID"
},
{
"name": "Container Type",
"type": "short",
"size": 2,
"value": "0x007D",
"description": "Container type (125)"
}
]
}
],
"clientVersion": {
"feature": "HighSeas adds containerType field"
},
"source": {
"file": "Projects/Server/Network/Packets/OutgoingContainerPackets.cs",
"line": 108
}
},
{
"id": "0x25",
"name": "Container Content Update",
"description": "Updates a single item in a container.",
"direction": "outgoing",
"isDynamic": false,
"size": "Varies",
"variants": [
{
"version": "pre-6017",
"name": "Classic",
"size": 20,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x25",
"description": "Packet identifier"
},
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of the item"
},
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Item ID Offset",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Item ID offset (signed)"
},
{
"name": "Amount",
"type": "ushort",
"size": 2,
"description": "Stack amount"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X position in container"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y position in container"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of parent container"
},
{
"name": "Hue",
"type": "ushort",
"size": 2,
"description": "Item hue"
}
]
},
{
"version": "6017+",
"name": "Container Grid Lines",
"condition": "Client version \u003e= 6.0.1.7 (ContainerGridLines)",
"size": 21,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x25",
"description": "Packet identifier"
},
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of the item"
},
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Item ID Offset",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Item ID offset (signed)"
},
{
"name": "Amount",
"type": "ushort",
"size": 2,
"description": "Stack amount"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X position in container"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y position in container"
},
{
"name": "Grid Location",
"type": "byte",
"size": 1,
"description": "Grid slot position"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of parent container"
},
{
"name": "Hue",
"type": "ushort",
"size": 2,
"description": "Item hue"
}
]
}
],
"clientVersion": {
"feature": "ContainerGridLines adds gridLocation byte"
},
"source": {
"file": "Projects/Server/Network/Packets/OutgoingContainerPackets.cs",
"line": 127
}
},
{
"id": "0x3C",
"name": "Container \u0026 Old Spellbook Content",
"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",
"tags": ["Spellbook", "Corpse"],
"variants": [
{
"version": "pre-6017",
"name": "Classic Format",
"condition": "Client version \u003c 6.0.1.7",
"size": "5 + (itemCount x 19)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x3C",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Item Count",
"type": "ushort",
"size": 2,
"description": "Number of items"
},
{
"name": "Items",
"type": "loop",
"description": "Item entries (19 bytes each)",
"loop": {
"countField": "itemCount",
"itemSize": 19,
"fields": [
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of the item"
},
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Item ID Offset",
"type": "byte",
"size": 1,
"description": "Item ID offset (signed)"
},
{
"name": "Amount",
"type": "ushort",
"size": 2,
"description": "Stack amount"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X position in container"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y position in container"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of parent container"
},
{
"name": "Hue",
"type": "ushort",
"size": 2,
"description": "Item hue"
}
]
}
}
]
},
{
"version": "6017+ (ContainerGridLines)",
"name": "Grid Location Format",
"condition": "Client version \u003e= 6.0.1.7 (ContainerGridLines)",
"size": "5 + (itemCount x 20)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x3C",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Item Count",
"type": "ushort",
"size": 2,
"description": "Number of items"
},
{
"name": "Items",
"type": "loop",
"description": "Item entries (20 bytes each)",
"loop": {
"countField": "itemCount",
"itemSize": 20,
"fields": [
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of the item"
},
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Item ID Offset",
"type": "byte",
"size": 1,
"description": "Item ID offset (signed)"
},
{
"name": "Amount",
"type": "ushort",
"size": 2,
"description": "Stack amount"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X position in container"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y position in container"
},
{
"name": "Grid Location",
"type": "byte",
"size": 1,
"description": "Grid slot position in container"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of parent container"
},
{
"name": "Hue",
"type": "ushort",
"size": 2,
"description": "Item hue"
}
]
}
}
]
}
],
"related": [
{
"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
}
},
{
"id": "0xBF",
"subId": "0x1B",
"name": "New Spellbook Content",
"description": "Sends spellbook contents using AOS format with a 64-bit bitmask of known spells.",
"direction": "outgoing",
"isDynamic": false,
"size": 23,
"tags": ["Spell", "Spellbook", "Extended Commands (0xBF)"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0017",
"description": "Packet length (23)"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x001B",
"description": "Subcommand (New Spellbook Content)"
},
{
"name": "Command",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Command (always 1)"
},
{
"name": "Book Serial",
"type": "uint",
"size": 4,
"description": "Serial of the spellbook"
},
{
"name": "Graphic",
"type": "short",
"size": 2,
"description": "Spellbook graphic ID"
},
{
"name": "Offset",
"type": "short",
"size": 2,
"description": "Spell offset (circle/school start)"
},
{
"name": "Spell Bits",
"type": "ulong",
"size": 8,
"description": "64-bit mask of known spells (written byte-by-byte, Little Endian)"
}
],
"related": [
{
"id": "0x3C",
"relationship": "variant",
"note": "Old Spellbook Content for pre-AOS clients"
}
],
"clientVersion": {
"min": "5.0.0a",
"feature": "NewSpellbook (Core.AOS \u0026\u0026 ns.NewSpellbook)"
},
"notes": "Used when Core.AOS \u0026\u0026 ns.NewSpellbook. Otherwise, old 0x3C format is used with spells as pseudo-items.",
"source": {
"file": "Projects/Server/Network/Packets/OutgoingContainerPackets.cs",
"line": 46
}
},
{
"id": "0xF7",
"name": "Packet Container",
"description": "Container packet for batching multiple entity packets. Used for sending groups of related entities efficiently, such as all items and mobiles visible on a boat.",
"direction": "outgoing",
"isDynamic": true,
"size": "5+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Total packet length"
},
{
"name": "Packet Count",
"type": "ushort",
"size": 2,
"description": "Number of embedded packets"
},
{
"name": "Packets",
"type": "array",
"description": "Embedded packets (typically 0xF3 World Entity packets)",
"loop": {
"countField": "packetCount",
"fields": [
{
"name": "Embedded Packet",
"type": "bytes",
"size": "var",
"description": "Complete embedded packet (typically 24-26 byte 0xF3 World Entity)"
}
]
}
}
],
"related": [
{
"id": "0xF3",
"relationship": "contains",
"note": "Typically contains World Entity packets"
}
],
"clientVersion": {
"min": "7.0.0.0",
"feature": "StygianAbyss"
},
"notes": "Uses PacketContainerBuilder for efficient dynamic growth. Commonly used by boat system to batch all visible entities on deck.",
"source": {
"file": "Projects/Server/Network/Packets/PacketContainerBuilder.cs",
"line": 9
}
}
]
}

View file

@ -0,0 +1,212 @@
{
"category": "Context Menu",
"packets": [
{
"id": "0xBF",
"subId": "0x14",
"name": "Display Context Menu",
"description": "Displays a context menu for an entity.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Old Format",
"version": "0x01",
"condition": "command == 0x01 (pre-NewHaven)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0014",
"description": "Context Menu subcommand"
},
{
"name": "Command",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Old format command"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of the target entity"
},
{
"name": "Entry Count",
"type": "byte",
"size": 1,
"description": "Number of menu entries"
},
{
"name": "Entries",
"type": "loop",
"description": "Menu entries",
"loop": {
"countField": "entryCount",
"fields": [
{
"name": "Index",
"type": "short",
"size": 2,
"description": "Entry index"
},
{
"name": "Cliloc Offset",
"type": "ushort",
"size": 2,
"description": "Cliloc number - 3000000"
},
{
"name": "Flags",
"type": "bitfield",
"size": 2,
"description": "Entry flags",
"flags": [
{
"bit": "0",
"name": "Disabled",
"description": "Entry is disabled"
},
{
"bit": "1",
"name": "Arrow",
"description": "Show arrow"
},
{
"bit": "2",
"name": "Highlighted",
"description": "Entry is highlighted"
},
{
"bit": "5",
"name": "Colored",
"description": "Entry uses custom color"
}
]
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Text hue (if Colored flag set)",
"condition": "flags \u0026 0x20"
}
]
}
}
]
},
{
"name": "New Format",
"version": "0x02",
"condition": "command == 0x02 (NewHaven+)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0014",
"description": "Context Menu subcommand"
},
{
"name": "Command",
"type": "short",
"size": 2,
"value": "0x0002",
"description": "New format command"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of the target entity"
},
{
"name": "Entry Count",
"type": "byte",
"size": 1,
"description": "Number of menu entries"
},
{
"name": "Entries",
"type": "loop",
"description": "Menu entries",
"loop": {
"countField": "entryCount",
"fields": [
{
"name": "Cliloc Number",
"type": "int",
"size": 4,
"description": "Full cliloc number"
},
{
"name": "Index",
"type": "short",
"size": 2,
"description": "Entry index"
},
{
"name": "Flags",
"type": "short",
"size": 2,
"description": "Entry flags (see Old Format)"
}
]
}
}
]
}
],
"related": [
{
"id": "0xBF/0x13",
"relationship": "request",
"note": "Context Menu Request from client"
},
{
"id": "0xBF/0x15",
"relationship": "response",
"note": "Context Menu Response from client"
}
],
"clientVersion": {
"feature": "NewHaven clients (6.0.0.0+) use command 0x02"
},
"source": {
"file": "Projects/UOContent/Context Menus/ContextMenuSystem.cs",
"line": 142
}
}
]
}

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

@ -0,0 +1,102 @@
{
"category": "Combat",
"packets": [
{
"id": "0x0B",
"name": "Damage",
"description": "Shows damage dealt to a mobile (client 5.0.0a+).",
"direction": "outgoing",
"isDynamic": false,
"size": 7,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x0B",
"description": "Packet identifier"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of damaged mobile"
},
{
"name": "Damage",
"type": "ushort",
"size": 2,
"description": "Damage amount (clamped 0-65535)"
}
],
"clientVersion": {
"min": "5.0.0a",
"feature": "DamagePacket"
},
"notes": "For pre-5.0.0a clients, use 0xBF/0x22 instead.",
"source": {
"file": "Projects/Server/Network/Packets/OutgoingDamagePackets.cs",
"line": 34
}
},
{
"id": "0xBF/0x22",
"name": "Damage (Old)",
"description": "Shows damage dealt to a mobile (pre-5.0.0a clients).",
"direction": "outgoing",
"isDynamic": false,
"size": 11,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "11",
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x22",
"description": "Subcommand (Damage)"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"value": "0x01",
"description": "Unknown (always 1)"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of damaged mobile"
},
{
"name": "Damage",
"type": "byte",
"size": 1,
"description": "Damage amount (clamped 0-255)"
}
],
"clientVersion": {
"max": "5.0.0a",
"notes": "For clients before DamagePacket feature"
},
"notes": "Damage is capped at 255 for old clients.",
"source": {
"file": "Projects/Server/Network/Packets/OutgoingDamagePackets.cs",
"line": 40
}
}
]
}

View file

@ -0,0 +1,459 @@
{
"category": "Effects",
"packets": [
{
"id": "0x54",
"name": "Sound Effect",
"description": "Plays a sound effect at a location.",
"direction": "outgoing",
"isDynamic": false,
"size": 12,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x54",
"description": "Packet identifier"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"value": "0x01",
"description": "Sound flags"
},
{
"name": "Sound ID",
"type": "short",
"size": 2,
"description": "Sound effect ID"
},
{
"name": "Volume",
"type": "short",
"size": 2,
"value": "0x0000",
"description": "Volume (unused)"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X coordinate"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y coordinate"
},
{
"name": "Z",
"type": "short",
"size": 2,
"description": "Z coordinate"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEffectPackets.cs",
"line": 41
}
},
{
"id": "0x70",
"name": "Screen Effect",
"description": "Triggers a screen-wide visual effect (fade in/out).",
"direction": "outgoing",
"isDynamic": false,
"size": 28,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x70",
"description": "Packet identifier"
},
{
"name": "Effect Type",
"type": "byte",
"size": 1,
"value": "0x04",
"description": "Effect type (4)"
},
{
"name": "Padding1",
"type": "byte[]",
"size": 8,
"description": "Padding (zeros)"
},
{
"name": "Type",
"type": "enum",
"enumType": "sequential",
"size": 2,
"description": "Screen effect type",
"values": [
{
"value": 0,
"name": "Fade Out",
"description": "Fade screen to black"
},
{
"value": 1,
"name": "Fade In",
"description": "Fade screen from black"
},
{
"value": 2,
"name": "Light Flash",
"description": "Light flash effect"
},
{
"value": 3,
"name": "Fade In Out",
"description": "Fade out then in"
},
{
"value": 4,
"name": "Darken Screen",
"description": "Darken screen"
}
]
},
{
"name": "Padding2",
"type": "byte[]",
"size": 16,
"description": "Padding (zeros)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEffectPackets.cs",
"line": 322
}
},
{
"id": "0xC0",
"name": "Hued Effect",
"description": "Displays a graphical effect with hue and render mode.",
"direction": "outgoing",
"isDynamic": false,
"size": 36,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xC0",
"description": "Packet identifier"
},
{
"name": "Effect Type",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Effect type",
"values": [
{
"value": 0,
"name": "Moving",
"description": "Effect moves between two points"
},
{
"value": 1,
"name": "Lightning",
"description": "Lightning bolt effect"
},
{
"value": 2,
"name": "Fixed XYZ",
"description": "Effect at fixed location"
},
{
"value": 3,
"name": "Fixed From",
"description": "Effect attached to source"
}
]
},
{
"name": "Source Serial",
"type": "uint",
"size": 4,
"description": "Serial of source entity"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of target entity"
},
{
"name": "Item ID",
"type": "short",
"size": 2,
"description": "Effect graphic ID"
},
{
"name": "Src X",
"type": "short",
"size": 2,
"description": "Source X coordinate"
},
{
"name": "Src Y",
"type": "short",
"size": 2,
"description": "Source Y coordinate"
},
{
"name": "Src Z",
"type": "sbyte",
"size": 1,
"description": "Source Z coordinate"
},
{
"name": "Dst X",
"type": "short",
"size": 2,
"description": "Destination X coordinate"
},
{
"name": "Dst Y",
"type": "short",
"size": 2,
"description": "Destination Y coordinate"
},
{
"name": "Dst Z",
"type": "sbyte",
"size": 1,
"description": "Destination Z coordinate"
},
{
"name": "Speed",
"type": "byte",
"size": 1,
"description": "Effect speed"
},
{
"name": "Duration",
"type": "byte",
"size": 1,
"description": "Effect duration"
},
{
"name": "Unknown1",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
},
{
"name": "Unknown2",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
},
{
"name": "Fixed Direction",
"type": "bool",
"size": 1,
"description": "Fixed direction"
},
{
"name": "Explode",
"type": "bool",
"size": 1,
"description": "Explode on impact"
},
{
"name": "Hue",
"type": "int",
"size": 4,
"description": "Effect hue"
},
{
"name": "Render Mode",
"type": "int",
"size": 4,
"description": "Render mode"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEffectPackets.cs",
"line": 175
}
},
{
"id": "0xC7",
"name": "Particle Effect",
"description": "Displays an advanced particle effect with extended parameters.",
"direction": "outgoing",
"isDynamic": false,
"size": 49,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xC7",
"description": "Packet identifier"
},
{
"name": "Effect Type",
"type": "byte",
"size": 1,
"description": "Effect type (see 0xC0)"
},
{
"name": "Source Serial",
"type": "uint",
"size": 4,
"description": "Serial of source entity"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of target entity"
},
{
"name": "Item ID",
"type": "short",
"size": 2,
"description": "Effect graphic ID"
},
{
"name": "Src X",
"type": "short",
"size": 2,
"description": "Source X coordinate"
},
{
"name": "Src Y",
"type": "short",
"size": 2,
"description": "Source Y coordinate"
},
{
"name": "Src Z",
"type": "sbyte",
"size": 1,
"description": "Source Z coordinate"
},
{
"name": "Dst X",
"type": "short",
"size": 2,
"description": "Destination X coordinate"
},
{
"name": "Dst Y",
"type": "short",
"size": 2,
"description": "Destination Y coordinate"
},
{
"name": "Dst Z",
"type": "sbyte",
"size": 1,
"description": "Destination Z coordinate"
},
{
"name": "Speed",
"type": "byte",
"size": 1,
"description": "Effect speed"
},
{
"name": "Duration",
"type": "byte",
"size": 1,
"description": "Effect duration"
},
{
"name": "Unknown1",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
},
{
"name": "Unknown2",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown"
},
{
"name": "Fixed Direction",
"type": "bool",
"size": 1,
"description": "Fixed direction"
},
{
"name": "Explode",
"type": "bool",
"size": 1,
"description": "Explode on impact"
},
{
"name": "Hue",
"type": "int",
"size": 4,
"description": "Effect hue"
},
{
"name": "Render Mode",
"type": "int",
"size": 4,
"description": "Render mode"
},
{
"name": "Effect",
"type": "short",
"size": 2,
"description": "Particle effect ID"
},
{
"name": "Explode Effect",
"type": "short",
"size": 2,
"description": "Explosion effect ID"
},
{
"name": "Explode Sound",
"type": "short",
"size": 2,
"description": "Explosion sound ID"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Associated entity serial"
},
{
"name": "Layer",
"type": "byte",
"size": 1,
"description": "Effect layer"
},
{
"name": "Unknown3",
"type": "short",
"size": 2,
"description": "Unknown"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEffectPackets.cs",
"line": 58
}
}
]
}

View file

@ -0,0 +1,397 @@
{
"category": "Item",
"tags": ["Mobile"],
"packets": [
{
"id": "0xD6",
"name": "Object Property List",
"description": "Sends the full Object Property List (tooltip) for an entity. Contains a hash for client caching and a list of localized property entries.",
"direction": "outgoing",
"isDynamic": true,
"size": "15+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD6",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Unknown1",
"type": "ushort",
"size": 2,
"value": "0x0001",
"description": "Unknown (always 1)"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Entity serial"
},
{
"name": "Unknown2",
"type": "ushort",
"size": 2,
"value": "0x0000",
"description": "Unknown (always 0)"
},
{
"name": "Hash",
"type": "int",
"size": 4,
"description": "XOR hash of all properties (computed with 26-bit mask)"
},
{
"name": "Properties",
"type": "array",
"description": "Property entries, terminated by number=0",
"loop": {
"terminator": "number == 0",
"fields": [
{
"name": "Number",
"type": "int",
"size": 4,
"description": "Cliloc number (0 = end of list)"
},
{
"name": "String Length",
"type": "ushort",
"size": 2,
"description": "Length of arguments in bytes (0 if no arguments)"
},
{
"name": "Arguments",
"type": "utf16le",
"size": "var",
"description": "Unicode LE string with tab-separated cliloc arguments. Length = String Length field"
}
]
}
}
],
"related": [
{
"id": "0xDC",
"relationship": "notification",
"note": "OPL Info notifies client of hash change, triggering 0xD6 request"
}
],
"clientVersion": {
"min": "4.0.0a",
"feature": "AOS tooltips"
},
"notes": "Hash is calculated by XORing each property\u0027s cliloc number with ((hash \u003e\u003e 31) \u0026 1) ^ (hash \u003c\u003c 1). Properties are cliloc entries with optional Unicode LE arguments separated by tabs.",
"source": {
"file": "Projects/Server/PropertyList/ObjectPropertyList.cs",
"line": 19
}
},
{
"id": "0x1D",
"name": "Remove Entity",
"description": "Removes an entity (item, mobile, or multi) from the client\u0027s view.",
"direction": "outgoing",
"isDynamic": false,
"size": 5,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x1D",
"description": "Packet identifier"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of entity to remove"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEntityPackets.cs",
"line": 75
}
},
{
"id": "0xDC",
"name": "OPL Info (Object Property List)",
"description": "Notifies the client of an entity\u0027s Object Property List hash. Client compares hash to cached version and requests full OPL if different.",
"direction": "outgoing",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDC",
"description": "Packet identifier"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Entity serial"
},
{
"name": "Hash",
"type": "int",
"size": 4,
"description": "Hash of the Object Property List"
}
],
"related": [
{
"id": "0xD6",
"direction": "outgoing",
"relationship": "data",
"note": "Full Object Property List packet"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEntityPackets.cs",
"line": 33
}
},
{
"id": "0xF3",
"name": "World Entity (SA+)",
"description": "Unified entity packet for items, mobiles, and multis. Replaces older 0x1A World Item packet for Stygian Abyss+ clients. High Seas clients add 2 extra bytes.",
"direction": "outgoing",
"isDynamic": false,
"size": "Varies",
"variants": [
{
"version": "Stygian Abyss",
"name": "SA Format",
"condition": "Client version 7.0.0.0 - 7.0.8.x (StygianAbyss, pre-HighSeas)",
"size": 24,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF3",
"description": "Packet identifier"
},
{
"name": "Command",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Command (always 1)"
},
{
"name": "Entity Type",
"type": "enum",
"size": 1,
"description": "Entity type",
"values": [
{ "value": "0", "name": "Item", "description": "World item" },
{ "value": "1", "name": "Mobile", "description": "Mobile/creature" },
{ "value": "2", "name": "Multi", "description": "Multi/structure" }
]
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Entity serial"
},
{
"name": "Graphic ID",
"type": "ushort",
"size": 2,
"description": "Graphic/Body ID (masked with 0x7FFF)"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Direction (mobiles) or 0"
},
{
"name": "Amount Min",
"type": "short",
"size": 2,
"description": "Minimum amount (items) or 1"
},
{
"name": "Amount Max",
"type": "short",
"size": 2,
"description": "Maximum amount (items) or 1"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X coordinate (masked with 0x7FFF)"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y coordinate (masked with 0x3FFF)"
},
{
"name": "Z",
"type": "sbyte",
"size": 1,
"description": "Z coordinate"
},
{
"name": "Light",
"type": "byte",
"size": 1,
"description": "Light level (items)"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Hue/color"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"description": "Packet flags (hidden, blessed, etc.)"
}
]
},
{
"version": "High Seas+",
"name": "HS Format",
"condition": "Client version \u003e= 7.0.9.0 (HighSeas)",
"size": 26,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF3",
"description": "Packet identifier"
},
{
"name": "Command",
"type": "short",
"size": 2,
"value": "0x0001",
"description": "Command (always 1)"
},
{
"name": "Entity Type",
"type": "enum",
"size": 1,
"description": "Entity type",
"values": [
{ "value": "0", "name": "Item", "description": "World item" },
{ "value": "1", "name": "Mobile", "description": "Mobile/creature" },
{ "value": "2", "name": "Multi", "description": "Multi/structure" }
]
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Entity serial"
},
{
"name": "Graphic ID",
"type": "ushort",
"size": 2,
"description": "Graphic/Body ID (masked with 0xFFFF, supports higher IDs)"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Direction (mobiles) or 0"
},
{
"name": "Amount Min",
"type": "short",
"size": 2,
"description": "Minimum amount (items) or 1"
},
{
"name": "Amount Max",
"type": "short",
"size": 2,
"description": "Maximum amount (items) or 1"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X coordinate (masked with 0x7FFF)"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y coordinate (masked with 0x3FFF)"
},
{
"name": "Z",
"type": "sbyte",
"size": 1,
"description": "Z coordinate"
},
{
"name": "Light",
"type": "byte",
"size": 1,
"description": "Light level (items)"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Hue/color"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"description": "Packet flags (hidden, blessed, etc.)"
},
{
"name": "Unknown",
"type": "short",
"size": 2,
"value": "0x0000",
"description": "Unknown (always 0)"
}
]
}
],
"related": [
{
"id": "0x1A",
"relationship": "variant",
"note": "Legacy World Item packet for pre-SA clients"
}
],
"clientVersion": {
"min": "7.0.0.0",
"feature": "StygianAbyss"
},
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEntityPackets.cs",
"line": 88
}
}
]
}

View file

@ -0,0 +1,173 @@
{
"category": "Equipment",
"packets": [
{
"id": "0x2E",
"name": "Equip Update",
"description": "Notifies client that an item has been equipped on a mobile.",
"direction": "outgoing",
"isDynamic": false,
"size": 15,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x2E",
"description": "Packet identifier"
},
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of the equipped item"
},
{
"name": "Item ID",
"type": "short",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Layer",
"type": "ushort",
"size": 2,
"description": "Equipment layer"
},
{
"name": "Mobile Serial",
"type": "uint",
"size": 4,
"description": "Serial of the mobile wearing the item"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Item hue (may be overridden by SolidHueOverride)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEquipmentPackets.cs",
"line": 86
}
},
{
"id": "0xBF",
"subId": "0x10",
"name": "Display Equipment Info",
"description": "Displays detailed equipment information including crafter name and magical properties.",
"direction": "outgoing",
"isDynamic": true,
"size": "17+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0010",
"description": "Display Equipment Info subcommand"
},
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Serial of the item"
},
{
"name": "Cliloc Number",
"type": "int",
"size": 4,
"description": "Base cliloc number for item name"
},
{
"name": "Crafter Info",
"type": "conditional",
"description": "Crafter information (if present)",
"condition": "crafterName.Length \u003e 0",
"fields": [
{
"name": "Crafted By",
"type": "int",
"size": 4,
"value": "-3",
"description": "Crafter marker"
},
{
"name": "Crafter Name Length",
"type": "ushort",
"size": 2,
"description": "Length of crafter name"
},
{
"name": "Crafter Name",
"type": "ascii",
"description": "Crafter name"
}
]
},
{
"name": "Unidentified",
"type": "conditional",
"description": "Unidentified marker",
"condition": "unidentified",
"fields": [
{
"name": "Unidentified Marker",
"type": "int",
"size": 4,
"value": "-4",
"description": "Unidentified marker"
}
]
},
{
"name": "Attributes",
"type": "loop",
"description": "Equipment attributes",
"loop": {
"countField": "variable",
"fields": [
{
"name": "Attribute Number",
"type": "int",
"size": 4,
"description": "Attribute cliloc number"
},
{
"name": "Charges",
"type": "short",
"size": 2,
"description": "Charges (-1 if not applicable)"
}
]
}
},
{
"name": "Terminator",
"type": "int",
"size": 4,
"value": "-1",
"description": "End of attributes marker"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingEquipmentPackets.cs",
"line": 37
}
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,306 @@
{
"category": "House",
"packets": [
{
"id": "0xD8",
"name": "House Design State Detailed",
"description": "Sends detailed house customization design data. Contains compressed plane data organized by floor level and component type. Tiles are encoded using grid-based or coordinate-based formats depending on their Z-height.",
"direction": "outgoing",
"isDynamic": true,
"size": "18+",
"tags": ["House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xD8",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Compression Type",
"type": "byte",
"size": 1,
"value": "0x03",
"description": "Compression type (always 3 = compressed)"
},
{
"name": "Unknown",
"type": "byte",
"size": 1,
"value": "0x00",
"description": "Unknown (always 0)"
},
{
"name": "House Serial",
"type": "uint",
"size": 4,
"description": "Serial of the house foundation"
},
{
"name": "Revision",
"type": "int",
"size": 4,
"description": "Design revision number"
},
{
"name": "Tile Count",
"type": "ushort",
"size": 2,
"description": "Total number of tiles in the design"
},
{
"name": "Buffer Length",
"type": "ushort",
"size": 2,
"description": "Length of remaining data (plane count + all plane sections)"
},
{
"name": "Plane Count",
"type": "byte",
"size": 1,
"description": "Number of plane/buffer sections that follow"
},
{
"name": "Plane Sections",
"type": "array",
"description": "Each section has a 4-byte header followed by compressed tile data",
"loop": {
"countField": "Plane Count",
"fields": [
{
"name": "Section Header",
"type": "uint",
"size": 4,
"description": "Packed header: bits 28-31=mode, bits 24-27=planeZ, bits 16-23+(bits 4-7<<8)=decompLen, bits 8-15+(bits 0-3<<8)=compLen"
},
{
"name": "Compressed Data",
"type": "bytes",
"size": "var",
"description": "DEFLATE compressed tile data (length from header)"
}
]
}
}
],
"planeFormat": {
"description": "Tiles are organized into planes based on Z-height. Planes 0-8 use grid encoding; planes 9+ use explicit coordinates for overflow items.",
"headerDecoding": {
"mode": "(header >> 28) & 0x0F",
"planeZ": "(header >> 24) & 0x0F",
"decompLen": "((header & 0xFF0000) >> 16) | ((header & 0xF0) << 4)",
"compLen": "((header & 0xFF00) >> 8) | ((header & 0x0F) << 8)"
},
"planeZMapping": [
{ "plane": 0, "z": 0, "description": "Ground floor" },
{ "plane": 1, "z": 7, "description": "1st storey (floor items)" },
{ "plane": 2, "z": 27, "description": "2nd storey (floor items)" },
{ "plane": 3, "z": 47, "description": "3rd storey (floor items)" },
{ "plane": 4, "z": 67, "description": "4th storey (floor items)" },
{ "plane": "5-8", "z": "7/27/47/67", "description": "Non-floor items per storey" },
{ "plane": "9+", "z": "varies", "description": "Overflow/stair buffers (explicit coords)" }
],
"encodingModes": [
{
"mode": 0,
"name": "Full Coordinates",
"bytesPerTile": 5,
"format": "ushort itemId, sbyte x, sbyte y, sbyte z",
"description": "Used for overflow buffers with non-standard Z heights"
},
{
"mode": 1,
"name": "XY Coordinates",
"bytesPerTile": 4,
"format": "ushort itemId, sbyte x, sbyte y",
"description": "Z calculated: ((planeZ - 1) % 4) * 20 + 7"
},
{
"mode": 2,
"name": "Grid-Based",
"bytesPerTile": 2,
"format": "ushort itemId (0x0000 = empty)",
"description": "X,Y from grid index: x = i / gridHeight, y = i % gridHeight"
}
],
"gridSizes": [
{ "plane": 0, "width": "width", "height": "height", "notes": "Full foundation footprint" },
{ "plane": "1-4", "width": "width - 1", "height": "height - 2", "notes": "Interior (floor items), offset by (1,1)" },
{ "plane": "5-8", "width": "width", "height": "height - 1", "notes": "Interior (non-floor items)" }
]
},
"compression": {
"algorithm": "DEFLATE",
"notes": "Raw DEFLATE compression (no zlib header/footer). Each plane buffer compressed independently. Max 750 items per overflow buffer (splits into multiple buffers if exceeded)."
},
"related": [
{
"id": "0xBF/0x1D",
"relationship": "related",
"note": "Design State General provides revision info only"
},
{
"id": "0xBF/0x20",
"relationship": "related",
"note": "Begin/End House Customization commands"
}
],
"clientVersion": {
"min": "4.0.0a",
"feature": "AOS House Customization"
},
"source": {
"file": "Projects/UOContent/Multis/Houses/HousePackets.cs",
"line": 93
}
},
{
"id": "0xBF",
"subId": "0x1D",
"name": "Design State General",
"description": "Sends house design revision information. Client requests full details if revision differs.",
"direction": "outgoing",
"isDynamic": false,
"size": 13,
"tags": ["Extended Commands (0xBF)", "House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x000D",
"description": "Packet length (13)"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x001D",
"description": "Design State General subcommand"
},
{
"name": "House Serial",
"type": "uint",
"size": 4,
"description": "Serial of the house"
},
{
"name": "Revision",
"type": "int",
"size": 4,
"description": "Design revision number"
}
],
"related": [
{
"id": "0xD8",
"relationship": "related",
"note": "Full design details requested if revision differs"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HousePackets.cs",
"line": 72
}
},
{
"id": "0xBF",
"subId": "0x20",
"name": "Begin House Customization",
"description": "Notifies client to enter house customization mode.",
"direction": "outgoing",
"isDynamic": false,
"size": 17,
"tags": ["Extended Commands (0xBF)", "House"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0011",
"description": "Packet length (17)"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0020",
"description": "House Customization subcommand"
},
{
"name": "House Serial",
"type": "uint",
"size": 4,
"description": "Serial of the house"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x04",
"description": "Begin customization command"
},
{
"name": "Unknown 1",
"type": "ushort",
"size": 2,
"value": "0x0000",
"description": "Unknown (always 0)"
},
{
"name": "Unknown 2",
"type": "ushort",
"size": 2,
"value": "0xFFFF",
"description": "Unknown (always 0xFFFF)"
},
{
"name": "Unknown 3",
"type": "ushort",
"size": 2,
"value": "0xFFFF",
"description": "Unknown (always 0xFFFF)"
},
{
"name": "Unknown 4",
"type": "byte",
"size": 1,
"value": "0xFF",
"description": "Unknown (always 0xFF)"
}
],
"related": [
{
"id": "0xBF/0x20",
"relationship": "variant",
"note": "End House Customization uses command 0x05"
}
],
"source": {
"file": "Projects/UOContent/Multis/Houses/HousePackets.cs",
"line": 30
}
}
]
}

View file

@ -0,0 +1,102 @@
{
"category": "Items",
"packets": [
{
"id": "0x1A",
"name": "World Item",
"description": "Displays an item in the world (pre-Stygian Abyss clients).",
"direction": "outgoing",
"isDynamic": true,
"size": "14+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x1A",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length (14-20)"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Item serial (bit 31 set if amount present)"
},
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID (bit 14 set for multi)"
},
{
"name": "Amount",
"type": "ushort",
"size": 2,
"description": "Stack amount (if serial bit 31 set)",
"condition": "serial \u0026 0x80000000"
},
{
"name": "X",
"type": "ushort",
"size": 2,
"description": "X coordinate (bit 15 set if direction present)"
},
{
"name": "Y",
"type": "ushort",
"size": 2,
"description": "Y coordinate (bit 15=hue, bit 14=flags)"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Direction (if x bit 15 set)",
"condition": "x \u0026 0x8000"
},
{
"name": "Z",
"type": "sbyte",
"size": 1,
"description": "Z coordinate"
},
{
"name": "Hue",
"type": "ushort",
"size": 2,
"description": "Item hue (if y bit 15 set)",
"condition": "y \u0026 0x8000"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"description": "Packet flags (if y bit 14 set)",
"condition": "y \u0026 0x4000"
}
],
"related": [
{
"id": "0xF3",
"relationship": "variant",
"note": "World Entity packet for SA+ clients"
}
],
"notes": "For Stygian Abyss+ clients, use 0xF3 World Entity instead.",
"clientVersion": {
"max": "6.0.14.2",
"notes": "Replaced by 0xF3 for SA+ clients"
},
"source": {
"file": "Projects/Server/Network/Packets/OutgoingItemPackets.cs",
"line": 24
}
}
]
}

View file

@ -0,0 +1,65 @@
{
"category": "Light",
"packets": [
{
"id": "0x4E",
"name": "Personal Light Level",
"description": "Sets the light level for a specific entity.",
"direction": "outgoing",
"isDynamic": false,
"size": 6,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x4E",
"description": "Packet identifier"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of entity"
},
{
"name": "Level",
"type": "byte",
"size": 1,
"description": "Light level (0=brightest, 25-30=typical night)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingLightPackets.cs",
"line": 23
}
},
{
"id": "0x4F",
"name": "Global Light Level",
"description": "Sets the global ambient light level for the client.",
"direction": "outgoing",
"isDynamic": false,
"size": 2,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x4F",
"description": "Packet identifier"
},
{
"name": "Level",
"type": "byte",
"size": 1,
"description": "Light level (0=brightest, 25-30=typical night)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingLightPackets.cs",
"line": 39
}
}
]
}

View file

@ -0,0 +1,501 @@
{
"category": "Mahjong",
"packets": [
{
"id": "0xDA",
"subId": "0x19",
"name": "Mahjong Join Game",
"description": "Notifies client to open the Mahjong game interface.",
"direction": "outgoing",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0009",
"description": "Packet length (9)"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"value": "0x0019",
"description": "Join Game command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"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",
"name": "Mahjong Players Info",
"description": "Sends information about all players 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": "0x0002",
"description": "Players Info command"
},
{
"name": "Seat Count",
"type": "ushort",
"size": 2,
"description": "Number of seats with data"
},
{
"name": "Players",
"type": "loop",
"description": "Player data for each seat",
"loop": {
"countField": "Seat Count",
"fields": [
{
"name": "Player Serial",
"type": "uint",
"size": 4,
"description": "Serial of player (0 if empty)"
},
{
"name": "Dealer Flag",
"type": "byte",
"size": 1,
"description": "1=Dealer, 2=Not dealer"
},
{
"name": "Position",
"type": "byte",
"size": 1,
"description": "Seat position index"
},
{
"name": "Score",
"type": "int",
"size": 4,
"description": "Player\u0027s current score"
},
{
"name": "Reserved",
"type": "short",
"size": 2,
"value": "0",
"description": "Reserved (always 0)"
},
{
"name": "Reserved 2",
"type": "byte",
"size": 1,
"value": "0",
"description": "Reserved (always 0)"
},
{
"name": "Public Hand",
"type": "bool",
"size": 1,
"description": "True if hand is visible to others"
},
{
"name": "Name",
"type": "ascii",
"size": 30,
"description": "Player name"
},
{
"name": "Empty Seat",
"type": "bool",
"size": 1,
"description": "True if seat is empty or not in game"
}
]
}
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 304
}
},
{
"id": "0xDA",
"subId": "0x05",
"name": "Mahjong General Info",
"description": "Sends general game state including dice values, dealer indicator, and wall break position.",
"direction": "outgoing",
"isDynamic": false,
"size": 25,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0019",
"description": "Packet length (25)"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"value": "0x0005",
"description": "General Info command"
},
{
"name": "Reserved",
"type": "short",
"size": 2,
"value": "0",
"description": "Reserved"
},
{
"name": "Reserved 2",
"type": "byte",
"size": 1,
"value": "0",
"description": "Reserved"
},
{
"name": "Options",
"type": "byte",
"size": 1,
"description": "Bit 0: Show Scores, Bit 1: Spectator Vision"
},
{
"name": "Dice 1",
"type": "byte",
"size": 1,
"description": "First dice value"
},
{
"name": "Dice 2",
"type": "byte",
"size": 1,
"description": "Second dice value"
},
{
"name": "Dealer Wind",
"type": "enum",
"size": 1,
"description": "Dealer indicator wind direction",
"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": "Dealer Y",
"type": "short",
"size": 2,
"description": "Dealer indicator Y position"
},
{
"name": "Dealer X",
"type": "short",
"size": 2,
"description": "Dealer indicator X position"
},
{
"name": "Dealer Direction",
"type": "byte",
"size": 1,
"description": "Dealer indicator direction"
},
{
"name": "Wall Break Y",
"type": "short",
"size": 2,
"description": "Wall break indicator Y position"
},
{
"name": "Wall Break X",
"type": "short",
"size": 2,
"description": "Wall break indicator X position"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 461
}
},
{
"id": "0xDA",
"subId": "0x1A",
"name": "Mahjong Relieve",
"description": "Notifies client to close the Mahjong game interface.",
"direction": "outgoing",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xDA",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0009",
"description": "Packet length (9)"
},
{
"name": "Game Serial",
"type": "uint",
"size": 4,
"description": "Serial of the Mahjong game"
},
{
"name": "Command",
"type": "ushort",
"size": 2,
"value": "0x001A",
"description": "Relieve command"
}
],
"source": {
"file": "Projects/UOContent/Items/Games/Mahjong/MahjongPackets.cs",
"line": 504
}
}
]
}

View file

@ -0,0 +1,424 @@
{
"category": "Map",
"packets": [
{
"id": "0xC6",
"name": "Invalid Map",
"description": "Notifies client that the current map is invalid.",
"direction": "outgoing",
"isDynamic": false,
"size": 1,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xC6",
"description": "Packet identifier"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMapPackets.cs",
"line": 53
}
},
{
"id": "0xBF",
"subId": "0x08",
"name": "Map Change",
"description": "Notifies client of a facet/map change.",
"direction": "outgoing",
"isDynamic": false,
"size": 6,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Packet length (6)"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0008",
"description": "Map Change subcommand"
},
{
"name": "Map ID",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Map/Facet ID",
"values": [
{
"value": 0,
"name": "Felucca",
"description": "Felucca facet"
},
{
"value": 1,
"name": "Trammel",
"description": "Trammel facet"
},
{
"value": 2,
"name": "Ilshenar",
"description": "Ilshenar facet"
},
{
"value": 3,
"name": "Malas",
"description": "Malas facet"
},
{
"value": 4,
"name": "Tokuno",
"description": "Tokuno Islands facet"
},
{
"value": 5,
"name": "Ter Mur",
"description": "Ter Mur facet"
}
]
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMapPackets.cs",
"line": 55
}
},
{
"id": "0xBF",
"subId": "0x18",
"name": "Map Patches",
"description": "Sends map patch information for static and land blocks.",
"direction": "outgoing",
"isDynamic": false,
"size": 41,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0029",
"description": "Packet length (41)"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0018",
"description": "Map Patches subcommand"
},
{
"name": "Map Count",
"type": "int",
"size": 4,
"value": "4",
"description": "Number of maps (always 4)"
},
{
"name": "Patches",
"type": "loop",
"description": "Patch counts for each map (Felucca, Trammel, Ilshenar, Malas)",
"loop": {
"countField": "4",
"fields": [
{
"name": "Static Blocks",
"type": "int",
"size": 4,
"description": "Number of patched static blocks"
},
{
"name": "Land Blocks",
"type": "int",
"size": 4,
"description": "Number of patched land blocks"
}
]
}
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMapPackets.cs",
"line": 25
}
},
{
"id": "0x56",
"name": "Map Command",
"description": "Server sends map pin commands to update the client\u0027s map display.",
"direction": "outgoing",
"isDynamic": false,
"size": 11,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x56",
"description": "Packet identifier"
},
{
"name": "Map Serial",
"type": "uint",
"size": 4,
"description": "Serial of the map item"
},
{
"name": "Command",
"type": "enum",
"size": 1,
"description": "Map command type",
"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" }
]
},
{
"name": "Editable",
"type": "bool",
"size": 1,
"description": "True if map is editable (for command 7)"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "X coordinate of pin"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Y coordinate of pin"
}
],
"related": [
{
"id": "0x56",
"direction": "incoming",
"relationship": "related",
"note": "Client map pin commands"
},
{
"id": "0x90",
"relationship": "related",
"note": "Map Details packet (old)"
},
{
"id": "0xF5",
"relationship": "related",
"note": "Map Details packet (new)"
}
],
"source": {
"file": "Projects/UOContent/Items/Maps/MapItemPackets.cs",
"line": 106
}
},
{
"id": "0x90",
"name": "Map Details",
"description": "Sends map details including bounds, dimensions, and graphic ID. Pre-NewCharacterList clients.",
"direction": "outgoing",
"isDynamic": false,
"size": 19,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x90",
"description": "Packet identifier"
},
{
"name": "Map Serial",
"type": "uint",
"size": 4,
"description": "Serial of the map item"
},
{
"name": "Graphic ID",
"type": "short",
"size": 2,
"value": "0x139D",
"description": "Map gump graphic ID"
},
{
"name": "Start X",
"type": "short",
"size": 2,
"description": "Map bounds start X coordinate"
},
{
"name": "Start Y",
"type": "short",
"size": 2,
"description": "Map bounds start Y coordinate"
},
{
"name": "End X",
"type": "short",
"size": 2,
"description": "Map bounds end X coordinate"
},
{
"name": "End Y",
"type": "short",
"size": 2,
"description": "Map bounds end Y coordinate"
},
{
"name": "Width",
"type": "short",
"size": 2,
"description": "Map width in pixels"
},
{
"name": "Height",
"type": "short",
"size": 2,
"description": "Map height in pixels"
}
],
"related": [
{
"id": "0x56",
"direction": "both",
"relationship": "related",
"note": "Map pin commands (client and server)"
},
{
"id": "0xF5",
"relationship": "variant",
"note": "New Map Details for NewCharacterList clients"
}
],
"source": {
"file": "Projects/UOContent/Items/Maps/MapItemPackets.cs",
"line": 78
}
},
{
"id": "0xF5",
"name": "Map Details (New)",
"description": "Sends map details for NewCharacterList clients. Includes facet ID.",
"direction": "outgoing",
"isDynamic": false,
"size": 21,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF5",
"description": "Packet identifier"
},
{
"name": "Map Serial",
"type": "uint",
"size": 4,
"description": "Serial of the map item"
},
{
"name": "Graphic ID",
"type": "short",
"size": 2,
"value": "0x139D",
"description": "Map gump graphic ID"
},
{
"name": "Start X",
"type": "short",
"size": 2,
"description": "Map bounds start X coordinate"
},
{
"name": "Start Y",
"type": "short",
"size": 2,
"description": "Map bounds start Y coordinate"
},
{
"name": "End X",
"type": "short",
"size": 2,
"description": "Map bounds end X coordinate"
},
{
"name": "End Y",
"type": "short",
"size": 2,
"description": "Map bounds end Y coordinate"
},
{
"name": "Width",
"type": "short",
"size": 2,
"description": "Map width in pixels"
},
{
"name": "Height",
"type": "short",
"size": 2,
"description": "Map height in pixels"
},
{
"name": "Facet ID",
"type": "enum",
"size": 2,
"description": "Map facet/world identifier",
"values": [
{ "value": "0", "name": "Felucca", "description": "Felucca facet" },
{ "value": "1", "name": "Trammel", "description": "Trammel facet" },
{ "value": "2", "name": "Ilshenar", "description": "Ilshenar facet" },
{ "value": "3", "name": "Malas", "description": "Malas facet" },
{ "value": "4", "name": "Tokuno", "description": "Tokuno Islands" },
{ "value": "5", "name": "TerMur", "description": "Ter Mur facet" }
]
}
],
"related": [
{
"id": "0x56",
"direction": "both",
"relationship": "related",
"note": "Map pin commands (client and server)"
},
{
"id": "0x90",
"relationship": "variant",
"note": "Old Map Details for pre-NewCharacterList clients"
}
],
"clientVersion": {
"min": "7.0.13.0",
"feature": "NewCharacterList"
},
"source": {
"file": "Projects/UOContent/Items/Maps/MapItemPackets.cs",
"line": 78
}
}
]
}

View file

@ -0,0 +1,185 @@
{
"category": "Menu",
"packets": [
{
"id": "0x7C",
"name": "Display Menu",
"description": "Displays an item list menu or question menu to the client.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Item List Menu",
"condition": "Menu is ItemListMenu",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x7C",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Menu Serial",
"type": "uint",
"size": 4,
"description": "Menu serial"
},
{
"name": "Menu ID",
"type": "ushort",
"size": 2,
"value": "0x0000",
"description": "Menu ID (always 0)"
},
{
"name": "Question Length",
"type": "byte",
"size": 1,
"description": "Length of question text"
},
{
"name": "Question",
"type": "ascii",
"description": "Question text"
},
{
"name": "Entry Count",
"type": "byte",
"size": 1,
"description": "Number of menu entries"
},
{
"name": "Entries",
"type": "loop",
"description": "Menu entries",
"loop": {
"countField": "entryCount",
"fields": [
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Item hue"
},
{
"name": "Name Length",
"type": "byte",
"size": 1,
"description": "Length of entry name"
},
{
"name": "Name",
"type": "ascii",
"description": "Entry name"
}
]
}
}
]
},
{
"name": "Question Menu",
"condition": "Menu is QuestionMenu",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x7C",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Menu Serial",
"type": "uint",
"size": 4,
"description": "Menu serial"
},
{
"name": "Menu ID",
"type": "ushort",
"size": 2,
"value": "0x0000",
"description": "Menu ID (always 0)"
},
{
"name": "Question Length",
"type": "byte",
"size": 1,
"description": "Length of question text"
},
{
"name": "Question",
"type": "ascii",
"description": "Question text"
},
{
"name": "Answer Count",
"type": "byte",
"size": 1,
"description": "Number of answers"
},
{
"name": "Answers",
"type": "loop",
"description": "Answer options",
"loop": {
"countField": "answerCount",
"fields": [
{
"name": "Padding",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused padding"
},
{
"name": "Answer Length",
"type": "byte",
"size": 1,
"description": "Length of answer text"
},
{
"name": "Answer",
"type": "ascii",
"description": "Answer text"
}
]
}
}
]
}
],
"related": [
{
"id": "0x7D",
"relationship": "response",
"note": "Menu Response from client"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMenuPackets.cs",
"line": 36
}
}
]
}

View file

@ -0,0 +1,534 @@
{
"category": "Message",
"packets": [
{
"id": "0x15",
"name": "Follow Message",
"description": "Instructs client to follow one entity with another.",
"direction": "outgoing",
"isDynamic": false,
"size": 9,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x15",
"description": "Packet identifier"
},
{
"name": "Follower Serial",
"type": "uint",
"size": 4,
"description": "Serial of the follower"
},
{
"name": "Target Serial",
"type": "uint",
"size": 4,
"description": "Serial of the target to follow"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 231
}
},
{
"id": "0x1C",
"name": "ASCII Message",
"description": "Server sends ASCII-encoded message to client.",
"direction": "outgoing",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x1C",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of speaker (0xFFFFFFFF for system)"
},
{
"name": "Graphic",
"type": "short",
"size": 2,
"description": "Body graphic of speaker"
},
{
"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": "Name",
"type": "ascii",
"size": 30,
"description": "Speaker name"
},
{
"name": "Text",
"type": "ascii-t",
"description": "Message text"
}
],
"related": [
{
"id": "0x03",
"relationship": "request",
"note": "ASCII Speech from client"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 180
}
},
{
"id": "0xAE",
"name": "Unicode Message",
"description": "Server sends Unicode-encoded message to client.",
"direction": "outgoing",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xAE",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of speaker (0xFFFFFFFF for system)"
},
{
"name": "Graphic",
"type": "short",
"size": 2,
"description": "Body graphic of speaker"
},
{
"name": "Type",
"type": "byte",
"size": 1,
"description": "Message type (see 0x1C)"
},
{
"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": "Name",
"type": "ascii",
"size": 30,
"description": "Speaker name"
},
{
"name": "Text",
"type": "utf16be-t",
"description": "Message text (Big Endian Unicode)"
}
],
"related": [
{
"id": "0xAD",
"relationship": "request",
"note": "Unicode Speech from client"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 180
}
},
{
"id": "0xB7",
"name": "Help Response",
"description": "Server sends help text response to client.",
"direction": "outgoing",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xB7",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of entity"
},
{
"name": "Text",
"type": "utf16be-t",
"description": "Help text"
}
],
"related": [
{
"id": "0xB6",
"relationship": "request",
"note": "Object Help Request from client"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 263
}
},
{
"id": "0xC1",
"name": "Localized Message",
"description": "Server sends a localized (cliloc) message to client.",
"direction": "outgoing",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xC1",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of speaker"
},
{
"name": "Graphic",
"type": "short",
"size": 2,
"description": "Body graphic of speaker"
},
{
"name": "Type",
"type": "byte",
"size": 1,
"description": "Message type (see 0x1C)"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Text color hue"
},
{
"name": "Font",
"type": "short",
"size": 2,
"description": "Font ID"
},
{
"name": "Cliloc Number",
"type": "int",
"size": 4,
"description": "Cliloc entry number"
},
{
"name": "Name",
"type": "ascii",
"size": 30,
"description": "Speaker name"
},
{
"name": "Arguments",
"type": "utf16le-t",
"description": "Tab-separated arguments for cliloc"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 55
}
},
{
"id": "0xC2",
"name": "Unicode Prompt",
"description": "Server requests text input from client.",
"direction": "outgoing",
"isDynamic": false,
"size": 21,
"tags": ["Menu"],
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xC2",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "21",
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Prompt serial"
},
{
"name": "Prompt ID",
"type": "uint",
"size": 4,
"description": "Prompt ID (same as serial)"
},
{
"name": "Padding",
"type": "byte[]",
"size": 10,
"description": "Unused padding (zeros)"
}
],
"related": [
{
"id": "0x9A",
"direction": "incoming",
"relationship": "response",
"note": "ASCII Prompt Response"
},
{
"id": "0xC2",
"direction": "incoming",
"relationship": "response",
"note": "Unicode Prompt Response"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 246
}
},
{
"id": "0xCC",
"name": "Localized Message Affix",
"description": "Server sends a localized message with text prefix/suffix.",
"direction": "outgoing",
"isDynamic": true,
"size": "var",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xCC",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Serial of speaker"
},
{
"name": "Graphic",
"type": "short",
"size": 2,
"description": "Body graphic of speaker"
},
{
"name": "Type",
"type": "byte",
"size": 1,
"description": "Message type (see 0x1C)"
},
{
"name": "Hue",
"type": "short",
"size": 2,
"description": "Text color hue"
},
{
"name": "Font",
"type": "short",
"size": 2,
"description": "Font ID"
},
{
"name": "Cliloc Number",
"type": "int",
"size": 4,
"description": "Cliloc entry number"
},
{
"name": "Affix Type",
"type": "enum",
"size": 1,
"description": "How to apply the affix",
"values": [
{
"value": 0,
"name": "Append",
"description": "Append affix to end"
},
{
"value": 1,
"name": "Prepend",
"description": "Prepend affix to start"
},
{
"value": 2,
"name": "System",
"description": "System message style"
}
]
},
{
"name": "Name",
"type": "ascii",
"size": 30,
"description": "Speaker name"
},
{
"name": "Affix",
"type": "ascii-t",
"description": "Text to prepend/append"
},
{
"name": "Arguments",
"type": "utf16be-t",
"description": "Tab-separated arguments for cliloc"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMessagePackets.cs",
"line": 112
}
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,256 @@
{
"category": "Movement",
"packets": [
{
"id": "0x21",
"name": "Movement Rejection",
"description": "Sent by the server when player movement is blocked (collision, teleport area, etc). Contains the corrected position the client should snap back to.",
"direction": "outgoing",
"isDynamic": false,
"size": 8,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x21",
"description": "Packet identifier"
},
{
"name": "Sequence",
"type": "byte",
"size": 1,
"description": "Sequence number of the rejected movement request"
},
{
"name": "X",
"type": "short",
"size": 2,
"description": "Correct X coordinate"
},
{
"name": "Y",
"type": "short",
"size": 2,
"description": "Correct Y coordinate"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Correct facing direction (0-7)"
},
{
"name": "Z",
"type": "sbyte",
"size": 1,
"description": "Correct Z coordinate"
}
],
"related": [
{
"id": "0x02",
"relationship": "request",
"note": "The movement request that was rejected"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMovementPackets.cs",
"line": 45
}
},
{
"id": "0x22",
"name": "Movement Acknowledgment",
"description": "Sent by the server to confirm successful player movement. Includes the player\u0027s current notoriety for display purposes.",
"direction": "outgoing",
"noMerge": true,
"isDynamic": false,
"size": 3,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x22",
"description": "Packet identifier"
},
{
"name": "Sequence",
"type": "byte",
"size": 1,
"description": "Sequence number of the accepted movement request"
},
{
"name": "Notoriety",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Player\u0027s current notoriety flag",
"values": [
{
"value": 0,
"name": "Innocent",
"description": "Blue - innocent player"
},
{
"value": 1,
"name": "Friend",
"description": "Green - ally/friend"
},
{
"value": 2,
"name": "Attackable",
"description": "Gray - can be attacked"
},
{
"value": 3,
"name": "Criminal",
"description": "Gray - criminal flag"
},
{
"value": 4,
"name": "Enemy",
"description": "Orange - enemy"
},
{
"value": 5,
"name": "Murderer",
"description": "Red - murderer"
},
{
"value": 6,
"name": "Invulnerable",
"description": "Yellow - invulnerable"
}
]
}
],
"related": [
{
"id": "0x02",
"relationship": "request",
"note": "The movement request that was accepted"
}
],
"notes": "Not related to incoming 0x22 (Resynchronize) despite sharing the same packet ID.",
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMovementPackets.cs",
"line": 42
}
},
{
"id": "0x97",
"name": "Move Player",
"description": "Server-initiated player movement. Forces the client to move in a direction (used for pushback effects, conveyors, etc).",
"direction": "outgoing",
"isDynamic": false,
"size": 2,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x97",
"description": "Packet identifier"
},
{
"name": "Direction",
"type": "byte",
"size": 1,
"description": "Direction to move (0-7). Bit 0x80 indicates running."
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMovementPackets.cs",
"line": 35
}
},
{
"id": "0xBF",
"subId": "0x26",
"name": "Speed Control",
"description": "Controls the player\u0027s movement speed. Used for mount speed changes, walk/run restrictions, etc.",
"direction": "outgoing",
"isDynamic": false,
"size": 6,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0026",
"description": "Sub-command for speed control"
},
{
"name": "Speed Setting",
"type": "enum",
"size": 1,
"description": "Movement speed mode",
"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" }
]
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMovementPackets.cs",
"line": 31
}
},
{
"id": "0xF2",
"name": "Time Sync Response",
"description": "Server response to client time synchronization request. Contains tick counts for latency calculation.",
"direction": "outgoing",
"isDynamic": false,
"size": 25,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xF2",
"description": "Packet identifier"
},
{
"name": "Tick Count1",
"type": "long",
"size": 8,
"description": "Server tick count"
},
{
"name": "Tick Count2",
"type": "long",
"size": 8,
"description": "Server tick count"
},
{
"name": "Tick Count3",
"type": "long",
"size": 8,
"description": "Server tick count"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingMovementPackets.cs",
"line": 63
}
}
]
}

View file

@ -0,0 +1,281 @@
{
"category": "Party",
"packets": [
{
"id": "0xBF",
"subId": "0x06",
"name": "Party Message",
"description": "Party system messages with various subcommands.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Member List",
"version": "0x01",
"condition": "command == 0x01",
"size": "7 + (memberCount x 4)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Party subcommand"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x01",
"description": "Member list command"
},
{
"name": "Member Count",
"type": "byte",
"size": 1,
"description": "Number of party members"
},
{
"name": "Members",
"type": "loop",
"description": "Party members",
"loop": {
"countField": "memberCount",
"fields": [
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Member\u0027s serial"
}
]
}
}
]
},
{
"name": "Remove Member",
"version": "0x02",
"condition": "command == 0x02",
"size": "11 + (memberCount x 4)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Party subcommand"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x02",
"description": "Remove member command"
},
{
"name": "Member Count",
"type": "byte",
"size": 1,
"description": "Number of remaining members"
},
{
"name": "Removed Serial",
"type": "uint",
"size": 4,
"description": "Serial of removed member"
},
{
"name": "Members",
"type": "loop",
"description": "Remaining party members",
"loop": {
"countField": "memberCount",
"fields": [
{
"name": "Serial",
"type": "uint",
"size": 4,
"description": "Member\u0027s serial"
}
]
}
}
]
},
{
"name": "Private Message",
"version": "0x03",
"condition": "command == 0x03",
"size": "12 + (text.Length x 2)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Party subcommand"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x03",
"description": "Private message command"
},
{
"name": "Sender Serial",
"type": "uint",
"size": 4,
"description": "Serial of message sender"
},
{
"name": "Text",
"type": "utf16be-t",
"description": "Message text"
}
]
},
{
"name": "Public Message",
"version": "0x04",
"condition": "command == 0x04",
"size": "12 + (text.Length x 2)",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Party subcommand"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x04",
"description": "Public message command"
},
{
"name": "Sender Serial",
"type": "uint",
"size": 4,
"description": "Serial of message sender"
},
{
"name": "Text",
"type": "utf16be-t",
"description": "Message text"
}
]
},
{
"name": "Party Invitation",
"version": "0x07",
"condition": "command == 0x07",
"size": 10,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "10",
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0006",
"description": "Party subcommand"
},
{
"name": "Command",
"type": "byte",
"size": 1,
"value": "0x07",
"description": "Invitation command"
},
{
"name": "Leader Serial",
"type": "uint",
"size": 4,
"description": "Serial of party leader"
}
]
}
],
"related": [
{
"id": "0xBF/0x06",
"relationship": "request",
"note": "Party Message from client"
}
],
"source": {
"file": "Projects/UOContent/Engines/Party/PartyPackets.cs",
"line": 28
}
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,275 @@
{
"category": "Secure Trade",
"packets": [
{
"id": "0x6F",
"name": "Secure Trade",
"description": "Manages secure trade windows between players.",
"direction": "outgoing",
"isDynamic": true,
"size": "Varies",
"variants": [
{
"name": "Display Trade Window",
"condition": "flag == Display (0)",
"size": 47,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "47",
"description": "Packet length"
},
{
"name": "Flag",
"type": "enum",
"enumType": "sequential",
"size": 1,
"value": "0",
"description": "Trade action flag",
"values": [
{
"value": 0,
"name": "Display",
"description": "Open trade window"
},
{
"value": 1,
"name": "Close",
"description": "Close trade window"
},
{
"value": 2,
"name": "Update",
"description": "Update accept status"
},
{
"value": 3,
"name": "Update Gold",
"description": "Update gold amounts"
},
{
"value": 4,
"name": "Update Ledger",
"description": "Update ledger"
}
]
},
{
"name": "Partner Serial",
"type": "uint",
"size": 4,
"description": "Serial of trading partner"
},
{
"name": "First Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of your trade container"
},
{
"name": "Second Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of partner\u0027s trade container"
},
{
"name": "Has Name",
"type": "bool",
"size": 1,
"value": "true",
"description": "Name field follows"
},
{
"name": "Partner Name",
"type": "ascii",
"size": 30,
"description": "Trading partner\u0027s name"
}
]
},
{
"name": "Close Trade Window",
"condition": "flag == Close (1)",
"size": 17,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "17",
"description": "Packet length"
},
{
"name": "Flag",
"type": "byte",
"size": 1,
"value": "1",
"description": "Close flag"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Trade container serial"
},
{
"name": "Unused1",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Unused2",
"type": "int",
"size": 4,
"value": "0",
"description": "Unused"
},
{
"name": "Has Name",
"type": "bool",
"size": 1,
"value": "false",
"description": "No name follows"
}
]
},
{
"name": "Update Accept Status",
"condition": "flag == Update (2)",
"size": 17,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "17",
"description": "Packet length"
},
{
"name": "Flag",
"type": "byte",
"size": 1,
"value": "2",
"description": "Update flag"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Trade container serial"
},
{
"name": "Your Accept",
"type": "int",
"size": 4,
"description": "Your accept status (0 or 1)"
},
{
"name": "Partner Accept",
"type": "int",
"size": 4,
"description": "Partner\u0027s accept status (0 or 1)"
},
{
"name": "Has Name",
"type": "bool",
"size": 1,
"value": "false",
"description": "No name follows"
}
]
},
{
"name": "Update Gold/Platinum",
"condition": "flag == UpdateGold (3)",
"size": 17,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6F",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "17",
"description": "Packet length"
},
{
"name": "Flag",
"type": "byte",
"size": 1,
"value": "3",
"description": "UpdateGold flag"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Trade container serial"
},
{
"name": "Gold",
"type": "int",
"size": 4,
"description": "Gold amount"
},
{
"name": "Platinum",
"type": "int",
"size": 4,
"description": "Platinum amount"
},
{
"name": "Has Name",
"type": "bool",
"size": 1,
"value": "false",
"description": "No name follows"
}
]
}
],
"related": [
{
"id": "0x6F",
"direction": "incoming",
"relationship": "request",
"note": "Client trade actions"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingSecureTradePackets.cs",
"line": 32
}
}
]
}

View file

@ -0,0 +1,221 @@
{
"category": "Targeting",
"packets": [
{
"id": "0x6C",
"name": "Target Request",
"description": "Requests the client to select a target.",
"direction": "outgoing",
"isDynamic": false,
"size": 19,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x6C",
"description": "Packet identifier"
},
{
"name": "Allow Ground",
"type": "bool",
"size": 1,
"description": "True = allow ground targeting"
},
{
"name": "Target ID",
"type": "int",
"size": 4,
"description": "Target cursor ID for matching response"
},
{
"name": "Flags",
"type": "enum",
"enumType": "sequential",
"size": 1,
"description": "Target cursor flags",
"values": [
{
"value": 0,
"name": "Neutral",
"description": "Neutral targeting (gray cursor)"
},
{
"value": 1,
"name": "Harmful",
"description": "Harmful action (red cursor)"
},
{
"value": 2,
"name": "Beneficial",
"description": "Beneficial action (green cursor)"
},
{
"value": 3,
"name": "Cancel",
"description": "Cancel targeting"
}
]
},
{
"name": "Padding",
"type": "byte[]",
"size": 12,
"description": "Padding (zeros)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingTargetPackets.cs",
"line": 57
}
},
{
"id": "0x99",
"name": "Multi Target Request",
"description": "Requests the client to place a multi (house/boat) structure.",
"direction": "outgoing",
"isDynamic": false,
"size": "Varies",
"variants": [
{
"version": "pre-HighSeas",
"name": "Classic",
"size": 26,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x99",
"description": "Packet identifier"
},
{
"name": "Allow Ground",
"type": "bool",
"size": 1,
"description": "Allow ground targeting"
},
{
"name": "Target ID",
"type": "int",
"size": 4,
"description": "Target cursor ID"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"description": "Target cursor flags"
},
{
"name": "Padding",
"type": "byte[]",
"size": 11,
"description": "Padding (zeros)"
},
{
"name": "Multi ID",
"type": "short",
"size": 2,
"description": "Multi graphic ID"
},
{
"name": "Offset X",
"type": "short",
"size": 2,
"description": "X offset for placement"
},
{
"name": "Offset Y",
"type": "short",
"size": 2,
"description": "Y offset for placement"
},
{
"name": "Offset Z",
"type": "short",
"size": 2,
"description": "Z offset for placement"
}
]
},
{
"version": "HighSeas+",
"name": "High Seas Extended",
"condition": "Client version \u003e= 7.0.9.0 (HighSeas)",
"size": 30,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x99",
"description": "Packet identifier"
},
{
"name": "Allow Ground",
"type": "bool",
"size": 1,
"description": "Allow ground targeting"
},
{
"name": "Target ID",
"type": "int",
"size": 4,
"description": "Target cursor ID"
},
{
"name": "Flags",
"type": "byte",
"size": 1,
"description": "Target cursor flags"
},
{
"name": "Padding",
"type": "byte[]",
"size": 11,
"description": "Padding (zeros)"
},
{
"name": "Multi ID",
"type": "short",
"size": 2,
"description": "Multi graphic ID"
},
{
"name": "Offset X",
"type": "short",
"size": 2,
"description": "X offset for placement"
},
{
"name": "Offset Y",
"type": "short",
"size": 2,
"description": "Y offset for placement"
},
{
"name": "Offset Z",
"type": "short",
"size": 2,
"description": "Z offset for placement"
},
{
"name": "Unknown",
"type": "int",
"size": 4,
"description": "Unknown (HighSeas extension)"
}
]
}
],
"clientVersion": {
"feature": "HighSeas adds 4 bytes"
},
"source": {
"file": "Projects/Server/Network/Packets/OutgoingTargetPackets.cs",
"line": 23
}
}
]
}

View file

@ -0,0 +1,216 @@
{
"category": "Vendor",
"packets": [
{
"id": "0x3B",
"name": "End Vendor Transaction",
"description": "Ends a vendor buy or sell transaction.",
"direction": "outgoing",
"isDynamic": false,
"size": 8,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x3B",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "8",
"description": "Packet length"
},
{
"name": "Vendor Serial",
"type": "uint",
"size": 4,
"description": "Serial of the vendor"
},
{
"name": "Item Count",
"type": "byte",
"size": 1,
"value": "0",
"description": "Item count (0 = end transaction)"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingVendorBuyPackets.cs",
"line": 111
}
},
{
"id": "0x74",
"name": "Vendor Buy List",
"description": "Sends the list of items available for purchase from a vendor with prices.",
"direction": "outgoing",
"isDynamic": true,
"size": "8+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x74",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Container Serial",
"type": "uint",
"size": 4,
"description": "Serial of vendor\u0027s buy container"
},
{
"name": "Item Count",
"type": "byte",
"size": 1,
"description": "Number of items"
},
{
"name": "Items",
"type": "loop",
"description": "Buy items with prices",
"loop": {
"countField": "itemCount",
"fields": [
{
"name": "Price",
"type": "int",
"size": 4,
"description": "Item price"
},
{
"name": "Desc Length",
"type": "byte",
"size": 1,
"description": "Description length + 1"
},
{
"name": "Description",
"type": "ascii-t",
"description": "Item description"
}
]
}
}
],
"related": [
{
"id": "0x3C",
"relationship": "request",
"note": "Container Content with items"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingVendorBuyPackets.cs",
"line": 77
}
},
{
"id": "0x9E",
"name": "Vendor Sell List",
"description": "Sends the list of items the vendor will buy from the player.",
"direction": "outgoing",
"isDynamic": true,
"size": "9+",
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0x9E",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"description": "Packet length"
},
{
"name": "Vendor Serial",
"type": "uint",
"size": 4,
"description": "Serial of the vendor"
},
{
"name": "Item Count",
"type": "ushort",
"size": 2,
"description": "Number of items"
},
{
"name": "Items",
"type": "loop",
"description": "Sell items with prices",
"loop": {
"countField": "itemCount",
"fields": [
{
"name": "Item Serial",
"type": "uint",
"size": 4,
"description": "Item serial"
},
{
"name": "Item ID",
"type": "ushort",
"size": 2,
"description": "Item graphic ID"
},
{
"name": "Hue",
"type": "ushort",
"size": 2,
"description": "Item hue"
},
{
"name": "Amount",
"type": "ushort",
"size": 2,
"description": "Item amount"
},
{
"name": "Price",
"type": "ushort",
"size": 2,
"description": "Price per unit"
},
{
"name": "Name Length",
"type": "ushort",
"size": 2,
"description": "Name length"
},
{
"name": "Name",
"type": "ascii",
"description": "Item name"
}
]
}
}
],
"related": [
{
"id": "0x9F",
"relationship": "response",
"note": "Vendor Sell Reply from client"
}
],
"source": {
"file": "Projects/Server/Network/Packets/OutgoingVendorSellPackets.cs",
"line": 25
}
}
]
}

View file

@ -0,0 +1,89 @@
{
"category": "Weapon Ability",
"packets": [
{
"id": "0xBF",
"subId": "0x21",
"name": "Clear Weapon Ability",
"description": "Clears the currently selected weapon ability.",
"direction": "outgoing",
"isDynamic": false,
"size": 5,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "5",
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0021",
"description": "Clear Weapon Ability subcommand"
}
],
"source": {
"file": "Projects/UOContent/Items/Weapons/Abilities/WeaponAbilityPackets.cs",
"line": 37
}
},
{
"id": "0xBF",
"subId": "0x25",
"name": "Toggle Special Ability",
"description": "Toggles a special weapon ability on or off.",
"direction": "outgoing",
"isDynamic": false,
"size": 8,
"fields": [
{
"name": "Packet ID",
"type": "byte",
"size": 1,
"value": "0xBF",
"description": "Packet identifier"
},
{
"name": "Length",
"type": "ushort",
"size": 2,
"value": "8",
"description": "Packet length"
},
{
"name": "Sub-Command",
"type": "ushort",
"size": 2,
"value": "0x0025",
"description": "Toggle Special Ability subcommand"
},
{
"name": "Ability ID",
"type": "short",
"size": 2,
"description": "Ability ID"
},
{
"name": "Active",
"type": "bool",
"size": 1,
"description": "True if ability is active"
}
],
"source": {
"file": "Projects/UOContent/Items/Weapons/Abilities/WeaponAbilityPackets.cs",
"line": 40
}
}
]
}

1533
docs/packets/packets.html Normal file

File diff suppressed because one or more lines are too long

1532
docs/packets/template.html Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,175 @@
# build-packets.ps1
# Combines all packet JSON files with the HTML template to generate the final documentation page.
#
# Usage:
# .\build-packets.ps1
# .\build-packets.ps1 -OutputPath "C:\custom\output\packets.html"
param(
[string]$OutputPath = ""
)
$ErrorActionPreference = "Stop"
# Determine paths
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$docsDir = (Resolve-Path (Join-Path $scriptDir "..")).Path
$packetsDir = Join-Path $docsDir "packets"
$templateFile = Join-Path $packetsDir "template.html"
if (-not $OutputPath) {
$OutputPath = Join-Path $packetsDir "packets.html"
}
Write-Host "ModernUO Packet Documentation Builder" -ForegroundColor Cyan
Write-Host "======================================" -ForegroundColor Cyan
Write-Host ""
# Verify template exists
if (-not (Test-Path $templateFile)) {
Write-Error "Template file not found: $templateFile"
exit 1
}
# Collect all packet JSON files
$allPackets = @{
incoming = @()
outgoing = @()
}
$incomingDir = Join-Path $packetsDir "incoming"
$outgoingDir = Join-Path $packetsDir "outgoing"
# Read incoming packets
if (Test-Path $incomingDir) {
$incomingFiles = Get-ChildItem "$incomingDir\*.json" -ErrorAction SilentlyContinue
foreach ($file in $incomingFiles) {
Write-Host " Reading: $($file.Name)" -ForegroundColor Gray
try {
$content = Get-Content $file.FullName -Raw -Encoding UTF8
$data = $content | ConvertFrom-Json
if ($data.packets) {
# Add category and merge tags for each packet
foreach ($packet in $data.packets) {
# Add category if not present (backward compatibility)
if (-not $packet.category -and $data.category) {
$packet | Add-Member -NotePropertyName "category" -NotePropertyValue $data.category -Force
}
# Merge tags: file-level + packet-level
$fileTags = @()
if ($data.tags) { $fileTags = @($data.tags) }
$packetTags = @()
if ($packet.tags) { $packetTags = @($packet.tags) }
$allTags = @($fileTags + $packetTags) | Select-Object -Unique
# Always include the primary category as a tag (first position)
if ($data.category -and $data.category -notin $allTags) {
$allTags = @($data.category) + $allTags
}
# Ensure tags is always an array (PowerShell can collapse single-element arrays)
$allTags = @($allTags)
$packet | Add-Member -NotePropertyName "tags" -NotePropertyValue $allTags -Force
}
$allPackets.incoming += $data.packets
}
} catch {
Write-Warning "Failed to parse $($file.Name): $_"
}
}
Write-Host " Found $($allPackets.incoming.Count) incoming packets" -ForegroundColor Green
} else {
Write-Host " No incoming packets directory found" -ForegroundColor Yellow
}
# Read outgoing packets
if (Test-Path $outgoingDir) {
$outgoingFiles = Get-ChildItem "$outgoingDir\*.json" -ErrorAction SilentlyContinue
foreach ($file in $outgoingFiles) {
Write-Host " Reading: $($file.Name)" -ForegroundColor Gray
try {
$content = Get-Content $file.FullName -Raw -Encoding UTF8
$data = $content | ConvertFrom-Json
if ($data.packets) {
# Add category and merge tags for each packet
foreach ($packet in $data.packets) {
# Add category if not present (backward compatibility)
if (-not $packet.category -and $data.category) {
$packet | Add-Member -NotePropertyName "category" -NotePropertyValue $data.category -Force
}
# Merge tags: file-level + packet-level
$fileTags = @()
if ($data.tags) { $fileTags = @($data.tags) }
$packetTags = @()
if ($packet.tags) { $packetTags = @($packet.tags) }
$allTags = @($fileTags + $packetTags) | Select-Object -Unique
# Always include the primary category as a tag (first position)
if ($data.category -and $data.category -notin $allTags) {
$allTags = @($data.category) + $allTags
}
# Ensure tags is always an array (PowerShell can collapse single-element arrays)
$allTags = @($allTags)
$packet | Add-Member -NotePropertyName "tags" -NotePropertyValue $allTags -Force
}
$allPackets.outgoing += $data.packets
}
} catch {
Write-Warning "Failed to parse $($file.Name): $_"
}
}
Write-Host " Found $($allPackets.outgoing.Count) outgoing packets" -ForegroundColor Green
} else {
Write-Host " No outgoing packets directory found" -ForegroundColor Yellow
}
$totalPackets = $allPackets.incoming.Count + $allPackets.outgoing.Count
Write-Host ""
Write-Host "Total packets: $totalPackets" -ForegroundColor Cyan
if ($totalPackets -eq 0) {
Write-Warning "No packets found! The output will have empty documentation."
}
# Convert to JSON
$packetsJson = $allPackets | ConvertTo-Json -Depth 20 -Compress
# HTML entity escape the JSON to safely embed in HTML
$packetsJson = $packetsJson -replace '<', '&lt;' -replace '>', '&gt;'
# Read template and inject JSON
Write-Host ""
Write-Host "Reading template..." -ForegroundColor Gray
$template = Get-Content $templateFile -Raw -Encoding UTF8
Write-Host "Injecting packet data..." -ForegroundColor Gray
$output = $template -replace '<!-- PACKETS -->', $packetsJson
# Ensure output directory exists
$outputDir = Split-Path $OutputPath -Parent
if (-not (Test-Path $outputDir)) {
Write-Host "Creating output directory: $outputDir" -ForegroundColor Gray
New-Item -ItemType Directory -Path $outputDir -Force | Out-Null
}
# Write output
Write-Host "Writing output..." -ForegroundColor Gray
$output | Set-Content $OutputPath -Encoding UTF8
$outputSize = (Get-Item $OutputPath).Length
$outputSizeKB = [math]::Round($outputSize / 1024, 2)
Write-Host ""
Write-Host "Success!" -ForegroundColor Green
Write-Host " Output: $OutputPath" -ForegroundColor White
Write-Host " Size: $outputSizeKB KB" -ForegroundColor White
Write-Host " Packets: $totalPackets" -ForegroundColor White