feat: Add interactive packet documentation system
- Create JSON-based packet documentation for 145 packets (66 incoming, 79 outgoing) - Add HTML template with search, filtering, and navigation - Support enum/bitfield field display with values and descriptions - Support packet variants for version-specific structures - Include 0xBF extended command subpackets documentation - Add PowerShell build script to generate final HTML 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
ec287d7691
commit
f0b65fecb7
28 changed files with 6011 additions and 0 deletions
482
Distribution/Data/packets/outgoing/player.json
Normal file
482
Distribution/Data/packets/outgoing/player.json
Normal file
|
|
@ -0,0 +1,482 @@
|
|||
{
|
||||
"category": "Player",
|
||||
"packets": [
|
||||
{
|
||||
"id": "0x23",
|
||||
"name": "Drag Effect",
|
||||
"description": "Displays a drag/drop visual effect between two points.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 26,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x23", "description": "Packet identifier" },
|
||||
{ "name": "itemId", "type": "short", "size": 2, "description": "Item graphic ID" },
|
||||
{ "name": "unknown", "type": "byte", "size": 1, "value": "0x00", "description": "Unknown" },
|
||||
{ "name": "hue", "type": "short", "size": 2, "description": "Item hue" },
|
||||
{ "name": "amount", "type": "short", "size": 2, "description": "Item amount" },
|
||||
{ "name": "srcSerial", "type": "uint", "size": 4, "description": "Source entity serial" },
|
||||
{ "name": "srcX", "type": "short", "size": 2, "description": "Source X coordinate" },
|
||||
{ "name": "srcY", "type": "short", "size": 2, "description": "Source Y coordinate" },
|
||||
{ "name": "srcZ", "type": "sbyte", "size": 1, "description": "Source Z coordinate" },
|
||||
{ "name": "dstSerial", "type": "uint", "size": 4, "description": "Destination entity serial" },
|
||||
{ "name": "dstX", "type": "short", "size": 2, "description": "Destination X coordinate" },
|
||||
{ "name": "dstY", "type": "short", "size": 2, "description": "Destination Y coordinate" },
|
||||
{ "name": "dstZ", "type": "sbyte", "size": 1, "description": "Destination Z coordinate" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 198
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x27",
|
||||
"name": "Lift Reject",
|
||||
"description": "Server rejects a lift/pick up request.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 2,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x27", "description": "Packet identifier" },
|
||||
{
|
||||
"name": "reason",
|
||||
"type": "enum",
|
||||
"enumType": "sequential",
|
||||
"size": 1,
|
||||
"description": "Rejection reason",
|
||||
"values": [
|
||||
{ "value": 0, "name": "CannotLift", "description": "You cannot pick that up" },
|
||||
{ "value": 1, "name": "OutOfRange", "description": "That is out of range" },
|
||||
{ "value": 2, "name": "OutOfSight", "description": "That is out of sight" },
|
||||
{ "value": 3, "name": "TryToSteal", "description": "That does not belong to you" },
|
||||
{ "value": 4, "name": "AreHolding", "description": "You are already holding an item" },
|
||||
{ "value": 5, "name": "Inspecific", "description": "You cannot pick that up" }
|
||||
]
|
||||
}
|
||||
],
|
||||
"related": [
|
||||
{ "id": "0x07", "relationship": "request", "note": "Lift Request that was rejected" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 90
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x2C",
|
||||
"name": "Death Status",
|
||||
"description": "Notifies client of death/resurrection state.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 2,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x2C", "description": "Packet identifier" },
|
||||
{ "name": "dead", "type": "byte", "size": 1, "value": "0x02", "description": "Always 2 (dead)" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 63
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x38",
|
||||
"name": "Pathfind Message",
|
||||
"description": "Instructs client to pathfind to a location.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 7,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x38", "description": "Packet identifier" },
|
||||
{ "name": "x", "type": "short", "size": 2, "description": "Target X coordinate" },
|
||||
{ "name": "y", "type": "short", "size": 2, "description": "Target Y coordinate" },
|
||||
{ "name": "z", "type": "short", "size": 2, "description": "Target Z coordinate" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 319
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x3A",
|
||||
"name": "Skills Update",
|
||||
"description": "Sends full skills list or single skill update to client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": true,
|
||||
"size": "Dynamic",
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x3A", "description": "Packet identifier" },
|
||||
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
||||
{
|
||||
"name": "type",
|
||||
"type": "enum",
|
||||
"enumType": "sequential",
|
||||
"size": 1,
|
||||
"description": "Update type",
|
||||
"values": [
|
||||
{ "value": "0x00", "name": "FullNoCaps", "description": "Full list without caps" },
|
||||
{ "value": "0x02", "name": "FullWithCaps", "description": "Full list with skill caps" },
|
||||
{ "value": "0xDF", "name": "SingleWithCaps", "description": "Single skill update with cap" },
|
||||
{ "value": "0xFF", "name": "SingleNoCaps", "description": "Single skill update" }
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "skills",
|
||||
"type": "loop",
|
||||
"loop": {
|
||||
"until": "skillId == 0",
|
||||
"fields": [
|
||||
{ "name": "skillId", "type": "ushort", "size": 2, "description": "Skill ID + 1 (0 terminates)" },
|
||||
{ "name": "value", "type": "ushort", "size": 2, "description": "Current skill value * 10" },
|
||||
{ "name": "base", "type": "ushort", "size": 2, "description": "Base skill value * 10" },
|
||||
{
|
||||
"name": "lock",
|
||||
"type": "enum",
|
||||
"enumType": "sequential",
|
||||
"size": 1,
|
||||
"description": "Skill 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" }
|
||||
]
|
||||
},
|
||||
{ "name": "cap", "type": "ushort", "size": 2, "description": "Skill cap * 10 (if type includes caps)" }
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 121
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x5B",
|
||||
"name": "Current Time",
|
||||
"description": "Sends current server time to client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 4,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x5B", "description": "Packet identifier" },
|
||||
{ "name": "hour", "type": "byte", "size": 1, "description": "Hour (0-23)" },
|
||||
{ "name": "minute", "type": "byte", "size": 1, "description": "Minute (0-59)" },
|
||||
{ "name": "second", "type": "byte", "size": 1, "description": "Second (0-59)" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 316
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x65",
|
||||
"name": "Weather",
|
||||
"description": "Sets weather conditions for client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 4,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x65", "description": "Packet identifier" },
|
||||
{
|
||||
"name": "type",
|
||||
"type": "enum",
|
||||
"enumType": "sequential",
|
||||
"size": 1,
|
||||
"description": "Weather type",
|
||||
"values": [
|
||||
{ "value": 0, "name": "Rain", "description": "Raining" },
|
||||
{ "value": 1, "name": "StormBrewing", "description": "Storm brewing" },
|
||||
{ "value": 2, "name": "Snow", "description": "Snowing" },
|
||||
{ "value": 3, "name": "Storm", "description": "Storm in progress" },
|
||||
{ "value": 254, "name": "None", "description": "No weather" },
|
||||
{ "value": 255, "name": "Clear", "description": "Clear weather (stops current)" }
|
||||
]
|
||||
},
|
||||
{ "name": "intensity", "type": "byte", "size": 1, "description": "Weather intensity (0-255)" },
|
||||
{ "name": "temperature", "type": "byte", "size": 1, "description": "Temperature value" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 97
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x6D",
|
||||
"name": "Play Music",
|
||||
"description": "Plays background music on client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 3,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x6D", "description": "Packet identifier" },
|
||||
{ "name": "musicId", "type": "short", "size": 2, "description": "Music track ID (0x1FFF = stop)" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 275
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x73",
|
||||
"name": "Ping Ack",
|
||||
"description": "Server acknowledges ping request.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 2,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x73", "description": "Packet identifier" },
|
||||
{ "name": "sequence", "type": "byte", "size": 1, "description": "Ping sequence (echoed from request)" }
|
||||
],
|
||||
"related": [
|
||||
{ "id": "0x73", "relationship": "request", "note": "Ping Request from client" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 336
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x76",
|
||||
"name": "Server Change",
|
||||
"description": "Notifies client of server/map transition.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 16,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x76", "description": "Packet identifier" },
|
||||
{ "name": "x", "type": "short", "size": 2, "description": "New X coordinate" },
|
||||
{ "name": "y", "type": "short", "size": 2, "description": "New Y coordinate" },
|
||||
{ "name": "z", "type": "short", "size": 2, "description": "New Z coordinate" },
|
||||
{ "name": "unknown", "type": "byte", "size": 1, "value": "0x00", "description": "Unknown" },
|
||||
{ "name": "unknown2", "type": "short", "size": 2, "value": "0x0000", "description": "Unknown" },
|
||||
{ "name": "unknown3", "type": "short", "size": 2, "value": "0x0000", "description": "Unknown" },
|
||||
{ "name": "mapWidth", "type": "short", "size": 2, "description": "Map width" },
|
||||
{ "name": "mapHeight", "type": "short", "size": 2, "description": "Map height" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 100
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x7B",
|
||||
"name": "Sequence",
|
||||
"description": "Sends sequence number to client for synchronization.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 2,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x7B", "description": "Packet identifier" },
|
||||
{ "name": "sequence", "type": "byte", "size": 1, "description": "Sequence number" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 154
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x88",
|
||||
"name": "Display Paperdoll",
|
||||
"description": "Opens paperdoll window for a mobile.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 66,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x88", "description": "Packet identifier" },
|
||||
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of mobile" },
|
||||
{ "name": "title", "type": "ascii", "size": 60, "description": "Title/name displayed" },
|
||||
{
|
||||
"name": "flags",
|
||||
"type": "bitfield",
|
||||
"size": 1,
|
||||
"description": "Paperdoll flags",
|
||||
"flags": [
|
||||
{ "bit": "0x01", "name": "Warmode", "description": "Mobile is in war mode" },
|
||||
{ "bit": "0x02", "name": "CanLift", "description": "Viewer can lift equipment" }
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 247
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0x95",
|
||||
"name": "Display Hue Picker",
|
||||
"description": "Opens hue picker dialog on client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 9,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0x95", "description": "Packet identifier" },
|
||||
{ "name": "serial", "type": "uint", "size": 4, "description": "Hue picker serial" },
|
||||
{ "name": "unknown", "type": "short", "size": 2, "value": "0x0000", "description": "Unknown" },
|
||||
{ "name": "itemId", "type": "short", "size": 2, "description": "Item graphic to preview hue on" }
|
||||
],
|
||||
"related": [
|
||||
{ "id": "0x95", "relationship": "response", "note": "Hue Picker Response from client" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 338
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xA5",
|
||||
"name": "Launch Browser",
|
||||
"description": "Opens a URL in client's web browser.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": true,
|
||||
"size": "Dynamic",
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA5", "description": "Packet identifier" },
|
||||
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
||||
{ "name": "url", "type": "ascii-null", "description": "URL to open" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 180
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xA6",
|
||||
"name": "Scroll Message",
|
||||
"description": "Displays a scrollable tips/message window.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": true,
|
||||
"size": "Dynamic",
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xA6", "description": "Packet identifier" },
|
||||
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
||||
{ "name": "type", "type": "byte", "size": 1, "description": "Scroll type" },
|
||||
{ "name": "tipNumber", "type": "int", "size": 4, "description": "Tip/message number" },
|
||||
{ "name": "textLength", "type": "ushort", "size": 2, "description": "Length of text" },
|
||||
{ "name": "text", "type": "ascii", "description": "Message text" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 291
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xB8",
|
||||
"name": "Display Profile",
|
||||
"description": "Displays a mobile's profile.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": true,
|
||||
"size": "Dynamic",
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xB8", "description": "Packet identifier" },
|
||||
{ "name": "length", "type": "ushort", "size": 2, "description": "Packet length" },
|
||||
{ "name": "serial", "type": "uint", "size": 4, "description": "Serial of mobile" },
|
||||
{ "name": "header", "type": "ascii-null", "description": "Profile header" },
|
||||
{ "name": "footer", "type": "unicode-be-null", "description": "Profile footer" },
|
||||
{ "name": "body", "type": "unicode-be-null", "description": "Profile body text" }
|
||||
],
|
||||
"related": [
|
||||
{ "id": "0xB8", "relationship": "request", "note": "Profile Request from client" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 66
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xBC",
|
||||
"name": "Season Change",
|
||||
"description": "Changes the visual season on client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 3,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBC", "description": "Packet identifier" },
|
||||
{
|
||||
"name": "season",
|
||||
"type": "enum",
|
||||
"enumType": "sequential",
|
||||
"size": 1,
|
||||
"description": "Season value",
|
||||
"values": [
|
||||
{ "value": 0, "name": "Spring", "description": "Spring season" },
|
||||
{ "value": 1, "name": "Summer", "description": "Summer season" },
|
||||
{ "value": 2, "name": "Fall", "description": "Fall/Autumn season" },
|
||||
{ "value": 3, "name": "Winter", "description": "Winter season" },
|
||||
{ "value": 4, "name": "Desolation", "description": "Desolation (dead trees)" }
|
||||
]
|
||||
},
|
||||
{ "name": "playSound", "type": "bool", "size": 1, "description": "Play season change sound" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 244
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xBF/0x19",
|
||||
"name": "Stat Lock Info",
|
||||
"description": "Sends stat lock states (STR/DEX/INT) to client.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 12,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xBF", "description": "Packet identifier" },
|
||||
{ "name": "length", "type": "ushort", "size": 2, "value": "12", "description": "Packet length" },
|
||||
{ "name": "subCommand", "type": "short", "size": 2, "value": "0x19", "description": "Subcommand (Stat Lock Info)" },
|
||||
{ "name": "type", "type": "byte", "size": 1, "value": "0x02", "description": "Type (2 = stat locks)" },
|
||||
{ "name": "serial", "type": "uint", "size": 4, "description": "Mobile serial" },
|
||||
{ "name": "unknown", "type": "byte", "size": 1, "value": "0x00", "description": "Unknown" },
|
||||
{
|
||||
"name": "lockBits",
|
||||
"type": "bitfield",
|
||||
"size": 1,
|
||||
"description": "Packed lock states",
|
||||
"flags": [
|
||||
{ "bit": "0x30", "name": "StrLock", "description": "Strength lock (bits 4-5)" },
|
||||
{ "bit": "0x0C", "name": "DexLock", "description": "Dexterity lock (bits 2-3)" },
|
||||
{ "bit": "0x03", "name": "IntLock", "description": "Intelligence lock (bits 0-1)" }
|
||||
],
|
||||
"notes": "Each lock is 2 bits: 0=Up, 1=Down, 2=Locked"
|
||||
}
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 36
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xC8",
|
||||
"name": "Change Update Range",
|
||||
"description": "Sets the client's update range.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 2,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xC8", "description": "Packet identifier" },
|
||||
{ "name": "range", "type": "byte", "size": 1, "description": "Update range (typically 18)" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 59
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "0xD1",
|
||||
"name": "Logout Ack",
|
||||
"description": "Server acknowledges logout request.",
|
||||
"direction": "outgoing",
|
||||
"isDynamic": false,
|
||||
"size": 2,
|
||||
"fields": [
|
||||
{ "name": "packetId", "type": "byte", "size": 1, "value": "0xD1", "description": "Packet identifier" },
|
||||
{ "name": "ack", "type": "byte", "size": 1, "value": "0x01", "description": "Acknowledgment (1 = OK)" }
|
||||
],
|
||||
"related": [
|
||||
{ "id": "0xD1", "relationship": "request", "note": "Logout Request from client" }
|
||||
],
|
||||
"source": {
|
||||
"file": "Projects/Server/Network/Packets/OutgoingPlayerPackets.cs",
|
||||
"line": 94
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue