ModernUO/Distribution/Data/packets/CONVENTIONS.md
Kamron Batman f0b65fecb7
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>
2026-01-01 11:47:31 -08:00

3.7 KiB

Packet Documentation Conventions

String Types

When documenting packet fields, use these specific type names to indicate the encoding and format:

By Encoding

Type Encoding Description
ascii ASCII 7-bit ASCII characters
unicode-le Unicode (Little Endian) UTF-16LE, each character is 2 bytes
unicode-be Unicode (Big Endian) UTF-16BE, each character is 2 bytes
utf8 UTF-8 Variable-width encoding (rarely used, mainly book packets)

By Format

Suffix Format Example
(no suffix) Fixed length, padded/truncated ascii with size: 30 = exactly 30 bytes
-null Null-terminated ascii-null = string followed by 0x00
-prefixed Length-prefixed unicode-le-prefixed = ushort length + characters

Common Combinations

Full Type Description SpanWriter Method
ascii Fixed-length ASCII WriteAscii(text, maxLength)
ascii-null Null-terminated ASCII WriteAsciiNull(text)
unicode-le Fixed-length Unicode LE WriteLittleUni(text, maxLength)
unicode-le-null Null-terminated Unicode LE WriteLittleUniNull(text)
unicode-be Fixed-length Unicode BE WriteBigUni(text, maxLength)
unicode-be-null Null-terminated Unicode BE WriteBigUniNull(text)
utf8-null Null-terminated UTF-8 WriteUtf8Null(text)

Size Calculations

  • Fixed ASCII: Size in bytes = specified size
  • Fixed Unicode: Size in bytes = specified size (characters) * 2
  • Null-terminated: Size = string length + 1 (ASCII) or string length * 2 + 2 (Unicode)
  • Length-prefixed: Size = 2 (ushort length) + string data

Examples in JSON

// Fixed-length ASCII (30 bytes exactly)
{ "name": "characterName", "type": "ascii", "size": 30, "description": "Character name" }

// Null-terminated ASCII (variable length)
{ "name": "message", "type": "ascii-null", "description": "Chat message" }

// Fixed-length Unicode Little Endian
{ "name": "text", "type": "unicode-le", "size": 64, "description": "Unicode text (64 chars)" }

// Null-terminated Unicode Big Endian
{ "name": "affix", "type": "unicode-be-null", "description": "Affix string" }

Numeric Types

Type Size Range Signed
byte 1 0-255 No
sbyte 1 -128 to 127 Yes
short 2 -32768 to 32767 Yes
ushort 2 0-65535 No
int 4 -2^31 to 2^31-1 Yes
uint 4 0 to 2^32-1 No
long 8 -2^63 to 2^63-1 Yes
ulong 8 0 to 2^64-1 No
bool 1 0 (false) or 1 (true) N/A

Byte Order

  • All numeric types are Big Endian (network byte order) unless noted otherwise
  • IP addresses use Little Endian (marked with LE suffix)
  • Some client-specific fields may use Little Endian (always documented)

Packet Flags

Common flag values used in mobile/item packets:

Flag Value Description
Hidden 0x80 Entity is hidden
Poisoned 0x04 Mobile is poisoned
Blessed 0x08 Mobile is blessed/invulnerable
Warmode 0x40 Mobile is in war mode
Female 0x02 Mobile is female

Direction Values

Value Direction
0 North
1 Right (NE)
2 East
3 Down (SE)
4 South
5 Left (SW)
6 West
7 Up (NW)
0x80 Running flag (OR with direction)

Notoriety Values

Value Name Color
0 Invalid Gray
1 Innocent Blue
2 Ally/Friend Green
3 Gray/Attackable Gray
4 Criminal Gray
5 Enemy Orange
6 Murderer Red
7 Invulnerable Yellow