{ "category": "Container", "packets": [ { "id": "0x24", "name": "Display Container", "description": "Opens a container gump on the client.", "direction": "outgoing", "isDynamic": false, "size": "Varies", "variants": [ { "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" } ] }, { "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": { "classic": {}, "enhanced": {}, "notes": "HighSeas (7.0.9.0+) 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": [ { "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" } ] }, { "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": { "classic": {}, "enhanced": {}, "notes": "ContainerGridLines (6.0.1.7+) 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": [ { "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" } ] } } ] }, { "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": { "classic": {}, "enhanced": {}, "notes": "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": { "classic": { "min": "5.0.0a" }, "enhanced": {}, "notes": "NewSpellbook feature (Core.AOS)" }, "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", "tags": ["Boat"], "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" }, { "id": "0xF6", "relationship": "variant", "note": "Used alongside Move Boat HS for boat display" } ], "clientVersion": { "classic": { "min": "7.0.9.0" }, "enhanced": {}, "notes": "HighSeas expansion feature" }, "notes": "Uses PacketContainerBuilder for efficient dynamic growth. Commonly used by boat system to batch all visible entities on deck. Minimum packet length is 5 bytes (header only).", "source": { "file": "Projects/Server/Network/Packets/PacketContainerBuilder.cs", "line": 23 } } ] }