# Ace of Spades Revival: complete AI-readable documentation corpus > This file combines the project overview, every long-form site article, and the complete Protocol 168 packet reference. Discovery index: https://aosplay.net/llms.txt Canonical website: https://aosplay.net/ --- title: "Ace of Spades Revival" description: "The community home for Ace of Spades: Battle Builder, with the BattleSpades dedicated server, revival client, protocol research, and hosting guides." canonical: "https://aosplay.net/" markdown: "https://aosplay.net/docs/index.md" content_type: "WebSite" --- # Ace of Spades Revival > The community home for Ace of Spades: Battle Builder, with the BattleSpades dedicated server, revival client, protocol research, and hosting guides. Ace of Spades Revival is an independent community preservation project rebuilding the Battle Builder experience through a clean-room dedicated server, an open revival client, public Protocol 168 research, independent hosting guidance, and modern discovery services. ## Project documentation - [BattleSpades dedicated server](https://aosplay.net/dedicated-server) — Explore BattleSpades, the playable clean-room Ace of Spades server with authoritative physics, VXL maps, bots, and six game modes. ([Markdown](https://aosplay.net/docs/dedicated-server.md)) - [The open Ace of Spades revival client](https://aosplay.net/revival-client) — Follow the open Ace of Spades Revival client preserving Battle Builder compatibility, voxel combat, construction, destruction, and community development. ([Markdown](https://aosplay.net/docs/revival-client.md)) - [A master server for reconnecting the community](https://aosplay.net/master-server) — Explore the Ace of Spades master server implementation for verified community registration, heartbeats, discovery, moderation, and the Battle Builder server browser. ([Markdown](https://aosplay.net/docs/master-server.md)) - [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) — A readable guide to Ace of Spades protocol 168: ENet transport, packet research, VXL map streaming, prediction, and clean-room verification. ([Markdown](https://aosplay.net/docs/protocol-168.md)) - [How to host a BattleSpades server](https://aosplay.net/host-a-server) — Host an Ace of Spades Battle Builder server with BattleSpades: portable releases, configuration, UDP port 27015, bots, maps, and security. ([Markdown](https://aosplay.net/docs/host-a-server.md)) - [About the Ace of Spades Revival](https://aosplay.net/about) — Meet Ace of Spades Revival, the independent community preserving Battle Builder through a clean-room server, open client, protocol research, and hosting. ([Markdown](https://aosplay.net/docs/about.md)) - [Ace of Spades Revival Player Identity](https://aosplay.net/account) — Understand Ace of Spades Revival accounts, signed guest profiles, original Steam owner validation, unique nicknames, join tickets, and leaderboard trust. ([Markdown](https://aosplay.net/docs/account.md)) - [Ace of Spades Revival Privacy Notes](https://aosplay.net/privacy) — A plain-language description of the account, guest, Steam, session, security, and gameplay data the Ace of Spades Revival service is designed to process. ([Markdown](https://aosplay.net/docs/privacy.md)) ## Protocol reference - [Protocol 168 packet browser](https://aosplay.net/protocol-168/packets) - [Complete packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Identity API implementation guide](https://aosplay.net/docs/auth-and-identity.md) - [Original Steam client compatibility guide](https://aosplay.net/docs/steam-retail-compatibility.md) - [Master server API contract](https://aosplay.net/docs/master-server-api.md) - [AI content index](https://aosplay.net/llms.txt) - [Combined AI-readable corpus](https://aosplay.net/llms-full.txt) ## Community links - [BattleSpades dedicated server repository](https://github.com/KikoTs/BattleSpades) - [Revival client repository](https://github.com/KikoTs/aceofspades_revival) - [Public progress board](https://trello.com/b/sf5TkSE9/ace-of-spades-community-revival) Ace of Spades Revival is independent, unofficial, and not affiliated with the original publisher. --- --- title: "BattleSpades dedicated server" description: "Explore BattleSpades, the playable clean-room Ace of Spades server with authoritative physics, VXL maps, bots, and six game modes." canonical: "https://aosplay.net/dedicated-server" markdown: "https://aosplay.net/docs/dedicated-server.md" last_updated: "2026-07-16" content_type: "TechArticle" keywords: ["Ace of Spades dedicated server","BattleSpades server","Battle Builder server","Ace of Spades 1.x server","voxel FPS server"] --- # BattleSpades dedicated server > Explore BattleSpades, the playable clean-room Ace of Spades server with authoritative physics, VXL maps, bots, and six game modes. BattleSpades is a from-scratch dedicated server for the Ace of Spades 1.x Battle Builder protocol. It reconnects the original game clients to a modern, inspectable server core without pretending that network compatibility alone is enough: movement, combat, building, entities, objectives, and world mutation all have to feel correct. ![Ace of Spades engineer studying a blueprint beside a block-built desert construction site](https://aosplay.net/game/ui/ace-of-spades-battle-builder-construction.jpg) _Battle Builder is a shooter and construction sandbox at the same time; the server has to understand both halves._ ## At a glance | Value | Meaning | | --- | --- | | 866 | unit and regression tests | | 60 Hz | authoritative simulation | | <5 ms | 50-player tick p99 gate | | 0.0.2 | portable alpha series | ## A real server, not a packet relay _The aim is a complete and hackable server that behaves like the original authority expected by the retail client._ BattleSpades accepts the stock Steam client, the non-Steam client, and the open revival client build. Connection compatibility is only the first layer. The server re-simulates players, resolves combat, owns the voxel world, advances game modes, and distributes state back to every connected peer. That server-authoritative model matters because it creates one shared truth. A player may predict movement locally so controls feel immediate, but the fixed-rate server remains responsible for the result. The implementation was calibrated against the compiled client instead of relying on remembered behavior or approximate constants. > **Current status — Playable alpha.** Core netcode and gameplay are working with real clients. The project is usable today while the remaining packet surface and presentation details continue to be recovered. ## What already works The current server covers the complete minute-to-minute combat loop: walking, sprinting, crouching, wading, climbing, jumping, hitscan weapons, headshots, grenades, damage, kill feeds, graves, timed respawns, ammo crates, and health crates. Block placement and destruction operate on the exact aimed cell, with debris and structure collapse propagated to clients. Six modes give those systems a purpose rather than leaving them as disconnected demonstrations. Team Deathmatch, Capture the Flag, Classic CTF, Arena, gangster VIP, and Zombie infection each have their own runtime rules and objective flow. - Full VXL map streaming with CRC validation - BlockLine construction, spade digging, bullet damage, and flood-fill collapse - Grenade fuse, bounce, line-of-sight blast damage, and 3×3×3 terrain destruction - Objective-aware bots with voxel navigation and class actions - Player and administrator commands, team management, and plugin hooks ## Readable logic with compiled hot paths BattleSpades splits responsibilities deliberately. Python holds the game rules, modes, players, commands, plugins, and orchestration where maintainers need clarity. Cython handles physics, VXL and KV6 operations, byte-level packet work, and vector math where predictable performance matters. The ENet transport uses the same protocol family as the original client: protocol version 168, a single channel, and range-coder compression. Networking and gameplay drains have explicit budgets so a burst of packets, world mutations, entity work, or plugin activity cannot quietly consume the entire tick. - aoslib: compiled physics, VXL world operations, and KV6 voxel models - shared: packet readers, writers, protocol types, and vector math - server: 60 Hz loop, connections, players, combat, and world management - modes: isolated rules for TDM, CTF, Arena, VIP, and Zombie play - plugins and commands: customization without rewriting the simulation core ## Measured against the client Reverse engineering becomes useful only when findings are repeatable. BattleSpades keeps captured behavior, packet research, deterministic scenarios, and regression tests close to the implementation. Movement replay gates compare client and server trajectories over thousands of frames, with the accepted mean position delta in the millimetre range. Capacity validation is executable rather than aspirational. The current Windows and Python 3.12 baseline sustains the 50-player gate at roughly 60 Hz with sub-5 ms tick p99. That does not promise identical results on every host, but it provides a published baseline that future changes must continue to meet. > **Why this matters — Parity is a maintained property.** A server can compile and still feel wrong. Regression fixtures make movement, packet ordering, block edits, bots, and modes reviewable engineering targets. ## Run it or build it Portable alpha archives package the launcher, native runtime, editable configuration, maps, prefabs, plugins, and license notices. Builds are prepared for Windows, Linux, and macOS on x86-64 and ARM64, so hosting does not require a system Python installation or local compiler. Developers can build from source with Python 3.10 through 3.12 and a C/C++ compiler. The repository includes installation scripts, release checks, operator documentation, protocol notes, and contribution guidance. Start with the hosting guide if the goal is a game night; start with the repository if the goal is changing the battlefield. ## Frequently asked questions ### Does BattleSpades work with the original Ace of Spades client? Yes. It is designed for the original Ace of Spades 1.x Battle Builder protocol and is tested with the stock Steam client, the non-Steam client, and the open revival client build. ### Is BattleSpades a fork of an old dedicated server? No. It is a clean-room, from-scratch implementation built from observed client behavior, packet research, and repeatable verification. ### Can I add custom modes or server behavior? The readable Python game layer, mode modules, commands, and plugin hooks are intended to make experimentation possible without forcing every change into compiled physics code. ### How many players can it host? The default configuration uses 24 player slots. An executable performance gate validates a 50-player workload at approximately 60 Hz with sub-5 ms tick p99 on the documented Windows baseline. ## Related reading - [How to host a BattleSpades server](https://aosplay.net/host-a-server) ([Markdown](https://aosplay.net/docs/host-a-server.md)) - [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) ([Markdown](https://aosplay.net/docs/protocol-168.md)) - [The open Ace of Spades revival client](https://aosplay.net/revival-client) ([Markdown](https://aosplay.net/docs/revival-client.md)) --- Source: [BattleSpades dedicated server](https://aosplay.net/dedicated-server) Maintained by Ace of Spades Revival contributors. --- --- title: "The open Ace of Spades revival client" description: "Follow the open Ace of Spades Revival client preserving Battle Builder compatibility, voxel combat, construction, destruction, and community development." canonical: "https://aosplay.net/revival-client" markdown: "https://aosplay.net/docs/revival-client.md" last_updated: "2026-07-16" content_type: "Article" keywords: ["Ace of Spades revival client","Ace of Spades Battle Builder client","open source voxel shooter","BattleSpades client","Ace of Spades community project"] --- # The open Ace of Spades revival client > Follow the open Ace of Spades Revival client preserving Battle Builder compatibility, voxel combat, construction, destruction, and community development. A preserved server still needs a durable way for players to enter the game. The revival client is the community-owned path back into Battle Builder: compatible with the rebuilt server, honest about its current development state, and focused on protecting the game’s particular combination of shooting, construction, destruction, and class-driven chaos. ![Block-built green battlefield with an Ace of Spades engineer facing a zombie soldier](https://aosplay.net/game/ui/ace-of-spades-battle-builder-battlefield.jpg) _The client work preserves more than connectivity: controls, presentation, classes, tools, and the rhythm of a destructible battlefield all matter._ ## At a glance | Value | Meaning | | --- | --- | | OPEN | community-owned direction | | 1.x | Battle Builder target | | 168 | compatible protocol | | ACTIVE | development status | ## Why an open client matters A closed executable can remain playable for years, but every operating-system change, driver regression, unavailable service, and undocumented assumption increases the chance that one day it simply stops. An open client turns those risks into work the community can inspect, discuss, test, and repair. The goal is not to sand away the identity of Battle Builder. The chunky silhouettes, readable team colors, dramatic voxel destruction, class equipment, map tools, and slightly unruly sandbox are the reason the project exists. Modern maintenance should protect that character rather than replace it with a generic shooter. > **Design principle — Preservation before reinvention.** Compatibility and recognizable play come first. New ideas can grow from a stable foundation once players can reliably return to the original experience. ## One battlefield, shared rules The revival client and BattleSpades server are separate projects with a shared contract. The server owns authoritative world state and game rules; the client handles input, prediction, rendering, sound, menus, and the player’s immediate view of the match. Protocol 168 compatibility is the bridge between them. Keeping that boundary documented allows the client to be tested against the new dedicated server while the server remains usable by original clients. It also prevents either side from quietly inventing behavior the other cannot understand. - Connect to BattleSpades through the established 1.x network contract - Preserve client prediction while accepting authoritative reconciliation - Receive VXL worlds, entities, objectives, players, and match state - Keep packet changes documented so compatibility is deliberate ## The Battle Builder experience Ace of Spades works because different fantasies share the same map. A marksman reads distant silhouettes. An engineer sees a defensive line that does not exist yet. A miner sees the route underneath it. A rocketeer sees the structure everyone else assumed was permanent. That interaction puts unusual demands on a client. Terrain is not background decoration; it is navigable state, cover, ammunition, objective strategy, and a source of debris. Menus, class selection, map previews, blueprint tools, hit feedback, world updates, and sound cues all help players understand a battlefield that changes every second. ## Current development focus The client is in development, so this page avoids pretending that every platform, feature, and release channel is finished. The durable target is clear: a maintainable client that can join the same matches as the original game and the BattleSpades server. Progress is most valuable when it can be reproduced. Client work benefits from the same captured packet sequences, retail behavior notes, physics fixtures, and real-server playtests used by the dedicated server. A visual fix that breaks the wire contract is not a fix, and a compatible packet decoder is not enough if the result is unpleasant to play. ## How players and builders can help Client preservation needs a wider range of contributors than network programmers. Build testing, GPU and operating-system coverage, input testing, UI comparison, sound verification, map loading, screenshots, documentation, and clear bug reports all reduce uncertainty. The most useful report includes the build, operating system, hardware, steps to reproduce, expected behavior, observed behavior, and a short capture when visuals or timing are involved. Join the community before starting a large change so effort lands where it can unblock the project. ## Frequently asked questions ### Is the revival client finished? No. It is an active development project. The site labels it that way deliberately and points players to the community for current build and playtest information. ### Will it connect to BattleSpades? Compatibility with the BattleSpades dedicated server is a core target, using the documented Ace of Spades 1.x protocol boundary. ### Does this replace the original art direction? The preservation goal is to retain the recognizable Battle Builder identity—voxel environments, classes, tools, readable UI, construction, and destruction—while making the implementation maintainable. ### Can non-programmers contribute? Yes. Hardware testing, accessibility feedback, comparison captures, documentation, map checks, sound checks, and reproducible bug reports are all useful. ## Related reading - [BattleSpades dedicated server](https://aosplay.net/dedicated-server) ([Markdown](https://aosplay.net/docs/dedicated-server.md)) - [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) ([Markdown](https://aosplay.net/docs/protocol-168.md)) - [About the Ace of Spades Revival](https://aosplay.net/about) ([Markdown](https://aosplay.net/docs/about.md)) --- Source: [The open Ace of Spades revival client](https://aosplay.net/revival-client) Maintained by Ace of Spades Revival contributors. --- --- title: "A master server for reconnecting the community" description: "Explore the Ace of Spades master server implementation for verified community registration, heartbeats, discovery, moderation, and the Battle Builder server browser." canonical: "https://aosplay.net/master-server" markdown: "https://aosplay.net/docs/master-server.md" last_updated: "2026-07-17" content_type: "TechArticle" keywords: ["Ace of Spades master server","Battle Builder server browser","game server discovery API","BattleSpades matchmaking","Ace of Spades server list"] --- # A master server for reconnecting the community > Explore the Ace of Spades master server implementation for verified community registration, heartbeats, discovery, moderation, and the Battle Builder server browser. The dedicated server makes matches possible. The master server makes them findable. This service is the small, dependable connective layer between hosts, clients, and the public server browser—not a replacement for game servers and not a mandatory dependency once a match begins. ![Tiny voxel engineers constructing a large wooden building in an Ace of Spades desert map](https://aosplay.net/game/ui/ace-of-spades-battle-builder-construction.jpg) _The next phase is infrastructure: helping independent hosts become visible without taking ownership away from them._ ## At a glance | Value | Meaning | | --- | --- | | NEXT | project phase | | HTTP | public service boundary | | UDP | game server health | | OPEN | documented contract | ## Discovery is the missing bridge A dedicated server can be healthy and still feel invisible. Players need a current list of reachable matches, useful names, map and mode information, occupancy, version compatibility, and enough health context to avoid repeatedly joining dead endpoints. Hosts need the opposite side of that exchange: a simple way to announce a server, refresh its presence, update match metadata, and disappear naturally when heartbeats stop. The master server’s first responsibility is to make that exchange boring, fast, and reliable. > **Status — Registration and moderation are now implemented.** Community hosts can request registration, pass a live UDP A2S_INFO probe, and receive a server-scoped credential. Listings remain short-lived, auditable, and removable by operators. ## A deliberately narrow service The master server should not simulate matches, stream VXL maps, resolve combat, or become a mandatory gameplay dependency after connection. Those jobs belong to BattleSpades and other compatible dedicated servers. Its core domain is registration and discovery. A host presents an endpoint and public metadata. The service validates what it safely can, records a short-lived listing, and exposes an efficient read model to compatible clients and web tools. - Register or refresh a dedicated server listing - Expire stale records when signed heartbeats stop - Expose filtered, paginated discovery for clients - Report map, mode, occupancy, region, build, and compatibility - Keep administrative moderation separate from ordinary listing writes ## The first API contract The write path is intentionally small: registration establishes a verified listing, heartbeat refreshes liveness and mutable match data, and deregistration allows a clean shutdown. A read endpoint returns normalized listings without exposing internal moderation fields or unnecessary host information. Versioning belongs in the URL or negotiated schema from day one. The clients and server binaries will not all update together, so additive evolution and explicit compatibility ranges are safer than silently changing a payload used by live builds. 1. **Register.** The host supplies its public endpoint, server identity, compatibility range, and initial match summary. 2. **Verify.** The service challenges or observes the endpoint so arbitrary third parties cannot list servers they do not control. 3. **Heartbeat.** A short-lived lease is refreshed with occupancy, current map, mode, and health information. 4. **Discover.** Clients request a compact, cache-friendly list and make the final game connection directly to the host. ## Abuse resistance without needless surveillance Public registration attracts spoofing, floods, misleading names, and endpoints that disappear. Rate limits, short leases, endpoint verification, payload limits, audit trails, and operator tools are basic reliability requirements—not optional polish. The service should collect the minimum information required to operate discovery. Public server metadata is expected to be public; private player data is not. Logs need bounded retention, secrets need rotation, and moderation decisions need enough history to be reviewable without turning the service into a player tracking system. - No plaintext administrative credentials in registration payloads - Bounded names, descriptions, tags, and heartbeat sizes - Per-identity and per-network rate limits with sensible burst capacity - Short expiration windows so stale servers remove themselves - Health and moderation signals kept distinct from public claims ## A staged route to production The contract, persistent registration store, public directory, operator controls, and server-scoped credentials are now in place. The next production gate is exercising UDP verification and lease renewal with real community hosts across home, cloud, and hosted networks. A fallback matters. Players should still be able to connect directly by address when discovery is unavailable. That single decision prevents an outage in a convenience service from becoming an outage in every independent match. ## Frequently asked questions ### Is the master server already live? No. It is the next implementation phase. This page documents the proposed scope and design principles before the API is built. ### Will matches run through the master server? No. It is intended for registration and discovery. Once a player chooses a server, the game connection goes directly to that dedicated host. ### Will direct IP connections still work? They should. Direct connection is an important fallback and keeps independent servers playable during discovery outages. ### Is player tracking required? No. A useful server list needs public server and match metadata, not a centralized history of every player. ## Related reading - [BattleSpades dedicated server](https://aosplay.net/dedicated-server) ([Markdown](https://aosplay.net/docs/dedicated-server.md)) - [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) ([Markdown](https://aosplay.net/docs/protocol-168.md)) - [About the Ace of Spades Revival](https://aosplay.net/about) ([Markdown](https://aosplay.net/docs/about.md)) --- Source: [A master server for reconnecting the community](https://aosplay.net/master-server) Maintained by Ace of Spades Revival contributors. --- --- title: "Inside the Ace of Spades protocol 168" description: "A readable guide to Ace of Spades protocol 168: ENet transport, packet research, VXL map streaming, prediction, and clean-room verification." canonical: "https://aosplay.net/protocol-168" markdown: "https://aosplay.net/docs/protocol-168.md" last_updated: "2026-07-16" content_type: "TechArticle" keywords: ["Ace of Spades protocol 168","Battle Builder network protocol","Ace of Spades packet documentation","ENet voxel game protocol","VXL map protocol"] --- # Inside the Ace of Spades protocol 168 > A readable guide to Ace of Spades protocol 168: ENet transport, packet research, VXL map streaming, prediction, and clean-room verification. Protocol 168 is the language shared by the Battle Builder client and dedicated server. Rebuilding it means more than assigning names to packet IDs: ordering, reliability, binary layout, state ownership, timing, compression, and the client’s local prediction all affect what players actually experience. ![Tokyo Neon Ace of Spades map preview with dense voxel city buildings](https://aosplay.net/game/maps/tokyoneon.png) _A protocol carries more than player positions: the complete match scene, changing VXL terrain, entities, rules, objectives, and presentation state cross the wire._ ## At a glance | Value | Meaning | | --- | --- | | 168 | protocol identifier | | ENet | reliable UDP transport | | 1 | network channel | | VXL | streamed voxel worlds | ## ENet underneath the battlefield BattleSpades uses ENet 1.3.17 through a pinned pyenet wrapper and vendored C sources. The Battle Builder contract uses protocol version 168, one ENet channel, and range-coder compression. Pinning the transport source makes release builds reproducible across supported systems and avoids depending on obsolete binary packages. Reliable UDP is useful here because different messages have different needs. Connection management and important state can use ENet’s reliability machinery without forcing every real-time update into a TCP stream where one delayed packet stalls everything behind it. ## A packet catalog with evidence The protocol catalog records packet IDs, direction, reliability, implementation state, handlers, sources, and validation notes. Known behavior and planned recovery are separated so a partially understood message is not presented as settled truth. That distinction is especially important for a retail protocol with broad presentation and mode surfaces. Building, entities, roster state, combat effects, match lifecycle, UI messages, objectives, deployables, scene rollover, and authentication do not all become clear at the same time. - Client-to-server input, aim, actions, chat, class, and team requests - Server-to-client world updates, entities, effects, rules, and objectives - Scene and resource messages used during map and mode transitions - Retail behavior notes for VIP, Zombie, CTF, blocks, and equipment - Explicit planned categories where evidence is still incomplete > **Documentation rule — Unknown is a valid state.** Marking a packet or field as planned is more useful than assigning a confident name that sends future reverse engineering in the wrong direction. ## Client prediction changes the meaning of movement The client does not wait for a round trip before showing every step. It predicts local movement, then consumes authoritative server updates. A compatible server therefore needs the same practical physics model and reconciliation expectations, not merely the ability to decode input bits. BattleSpades uses deterministic fixtures and captured client behavior to calibrate walking, sprinting, crouching, wading, climbing, gravity, friction, jumping, and owner-row updates. Position parity is measured over long sequences because a tiny per-frame difference can become a visible correction seconds later. ## VXL maps are live network state The map begins as a streamed VXL resource with CRC validation, but it immediately becomes mutable shared state. Block lines, individual placement, digging, bullet damage, explosive damage, color, prefabs, and collapse all need stable ordering so every client ends with the same world. KV6 voxel models cover a different layer: entities and prefabs rather than the terrain volume itself. Keeping formats and responsibilities explicit prevents a visual resource problem from being misdiagnosed as a map synchronization problem. ## From observation to regression test The clean-room workflow begins with observable behavior: captures, instrumented clients, controlled input, packet traces, and repeatable scenarios. A finding is documented with its evidence, implemented at the correct ownership layer, then protected by a regression test or real-client validation gate. This turns the protocol archive into more than a reference for BattleSpades. It becomes a map for client developers, alternative server implementations, tool authors, and future maintainers trying to understand why a seemingly odd field or ordering constraint exists. 1. **Observe.** Create a narrow scenario and capture what the retail client sends, receives, and displays. 2. **Describe.** Record direction, layout, reliability, timing, uncertainty, and links to supporting evidence. 3. **Implement.** Place behavior in transport, protocol, simulation, world, mode, or presentation code according to ownership. 4. **Verify.** Replay fixtures and retest with real clients so later changes cannot silently erase parity. ## Frequently asked questions ### What does protocol 168 mean? It is the protocol identifier used by the targeted Ace of Spades 1.x Battle Builder network contract. Compatible clients and servers must agree on that contract. ### Does protocol documentation contain original game source code? No. The project documents observable wire formats and behavior for a clean-room implementation. ### Why use ENet instead of raw UDP? ENet provides connection management, sequencing, reliability choices, and congestion-aware delivery while retaining the low-latency characteristics useful to a real-time game. ### Are all packets fully understood? No. The catalog distinguishes implemented, observed, partially understood, and planned areas so uncertainty remains visible. ## Related reading - [BattleSpades dedicated server](https://aosplay.net/dedicated-server) ([Markdown](https://aosplay.net/docs/dedicated-server.md)) - [A master server for reconnecting the community](https://aosplay.net/master-server) ([Markdown](https://aosplay.net/docs/master-server.md)) - [How to host a BattleSpades server](https://aosplay.net/host-a-server) ([Markdown](https://aosplay.net/docs/host-a-server.md)) --- Source: [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) Maintained by Ace of Spades Revival contributors. --- --- title: "How to host a BattleSpades server" description: "Host an Ace of Spades Battle Builder server with BattleSpades: portable releases, configuration, UDP port 27015, bots, maps, and security." canonical: "https://aosplay.net/host-a-server" markdown: "https://aosplay.net/docs/host-a-server.md" last_updated: "2026-07-16" content_type: "TechArticle" keywords: ["host Ace of Spades server","BattleSpades hosting guide","Ace of Spades server port 27015","Battle Builder private server","run voxel game server"] --- # How to host a BattleSpades server > Host an Ace of Spades Battle Builder server with BattleSpades: portable releases, configuration, UDP port 27015, bots, maps, and security. You can run a private playtest, a community game night, or a persistent public server without rebuilding the original backend. The fastest path is a portable BattleSpades alpha; the source path is better when you plan to change modes, commands, plugins, protocol behavior, or the simulation itself. ![Castle Wars Ace of Spades map preview showing opposing voxel fortifications](https://aosplay.net/game/maps/castlewars.png) _A private Castle Wars match is a good first deployment: small group, familiar objectives, and plenty of world mutation to validate._ ## At a glance | Value | Meaning | | --- | --- | | 27015 | default UDP port | | 24 | default player slots | | 6 | implemented modes | | 3 | desktop operating systems | ## Choose a portable or source build Portable 0.0.2 alpha archives are the shortest route to a running host. They include the launcher, Python and native runtime, configuration, VXL maps, KV6 prefabs, plugin directory, and notices. Select the archive for Windows, Linux, or macOS and for x86-64 or ARM64. A source build supports Python 3.10 through 3.12, with Python 3.12 as the primary development target. You also need a C/C++ toolchain because Cython extensions and the pinned ENet transport are compiled locally. > **Before publishing — Change the default administrator password.** The sample configuration uses changeme. Replace it before opening UDP port 27015 to the internet. ## Start a portable server Extract the entire archive rather than copying only the executable. Maps, native libraries, configuration, plugins, and notices are part of the runtime. Run the built-in check first so missing files or an invalid configuration fail before players arrive. The first macOS alpha is unsigned and not notarized, so the host may need an explicit local Gatekeeper override. That is an operator decision; the release does not claim Apple notarization. **Portable validation and launch** ~~~text Windows .\BattleSpades.exe --check .\BattleSpades.exe Linux or macOS ./BattleSpades --check ./BattleSpades ~~~ ## Build from source Use a virtual environment so compiled dependencies stay isolated from other Python projects. The platform install scripts clone dependencies, build the extensions, and leave the normal Python entry point available for development. Stop the server before rebuilding Cython extensions. A running Windows process locks the loaded native modules, and rebuilding over them will fail. **Clone, install, and run** ~~~text Linux or macOS git clone https://github.com/KikoTs/BattleSpades.git cd BattleSpades ./scripts/install.sh python run_server.py Windows PowerShell git clone https://github.com/KikoTs/BattleSpades.git cd BattleSpades .\scripts\install.ps1 python run_server.py ~~~ ## Configure the match before opening the port The editable config.toml file controls identity, networking budgets, maps, modes, bots, game rules, classes, equipment, weapons, administration, and plugins. Start with a small, predictable setup and change one category at a time. The simulation tick rate should remain 60 unless you are actively developing and validating client parity. It is not a generic performance knob: client behavior is calibrated around the current fixed rate. - Set a recognizable server name and choose the default VXL map - Choose tdm, ctf, classic_ctf, arena, vip, or zombie as the default mode - Keep the default 24 slots for a first public test, then measure before raising it - Set bot_count to populate an empty server or test objectives - Review friendly fire, fall damage, block damage, respawn, class, and equipment rules - Set strong administrative credentials and remove values you do not use ## Network and firewall checklist BattleSpades listens on UDP port 27015 by default. A host behind a home router normally needs a UDP port-forward from the public address to the machine running the server. The operating-system firewall must allow the same inbound UDP port. Test locally first, then from another device on the local network, and finally from outside the network. A local connection proves the server is running; it does not prove the router, carrier, cloud security group, or upstream network permits public traffic. 1. **Local.** Connect a compatible client to 127.0.0.1:27015 on the host machine. 2. **LAN.** Connect from a second device using the host’s private network address. 3. **Public.** Forward UDP 27015 and test from a different internet connection. 4. **Observe.** Watch logs, tick timing, packet backlog, map transitions, and reconnect behavior during a real match. ## Publish a verified community listing Once the server is reachable from the public internet, send its game and query ports to POST /api/master/servers/register on the revival website. The service uses the source address it observes instead of trusting a caller-supplied IP address, then imports the server name, map, mode, region, version, and population from a verified UDP A2S_INFO response. A successful probe creates a community listing and returns a server-scoped token once. Store that token as a secret and use it for heartbeats from that server only. A timed-out or invalid probe remains pending and is never silently published; fix the firewall, forwarding, or server response and request verification again. - Expose the configured game port over UDP before registering - Send only the public game and query ports; live match metadata comes from A2S - Keep the returned aos_srv token private and rotate it by registering again if it is exposed - Use the scoped token for that server's heartbeat rather than the internal master write token - Keep direct-connect instructions available so discovery outages never stop independent play ## Operate it like a small service Back up configuration, custom maps, prefabs, plugins, and moderation data before upgrades. Validate a new archive or source revision on a separate port before replacing a working public instance. For ongoing hosting, use a service manager appropriate to the operating system, capture logs with bounded retention, and document who can restart or administer the process. The repository runbook contains the deeper capacity, parity, bot, map, mode, and release validation gates used by the project. ## Frequently asked questions ### Do players need Python installed? No. Players only need a compatible client. Hosts using a portable BattleSpades archive also do not need a system Python installation or compiler. ### Which port should I forward? The default is UDP port 27015. If you change the configured port, update the operating-system firewall, router or cloud security rule, and the address shared with players. ### Can I host a match with bots only? Yes. The configurable bot worker supports voxel navigation, class actions, and roles for the implemented modes, which is useful for development and low-population sessions. ### Should I change the 60 Hz tick rate? Not for ordinary hosting. The server and client parity work is calibrated around a 60 Hz simulation, and changing it can alter movement and reconciliation behavior. ## Related reading - [BattleSpades dedicated server](https://aosplay.net/dedicated-server) ([Markdown](https://aosplay.net/docs/dedicated-server.md)) - [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) ([Markdown](https://aosplay.net/docs/protocol-168.md)) - [A master server for reconnecting the community](https://aosplay.net/master-server) ([Markdown](https://aosplay.net/docs/master-server.md)) --- Source: [How to host a BattleSpades server](https://aosplay.net/host-a-server) Maintained by Ace of Spades Revival contributors. --- --- title: "About the Ace of Spades Revival" description: "Meet Ace of Spades Revival, the independent community preserving Battle Builder through a clean-room server, open client, protocol research, and hosting." canonical: "https://aosplay.net/about" markdown: "https://aosplay.net/docs/about.md" last_updated: "2026-07-16" content_type: "AboutPage" keywords: ["Ace of Spades Revival","Battle Builder community","Ace of Spades preservation","BattleSpades project","voxel game revival"] --- # About the Ace of Spades Revival > Meet Ace of Spades Revival, the independent community preserving Battle Builder through a clean-room server, open client, protocol research, and hosting. Ace of Spades: Battle Builder made construction, destruction, class equipment, and competitive shooting part of the same decision. The revival exists because that design remains worth playing—and because a community should not lose the ability to gather when an old service disappears. ![Mayan Jungle Ace of Spades map preview with a large stepped voxel temple surrounded by trees](https://aosplay.net/game/maps/mayanjungle.png) _Preservation is practical: keep the maps loadable, the protocol understandable, the servers runnable, and the community able to meet._ ## At a glance | Value | Meaning | | --- | --- | | CLEAN | from-scratch server core | | OPEN | repositories and research | | REAL | client-backed verification | | NEXT | master server API | ## Preserve the ability to play The project’s practical goal is straightforward: a compatible client, a dedicated server anyone can operate, documentation that survives individual maintainers, and a discovery service that helps players find independent hosts. Preservation does not mean freezing every implementation choice forever. It means protecting the recognizable experience and the evidence needed to make informed changes. Stable compatibility creates room for accessibility work, platform support, new tools, custom modes, and experiments without erasing the baseline. ## How the work is done The dedicated server is a clean-room implementation based on observed client behavior, packet captures, measured physics, controlled scenarios, and public documentation. It does not rely on possession of an original dedicated-server source tree. Claims are tied to runnable work. Features move from observation to implementation, regression coverage, real-client validation, and operator documentation. Current limitations remain visible because an honest planned label is more useful to contributors than a polished fiction. 1. **Reverse.** Observe the client, isolate behavior, capture evidence, and document uncertainty. 2. **Rebuild.** Implement the smallest correct ownership layer in readable, testable code. 3. **Verify.** Replay fixtures and test real clients, modes, maps, bots, and capacity. 4. **Reconnect.** Package releases, support hosts, improve discovery, and organize playtests. ## Project values Compatibility is treated as a measurable contract. Performance claims need a baseline. Security defaults should protect a first-time host. Documentation should explain why a constant or packet exists, not only repeat its name. Community work also needs readable progress. The portfolio, public repositories, focused docs, release checks, and operation board exist so players can see what is playable, developers can find evidence, and contributors can choose work with a clear definition of done. - People-first documentation instead of keyword-shaped filler - Real-client evidence instead of folklore - Portable releases instead of a development-only demo - Independent hosting instead of a single mandatory operator - Visible uncertainty instead of inflated completion claims - Accessible interfaces and useful text alternatives for project media ## Independent and unofficial Ace of Spades Revival is an independent community preservation project and is not an official release or affiliated with the original publisher. References to the game identify the compatibility target and the experience being preserved. The portfolio uses visual materials already present in the local revival workspace to communicate the original Battle Builder design language. Project code, third-party dependencies, fonts, and game assets retain their respective notices and licenses; contributors should review the repositories before redistribution. > **Trust and accuracy — Status language is intentional.** BattleSpades is playable. The revival client is in development. The master server is planned. Keeping those states distinct helps players and contributors make informed decisions. ## There is more than one way to contribute Protocol and systems work are important, but a durable revival also needs server operators, map makers, testers, technical writers, release verification, accessibility review, moderation planning, and people willing to organize a match. Start by reading the page closest to your interest. Run a server if you want operational feedback. Review protocol 168 if you enjoy evidence-driven reverse engineering. Test the client if you can describe reproducible visual or input behavior. Join the community before taking on a large branch so the result lands where it helps. ## Frequently asked questions ### Is this project affiliated with the original publisher? No. Ace of Spades Revival is an independent, unofficial community preservation project. ### Why rebuild both a client and a server? A durable multiplayer game needs both sides of the connection. The server preserves shared rules and hosting; the client preserves access, presentation, input, and the player experience. ### Why publish protocol research? Public evidence reduces duplicated work, makes compatibility reviewable, and helps future client, server, and tool developers understand the contract. ### Do I need to be a programmer to help? No. Testing, hosting, maps, captures, documentation, accessibility feedback, moderation planning, and playtest organization are all valuable. ## Related reading - [BattleSpades dedicated server](https://aosplay.net/dedicated-server) ([Markdown](https://aosplay.net/docs/dedicated-server.md)) - [The open Ace of Spades revival client](https://aosplay.net/revival-client) ([Markdown](https://aosplay.net/docs/revival-client.md)) - [A master server for reconnecting the community](https://aosplay.net/master-server) ([Markdown](https://aosplay.net/docs/master-server.md)) --- Source: [About the Ace of Spades Revival](https://aosplay.net/about) Maintained by Ace of Spades Revival contributors. --- --- title: "Ace of Spades Revival Player Identity" description: "Understand Ace of Spades Revival accounts, signed guest profiles, original Steam owner validation, unique nicknames, join tickets, and leaderboard trust." canonical: "https://aosplay.net/account" markdown: "https://aosplay.net/docs/account.md" last_updated: "2026-07-16" content_type: "TechArticle" keywords: ["Ace of Spades account","Ace of Spades Steam authentication","BattleSpades guest mode","Ace of Spades leaderboard profile","Protocol 168 SteamSessionTicket"] --- # Ace of Spades Revival Player Identity > Understand Ace of Spades Revival accounts, signed guest profiles, original Steam owner validation, unique nicknames, join tickets, and leaderboard trust. The revival identity system gives every connection a durable player record without forcing every player through the same credential method. A revival username and password works across the site and launcher, a signed installation provides immediate guest play, and original Steam customers keep the retail client’s native session-ticket path. ![Ace of Spades engineer reading plans beside a desert voxel construction project](https://aosplay.net/game/ui/ace-of-spades-battle-builder-construction.jpg) _Three credential routes resolve to one player record: revival password, signed guest installation, or validated original Steam ownership._ ## At a glance | Value | Meaning | | --- | --- | | 3 | supported identity routes | | 10 MIN | default one-use join-code lifetime | | ARGON2ID | password hashing | | 105 | retail Steam ticket packet | ## Credentials prove access; the player record owns progress A nickname is presentation, not proof of identity. The database assigns an internal UUID, a public opaque player ID, and a legacy-compatible numeric ID. Credentials live in separate records and resolve to that player. Statistics, moderation state, and leaderboard history attach to the player record instead of a mutable name. This separation lets a guest upgrade to a password account without losing history and lets a Steam owner participate without inventing a revival password. It also leaves room for carefully reviewed account linking later without rewriting the score model. ## Revival username and password Revival usernames are unique case-insensitively and double as in-game nicknames. They use 3–24 ASCII letters, numbers, or underscore, begin with a letter, and cannot use reserved project or guest prefixes. Passwords are accepted only over the HTTPS API and hashed with Argon2id before storage. The service returns an opaque session: an HttpOnly SameSite cookie for the website or a bearer token for the launcher. Session tokens are random and stored only as SHA-256 hashes in PostgreSQL. - No email address or real name is required - Passwords must contain 12–128 characters - A one-time offline recovery code replaces email-based reset - Changing or recovering a password revokes existing sessions - Database-backed rate limits apply across app instances ## Guest play without a hardware identifier The launcher generates an Ed25519 key pair for a guest installation. The private key remains on the player’s device. To reconnect, the launcher signs a short-lived server challenge; the service stores only the public key and a SHA-256 fingerprint. New guest records receive a random Guest-XXXXXXXX nickname. The reserved prefix prevents confusion with registered callsigns. Guests are deliberately unranked until upgraded, but their local history can remain attached to the same player record during an upgrade. > **Privacy choice — A random key is better than an HWID.** Hardware fingerprints are difficult to rotate, can be unexpectedly identifying, and still can be spoofed. A locally generated signing key proves continuity without inventorying the player’s machine. ## Original Steam owners remain first-class players The retail client sends Protocol 168 packet 105 immediately after ENet connection. Its payload is a little-endian 32-bit ticket length followed by that many opaque Steam authentication bytes. Because this packet has no separate SteamID and the recovered 2014 wrapper exposes the old connect-auth lifecycle, unmodified retail compatibility uses the matching Steam Game Server legacy flow: SendUserConnectAndAuthenticate returns the candidate SteamID, then GSClientApprove or GSClientDeny makes the final decision. A modern GetAuthSessionTicket/BeginAuthSession flow is a separate option only when a claimed SteamID is carried through an authenticated side channel; the old and new APIs must not be mixed in one session. After Valve validates the ticket for the allowed original AppID, a trusted server bridge sends the master service the verified SteamID64, AppID, callback timestamp, server ID, and only a SHA-256 ticket digest. The master never stores the raw ticket. It creates or resolves a Steam-backed player whose legacy numeric ID is the SteamID64, preserving compatibility with the retail profile and leaderboard requests. A client-supplied SteamID, persona name, ticket digest, or Spacewar identity is not proof of ownership. The private bridge endpoint accepts only a fresh attestation from a controlled server that actually received GSClientApprove for the retail flow or ValidateAuthTicketResponse with OK for the modern flow. **Retail packet 105 application payload** ~~~text 69 packet_id = 105 NN NN NN NN ticket_size, u32 little-endian [.. N opaque bytes ..] Steam session ticket ~~~ ## A client never awards its own score After website or launcher authentication, the client requests a short-lived join ticket scoped to one server. The dedicated server consumes it once and receives the canonical player record. Original Steam connections reach the same record through the validated packet-105 path. Only an authenticated dedicated server can submit a match event. Events carry an idempotency key so retries cannot double-award statistics. The service ignores a client-provided display name when a canonical account nickname is available and uses the database identity as the leaderboard key. 1. **Authenticate.** Verify a password, guest signature, or Valve session ticket. 2. **Resolve.** Map the successful proof to exactly one durable player record. 3. **Bind.** Lock a short-lived join ticket or Steam session to the target game server. 4. **Ingest.** Accept idempotent statistics only from an authenticated server authority. ## Frequently asked questions ### Do original Steam owners need to create a revival account? No. A successfully validated retail Steam session resolves directly to a Steam-backed revival player record. ### Why not use Steam Spacewar AppID 480 for identity? Spacewar is Valve’s SDK example and proves access to the example AppID, not ownership of Ace of Spades. Original-owner validation must use an authorized path for the original game AppID. ### Can guests choose any nickname? Guests receive a server-generated Guest-XXXXXXXX name. This avoids impersonation and collisions while keeping registration optional. ### Are recovery codes emailed? No email is collected. The code is shown once and must be stored offline by the player. ## Related reading - [A master server for reconnecting the community](https://aosplay.net/master-server) ([Markdown](https://aosplay.net/docs/master-server.md)) - [Inside the Ace of Spades protocol 168](https://aosplay.net/protocol-168) ([Markdown](https://aosplay.net/docs/protocol-168.md)) - [Ace of Spades Revival Privacy Notes](https://aosplay.net/privacy) ([Markdown](https://aosplay.net/docs/privacy.md)) --- Source: [Ace of Spades Revival Player Identity](https://aosplay.net/account) Maintained by Ace of Spades Revival contributors. --- --- title: "Ace of Spades Revival Privacy Notes" description: "A plain-language description of the account, guest, Steam, session, security, and gameplay data the Ace of Spades Revival service is designed to process." canonical: "https://aosplay.net/privacy" markdown: "https://aosplay.net/docs/privacy.md" last_updated: "2026-07-16" content_type: "WebPage" keywords: ["Ace of Spades Revival privacy","BattleSpades account data","Steam ticket privacy","guest profile privacy"] --- # Ace of Spades Revival Privacy Notes > A plain-language description of the account, guest, Steam, session, security, and gameplay data the Ace of Spades Revival service is designed to process. The revival service is designed to collect the minimum information needed to keep accounts secure, reconnect guest installations, validate original Steam owners, operate servers, and maintain player statistics. It does not require an email address, real name, or hardware inventory. ![Blue Ace of Spades construction blueprint texture](https://aosplay.net/game/ui/prefab_selection_blueprint.webp) _The service separates credentials, public profile data, audit events, and gameplay statistics so each can have a narrow purpose._ ## At a glance | Value | Meaning | | --- | --- | | NO | email required | | NO | raw hardware ID | | NO | stored raw Steam ticket | | HASHED | passwords and sessions | ## Information used by the service A password account stores a chosen username, nickname, Argon2id password hash, hashed recovery code, account timestamps, and public player identifiers. A guest stores a generated nickname and the public half of a random installation signing key. A Steam-backed profile stores the verified SteamID64 and last observed persona name. Gameplay records may include server ID, match event ID, timestamps, aggregate score, and per-stat counters. Operational records may include session expiry, a shortened user-agent string, and HMAC-pseudonymized network addresses used for abuse limits and security auditing. ## Information deliberately not required The account API does not ask for an email address, real name, date of birth, postal address, payment information, or social profile. Guest continuity does not use a motherboard serial, disk serial, MAC address, or other raw hardware identifier. Raw passwords are not written to the database or application logs. Raw Steam session tickets are validated at the game-server boundary and are not sent to or stored by the web master service; only a SHA-256 digest is retained as a replay guard. ## Sessions and cookies The website uses one strictly necessary authentication cookie after sign-in. It is HttpOnly, SameSite=Lax, limited to the site path, and marked Secure in production. The cookie contains a random opaque token rather than account data. The launcher receives the same class of opaque token as a bearer credential. Tokens are stored hashed on the server, expire, can be revoked, and are rotated after password recovery. The service does not require advertising or cross-site tracking cookies. ## Retention and control Expired challenges, rate-limit buckets, join tickets, and revoked sessions are operational data intended for periodic cleanup. Player records and aggregate statistics persist so profiles remain stable. Authentication events are retained only as long as they remain useful for security investigation and abuse prevention. Before public launch, deployment policy must define concrete cleanup schedules, backup retention, account deletion handling, and a contact route for access or deletion requests in the jurisdictions where the service operates. The technical schema supports disabling and deleting accounts without reassigning another player’s identity. > **Pre-launch requirement — Publish operator details before collecting public data.** This page describes the implemented data design, not a substitute for deployment-specific legal review. The operator must add jurisdiction, contact, retention, and subprocessors when hosting begins. ## Infrastructure and third parties The planned deployment uses Vercel for the Next.js application and Railway PostgreSQL for durable storage. Hosting providers process network and service telemetry under their own terms. Steam authentication involves Valve only for players who choose the original Steam path. Secrets such as database credentials, server-write credentials, and the Steam bridge token remain server-side environment variables. They must never be embedded in the browser, launcher, public repository, or distributable dedicated-server package. ## Frequently asked questions ### Does guest mode track my computer hardware? No. Guest continuity uses a random signing key generated by the launcher, not a hardware fingerprint. ### Is my password recoverable by the operator? No. Only an Argon2id hash is stored. Recovery replaces the password using a separately hashed one-time recovery code. ### Is a Steam session ticket stored? No. The web service stores only its SHA-256 digest for replay detection after the game server reports successful Valve validation. ### Does the site use advertising trackers? The implemented application does not require advertising trackers; its account cookie is strictly necessary for sign-in. ## Related reading - [Ace of Spades Revival Player Identity](https://aosplay.net/account) ([Markdown](https://aosplay.net/docs/account.md)) - [A master server for reconnecting the community](https://aosplay.net/master-server) ([Markdown](https://aosplay.net/docs/master-server.md)) - [About the Ace of Spades Revival](https://aosplay.net/about) ([Markdown](https://aosplay.net/docs/about.md)) --- Source: [Ace of Spades Revival Privacy Notes](https://aosplay.net/privacy) Maintained by Ace of Spades Revival contributors. --- --- title: "Protocol 168: Complete packet reference" description: "All 119 Ace of Spades Battle Builder protocol 168 packet IDs with direction, field order, byte width, encoding, implementation state, and evidence status." canonical: "https://aosplay.net/protocol-168/packets" markdown: "https://aosplay.net/docs/protocol-168/packets.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_range: "0-118" --- # Protocol 168: Complete packet reference > All 119 Ace of Spades: Battle Builder application packet IDs, including currently unused and provisional records. The catalog separates verified behavior from implementation-backed and provisional recovery. Every packet document gives its application ID, direction, total or variable wire size, ordered fields, field encodings, byte widths, conditions, purpose, implementation status, and evidence level. ## Framing and byte order - The first application byte is the packet ID. - Multi-byte numeric fields are little-endian unless a packet says otherwise. - Sizes do not include ENet framing, wrapper prefixes, LZF chunk framing, or transport compression. - A planned packet is part of the recovered retail surface but is not claimed as production-ready. - BattleSpades-only diagnostic IDs outside 0–118 are not retail Protocol 168 packets. ## Packet index | Dec | Hex | Packet | Direction | Family | Size | Status | Evidence | | ---: | ---: | --- | --- | --- | --- | --- | --- | | 0 | 0x00 | [ClockSync](https://aosplay.net/docs/protocol-168/packets/0.md) | Both | Timing | 9 bytes | Handled + sent | Implementation-backed | | 1 | 0x01 | [PlaceDynamite](https://aosplay.net/docs/protocol-168/packets/1.md) | C→S | Deployables | 12 bytes | Handled | Live-verified | | 2 | 0x02 | [WorldUpdate](https://aosplay.net/docs/protocol-168/packets/2.md) | S→C | Replication | 11 + 56P + ΣE + 6T bytes | Sent | Live-verified | | 3 | 0x03 | [EntityUpdates](https://aosplay.net/docs/protocol-168/packets/3.md) | Inactive | Entities | 7 + ΣE bytes | Planned | Provisional | | 4 | 0x04 | [ClientData](https://aosplay.net/docs/protocol-168/packets/4.md) | C→S | Input | 16, 18, or 20 bytes | Handled | Live-verified | | 5 | 0x05 | [SetHP](https://aosplay.net/docs/protocol-168/packets/5.md) | S→C | Combat | 9 bytes | Sent | Implementation-backed | | 6 | 0x06 | [ShootPacket](https://aosplay.net/docs/protocol-168/packets/6.md) | C→S | Combat | 40 bytes | Handled | Live-verified | | 7 | 0x07 | [PaintBlockPacket](https://aosplay.net/docs/protocol-168/packets/7.md) | C→S | Building | 14 bytes | Handled | Implementation-backed | | 8 | 0x08 | [ShootFeedbackPacket](https://aosplay.net/docs/protocol-168/packets/8.md) | S→C | Combat | 12 bytes | Sent | Live-verified | | 9 | 0x09 | [ShootResponse](https://aosplay.net/docs/protocol-168/packets/9.md) | S→C | Combat | 10 bytes | Sent | Live-verified | | 10 | 0x0A | [UseOrientedItem](https://aosplay.net/docs/protocol-168/packets/10.md) | Both | Combat | 21 bytes | Handled + sent | Implementation-backed | | 11 | 0x0B | [SetColor](https://aosplay.net/docs/protocol-168/packets/11.md) | Both | Building | 5 bytes | Handled + sent | Implementation-backed | | 12 | 0x0C | [SetUGCEditMode](https://aosplay.net/docs/protocol-168/packets/12.md) | Inactive | UGC | 2 bytes | Planned | Provisional | | 13 | 0x0D | [SetClassLoadout](https://aosplay.net/docs/protocol-168/packets/13.md) | C→S | Players | Variable: 6 + L + ΣS + optional (1 + U) | Handled | Live-verified | | 14 | 0x0E | [ExistingPlayer](https://aosplay.net/docs/protocol-168/packets/14.md) | Inactive | Players | Variable: 19 + name + L + Σprefabs | Planned | Provisional | | 15 | 0x0F | [NewPlayerConnection](https://aosplay.net/docs/protocol-168/packets/15.md) | C→S | Players | 6 + name bytes | Handled | Implementation-backed | | 16 | 0x10 | [ChangeEntity](https://aosplay.net/docs/protocol-168/packets/16.md) | S→C | Entities | 5–10 bytes | Sent | Implementation-backed | | 17 | 0x11 | [ChangePlayer](https://aosplay.net/docs/protocol-168/packets/17.md) | S→C | Players | 4 or 5 bytes | Sent | Implementation-backed | | 18 | 0x12 | [POIFocus](https://aosplay.net/docs/protocol-168/packets/18.md) | Inactive | Interface | 7 bytes | Planned | Provisional | | 19 | 0x13 | [DestroyEntity](https://aosplay.net/docs/protocol-168/packets/19.md) | S→C | Entities | 3 bytes | Sent | Implementation-backed | | 20 | 0x14 | [HitEntity](https://aosplay.net/docs/protocol-168/packets/20.md) | S→C | Entities | 10 bytes | Sent | Implementation-backed | | 21 | 0x15 | [CreateEntity](https://aosplay.net/docs/protocol-168/packets/21.md) | S→C | Entities | 34 + 4I + 2F bytes | Sent | Live-verified | | 22 | 0x16 | [CreateAmbientSound](https://aosplay.net/docs/protocol-168/packets/22.md) | S→C | Audio | Variable: 3 + name + 6P bytes | Sent | Live-verified | | 23 | 0x17 | [PlaySound](https://aosplay.net/docs/protocol-168/packets/23.md) | S→C | Audio | 7–16 bytes | Sent | Live-verified | | 24 | 0x18 | [PlayAmbientSound](https://aosplay.net/docs/protocol-168/packets/24.md) | S→C | Audio | Variable: name + 7–16 bytes | Sent | Live-verified | | 25 | 0x19 | [StopSound](https://aosplay.net/docs/protocol-168/packets/25.md) | Inactive | Audio | 2 bytes | Planned | Provisional | | 26 | 0x1A | [PlayMusic](https://aosplay.net/docs/protocol-168/packets/26.md) | S→C | Audio | Variable: name + 4 bytes | Sent | Implementation-backed | | 27 | 0x1B | [StopMusic](https://aosplay.net/docs/protocol-168/packets/27.md) | S→C | Audio | 1 byte | Sent | Implementation-backed | | 28 | 0x1C | [CreatePlayer](https://aosplay.net/docs/protocol-168/packets/28.md) | S→C | Players | Variable: 21 + name + L + Σprefabs | Sent | Live-verified | | 29 | 0x1D | [PrefabComplete](https://aosplay.net/docs/protocol-168/packets/29.md) | S→C | Building | 1 byte | Sent | Implementation-backed | | 30 | 0x1E | [BuildPrefabAction](https://aosplay.net/docs/protocol-168/packets/30.md) | C→S | Building | Variable: 28 + prefab-name bytes | Handled | Implementation-backed | | 31 | 0x1F | [ErasePrefabAction](https://aosplay.net/docs/protocol-168/packets/31.md) | C→S | Building | Variable: 17 + prefab-name bytes | Handled | Provisional | | 32 | 0x20 | [BlockBuild](https://aosplay.net/docs/protocol-168/packets/32.md) | Both | Building | 13 bytes | Handled + sent | Implementation-backed | | 33 | 0x21 | [BlockBuildColored](https://aosplay.net/docs/protocol-168/packets/33.md) | S→C | Building | 15 bytes | Sent | Implementation-backed | | 34 | 0x22 | [BlockOccupy](https://aosplay.net/docs/protocol-168/packets/34.md) | Inactive | Building | 12 bytes | Planned | Provisional | | 35 | 0x23 | [BlockLiberate](https://aosplay.net/docs/protocol-168/packets/35.md) | C→S | Building | 12 bytes | Handled | Implementation-backed | | 36 | 0x24 | [ExplodeCorpse](https://aosplay.net/docs/protocol-168/packets/36.md) | Inactive | Combat | 3 bytes | Planned | Provisional | | 37 | 0x25 | [Damage](https://aosplay.net/docs/protocol-168/packets/37.md) | S→C | Combat | 21 bytes | Sent | Live-verified | | 38 | 0x26 | [BlockManagerState](https://aosplay.net/docs/protocol-168/packets/38.md) | Inactive | Building | Variable; non-empty record format unresolved | Planned | Provisional | | 39 | 0x27 | [ServerBlockAction](https://aosplay.net/docs/protocol-168/packets/39.md) | Inactive | Building | 5 + N × (7 or 10) bytes in generated writer | Planned | Provisional | | 40 | 0x28 | [BlockLine](https://aosplay.net/docs/protocol-168/packets/40.md) | C→S | Building | 18 bytes | Handled | Live-verified | | 41 | 0x29 | [MinimapBillboard](https://aosplay.net/docs/protocol-168/packets/41.md) | Inactive | Interface | Variable: 15 + icon-name bytes | Planned | Provisional | | 42 | 0x2A | [MinimapBillboardClear](https://aosplay.net/docs/protocol-168/packets/42.md) | Inactive | Interface | 3 bytes | Planned | Provisional | | 43 | 0x2B | [MinimapZone](https://aosplay.net/docs/protocol-168/packets/43.md) | S→C | Interface | 21 bytes | Sent | Live-verified | | 44 | 0x2C | [MinimapZoneClear](https://aosplay.net/docs/protocol-168/packets/44.md) | Inactive | Interface | 13 bytes | Planned | Provisional | | 45 | 0x2D | [StateData](https://aosplay.net/docs/protocol-168/packets/45.md) | S→C | Replication | Variable: 61-byte shell + strings, arrays, and entities | Sent | Implementation-backed | | 46 | 0x2E | [KillAction](https://aosplay.net/docs/protocol-168/packets/46.md) | S→C | Combat | 8 bytes | Sent | Live-verified | | 47 | 0x2F | [GenericVoteMessage](https://aosplay.net/docs/protocol-168/packets/47.md) | Both | Interface | Variable: 6 + candidates + title + description | Handled + sent | Live-verified | | 48 | 0x30 | [InitiateKickMessage](https://aosplay.net/docs/protocol-168/packets/48.md) | C→S | Interface | 4 bytes | Handled | Implementation-backed | | 49 | 0x31 | [ChatMessage](https://aosplay.net/docs/protocol-168/packets/49.md) | Both | Interface | Variable: 4 + text bytes | Handled + sent | Live-verified | | 50 | 0x32 | [LocalisedMessage](https://aosplay.net/docs/protocol-168/packets/50.md) | S→C | Interface | Variable: 5 + string ID + parameters | Sent | Implementation-backed | | 51 | 0x33 | [SkyboxData](https://aosplay.net/docs/protocol-168/packets/51.md) | S→C | Map sync | Variable: 2 + filename bytes | Sent | Implementation-backed | | 52 | 0x34 | [MapEnded](https://aosplay.net/docs/protocol-168/packets/52.md) | S→C | Map sync | 1 byte | Sent | Live-verified | | 53 | 0x35 | [ShowGameStats](https://aosplay.net/docs/protocol-168/packets/53.md) | S→C | Progression | 1 byte | Sent | Live-verified | | 54 | 0x36 | [MapDataStart](https://aosplay.net/docs/protocol-168/packets/54.md) | Inactive | Map sync | 1 byte | Planned | Provisional | | 55 | 0x37 | [MapSyncStart](https://aosplay.net/docs/protocol-168/packets/55.md) | S→C | Map sync | 1 byte | Sent | Live-verified | | 56 | 0x38 | [MapDataChunk](https://aosplay.net/docs/protocol-168/packets/56.md) | Inactive | Map sync | 4 + N bytes | Planned | Provisional | | 57 | 0x39 | [MapSyncChunk](https://aosplay.net/docs/protocol-168/packets/57.md) | S→C | Map sync | 4 + N bytes | Sent | Live-verified | | 58 | 0x3A | [MapDataEnd](https://aosplay.net/docs/protocol-168/packets/58.md) | Inactive | Map sync | 1 byte | Planned | Provisional | | 59 | 0x3B | [MapSyncEnd](https://aosplay.net/docs/protocol-168/packets/59.md) | S→C | Map sync | 1 byte | Sent | Live-verified | | 60 | 0x3C | [MapDataValidation](https://aosplay.net/docs/protocol-168/packets/60.md) | Both | Map sync | 5 bytes | Handled + sent | Live-verified | | 61 | 0x3D | [PackStart](https://aosplay.net/docs/protocol-168/packets/61.md) | Inactive | Map sync | 9 bytes | Planned | Provisional | | 62 | 0x3E | [PackResponse](https://aosplay.net/docs/protocol-168/packets/62.md) | Inactive | Map sync | 2 bytes | Planned | Provisional | | 63 | 0x3F | [PackChunk](https://aosplay.net/docs/protocol-168/packets/63.md) | Inactive | Map sync | 1 + remaining payload bytes | Planned | Provisional | | 64 | 0x40 | [PlayerLeft](https://aosplay.net/docs/protocol-168/packets/64.md) | S→C | Players | 2 bytes | Sent | Implementation-backed | | 65 | 0x41 | [ProgressBar](https://aosplay.net/docs/protocol-168/packets/65.md) | Inactive | Interface | 11 bytes | Planned | Provisional | | 66 | 0x42 | [RankUps](https://aosplay.net/docs/protocol-168/packets/66.md) | Inactive | Progression | Variable: 5 + rank-up records | Planned | Provisional | | 67 | 0x43 | [GameStats](https://aosplay.net/docs/protocol-168/packets/67.md) | S→C | Progression | 9 + 8N bytes | Sent | Implementation-backed | | 68 | 0x44 | [UGCObjectives](https://aosplay.net/docs/protocol-168/packets/68.md) | Inactive | UGC | Variable: 6 + objective records | Planned | Provisional | | 69 | 0x45 | [Restock](https://aosplay.net/docs/protocol-168/packets/69.md) | S→C | Players | 3 bytes | Sent | Live-verified | | 70 | 0x46 | [PickPickup](https://aosplay.net/docs/protocol-168/packets/70.md) | S→C | Players | 4 bytes | Sent | Implementation-backed | | 71 | 0x47 | [DropPickup](https://aosplay.net/docs/protocol-168/packets/71.md) | Both | Players | 19 bytes | Handled + sent | Live-verified | | 72 | 0x48 | [ForceShowScores](https://aosplay.net/docs/protocol-168/packets/72.md) | Inactive | Progression | 2 bytes | Planned | Provisional | | 73 | 0x49 | [ShowTextMessage](https://aosplay.net/docs/protocol-168/packets/73.md) | S→C | Interface | 4 bytes | Reversed / unused | Live-verified | | 74 | 0x4A | [FogColor](https://aosplay.net/docs/protocol-168/packets/74.md) | S→C | Interface | 5 bytes | Sent | Implementation-backed | | 75 | 0x4B | [TimeScale](https://aosplay.net/docs/protocol-168/packets/75.md) | Inactive | Teams | 3 bytes | Planned | Provisional | | 76 | 0x4C | [WeaponReload](https://aosplay.net/docs/protocol-168/packets/76.md) | Both | Combat | 4 bytes | Handled + sent | Implementation-backed | | 77 | 0x4D | [ChangeTeam](https://aosplay.net/docs/protocol-168/packets/77.md) | C→S | Players | 3 bytes | Handled | Implementation-backed | | 78 | 0x4E | [ChangeClass](https://aosplay.net/docs/protocol-168/packets/78.md) | C→S | Players | 3 bytes | Handled | Implementation-backed | | 79 | 0x4F | [LockTeam](https://aosplay.net/docs/protocol-168/packets/79.md) | Inactive | Teams | 3 bytes | Planned | Provisional | | 80 | 0x50 | [TeamLockClass](https://aosplay.net/docs/protocol-168/packets/80.md) | Inactive | Teams | 3 bytes | Planned | Provisional | | 81 | 0x51 | [TeamLockScore](https://aosplay.net/docs/protocol-168/packets/81.md) | Inactive | Teams | 3 bytes | Planned | Provisional | | 82 | 0x52 | [TeamInfiniteBlocks](https://aosplay.net/docs/protocol-168/packets/82.md) | Inactive | Teams | 3 bytes | Planned | Provisional | | 83 | 0x53 | [TeamMapVisibility](https://aosplay.net/docs/protocol-168/packets/83.md) | S→C | Teams | 3 bytes | Sent | Live-verified | | 84 | 0x54 | [DisplayCountdown](https://aosplay.net/docs/protocol-168/packets/84.md) | S→C | Interface | 5 bytes | Sent | Live-verified | | 85 | 0x55 | [SetScore](https://aosplay.net/docs/protocol-168/packets/85.md) | S→C | Progression | 8 bytes | Sent | Implementation-backed | | 86 | 0x56 | [UseCommand](https://aosplay.net/docs/protocol-168/packets/86.md) | C→S | Deployables | 1 byte | Handled | Implementation-backed | | 87 | 0x57 | [PlaceMG](https://aosplay.net/docs/protocol-168/packets/87.md) | C→S | Deployables | 14 bytes | Handled | Live-verified | | 88 | 0x58 | [PlaceRocketTurret](https://aosplay.net/docs/protocol-168/packets/88.md) | C→S | Deployables | 14 bytes | Handled | Live-verified | | 89 | 0x59 | [PlaceLandmine](https://aosplay.net/docs/protocol-168/packets/89.md) | C→S | Deployables | 12 bytes | Handled | Live-verified | | 90 | 0x5A | [PlaceMedPack](https://aosplay.net/docs/protocol-168/packets/90.md) | C→S | Deployables | 13 bytes | Handled | Live-verified | | 91 | 0x5B | [PlaceRadarStation](https://aosplay.net/docs/protocol-168/packets/91.md) | C→S | Deployables | 12 bytes | Handled | Live-verified | | 92 | 0x5C | [PlaceC4](https://aosplay.net/docs/protocol-168/packets/92.md) | C→S | Deployables | 12 bytes | Handled | Live-verified | | 93 | 0x5D | [DetonateC4](https://aosplay.net/docs/protocol-168/packets/93.md) | C→S | Deployables | 5 bytes | Handled | Implementation-backed | | 94 | 0x5E | [BlockSuckerPacket](https://aosplay.net/docs/protocol-168/packets/94.md) | Both | Building | 8 bytes | Handled + sent | Implementation-backed | | 95 | 0x5F | [DisguisePacket](https://aosplay.net/docs/protocol-168/packets/95.md) | C→S | Players | 6 bytes | Handled | Implementation-backed | | 96 | 0x60 | [DisableEntity](https://aosplay.net/docs/protocol-168/packets/96.md) | Inactive | Entities | 3 bytes | Planned | Provisional | | 97 | 0x61 | [PlaceUGC](https://aosplay.net/docs/protocol-168/packets/97.md) | Inactive | UGC | 13 bytes | Planned | Provisional | | 98 | 0x62 | [InitialUGCBatch](https://aosplay.net/docs/protocol-168/packets/98.md) | Inactive | UGC | 2 + 11N bytes | Planned | Provisional | | 99 | 0x63 | [ReqestUGCEntities](https://aosplay.net/docs/protocol-168/packets/99.md) | Inactive | UGC | 3 bytes | Planned | Provisional | | 100 | 0x64 | [UGCMessage](https://aosplay.net/docs/protocol-168/packets/100.md) | Inactive | UGC | 2 bytes | Planned | Provisional | | 101 | 0x65 | [UGCMapLoadingFromHost](https://aosplay.net/docs/protocol-168/packets/101.md) | Inactive | UGC | 2 bytes | Planned | Provisional | | 102 | 0x66 | [UGCMapInfo](https://aosplay.net/docs/protocol-168/packets/102.md) | Inactive | UGC | 5 + N bytes | Planned | Provisional | | 103 | 0x67 | [VoiceData](https://aosplay.net/docs/protocol-168/packets/103.md) | Inactive | UGC | 4 + N bytes | Planned | Provisional | | 104 | 0x68 | [PlaceFlareBlock](https://aosplay.net/docs/protocol-168/packets/104.md) | C→S | Deployables | 11 bytes | Handled | Live-verified | | 105 | 0x69 | [SteamSessionTicket](https://aosplay.net/docs/protocol-168/packets/105.md) | C→S | Authentication | 5 + N bytes | Handshake | Live-verified | | 106 | 0x6A | [TerritoryBaseState](https://aosplay.net/docs/protocol-168/packets/106.md) | Inactive | Teams | 7 bytes | Planned | Provisional | | 107 | 0x6B | [DebugDraw](https://aosplay.net/docs/protocol-168/packets/107.md) | Inactive | Diagnostics | 10, 24, or 34 bytes | Planned | Provisional | | 108 | 0x6C | [LockToZone](https://aosplay.net/docs/protocol-168/packets/108.md) | Inactive | Teams | 13 bytes | Planned | Provisional | | 109 | 0x6D | [HelpMessage](https://aosplay.net/docs/protocol-168/packets/109.md) | Inactive | Interface | Variable: 6 + message strings | Planned | Provisional | | 110 | 0x6E | [ClientInMenu](https://aosplay.net/docs/protocol-168/packets/110.md) | C→S | Players | 2 bytes | Handled | Implementation-backed | | 111 | 0x6F | [Password](https://aosplay.net/docs/protocol-168/packets/111.md) | Inactive | Authentication | Variable: 2 + password bytes | Planned | Provisional | | 112 | 0x70 | [PasswordNeeded](https://aosplay.net/docs/protocol-168/packets/112.md) | Inactive | Authentication | 1 byte | Planned | Provisional | | 113 | 0x71 | [PasswordProvided](https://aosplay.net/docs/protocol-168/packets/113.md) | Inactive | Authentication | Variable: 2 + password bytes | Planned | Provisional | | 114 | 0x72 | [InitialInfo](https://aosplay.net/docs/protocol-168/packets/114.md) | S→C | Map sync | Variable: 55-byte shell + 9 strings and counted arrays | Sent | Live-verified | | 115 | 0x73 | [ForceTeamJoin](https://aosplay.net/docs/protocol-168/packets/115.md) | Inactive | Teams | 3 bytes | Planned | Provisional | | 116 | 0x74 | [PositionData](https://aosplay.net/docs/protocol-168/packets/116.md) | C→S | Input | 7 or 13 bytes | Handled | Provisional | | 117 | 0x75 | [TeamProgress](https://aosplay.net/docs/protocol-168/packets/117.md) | Inactive | Teams | 6 or 12 bytes | Planned | Provisional | | 118 | 0x76 | [SetGroundColors](https://aosplay.net/docs/protocol-168/packets/118.md) | Inactive | Interface | 2 + 4N bytes | Planned | Provisional | ## Research method Claims are promoted through captured or decompiled evidence, isolated layout recovery, implementation, regression fixtures, and real-client validation. See the [Protocol 168 guide](https://aosplay.net/protocol-168) for the full clean-room method. --- --- title: "Packet 0: ClockSync" description: "Round-trip clock synchronization. The server returns its loop count while keeping the retail client one simulation tick ahead." canonical: "https://aosplay.net/protocol-168/packets/0" markdown: "https://aosplay.net/docs/protocol-168/packets/0.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "0" packet_id_hex: "0x00" direction: "Both" family: "Timing" implementation_status: "Handled + sent" evidence: "Implementation-backed" wire_size: "9 bytes" --- # Packet 0: ClockSync > Round-trip clock synchronization. The server returns its loop count while keeping the retail client one simulation tick ahead. - **Decimal ID:** 0 - **Hex ID:** 0x00 - **Direction:** Both - **Family:** Timing - **Status:** Handled + sent - **Evidence:** Implementation-backed - **Wire size:** 9 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 0 (0x00). | — | | 1 | `client_time` | i32 LE | 4 | Client clock value echoed through the synchronization exchange. | — | | 2 | `server_loop_count` | i32 LE | 4 | Authoritative server simulation loop. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/0) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 1: PlaceDynamite" description: "Requests a Miner dynamite placement. The server validates tool, stock, range, and support before creating entity type 10 and owning the fuse and blast." canonical: "https://aosplay.net/protocol-168/packets/1" markdown: "https://aosplay.net/docs/protocol-168/packets/1.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "1" packet_id_hex: "0x01" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "12 bytes" --- # Packet 1: PlaceDynamite > Requests a Miner dynamite placement. The server validates tool, stock, range, and support before creating entity type 10 and owning the fuse and blast. - **Decimal ID:** 1 - **Hex ID:** 0x01 - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 12 bytes ## Implementation note Corrected runtime layout: the older generated loader divided the coordinates by 64; the live-compatible decoder uses raw unsigned shorts. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 1 (0x01). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `position` | 3 × u16 LE | 6 | Live clients send literal voxel coordinates, not fixed-point world units. | — | | 3 | `face` | u8 | 1 | Voxel face or placement orientation index. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/1) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 2: WorldUpdate" description: "The 30 Hz unreliable snapshot stream for remote players, moving entities, and rocket turrets. P is the player count, E contains variable Entity records, and T is the turret count." canonical: "https://aosplay.net/protocol-168/packets/2" markdown: "https://aosplay.net/docs/protocol-168/packets/2.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "2" packet_id_hex: "0x02" direction: "S→C" family: "Replication" implementation_status: "Sent" evidence: "Live-verified" wire_size: "11 + 56P + ΣE + 6T bytes" --- # Packet 2: WorldUpdate > The 30 Hz unreliable snapshot stream for remote players, moving entities, and rocket turrets. P is the player count, E contains variable Entity records, and T is the turret count. - **Decimal ID:** 2 - **Hex ID:** 0x02 - **Direction:** S→C - **Family:** Replication - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 11 + 56P + ΣE + 6T bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 2 (0x02). | — | | 1 | `loop_count` | i32 LE | 4 | Global snapshot clock. | — | | 2 | `player_count` | u16 LE | 2 | Number of 56-byte player rows. | — | | 3 | `players[].player_id` | u8 | 1 | Player represented by this repeated row. | — | | 4 | `players[].position` | 3 × IEEE-754 f32 LE | 12 | X, Y, and Z floating-point components. | — | | 5 | `players[].orientation` | 3 × IEEE-754 f32 LE | 12 | X, Y, and Z floating-point components. | — | | 6 | `players[].velocity` | 3 × IEEE-754 f32 LE | 12 | X, Y, and Z floating-point components. | — | | 7 | `players[].ping` | i16 LE | 2 | Latency/sample value retained by the retail row. | — | | 8 | `players[].pong` | i32 LE | 4 | Last ClientData loop consumed for a human; a monotonic server loop for peerless bots. | — | | 9 | `players[].hp` | i16 LE | 2 | Current authoritative health. | — | | 10 | `players[].input_flags` | u8 | 1 | Remote movement input bit field. | — | | 11 | `players[].action_flags` | u8 | 1 | Remote primary, secondary, jetpack, zoom, and deployment actions. | — | | 12 | `players[].state_flags` | u8 | 1 | 0x01 parachute, 0x02 disguise, and 0x08 touching goo. | — | | 13 | `players[].tool` | u8 | 1 | Tool selected for the remote character. | — | | 14 | `players[].pickup` | i8 | 1 | Carried pickup ID; -1 (0xFF) is the required no-pickup sentinel. | — | | 15 | `players[].jetpack_fuel` | sign-magnitude fixed16 LE (1/64) | 2 | players[].jetpack fuel value. | — | | 16 | `players[].spawn_protection_timer` | sign-magnitude fixed16 LE (1/64) | 2 | players[].spawn protection timer value. | — | | 17 | `players[].weapon_deployment_yaw` | sign-magnitude fixed16 LE (1/64) | 2 | players[].weapon deployment yaw value. | — | | 18 | `entity_count` | u16 LE | 2 | Number of variable Entity records that follow. | — | | 19 | `entities[]` | Entity record | 33 + 4I + 2F | Entity layout from packet 21 without another packet-ID byte. | — | | 20 | `turret_count` | u16 LE | 2 | Number of compact rocket-turret aim records. | — | | 21 | `turrets[]` | i16 + 2 × fixed16 | 6 | Entity ID, yaw, and pitch. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/2) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 3: EntityUpdates" description: "A separate moving-entity delta stream retained in the retail protocol surface. BattleSpades currently carries entity changes through other active paths." canonical: "https://aosplay.net/protocol-168/packets/3" markdown: "https://aosplay.net/docs/protocol-168/packets/3.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "3" packet_id_hex: "0x03" direction: "Inactive" family: "Entities" implementation_status: "Planned" evidence: "Provisional" wire_size: "7 + ΣE bytes" --- # Packet 3: EntityUpdates > A separate moving-entity delta stream retained in the retail protocol surface. BattleSpades currently carries entity changes through other active paths. - **Decimal ID:** 3 - **Hex ID:** 0x03 - **Direction:** Inactive - **Family:** Entities - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 7 + ΣE bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 3 (0x03). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `entity_count` | u16 LE | 2 | entity count value. | — | | 3 | `entities[]` | Entity record | 33 + 4I + 2F | Repeated packet-21 Entity records without nested packet IDs. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/3) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 4: ClientData" description: "Buffered client input applied at its matching simulation tick. Bit 7 of the player byte enables the palette; bits 0–6 hold the player ID." canonical: "https://aosplay.net/protocol-168/packets/4" markdown: "https://aosplay.net/docs/protocol-168/packets/4.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "4" packet_id_hex: "0x04" direction: "C→S" family: "Input" implementation_status: "Handled" evidence: "Live-verified" wire_size: "16, 18, or 20 bytes" --- # Packet 4: ClientData > Buffered client input applied at its matching simulation tick. Bit 7 of the player byte enables the palette; bits 0–6 hold the player ID. - **Decimal ID:** 4 - **Hex ID:** 0x04 - **Direction:** C→S - **Family:** Input - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 16, 18, or 20 bytes ## Implementation note The tolerant runtime decoder bounds all three known payload lengths; the generated writer emits the 18-byte fixed16 form. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 4 (0x04). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_and_palette` | u8 | 1 | Bits 0–6 are player_id; bit 7 is palette_enabled. | — | | 3 | `tool_id` | u8 | 1 | Equipped tool identifier. | — | | 4 | `orientation_x` | orientation16 LE (1/8192) | 2 | orientation x value. | — | | 5 | `orientation_y` | orientation16 LE (1/8192) | 2 | orientation y value. | — | | 6 | `orientation_z` | orientation16 LE (1/8192) | 2 | orientation z value. | — | | 7 | `opaque_orientation_byte` | u8 | 1 | Retail field retained as `ooo`; exact gameplay meaning remains unknown. | — | | 8 | `input_flags` | u8 | 1 | 0x01 up, 0x02 down, 0x04 left, 0x08 right, 0x10 jump, 0x20 crouch, 0x40 sneak, 0x80 sprint. | — | | 9 | `action_flags` | u8 | 1 | 0x01 primary, 0x02 secondary, 0x04 zoom, 0x08 pickup, 0x10 display weapon, 0x20 on fire, 0x40 deployed, 0x80 hover. | — | | 10 | `weapon_deployment_yaw` | optional fixed16 or f32 LE | 0, 2, or 4 | Known retail variants omit this value or encode it as fixed16/f32. | Remaining payload bytes select the variant. | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/4) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 5: SetHP" description: "Sets local health for spawn, healing, or damage feedback and supplies a source direction for presentation." canonical: "https://aosplay.net/protocol-168/packets/5" markdown: "https://aosplay.net/docs/protocol-168/packets/5.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "5" packet_id_hex: "0x05" direction: "S→C" family: "Combat" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "9 bytes" --- # Packet 5: SetHP > Sets local health for spawn, healing, or damage feedback and supplies a source direction for presentation. - **Decimal ID:** 5 - **Hex ID:** 0x05 - **Direction:** S→C - **Family:** Combat - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 9 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 5 (0x05). | — | | 1 | `hp` | u8 | 1 | hp value. | — | | 2 | `damage_type` | u8 | 1 | damage type value. | — | | 3 | `source_position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/5) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 6: ShootPacket" description: "A client firearm request. The server validates cadence, origin, orientation, weapon state, and penetration before resolving authoritative hits." canonical: "https://aosplay.net/protocol-168/packets/6" markdown: "https://aosplay.net/docs/protocol-168/packets/6.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "6" packet_id_hex: "0x06" direction: "C→S" family: "Combat" implementation_status: "Handled" evidence: "Live-verified" wire_size: "40 bytes" --- # Packet 6: ShootPacket > A client firearm request. The server validates cadence, origin, orientation, weapon state, and penetration before resolving authoritative hits. - **Decimal ID:** 6 - **Hex ID:** 0x06 - **Direction:** C→S - **Family:** Combat - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 40 bytes ## Implementation note Retail clients have no incoming action handler for packet 6; observers receive ShootFeedbackPacket (8), not a relayed ShootPacket. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 6 (0x06). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `shooter_id` | u8 | 1 | Player slot that initiated the action. | — | | 3 | `shot_on_world_update` | i32 LE | 4 | WorldUpdate reference used to associate the predicted shot. | — | | 4 | `origin` | 3 × IEEE-754 f32 LE | 12 | X, Y, and Z floating-point components. | — | | 5 | `orientation` | 3 × IEEE-754 f32 LE | 12 | X, Y, and Z floating-point components. | — | | 6 | `damage` | i16 LE | 2 | Client-reported weapon damage; never trusted without server validation. | — | | 7 | `penetration` | i16 LE | 2 | Client-reported penetration value. | — | | 8 | `shot_flags` | u8 | 1 | Bit 0 affect_shooter; bit 1 secondary fire. | — | | 9 | `seed` | u8 | 1 | Deterministic random seed used to reproduce client effects. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/6) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 7: PaintBlockPacket" description: "Requests a block colour mutation. The server validates the paint tool, range, and voxel solidity, then journals the authoritative RGB change for late joiners." canonical: "https://aosplay.net/protocol-168/packets/7" markdown: "https://aosplay.net/docs/protocol-168/packets/7.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "7" packet_id_hex: "0x07" direction: "C→S" family: "Building" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "14 bytes" --- # Packet 7: PaintBlockPacket > Requests a block colour mutation. The server validates the paint tool, range, and voxel solidity, then journals the authoritative RGB change for late joiners. - **Decimal ID:** 7 - **Hex ID:** 0x07 - **Direction:** C→S - **Family:** Building - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 14 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 7 (0x07). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `x` | i16 LE | 2 | x value. | — | | 3 | `y` | i16 LE | 2 | y value. | — | | 4 | `z` | i16 LE | 2 | z value. | — | | 5 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/7) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 8: ShootFeedbackPacket" description: "Replays a remote firearm shot for observers, producing the native muzzle, gunshot, and character animation without duplicating the shooter's local prediction." canonical: "https://aosplay.net/protocol-168/packets/8" markdown: "https://aosplay.net/docs/protocol-168/packets/8.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "8" packet_id_hex: "0x08" direction: "S→C" family: "Combat" implementation_status: "Sent" evidence: "Live-verified" wire_size: "12 bytes" --- # Packet 8: ShootFeedbackPacket > Replays a remote firearm shot for observers, producing the native muzzle, gunshot, and character animation without duplicating the shooter's local prediction. - **Decimal ID:** 8 - **Hex ID:** 0x08 - **Direction:** S→C - **Family:** Combat - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 12 bytes ## Implementation note Never use for spades or melee tools; their remote action comes from WorldUpdate action bit 0x01. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 8 (0x08). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `shooter_id` | u8 | 1 | Player slot that initiated the action. | — | | 3 | `tool_id` | u8 | 1 | Equipped tool identifier. | — | | 4 | `shot_on_world_update` | i32 LE | 4 | shot on world update value. | — | | 5 | `seed` | u8 | 1 | Deterministic random seed used to reproduce client effects. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/8) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 9: ShootResponse" description: "Reports an authoritative player hit. All observers can show blood, while only the matching local shooter receives the hit-confirm sound and crosshair response." canonical: "https://aosplay.net/protocol-168/packets/9" markdown: "https://aosplay.net/docs/protocol-168/packets/9.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "9" packet_id_hex: "0x09" direction: "S→C" family: "Combat" implementation_status: "Sent" evidence: "Live-verified" wire_size: "10 bytes" --- # Packet 9: ShootResponse > Reports an authoritative player hit. All observers can show blood, while only the matching local shooter receives the hit-confirm sound and crosshair response. - **Decimal ID:** 9 - **Hex ID:** 0x09 - **Direction:** S→C - **Family:** Combat - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 10 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 9 (0x09). | — | | 1 | `damage_by` | u8 | 1 | Shooter player ID used for local hit-confirm matching. | — | | 2 | `damaged` | u8 | 1 | Damaged player ID. | — | | 3 | `blood` | boolean u8 | 1 | Whether to emit the blood effect. | — | | 4 | `position` | 3 × fixed16 LE | 6 | Impact position. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/9) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 10: UseOrientedItem" description: "Uses an oriented item such as a legacy grenade-family object. The server validates the active tool, cadence, and stock before accepting or relaying it." canonical: "https://aosplay.net/protocol-168/packets/10" markdown: "https://aosplay.net/docs/protocol-168/packets/10.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "10" packet_id_hex: "0x0A" direction: "Both" family: "Combat" implementation_status: "Handled + sent" evidence: "Implementation-backed" wire_size: "21 bytes" --- # Packet 10: UseOrientedItem > Uses an oriented item such as a legacy grenade-family object. The server validates the active tool, cadence, and stock before accepting or relaying it. - **Decimal ID:** 10 - **Hex ID:** 0x0A - **Direction:** Both - **Family:** Combat - **Status:** Handled + sent - **Evidence:** Implementation-backed - **Wire size:** 21 bytes ## Implementation note Entity-backed projectiles use CreateEntity (21). Do not relay tool 55 into the retail client's stale GLGrenade constructor. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 10 (0x0A). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `tool` | u8 | 1 | Tool/object identifier. | — | | 4 | `value` | sign-magnitude fixed16 LE (1/64) | 2 | Item-specific scalar, commonly fuse or charge. | — | | 5 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 6 | `velocity` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/10) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 11: SetColor" description: "Updates the selected palette colour for block, flare, and Block Cannon tools. The sender already applies its UI choice, so the server broadcasts to observers." canonical: "https://aosplay.net/protocol-168/packets/11" markdown: "https://aosplay.net/docs/protocol-168/packets/11.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "11" packet_id_hex: "0x0B" direction: "Both" family: "Building" implementation_status: "Handled + sent" evidence: "Implementation-backed" wire_size: "5 bytes" --- # Packet 11: SetColor > Updates the selected palette colour for block, flare, and Block Cannon tools. The sender already applies its UI choice, so the server broadcasts to observers. - **Decimal ID:** 11 - **Hex ID:** 0x0B - **Direction:** Both - **Family:** Building - **Status:** Handled + sent - **Evidence:** Implementation-backed - **Wire size:** 5 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 11 (0x0B). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/11) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 12: SetUGCEditMode" description: "Toggles the retail user-generated-content editor mode. The layout exists, but BattleSpades does not currently activate the UGC editor workflow." canonical: "https://aosplay.net/protocol-168/packets/12" markdown: "https://aosplay.net/docs/protocol-168/packets/12.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "12" packet_id_hex: "0x0C" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 bytes" --- # Packet 12: SetUGCEditMode > Toggles the retail user-generated-content editor mode. The layout exists, but BattleSpades does not currently activate the UGC editor workflow. - **Decimal ID:** 12 - **Hex ID:** 0x0C - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 12 (0x0C). | — | | 1 | `mode` | u8 | 1 | UGC edit-mode selector. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/12) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 13: SetClassLoadout" description: "Submits a class, equipment list, prefab selection, and optional UGC tools as one life-boundary loadout transaction." canonical: "https://aosplay.net/protocol-168/packets/13" markdown: "https://aosplay.net/docs/protocol-168/packets/13.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "13" packet_id_hex: "0x0D" direction: "C→S" family: "Players" implementation_status: "Handled" evidence: "Live-verified" wire_size: "Variable: 6 + L + ΣS + optional (1 + U)" --- # Packet 13: SetClassLoadout > Submits a class, equipment list, prefab selection, and optional UGC tools as one life-boundary loadout transaction. - **Decimal ID:** 13 - **Hex ID:** 0x0D - **Direction:** C→S - **Family:** Players - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** Variable: 6 + L + ΣS + optional (1 + U) ## Implementation note The bounded runtime decoder accepts exactly one observed variation: a missing zero UGC-count tail. It rejects malformed counts and unterminated strings. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 13 (0x0D). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `class_id` | u8 | 1 | Selected character class identifier. | — | | 3 | `instant` | boolean u8 | 1 | Boolean-like byte requesting immediate application. | — | | 4 | `loadout_count` | u8 | 1 | L: number of one-byte tool IDs. | — | | 5 | `loadout[]` | L × u8 | L | Ordered equipment/tool IDs. | — | | 6 | `prefab_count` | u8 | 1 | Number of NUL-terminated prefab names. | — | | 7 | `prefabs[]` | repeated NUL strings | ΣS | Selected prefab names; each consumes its UTF-8 length plus one terminator byte. | — | | 8 | `ugc_tool_count` | u8 | 1 | U: optional trailing count; retail may omit it when zero. | Present only when bytes remain. | | 9 | `ugc_tools[]` | U × u8 | U | UGC tool IDs. | Only after ugc_tool_count. | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/13) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 14: ExistingPlayer" description: "Legacy roster-entry shape. BattleSpades intentionally sends CreatePlayer (28) for roster state because this packet stores pickup verbatim and has no safe 0xFF sentinel path." canonical: "https://aosplay.net/protocol-168/packets/14" markdown: "https://aosplay.net/docs/protocol-168/packets/14.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "14" packet_id_hex: "0x0E" direction: "Inactive" family: "Players" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 19 + name + L + Σprefabs" --- # Packet 14: ExistingPlayer > Legacy roster-entry shape. BattleSpades intentionally sends CreatePlayer (28) for roster state because this packet stores pickup verbatim and has no safe 0xFF sentinel path. - **Decimal ID:** 14 - **Hex ID:** 0x0E - **Direction:** Inactive - **Family:** Players - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 19 + name + L + Σprefabs ## Implementation note Defined and decoded, but deliberately not used for live roster delivery. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 14 (0x0E). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `demo_player` | boolean u8 | 1 | demo player value. | — | | 3 | `team` | u8 | 1 | team value. | — | | 4 | `class_id` | u8 | 1 | Selected character class identifier. | — | | 5 | `tool` | u8 | 1 | tool value. | — | | 6 | `pickup` | i8 | 1 | pickup value. | — | | 7 | `dead` | boolean u8 | 1 | dead value. | — | | 8 | `score` | i32 LE | 4 | score value. | — | | 9 | `forced_team` | boolean u8 | 1 | forced team value. | — | | 10 | `local_language` | u8 | 1 | local language value. | — | | 11 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 12 | `name` | NUL-terminated UTF-8 string | N + 1 | Null-terminated UTF-8/ASCII-compatible string. | — | | 13 | `loadout_count` | u8 | 1 | loadout count value. | — | | 14 | `loadout[]` | L × u8 | L | Tool IDs. | — | | 15 | `prefab_count` | u8 | 1 | prefab count value. | — | | 16 | `prefabs[]` | repeated NUL strings | Σ(N + 1) | Prefab names. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/14) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 15: NewPlayerConnection" description: "The client's join announcement. Names are normalized to a case-insensitively unique 15-byte wire value before any CreatePlayer response." canonical: "https://aosplay.net/protocol-168/packets/15" markdown: "https://aosplay.net/docs/protocol-168/packets/15.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "15" packet_id_hex: "0x0F" direction: "C→S" family: "Players" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "6 + name bytes" --- # Packet 15: NewPlayerConnection > The client's join announcement. Names are normalized to a case-insensitively unique 15-byte wire value before any CreatePlayer response. - **Decimal ID:** 15 - **Hex ID:** 0x0F - **Direction:** C→S - **Family:** Players - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 6 + name bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 15 (0x0F). | — | | 1 | `team` | u8 | 1 | team value. | — | | 2 | `class_id` | u8 | 1 | Selected character class identifier. | — | | 3 | `forced_team` | boolean u8 | 1 | forced team value. | — | | 4 | `local_language` | u8 | 1 | local language value. | — | | 5 | `name` | NUL-terminated UTF-8 string | N + 1 | Null-terminated UTF-8/ASCII-compatible string. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/15) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 16: ChangeEntity" description: "Applies one server-owned entity mutation: state, position, velocity, carrier, forward vector, target, fuse, or ammo." canonical: "https://aosplay.net/protocol-168/packets/16" markdown: "https://aosplay.net/docs/protocol-168/packets/16.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "16" packet_id_hex: "0x10" direction: "S→C" family: "Entities" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "5–10 bytes" --- # Packet 16: ChangeEntity > Applies one server-owned entity mutation: state, position, velocity, carrier, forward vector, target, fuse, or ammo. - **Decimal ID:** 16 - **Hex ID:** 0x10 - **Direction:** S→C - **Family:** Entities - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 5–10 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 16 (0x10). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | | 2 | `action` | u8 | 1 | 0 state, 1 position, 2 velocity, 3 player, 4 forward vector, 5 target, 6 fuse, 7 ammo. | — | | 3 | `state` | u8 | 1 | Entity or gameplay state value. | action = 0 | | 4 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | action = 1 | | 5 | `velocity` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | action = 2 | | 6 | `player_id` | u8 | 1 | Compact player-slot identifier. | action = 3 | | 7 | `forward` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | action = 4 | | 8 | `target_id` | i8 | 1 | Signed player target; -1 means no target. | action = 5 | | 9 | `fuse` | sign-magnitude fixed16 LE (1/64) | 2 | fuse value. | action = 6 | | 10 | `ammo` | sign-magnitude fixed16 LE (1/64) | 2 | ammo value. | action = 7 | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/16) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 17: ChangePlayer" description: "Changes an existing player's presentation state. Active modes use action 8 for a through-terrain/high-minimap marker." canonical: "https://aosplay.net/protocol-168/packets/17" markdown: "https://aosplay.net/docs/protocol-168/packets/17.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "17" packet_id_hex: "0x11" direction: "S→C" family: "Players" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "4 or 5 bytes" --- # Packet 17: ChangePlayer > Changes an existing player's presentation state. Active modes use action 8 for a through-terrain/high-minimap marker. - **Decimal ID:** 17 - **Hex ID:** 0x11 - **Direction:** S→C - **Family:** Players - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 4 or 5 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 17 (0x11). | — | | 1 | `player_id` | i16 LE | 2 | Compact player-slot identifier. | — | | 2 | `action` | u8 | 1 | 8 sets high minimap visibility; 9 sets chase-camera state. | — | | 3 | `high_minimap_visibility` | boolean u8 | 1 | Expose the player through terrain/minimap. | action = 8 | | 4 | `chase_cam` | boolean u8 | 1 | Chase-camera toggle. | action = 9 | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/17) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 18: POIFocus" description: "Moves the client's point-of-interest focus marker to a world position." canonical: "https://aosplay.net/protocol-168/packets/18" markdown: "https://aosplay.net/docs/protocol-168/packets/18.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "18" packet_id_hex: "0x12" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "7 bytes" --- # Packet 18: POIFocus > Moves the client's point-of-interest focus marker to a world position. - **Decimal ID:** 18 - **Hex ID:** 0x12 - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 7 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 18 (0x12). | — | | 1 | `target_position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/18) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 19: DestroyEntity" description: "Removes an entity previously announced to the current GameScene." canonical: "https://aosplay.net/protocol-168/packets/19" markdown: "https://aosplay.net/docs/protocol-168/packets/19.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "19" packet_id_hex: "0x13" direction: "S→C" family: "Entities" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "3 bytes" --- # Packet 19: DestroyEntity > Removes an entity previously announced to the current GameScene. - **Decimal ID:** 19 - **Hex ID:** 0x13 - **Direction:** S→C - **Family:** Entities - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 3 bytes ## Implementation note For Snowball this removes the visual/effect only; impulse is triggered by the preceding zero-damage packet 37 event. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 19 (0x13). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/19) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 20: HitEntity" description: "Invokes the visual impact callback for an authoritative hit on a damageable entity." canonical: "https://aosplay.net/protocol-168/packets/20" markdown: "https://aosplay.net/docs/protocol-168/packets/20.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "20" packet_id_hex: "0x14" direction: "S→C" family: "Entities" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "10 bytes" --- # Packet 20: HitEntity > Invokes the visual impact callback for an authoritative hit on a damageable entity. - **Decimal ID:** 20 - **Hex ID:** 0x14 - **Direction:** S→C - **Family:** Entities - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 10 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 20 (0x14). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | | 2 | `impact_position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 3 | `type` | u8 | 1 | Impact/effect discriminator. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/20) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 21: CreateEntity" description: "Creates a map entity, light, deployable, pickup, or projectile. I and F are the integer- and fixed-property counts carried inside the record." canonical: "https://aosplay.net/protocol-168/packets/21" markdown: "https://aosplay.net/docs/protocol-168/packets/21.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "21" packet_id_hex: "0x15" direction: "S→C" family: "Entities" implementation_status: "Sent" evidence: "Live-verified" wire_size: "34 + 4I + 2F bytes" --- # Packet 21: CreateEntity > Creates a map entity, light, deployable, pickup, or projectile. I and F are the integer- and fixed-property counts carried inside the record. - **Decimal ID:** 21 - **Hex ID:** 0x15 - **Direction:** S→C - **Family:** Entities - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 34 + 4I + 2F bytes ## Implementation note The standalone Entity structure and CreateEntity wrapper share ID 21. Retail has no legacy FLAG=0 or BASE=1 constructor; sending BASE can freeze scene creation. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 21 (0x15). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | | 2 | `entity_type` | u8 | 1 | entity type value. | — | | 3 | `state` | u8 | 1 | Entity or gameplay state value. | — | | 4 | `player_id` | i8 | 1 | Owning player, using the retail sentinel where applicable. | — | | 5 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 6 | `velocity` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 7 | `yaw` | sign-magnitude fixed16 LE (1/64) | 2 | yaw value. | — | | 8 | `color_r` | sign-magnitude fixed16 LE (1/64) | 2 | color r value. | — | | 9 | `color_g` | sign-magnitude fixed16 LE (1/64) | 2 | color g value. | — | | 10 | `color_b` | sign-magnitude fixed16 LE (1/64) | 2 | color b value. | — | | 11 | `radius` | sign-magnitude fixed16 LE (1/64) | 2 | radius value. | — | | 12 | `face` | u8 | 1 | Voxel face or placement orientation index. | — | | 13 | `fuse` | sign-magnitude fixed16 LE (1/64) | 2 | fuse value. | — | | 14 | `int_property_count` | u8 | 1 | I: number of 4-byte integer properties. | — | | 15 | `float_property_count` | u8 | 1 | F: number of fixed16 properties. | — | | 16 | `ugc_mode` | u8 | 1 | ugc mode value. | — | | 17 | `int_properties[]` | I × i32 LE | 4I | Entity-type-specific integer properties. | — | | 18 | `float_properties[]` | F × fixed16 LE | 2F | Entity-type-specific scalar properties. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/21) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 22: CreateAmbientSound" description: "Registers a map-owned ambient controller. Empty point lists create a global bed; authored points create local emitters." canonical: "https://aosplay.net/protocol-168/packets/22" markdown: "https://aosplay.net/docs/protocol-168/packets/22.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "22" packet_id_hex: "0x16" direction: "S→C" family: "Audio" implementation_status: "Sent" evidence: "Live-verified" wire_size: "Variable: 3 + name + 6P bytes" --- # Packet 22: CreateAmbientSound > Registers a map-owned ambient controller. Empty point lists create a global bed; authored points create local emitters. - **Decimal ID:** 22 - **Hex ID:** 0x16 - **Direction:** S→C - **Family:** Audio - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** Variable: 3 + name + 6P bytes ## Implementation note Must precede PlayAmbientSound (24) with the same loop ID. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 22 (0x16). | — | | 1 | `name` | NUL-terminated UTF-8 string | N + 1 | Validated retail sound asset name. | — | | 2 | `loop_id` | u8 | 1 | loop id value. | — | | 3 | `point_count` | u8 | 1 | P: emitter point count. | — | | 4 | `points[]` | P × 3 × i16 LE | 6P | Raw signed-short X/Y/Z emitter coordinates. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/22) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 23: PlaySound" description: "Plays a one-shot or looping positional/UI sound, including pickup, round, kill, and observer-only block-tool cues." canonical: "https://aosplay.net/protocol-168/packets/23" markdown: "https://aosplay.net/docs/protocol-168/packets/23.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "23" packet_id_hex: "0x17" direction: "S→C" family: "Audio" implementation_status: "Sent" evidence: "Live-verified" wire_size: "7–16 bytes" --- # Packet 23: PlaySound > Plays a one-shot or looping positional/UI sound, including pickup, round, kill, and observer-only block-tool cues. - **Decimal ID:** 23 - **Hex ID:** 0x17 - **Direction:** S→C - **Family:** Audio - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 7–16 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 23 (0x17). | — | | 1 | `sound_id` | u8 | 1 | sound id value. | — | | 2 | `flags` | u8 | 1 | Bit 0 looping; bit 1 positioned. | — | | 3 | `volume` | sign-magnitude fixed16 LE (1/64) | 2 | volume value. | — | | 4 | `time` | sign-magnitude fixed16 LE (1/64) | 2 | time value. | — | | 5 | `loop_id` | u8 | 1 | loop id value. | looping flag set | | 6 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | positioned flag set | | 7 | `attenuation` | sign-magnitude fixed16 LE (1/64) | 2 | attenuation value. | positioned flag set | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/23) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 24: PlayAmbientSound" description: "Starts the streaming ambient GameSound registered by packet 22 and supplies its playback flags, volume, time, position, and attenuation." canonical: "https://aosplay.net/protocol-168/packets/24" markdown: "https://aosplay.net/docs/protocol-168/packets/24.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "24" packet_id_hex: "0x18" direction: "S→C" family: "Audio" implementation_status: "Sent" evidence: "Live-verified" wire_size: "Variable: name + 7–16 bytes" --- # Packet 24: PlayAmbientSound > Starts the streaming ambient GameSound registered by packet 22 and supplies its playback flags, volume, time, position, and attenuation. - **Decimal ID:** 24 - **Hex ID:** 0x18 - **Direction:** S→C - **Family:** Audio - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** Variable: name + 7–16 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 24 (0x18). | — | | 1 | `name` | NUL-terminated UTF-8 string | N + 1 | Null-terminated UTF-8/ASCII-compatible string. | — | | 2 | `flags` | u8 | 1 | Bit 0 looping; bit 1 positioned. | — | | 3 | `volume` | sign-magnitude fixed16 LE (1/64) | 2 | volume value. | — | | 4 | `time` | sign-magnitude fixed16 LE (1/64) | 2 | time value. | — | | 5 | `loop_id` | u8 | 1 | loop id value. | looping flag set | | 6 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | positioned flag set | | 7 | `attenuation` | sign-magnitude fixed16 LE (1/64) | 2 | attenuation value. | positioned flag set | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/24) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 25: StopSound" description: "Stops the looping sound associated with a loop ID." canonical: "https://aosplay.net/protocol-168/packets/25" markdown: "https://aosplay.net/docs/protocol-168/packets/25.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "25" packet_id_hex: "0x19" direction: "Inactive" family: "Audio" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 bytes" --- # Packet 25: StopSound > Stops the looping sound associated with a loop ID. - **Decimal ID:** 25 - **Hex ID:** 0x19 - **Direction:** Inactive - **Family:** Audio - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 25 (0x19). | — | | 1 | `loop_id` | u8 | 1 | loop id value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/25) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 26: PlayMusic" description: "Starts a named music track at an encoded playback offset." canonical: "https://aosplay.net/protocol-168/packets/26" markdown: "https://aosplay.net/docs/protocol-168/packets/26.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "26" packet_id_hex: "0x1A" direction: "S→C" family: "Audio" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "Variable: name + 4 bytes" --- # Packet 26: PlayMusic > Starts a named music track at an encoded playback offset. - **Decimal ID:** 26 - **Hex ID:** 0x1A - **Direction:** S→C - **Family:** Audio - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** Variable: name + 4 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 26 (0x1A). | — | | 1 | `name` | NUL-terminated UTF-8 string | N + 1 | Null-terminated UTF-8/ASCII-compatible string. | — | | 2 | `seconds_played` | sign-magnitude fixed16 LE (1/64) | 2 | seconds played value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/26) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 27: StopMusic" description: "Stops the current music track." canonical: "https://aosplay.net/protocol-168/packets/27" markdown: "https://aosplay.net/docs/protocol-168/packets/27.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "27" packet_id_hex: "0x1B" direction: "S→C" family: "Audio" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "1 byte" --- # Packet 27: StopMusic > Stops the current music track. - **Decimal ID:** 27 - **Hex ID:** 0x1B - **Direction:** S→C - **Family:** Audio - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 27 (0x1B). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/27) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 28: CreatePlayer" description: "Creates a player character and also serves as the active roster format. Class, loadout, and all selected prefab names come from one committed selection." canonical: "https://aosplay.net/protocol-168/packets/28" markdown: "https://aosplay.net/docs/protocol-168/packets/28.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "28" packet_id_hex: "0x1C" direction: "S→C" family: "Players" implementation_status: "Sent" evidence: "Live-verified" wire_size: "Variable: 21 + name + L + Σprefabs" --- # Packet 28: CreatePlayer > Creates a player character and also serves as the active roster format. Class, loadout, and all selected prefab names come from one committed selection. - **Decimal ID:** 28 - **Hex ID:** 0x1C - **Direction:** S→C - **Family:** Players - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** Variable: 21 + name + L + Σprefabs ## Implementation note Names must already be unique. This direction contains no field identifying which remote row the receiving client owns. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 28 (0x1C). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `demo_player` | boolean u8 | 1 | demo player value. | — | | 3 | `class_id` | u8 | 1 | Selected character class identifier. | — | | 4 | `team` | u8 | 1 | team value. | — | | 5 | `dead` | boolean u8 | 1 | dead value. | — | | 6 | `local_language` | u8 | 1 | local language value. | — | | 7 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 8 | `orientation` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 9 | `name` | NUL-terminated UTF-8 string | N + 1 | Null-terminated UTF-8/ASCII-compatible string. | — | | 10 | `loadout_count` | u8 | 1 | L: tool count. | — | | 11 | `loadout[]` | L × u8 | L | Ordered tool IDs. | — | | 12 | `prefab_count` | u8 | 1 | prefab count value. | — | | 13 | `prefabs[]` | repeated NUL strings | Σ(N + 1) | Selected prefab names. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/28) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 29: PrefabComplete" description: "Signals the builder that a queued prefab placement has finished." canonical: "https://aosplay.net/protocol-168/packets/29" markdown: "https://aosplay.net/docs/protocol-168/packets/29.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "29" packet_id_hex: "0x1D" direction: "S→C" family: "Building" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "1 byte" --- # Packet 29: PrefabComplete > Signals the builder that a queued prefab placement has finished. - **Decimal ID:** 29 - **Hex ID:** 0x1D - **Direction:** S→C - **Family:** Building - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 29 (0x1D). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/29) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 30: BuildPrefabAction" description: "Requests a bounded KV6 prefab expansion. The server validates selection, stock, world contact, reservations, orientation, and cell range." canonical: "https://aosplay.net/protocol-168/packets/30" markdown: "https://aosplay.net/docs/protocol-168/packets/30.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "30" packet_id_hex: "0x1E" direction: "C→S" family: "Building" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "Variable: 28 + prefab-name bytes" --- # Packet 30: BuildPrefabAction > Requests a bounded KV6 prefab expansion. The server validates selection, stock, world contact, reservations, orientation, and cell range. - **Decimal ID:** 30 - **Hex ID:** 0x1E - **Direction:** C→S - **Family:** Building - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** Variable: 28 + prefab-name bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 30 (0x1E). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `prefab_name` | NUL-terminated UTF-8 string | N + 1 | prefab name value. | — | | 3 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 4 | `prefab_yaw` | u8 | 1 | prefab yaw value. | — | | 5 | `prefab_pitch` | u8 | 1 | prefab pitch value. | — | | 6 | `prefab_roll` | u8 | 1 | prefab roll value. | — | | 7 | `from_block_index` | i32 LE | 4 | from block index value. | — | | 8 | `to_block_index` | i32 LE | 4 | to block index value. | — | | 9 | `position` | 3 × i16 LE | 6 | Raw signed-short anchor coordinates. | — | | 10 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 11 | `add_to_user_blocks` | boolean u8 | 1 | add to user blocks value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/30) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 31: ErasePrefabAction" description: "Requests a UGC prefab carve over a bounded block-index range, ultimately using the verified Damage (37) block-destroy path." canonical: "https://aosplay.net/protocol-168/packets/31" markdown: "https://aosplay.net/docs/protocol-168/packets/31.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "31" packet_id_hex: "0x1F" direction: "C→S" family: "Building" implementation_status: "Handled" evidence: "Provisional" wire_size: "Variable: 17 + prefab-name bytes" --- # Packet 31: ErasePrefabAction > Requests a UGC prefab carve over a bounded block-index range, ultimately using the verified Damage (37) block-destroy path. - **Decimal ID:** 31 - **Hex ID:** 0x1F - **Direction:** C→S - **Family:** Building - **Status:** Handled - **Evidence:** Provisional - **Wire size:** Variable: 17 + prefab-name bytes ## Implementation note The recovered wire shape has no rotation fields and still needs a clean live-client validation pass. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 31 (0x1F). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `prefab_name` | NUL-terminated UTF-8 string | N + 1 | prefab name value. | — | | 4 | `from_block_index` | i16 LE | 2 | from block index value. | — | | 5 | `to_block_index` | i16 LE | 2 | to block index value. | — | | 6 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/31) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 32: BlockBuild" description: "Places one voxel using the player's current colour and the specified build type." canonical: "https://aosplay.net/protocol-168/packets/32" markdown: "https://aosplay.net/docs/protocol-168/packets/32.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "32" packet_id_hex: "0x20" direction: "Both" family: "Building" implementation_status: "Handled + sent" evidence: "Implementation-backed" wire_size: "13 bytes" --- # Packet 32: BlockBuild > Places one voxel using the player's current colour and the specified build type. - **Decimal ID:** 32 - **Hex ID:** 0x20 - **Direction:** Both - **Family:** Building - **Status:** Handled + sent - **Evidence:** Implementation-backed - **Wire size:** 13 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 32 (0x20). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `x` | i16 LE | 2 | x value. | — | | 4 | `y` | i16 LE | 2 | y value. | — | | 5 | `z` | i16 LE | 2 | z value. | — | | 6 | `block_type` | u8 | 1 | block type value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/32) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 33: BlockBuildColored" description: "Places one voxel with explicit RGB, used for prefabs, observers, terrain repair, and persistent Block Cannon impacts." canonical: "https://aosplay.net/protocol-168/packets/33" markdown: "https://aosplay.net/docs/protocol-168/packets/33.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "33" packet_id_hex: "0x21" direction: "S→C" family: "Building" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "15 bytes" --- # Packet 33: BlockBuildColored > Places one voxel with explicit RGB, used for prefabs, observers, terrain repair, and persistent Block Cannon impacts. - **Decimal ID:** 33 - **Hex ID:** 0x21 - **Direction:** S→C - **Family:** Building - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 15 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 33 (0x21). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `x` | i16 LE | 2 | x value. | — | | 4 | `y` | i16 LE | 2 | y value. | — | | 5 | `z` | i16 LE | 2 | z value. | — | | 6 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/33) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 34: BlockOccupy" description: "Marks one voxel as occupied by a player/building workflow." canonical: "https://aosplay.net/protocol-168/packets/34" markdown: "https://aosplay.net/docs/protocol-168/packets/34.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "34" packet_id_hex: "0x22" direction: "Inactive" family: "Building" implementation_status: "Planned" evidence: "Provisional" wire_size: "12 bytes" --- # Packet 34: BlockOccupy > Marks one voxel as occupied by a player/building workflow. - **Decimal ID:** 34 - **Hex ID:** 0x22 - **Direction:** Inactive - **Family:** Building - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 12 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 34 (0x22). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `x` | i16 LE | 2 | x value. | — | | 4 | `y` | i16 LE | 2 | y value. | — | | 5 | `z` | i16 LE | 2 | z value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/34) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 35: BlockLiberate" description: "Requests liberation/destruction of one voxel, primarily through the spade dig path." canonical: "https://aosplay.net/protocol-168/packets/35" markdown: "https://aosplay.net/docs/protocol-168/packets/35.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "35" packet_id_hex: "0x23" direction: "C→S" family: "Building" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "12 bytes" --- # Packet 35: BlockLiberate > Requests liberation/destruction of one voxel, primarily through the spade dig path. - **Decimal ID:** 35 - **Hex ID:** 0x23 - **Direction:** C→S - **Family:** Building - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 12 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 35 (0x23). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `x` | i16 LE | 2 | x value. | — | | 4 | `y` | i16 LE | 2 | y value. | — | | 5 | `z` | i16 LE | 2 | z value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/35) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 36: ExplodeCorpse" description: "Requests the client to gib/explode a player's corpse for death presentation." canonical: "https://aosplay.net/protocol-168/packets/36" markdown: "https://aosplay.net/docs/protocol-168/packets/36.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "36" packet_id_hex: "0x24" direction: "Inactive" family: "Combat" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 36: ExplodeCorpse > Requests the client to gib/explode a player's corpse for death presentation. - **Decimal ID:** 36 - **Hex ID:** 0x24 - **Direction:** Inactive - **Family:** Combat - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 36 (0x24). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `show_explosion_effect` | boolean u8 | 1 | show explosion effect value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/36) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 37: Damage" description: "Broadcasts authoritative block or player damage. Damage type selects exact-cell, area, melee, drill, snowball, and other native expansion behavior." canonical: "https://aosplay.net/protocol-168/packets/37" markdown: "https://aosplay.net/docs/protocol-168/packets/37.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "37" packet_id_hex: "0x25" direction: "S→C" family: "Combat" implementation_status: "Sent" evidence: "Live-verified" wire_size: "21 bytes" --- # Packet 37: Damage > Broadcasts authoritative block or player damage. Damage type selects exact-cell, area, melee, drill, snowball, and other native expansion behavior. - **Decimal ID:** 37 - **Hex ID:** 0x25 - **Direction:** S→C - **Family:** Combat - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 21 bytes ## Implementation note Snowball sends one reliable zero-damage type-20 event before DestroyEntity (19) so the retail explosion manager predicts impulse. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 37 (0x25). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `type` | u8 | 1 | Action- or resource-specific discriminator. | — | | 3 | `damage` | u8 fixed-point (1/4) | 1 | Damage scalar encoded in quarter units. | — | | 4 | `face` | u8 | 1 | Voxel face or placement orientation index. | — | | 5 | `chunk_check` | boolean u8 | 1 | chunk check value. | — | | 6 | `seed` | u8 | 1 | Deterministic random seed used to reproduce client effects. | — | | 7 | `causer_id` | i16 LE | 2 | causer id value. | — | | 8 | `position` | 3 × IEEE-754 f32 LE | 12 | X, Y, and Z floating-point components. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/37) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 38: BlockManagerState" description: "Carries BlockManager damaged, occupied, and user-owned dictionaries—not VXL topology or a removed-voxel resynchronization stream." canonical: "https://aosplay.net/protocol-168/packets/38" markdown: "https://aosplay.net/docs/protocol-168/packets/38.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "38" packet_id_hex: "0x26" direction: "Inactive" family: "Building" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable; non-empty record format unresolved" --- # Packet 38: BlockManagerState > Carries BlockManager damaged, occupied, and user-owned dictionaries—not VXL topology or a removed-voxel resynchronization stream. - **Decimal ID:** 38 - **Hex ID:** 0x26 - **Direction:** Inactive - **Family:** Building - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable; non-empty record format unresolved ## Implementation note The empty form is understood. Non-empty retail encoding remains explicitly unverified. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 38 (0x26). | — | | 1 | `record_count` | i32 LE | 4 | record count value. | — | | 2 | `records[]` | packed block record | unverified | Generated reader and writer disagree about the colour-presence byte; do not treat the non-empty shape as stable. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/38) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 39: ServerBlockAction" description: "A server-authored batch of compact block items. The recovered retail client path is currently a no-op stub." canonical: "https://aosplay.net/protocol-168/packets/39" markdown: "https://aosplay.net/docs/protocol-168/packets/39.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "39" packet_id_hex: "0x27" direction: "Inactive" family: "Building" implementation_status: "Planned" evidence: "Provisional" wire_size: "5 + N × (7 or 10) bytes in generated writer" --- # Packet 39: ServerBlockAction > A server-authored batch of compact block items. The recovered retail client path is currently a no-op stub. - **Decimal ID:** 39 - **Hex ID:** 0x27 - **Direction:** Inactive - **Family:** Building - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 5 + N × (7 or 10) bytes in generated writer ## Implementation note The generated record writer is documented for research, but the unused client receive path has not been live-validated. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 39 (0x27). | — | | 1 | `record_count` | i32 LE | 4 | record count value. | — | | 2 | `records[].has_color` | boolean u8 | 1 | Whether a three-byte BGR colour follows the packed coordinates. | — | | 3 | `records[].coordinates` | 3 × packed i16 LE | 6 | X/Y low components plus packed Z and high-coordinate bits. | — | | 4 | `records[].color` | BGR888 | 3 | Optional explicit colour. | has_color = 1 | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/39) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 40: BlockLine" description: "The retail 1.x client's normal multi-block placement request. The server rasterizes and validates the line between both voxel endpoints." canonical: "https://aosplay.net/protocol-168/packets/40" markdown: "https://aosplay.net/docs/protocol-168/packets/40.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "40" packet_id_hex: "0x28" direction: "C→S" family: "Building" implementation_status: "Handled" evidence: "Live-verified" wire_size: "18 bytes" --- # Packet 40: BlockLine > The retail 1.x client's normal multi-block placement request. The server rasterizes and validates the line between both voxel endpoints. - **Decimal ID:** 40 - **Hex ID:** 0x28 - **Direction:** C→S - **Family:** Building - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 18 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 40 (0x28). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `x1` | i16 LE | 2 | x1 value. | — | | 4 | `y1` | i16 LE | 2 | y1 value. | — | | 5 | `z1` | i16 LE | 2 | z1 value. | — | | 6 | `x2` | i16 LE | 2 | x2 value. | — | | 7 | `y2` | i16 LE | 2 | y2 value. | — | | 8 | `z2` | i16 LE | 2 | z2 value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/40) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 41: MinimapBillboard" description: "Creates a coloured, optionally tracking billboard/icon on the minimap." canonical: "https://aosplay.net/protocol-168/packets/41" markdown: "https://aosplay.net/docs/protocol-168/packets/41.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "41" packet_id_hex: "0x29" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 15 + icon-name bytes" --- # Packet 41: MinimapBillboard > Creates a coloured, optionally tracking billboard/icon on the minimap. - **Decimal ID:** 41 - **Hex ID:** 0x29 - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 15 + icon-name bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 41 (0x29). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | | 2 | `key` | u8 | 1 | Visibility/team key. | — | | 3 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 4 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 5 | `icon_name` | NUL-terminated UTF-8 string | N + 1 | Retail minimap icon asset name. | — | | 6 | `tracking` | boolean u8 | 1 | Whether the marker follows its associated entity. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/41) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 42: MinimapBillboardClear" description: "Clears a minimap billboard by entity identifier." canonical: "https://aosplay.net/protocol-168/packets/42" markdown: "https://aosplay.net/docs/protocol-168/packets/42.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "42" packet_id_hex: "0x2A" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 42: MinimapBillboardClear > Clears a minimap billboard by entity identifier. - **Decimal ID:** 42 - **Hex ID:** 0x2A - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 42 (0x2A). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/42) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 43: MinimapZone" description: "Creates a bounded minimap zone and icon. BattleSpades uses it for the CTF base area at mode start and during late-join replay." canonical: "https://aosplay.net/protocol-168/packets/43" markdown: "https://aosplay.net/docs/protocol-168/packets/43.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "43" packet_id_hex: "0x2B" direction: "S→C" family: "Interface" implementation_status: "Sent" evidence: "Live-verified" wire_size: "21 bytes" --- # Packet 43: MinimapZone > Creates a bounded minimap zone and icon. BattleSpades uses it for the CTF base area at mode start and during late-join replay. - **Decimal ID:** 43 - **Hex ID:** 0x2B - **Direction:** S→C - **Family:** Interface - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 21 bytes ## Implementation note The six signed shorts are literal voxel bounds; they are not fixed-point world coordinates. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 43 (0x2B). | — | | 1 | `key` | u8 | 1 | Native visible-team key. | — | | 2 | `color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 3 | `min_x` | i16 LE | 2 | min x value. | — | | 4 | `min_y` | i16 LE | 2 | min y value. | — | | 5 | `min_z` | i16 LE | 2 | min z value. | — | | 6 | `max_x` | i16 LE | 2 | max x value. | — | | 7 | `max_y` | i16 LE | 2 | max y value. | — | | 8 | `max_z` | i16 LE | 2 | max z value. | — | | 9 | `icon_scale` | sign-magnitude fixed16 LE (1/64) | 2 | icon scale value. | — | | 10 | `icon_id` | u8 | 1 | Icon 6 is the native CTF zone icon. | — | | 11 | `locked_in_zone` | boolean u8 | 1 | locked in zone value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/43) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 44: MinimapZoneClear" description: "Clears the minimap zone matching an exact six-coordinate voxel bounding box." canonical: "https://aosplay.net/protocol-168/packets/44" markdown: "https://aosplay.net/docs/protocol-168/packets/44.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "44" packet_id_hex: "0x2C" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "13 bytes" --- # Packet 44: MinimapZoneClear > Clears the minimap zone matching an exact six-coordinate voxel bounding box. - **Decimal ID:** 44 - **Hex ID:** 0x2C - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 13 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 44 (0x2C). | — | | 1 | `min_x` | i16 LE | 2 | min x value. | — | | 2 | `min_y` | i16 LE | 2 | min y value. | — | | 3 | `min_z` | i16 LE | 2 | min z value. | — | | 4 | `max_x` | i16 LE | 2 | max x value. | — | | 5 | `max_y` | i16 LE | 2 | max y value. | — | | 6 | `max_z` | i16 LE | 2 | max z value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/44) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 45: StateData" description: "The per-spawn GameScene snapshot: lighting, physics, mode, teams, class locks, prefabs, static entities, screenshot cameras, and rollover state." canonical: "https://aosplay.net/protocol-168/packets/45" markdown: "https://aosplay.net/docs/protocol-168/packets/45.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "45" packet_id_hex: "0x2D" direction: "S→C" family: "Replication" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "Variable: 61-byte shell + strings, arrays, and entities" --- # Packet 45: StateData > The per-spawn GameScene snapshot: lighting, physics, mode, teams, class locks, prefabs, static entities, screenshot cameras, and rollover state. - **Decimal ID:** 45 - **Hex ID:** 0x2D - **Direction:** S→C - **Family:** Replication - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** Variable: 61-byte shell + strings, arrays, and entities ## Implementation note VIP and Zombie modes derive their class visibility and locks from this packet; malformed list shapes are crash-sensitive in the retail scene constructor. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 45 (0x2D). | — | | 1 | `player_id` | u8 | 1 | Receiving player's slot. | — | | 2 | `fog_color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 3 | `gravity` | sign-magnitude fixed16 LE (1/64) | 2 | gravity value. | — | | 4 | `light_color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 5 | `light_direction` | 3 × fixed16 LE (Z,Y,X) | 6 | Primary light direction written in reverse component order. | — | | 6 | `back_light_color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 7 | `back_light_direction` | 3 × fixed16 LE (Z,Y,X) | 6 | Back-light direction. | — | | 8 | `ambient_light_color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 9 | `ambient_light_intensity` | sign-magnitude fixed16 LE (1/64) | 2 | ambient light intensity value. | — | | 10 | `time_scale` | sign-magnitude fixed16 LE (1/64) | 2 | time scale value. | — | | 11 | `score_limit` | u8 | 1 | score limit value. | — | | 12 | `mode_type` | u8 | 1 | mode type value. | — | | 13 | `team_headcount_type` | u8 | 1 | team headcount type value. | — | | 14 | `team1_name` | NUL-terminated UTF-8 string | N + 1 | team1 name value. | — | | 15 | `team1_color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 16 | `team1_score` | i32 LE | 4 | team1 score value. | — | | 17 | `team1_flags` | u8 | 1 | Lock, visibility, score, infinite-block, class-lock, and score-lock bits. | — | | 18 | `team1_class_count` | u8 | 1 | team1 class count value. | — | | 19 | `team1_classes[]` | C1 × u8 | C1 | Allowed class IDs. | — | | 20 | `team2_name` | NUL-terminated UTF-8 string | N + 1 | team2 name value. | — | | 21 | `team2_color` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 22 | `team2_score` | i32 LE | 4 | team2 score value. | — | | 23 | `team2_flags` | u8 | 1 | Lock, visibility, score, infinite-block, class-lock, and score-lock bits. | — | | 24 | `team2_class_count` | u8 | 1 | team2 class count value. | — | | 25 | `team2_classes[]` | C2 × u8 | C2 | Allowed class IDs. | — | | 26 | `global_lock_flags` | u8 | 1 | Bit 0 locks team swap; bit 1 locks spectator swap. | — | | 27 | `prefab_count` | u8 | 1 | prefab count value. | — | | 28 | `prefab_padding` | u8 | 1 | Required zero padding. | — | | 29 | `prefabs[]` | repeated NUL strings | Σ(N + 1) | Available prefab names. | — | | 30 | `entity_count` | u8 | 1 | entity count value. | — | | 31 | `entity_padding` | u8 | 1 | Required zero padding. | — | | 32 | `entities[]` | Entity records | Σ(33 + 4I + 2F) | Static scene entities using the packet-21 inner layout. | — | | 33 | `camera_point_count` | u8 | 1 | camera point count value. | — | | 34 | `camera_points[]` | P × 3 × fixed16 LE (Z,Y,X) | 6P | Screenshot camera positions. | — | | 35 | `camera_rotation_count` | u8 | 1 | camera rotation count value. | — | | 36 | `camera_rotations[]` | R × 3 × fixed16 LE (Z,Y,X) | 6R | Screenshot camera rotations. | — | | 37 | `has_map_ended` | boolean u8 | 1 | has map ended value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/45) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 46: KillAction" description: "Broadcasts a death/kill event and its native HUD metadata." canonical: "https://aosplay.net/protocol-168/packets/46" markdown: "https://aosplay.net/docs/protocol-168/packets/46.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "46" packet_id_hex: "0x2E" direction: "S→C" family: "Combat" implementation_status: "Sent" evidence: "Live-verified" wire_size: "8 bytes" --- # Packet 46: KillAction > Broadcasts a death/kill event and its native HUD metadata. - **Decimal ID:** 46 - **Hex ID:** 0x2E - **Direction:** S→C - **Family:** Combat - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 8 bytes ## Implementation note kill_count is not the cumulative scoreboard total; it resets on death and round transitions. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 46 (0x2E). | — | | 1 | `player_id` | u8 | 1 | Victim player slot. | — | | 2 | `killer_id` | u8 | 1 | killer id value. | — | | 3 | `kill_type` | u8 | 1 | kill type value. | — | | 4 | `respawn_time` | u8 | 1 | respawn time value. | — | | 5 | `kill_count` | u8 | 1 | Killer's current-life streak used by the multikill HUD. | — | | 6 | `domination_kill` | boolean u8 | 1 | domination kill value. | — | | 7 | `revenge_kill` | boolean u8 | 1 | revenge kill value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/46) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 47: GenericVoteMessage" description: "Opens, updates, closes, or casts into the native kick/next-map vote overlay." canonical: "https://aosplay.net/protocol-168/packets/47" markdown: "https://aosplay.net/docs/protocol-168/packets/47.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "47" packet_id_hex: "0x2F" direction: "Both" family: "Interface" implementation_status: "Handled + sent" evidence: "Live-verified" wire_size: "Variable: 6 + candidates + title + description" --- # Packet 47: GenericVoteMessage > Opens, updates, closes, or casts into the native kick/next-map vote overlay. - **Decimal ID:** 47 - **Hex ID:** 0x2F - **Direction:** Both - **Family:** Interface - **Status:** Handled + sent - **Evidence:** Live-verified - **Wire size:** Variable: 6 + candidates + title + description ## Implementation note The stock overlay binds at most the first three candidates to F1/F2/F3. Candidate text is an identity field, not a yes/no label. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 47 (0x2F). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `message_type` | u8 | 1 | message type value. | — | | 3 | `candidate_count` | u16 LE | 2 | candidate count value. | — | | 4 | `candidates[].name` | NUL-terminated UTF-8 string | N + 1 | Exact candidate identity shown to and returned by the client. | — | | 5 | `candidates[].votes` | i32 LE | 4 | candidates[].votes value. | — | | 6 | `title` | NUL-terminated UTF-8 string | N + 1 | repr-form localized-string tuple. | — | | 7 | `description` | NUL-terminated UTF-8 string | N + 1 | repr-form localized-string tuple. | — | | 8 | `vote_flags` | u8 | 1 | Bit 0 allow revote; bit 2 can vote. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/47) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 48: InitiateKickMessage" description: "Requests the start or cancellation path for a player kick vote." canonical: "https://aosplay.net/protocol-168/packets/48" markdown: "https://aosplay.net/docs/protocol-168/packets/48.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "48" packet_id_hex: "0x30" direction: "C→S" family: "Interface" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "4 bytes" --- # Packet 48: InitiateKickMessage > Requests the start or cancellation path for a player kick vote. - **Decimal ID:** 48 - **Hex ID:** 0x30 - **Direction:** C→S - **Family:** Interface - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 4 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 48 (0x30). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `target_id` | u8 | 1 | Player proposed for removal. | — | | 3 | `reason` | u8 | 1 | Native kick-reason enum. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/48) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 49: ChatMessage" description: "Carries player chat and server announcements. Types 0/1 are player channels, type 2 is a private system reply, and type 3 is the global top-screen CHAT_BIG presentation." canonical: "https://aosplay.net/protocol-168/packets/49" markdown: "https://aosplay.net/docs/protocol-168/packets/49.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "49" packet_id_hex: "0x31" direction: "Both" family: "Interface" implementation_status: "Handled + sent" evidence: "Live-verified" wire_size: "Variable: 4 + text bytes" --- # Packet 49: ChatMessage > Carries player chat and server announcements. Types 0/1 are player channels, type 2 is a private system reply, and type 3 is the global top-screen CHAT_BIG presentation. - **Decimal ID:** 49 - **Hex ID:** 0x31 - **Direction:** Both - **Family:** Interface - **Status:** Handled + sent - **Evidence:** Live-verified - **Wire size:** Variable: 4 + text bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 49 (0x31). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `chat_type` | u8 | 1 | chat type value. | — | | 3 | `value` | NUL-terminated UTF-8 string | N + 1 | Chat or announcement text. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/49) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 50: LocalisedMessage" description: "Displays a string-table announcement with positional parameters and optional parameter localization." canonical: "https://aosplay.net/protocol-168/packets/50" markdown: "https://aosplay.net/docs/protocol-168/packets/50.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "50" packet_id_hex: "0x32" direction: "S→C" family: "Interface" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "Variable: 5 + string ID + parameters" --- # Packet 50: LocalisedMessage > Displays a string-table announcement with positional parameters and optional parameter localization. - **Decimal ID:** 50 - **Hex ID:** 0x32 - **Direction:** S→C - **Family:** Interface - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** Variable: 5 + string ID + parameters ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 50 (0x32). | — | | 1 | `chat_type` | u8 | 1 | chat type value. | — | | 2 | `localise_parameters` | boolean u8 | 1 | localise parameters value. | — | | 3 | `string_id` | NUL-terminated UTF-8 string | N + 1 | Retail localization-table key. | — | | 4 | `parameter_count` | u8 | 1 | parameter count value. | — | | 5 | `parameters[]` | repeated NUL strings | Σ(N + 1) | Values for {0}, {1}, and later placeholders. | — | | 6 | `override_previous_message` | boolean u8 | 1 | Replace the previous top-screen message. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/50) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 51: SkyboxData" description: "Selects the retail mesh-environment manifest used for sky, clouds, mist, waves, sun, transforms, and UV animation." canonical: "https://aosplay.net/protocol-168/packets/51" markdown: "https://aosplay.net/docs/protocol-168/packets/51.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "51" packet_id_hex: "0x33" direction: "S→C" family: "Map sync" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "Variable: 2 + filename bytes" --- # Packet 51: SkyboxData > Selects the retail mesh-environment manifest used for sky, clouds, mist, waves, sun, transforms, and UV animation. - **Decimal ID:** 51 - **Hex ID:** 0x33 - **Direction:** S→C - **Family:** Map sync - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** Variable: 2 + filename bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 51 (0x33). | — | | 1 | `value` | NUL-terminated UTF-8 string | N + 1 | Validated skybox/environment filename. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/51) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 52: MapEnded" description: "Triggers the native full-GameScene rollover boundary after end-of-round presentation and map preflight." canonical: "https://aosplay.net/protocol-168/packets/52" markdown: "https://aosplay.net/docs/protocol-168/packets/52.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "52" packet_id_hex: "0x34" direction: "S→C" family: "Map sync" implementation_status: "Sent" evidence: "Live-verified" wire_size: "1 byte" --- # Packet 52: MapEnded > Triggers the native full-GameScene rollover boundary after end-of-round presentation and map preflight. - **Decimal ID:** 52 - **Hex ID:** 0x34 - **Direction:** S→C - **Family:** Map sync - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 1 byte ## Implementation note The native handler freezes the scene; the revival compatibility hook opens LoadingMenu before the server begins a fresh loader handshake. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 52 (0x34). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/52) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 53: ShowGameStats" description: "Opens the native end-of-round game-statistics screen when a compatible level screenshot exists." canonical: "https://aosplay.net/protocol-168/packets/53" markdown: "https://aosplay.net/docs/protocol-168/packets/53.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "53" packet_id_hex: "0x35" direction: "S→C" family: "Progression" implementation_status: "Sent" evidence: "Live-verified" wire_size: "1 byte" --- # Packet 53: ShowGameStats > Opens the native end-of-round game-statistics screen when a compatible level screenshot exists. - **Decimal ID:** 53 - **Hex ID:** 0x35 - **Direction:** S→C - **Family:** Progression - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 53 (0x35). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/53) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 54: MapDataStart" description: "Begins the legacy map-data transfer family. The active BattleSpades path uses MapSyncStart (55)." canonical: "https://aosplay.net/protocol-168/packets/54" markdown: "https://aosplay.net/docs/protocol-168/packets/54.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "54" packet_id_hex: "0x36" direction: "Inactive" family: "Map sync" implementation_status: "Planned" evidence: "Provisional" wire_size: "1 byte" --- # Packet 54: MapDataStart > Begins the legacy map-data transfer family. The active BattleSpades path uses MapSyncStart (55). - **Decimal ID:** 54 - **Hex ID:** 0x36 - **Direction:** Inactive - **Family:** Map sync - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 54 (0x36). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/54) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 55: MapSyncStart" description: "Starts the active VXL map synchronization stream, normally under wrapper prefix 0x32." canonical: "https://aosplay.net/protocol-168/packets/55" markdown: "https://aosplay.net/docs/protocol-168/packets/55.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "55" packet_id_hex: "0x37" direction: "S→C" family: "Map sync" implementation_status: "Sent" evidence: "Live-verified" wire_size: "1 byte" --- # Packet 55: MapSyncStart > Starts the active VXL map synchronization stream, normally under wrapper prefix 0x32. - **Decimal ID:** 55 - **Hex ID:** 0x37 - **Direction:** S→C - **Family:** Map sync - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 55 (0x37). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/55) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 56: MapDataChunk" description: "Carries one chunk in the legacy map-data transfer family." canonical: "https://aosplay.net/protocol-168/packets/56" markdown: "https://aosplay.net/docs/protocol-168/packets/56.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "56" packet_id_hex: "0x38" direction: "Inactive" family: "Map sync" implementation_status: "Planned" evidence: "Provisional" wire_size: "4 + N bytes" --- # Packet 56: MapDataChunk > Carries one chunk in the legacy map-data transfer family. - **Decimal ID:** 56 - **Hex ID:** 0x38 - **Direction:** Inactive - **Family:** Map sync - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 4 + N bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 56 (0x38). | — | | 1 | `percent_complete` | u8 | 1 | percent complete value. | — | | 2 | `data_size` | u16 LE | 2 | N: raw payload length. | — | | 3 | `data` | raw bytes | N | Legacy map bytes. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/56) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 57: MapSyncChunk" description: "Carries one bounded chunk of the active VXL map stream." canonical: "https://aosplay.net/protocol-168/packets/57" markdown: "https://aosplay.net/docs/protocol-168/packets/57.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "57" packet_id_hex: "0x39" direction: "S→C" family: "Map sync" implementation_status: "Sent" evidence: "Live-verified" wire_size: "4 + N bytes" --- # Packet 57: MapSyncChunk > Carries one bounded chunk of the active VXL map stream. - **Decimal ID:** 57 - **Hex ID:** 0x39 - **Direction:** S→C - **Family:** Map sync - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 4 + N bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 57 (0x39). | — | | 1 | `percent_complete` | u8 | 1 | percent complete value. | — | | 2 | `data_size` | u16 LE | 2 | N: raw payload length. | — | | 3 | `data` | raw bytes | N | VXL stream bytes. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/57) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 58: MapDataEnd" description: "Terminates the legacy map-data transfer family." canonical: "https://aosplay.net/protocol-168/packets/58" markdown: "https://aosplay.net/docs/protocol-168/packets/58.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "58" packet_id_hex: "0x3A" direction: "Inactive" family: "Map sync" implementation_status: "Planned" evidence: "Provisional" wire_size: "1 byte" --- # Packet 58: MapDataEnd > Terminates the legacy map-data transfer family. - **Decimal ID:** 58 - **Hex ID:** 0x3A - **Direction:** Inactive - **Family:** Map sync - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 58 (0x3A). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/58) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 59: MapSyncEnd" description: "Terminates the active VXL map stream and advances the loader handshake." canonical: "https://aosplay.net/protocol-168/packets/59" markdown: "https://aosplay.net/docs/protocol-168/packets/59.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "59" packet_id_hex: "0x3B" direction: "S→C" family: "Map sync" implementation_status: "Sent" evidence: "Live-verified" wire_size: "1 byte" --- # Packet 59: MapSyncEnd > Terminates the active VXL map stream and advances the loader handshake. - **Decimal ID:** 59 - **Hex ID:** 0x3B - **Direction:** S→C - **Family:** Map sync - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 59 (0x3B). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/59) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 60: MapDataValidation" description: "Exchanges the map file CRC. The server answers with its authoritative file checksum before streaming." canonical: "https://aosplay.net/protocol-168/packets/60" markdown: "https://aosplay.net/docs/protocol-168/packets/60.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "60" packet_id_hex: "0x3C" direction: "Both" family: "Map sync" implementation_status: "Handled + sent" evidence: "Live-verified" wire_size: "5 bytes" --- # Packet 60: MapDataValidation > Exchanges the map file CRC. The server answers with its authoritative file checksum before streaming. - **Decimal ID:** 60 - **Hex ID:** 0x3C - **Direction:** Both - **Family:** Map sync - **Status:** Handled + sent - **Evidence:** Live-verified - **Wire size:** 5 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 60 (0x3C). | — | | 1 | `crc` | i32 LE | 4 | Signed 32-bit map checksum used by the validation handshake. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/60) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 61: PackStart" description: "Starts a legacy resource-pack transfer with its byte length and checksum." canonical: "https://aosplay.net/protocol-168/packets/61" markdown: "https://aosplay.net/docs/protocol-168/packets/61.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "61" packet_id_hex: "0x3D" direction: "Inactive" family: "Map sync" implementation_status: "Planned" evidence: "Provisional" wire_size: "9 bytes" --- # Packet 61: PackStart > Starts a legacy resource-pack transfer with its byte length and checksum. - **Decimal ID:** 61 - **Hex ID:** 0x3D - **Direction:** Inactive - **Family:** Map sync - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 9 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 61 (0x3D). | — | | 1 | `size` | i32 LE | 4 | Total resource-pack byte length. | — | | 2 | `checksum` | i32 LE | 4 | checksum value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/61) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 62: PackResponse" description: "Acknowledges or rejects the pending resource-pack transfer." canonical: "https://aosplay.net/protocol-168/packets/62" markdown: "https://aosplay.net/docs/protocol-168/packets/62.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "62" packet_id_hex: "0x3E" direction: "Inactive" family: "Map sync" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 bytes" --- # Packet 62: PackResponse > Acknowledges or rejects the pending resource-pack transfer. - **Decimal ID:** 62 - **Hex ID:** 0x3E - **Direction:** Inactive - **Family:** Map sync - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 62 (0x3E). | — | | 1 | `value` | u8 | 1 | Response/status enum. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/62) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 63: PackChunk" description: "Carries raw resource-pack bytes. No inner length prefix is present; the decoded packet boundary supplies the length." canonical: "https://aosplay.net/protocol-168/packets/63" markdown: "https://aosplay.net/docs/protocol-168/packets/63.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "63" packet_id_hex: "0x3F" direction: "Inactive" family: "Map sync" implementation_status: "Planned" evidence: "Provisional" wire_size: "1 + remaining payload bytes" --- # Packet 63: PackChunk > Carries raw resource-pack bytes. No inner length prefix is present; the decoded packet boundary supplies the length. - **Decimal ID:** 63 - **Hex ID:** 0x3F - **Direction:** Inactive - **Family:** Map sync - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 1 + remaining payload bytes ## Implementation note The generated reader still references an obsolete get() helper, so this unused receive path needs cleanup before activation. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 63 (0x3F). | — | | 1 | `data` | raw bytes | remainder | Resource-pack chunk payload. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/63) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 64: PlayerLeft" description: "Removes a player slot from the current roster and scene." canonical: "https://aosplay.net/protocol-168/packets/64" markdown: "https://aosplay.net/docs/protocol-168/packets/64.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "64" packet_id_hex: "0x40" direction: "S→C" family: "Players" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "2 bytes" --- # Packet 64: PlayerLeft > Removes a player slot from the current roster and scene. - **Decimal ID:** 64 - **Hex ID:** 0x40 - **Direction:** S→C - **Family:** Players - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 64 (0x40). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/64) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 65: ProgressBar" description: "Configures a generic capture/build progress bar with current progress, rate, and a two-colour gradient." canonical: "https://aosplay.net/protocol-168/packets/65" markdown: "https://aosplay.net/docs/protocol-168/packets/65.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "65" packet_id_hex: "0x41" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "11 bytes" --- # Packet 65: ProgressBar > Configures a generic capture/build progress bar with current progress, rate, and a two-colour gradient. - **Decimal ID:** 65 - **Hex ID:** 0x41 - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 11 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 65 (0x41). | — | | 1 | `progress` | sign-magnitude fixed16 LE (1/64) | 2 | progress value. | — | | 2 | `rate` | sign-magnitude fixed16 LE (1/64) | 2 | rate value. | — | | 3 | `color1` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | | 4 | `color2` | BGR888 | 3 | Three colour channels written blue, green, then red. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/65) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 66: RankUps" description: "Describes one or more rank/score changes for end-of-match progression presentation." canonical: "https://aosplay.net/protocol-168/packets/66" markdown: "https://aosplay.net/docs/protocol-168/packets/66.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "66" packet_id_hex: "0x42" direction: "Inactive" family: "Progression" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 5 + rank-up records" --- # Packet 66: RankUps > Describes one or more rank/score changes for end-of-match progression presentation. - **Decimal ID:** 66 - **Hex ID:** 0x42 - **Direction:** Inactive - **Family:** Progression - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 5 + rank-up records ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 66 (0x42). | — | | 1 | `rank_up_count` | i32 LE | 4 | rank up count value. | — | | 2 | `rank_ups[].score_reason` | i32 LE | 4 | rank ups[].score reason value. | — | | 3 | `rank_ups[].old_score` | NUL-terminated UTF-8 string | N + 1 | Old score encoded as decimal text. | — | | 4 | `rank_ups[].new_score` | NUL-terminated UTF-8 string | N + 1 | New score encoded as decimal text. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/66) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 67: GameStats" description: "Builds the end-of-round scoreboard/statistics widget for a team and a list of typed player-stat rows." canonical: "https://aosplay.net/protocol-168/packets/67" markdown: "https://aosplay.net/docs/protocol-168/packets/67.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "67" packet_id_hex: "0x43" direction: "S→C" family: "Progression" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "9 + 8N bytes" --- # Packet 67: GameStats > Builds the end-of-round scoreboard/statistics widget for a team and a list of typed player-stat rows. - **Decimal ID:** 67 - **Hex ID:** 0x43 - **Direction:** S→C - **Family:** Progression - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 9 + 8N bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 67 (0x43). | — | | 1 | `stat_count` | i32 LE | 4 | N: number of rows. | — | | 2 | `team_id` | i32 LE | 4 | Team identifier. | — | | 3 | `stats[].player_id` | i32 LE | 4 | stats[].player id value. | — | | 4 | `stats[].type` | i32 LE | 4 | Statistic/result type for the paired player. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/67) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 68: UGCObjectives" description: "Defines custom UGC objective identifiers and integer values for a mode." canonical: "https://aosplay.net/protocol-168/packets/68" markdown: "https://aosplay.net/docs/protocol-168/packets/68.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "68" packet_id_hex: "0x44" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 6 + objective records" --- # Packet 68: UGCObjectives > Defines custom UGC objective identifiers and integer values for a mode. - **Decimal ID:** 68 - **Hex ID:** 0x44 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 6 + objective records ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 68 (0x44). | — | | 1 | `mode` | u8 | 1 | mode value. | — | | 2 | `objective_count` | i32 LE | 4 | objective count value. | — | | 3 | `objectives[].id` | NUL-terminated UTF-8 string | N + 1 | objectives[].id value. | — | | 4 | `objectives[].value` | i32 LE | 4 | objectives[].value value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/68) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 69: Restock" description: "Refills one player resource category. Type 0 is full-life/general restock; physical ammo crates must use type 3." canonical: "https://aosplay.net/protocol-168/packets/69" markdown: "https://aosplay.net/docs/protocol-168/packets/69.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "69" packet_id_hex: "0x45" direction: "S→C" family: "Players" implementation_status: "Sent" evidence: "Live-verified" wire_size: "3 bytes" --- # Packet 69: Restock > Refills one player resource category. Type 0 is full-life/general restock; physical ammo crates must use type 3. - **Decimal ID:** 69 - **Hex ID:** 0x45 - **Direction:** S→C - **Family:** Players - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 3 bytes ## Implementation note Using type 0 for an ammo crate also restores client health. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 69 (0x45). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `type` | u8 | 1 | 0 full/general, 3 ammunition, 4 health, 5 blocks, 6 jetpack. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/69) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 70: PickPickup" description: "Confirms an authoritative objective pickup and initializes the carried tool and burden state." canonical: "https://aosplay.net/protocol-168/packets/70" markdown: "https://aosplay.net/docs/protocol-168/packets/70.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "70" packet_id_hex: "0x46" direction: "S→C" family: "Players" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "4 bytes" --- # Packet 70: PickPickup > Confirms an authoritative objective pickup and initializes the carried tool and burden state. - **Decimal ID:** 70 - **Hex ID:** 0x46 - **Direction:** S→C - **Family:** Players - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 4 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 70 (0x46). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `pickup_id` | u8 | 1 | pickup id value. | — | | 3 | `burdensome` | boolean u8 | 1 | burdensome value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/70) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 71: DropPickup" description: "Requests and replicates an objective drop with authoritative identity, position, and capped throw velocity." canonical: "https://aosplay.net/protocol-168/packets/71" markdown: "https://aosplay.net/docs/protocol-168/packets/71.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "71" packet_id_hex: "0x47" direction: "Both" family: "Players" implementation_status: "Handled + sent" evidence: "Live-verified" wire_size: "19 bytes" --- # Packet 71: DropPickup > Requests and replicates an objective drop with authoritative identity, position, and capped throw velocity. - **Decimal ID:** 71 - **Hex ID:** 0x47 - **Direction:** Both - **Family:** Players - **Status:** Handled + sent - **Evidence:** Live-verified - **Wire size:** 19 bytes ## Implementation note The packet clears the carried tool but does not persist ground intel; CTF follows it with a type-16 CreateEntity at the settled position. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 71 (0x47). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `pickup_id` | u8 | 1 | pickup id value. | — | | 4 | `position` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | | 5 | `velocity` | 3 × fixed16 LE | 6 | X, Y, and Z components at 1/64-unit precision. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/71) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 72: ForceShowScores" description: "Forces the scoreboard overlay open or releases that override." canonical: "https://aosplay.net/protocol-168/packets/72" markdown: "https://aosplay.net/docs/protocol-168/packets/72.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "72" packet_id_hex: "0x48" direction: "Inactive" family: "Progression" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 bytes" --- # Packet 72: ForceShowScores > Forces the scoreboard overlay open or releases that override. - **Decimal ID:** 72 - **Hex ID:** 0x48 - **Direction:** Inactive - **Family:** Progression - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 72 (0x48). | — | | 1 | `forced` | boolean u8 | 1 | forced value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/72) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 73: ShowTextMessage" description: "Selects one of nine hard-coded end/mode messages for a fixed duration; it is not an arbitrary-text packet." canonical: "https://aosplay.net/protocol-168/packets/73" markdown: "https://aosplay.net/docs/protocol-168/packets/73.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "73" packet_id_hex: "0x49" direction: "S→C" family: "Interface" implementation_status: "Reversed / unused" evidence: "Live-verified" wire_size: "4 bytes" --- # Packet 73: ShowTextMessage > Selects one of nine hard-coded end/mode messages for a fixed duration; it is not an arbitrary-text packet. - **Decimal ID:** 73 - **Hex ID:** 0x49 - **Direction:** S→C - **Family:** Interface - **Status:** Reversed / unused - **Evidence:** Live-verified - **Wire size:** 4 bytes ## Implementation note BattleSpades intentionally uses ChatMessage (49) or LocalisedMessage (50) for free-form and localized announcements. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 73 (0x49). | — | | 1 | `message_id` | u8 | 1 | Native fixed-message enum. | — | | 2 | `duration` | sign-magnitude fixed16 LE (1/64) | 2 | duration value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/73) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 74: FogColor" description: "Overrides the active fog colour and persists that override into later spawn/rejoin snapshots." canonical: "https://aosplay.net/protocol-168/packets/74" markdown: "https://aosplay.net/docs/protocol-168/packets/74.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "74" packet_id_hex: "0x4A" direction: "S→C" family: "Interface" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "5 bytes" --- # Packet 74: FogColor > Overrides the active fog colour and persists that override into later spawn/rejoin snapshots. - **Decimal ID:** 74 - **Hex ID:** 0x4A - **Direction:** S→C - **Family:** Interface - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 5 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 74 (0x4A). | — | | 1 | `color` | packed B,G,R,0 | 4 | RGB packed into a little-endian 32-bit word with a zero low-significance padding channel. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/74) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 75: TimeScale" description: "Changes the GameScene time-scale multiplier for a mode rule." canonical: "https://aosplay.net/protocol-168/packets/75" markdown: "https://aosplay.net/docs/protocol-168/packets/75.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "75" packet_id_hex: "0x4B" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 75: TimeScale > Changes the GameScene time-scale multiplier for a mode rule. - **Decimal ID:** 75 - **Hex ID:** 0x4B - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 75 (0x4B). | — | | 1 | `scale` | sign-magnitude fixed16 LE (1/64) | 2 | scale value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/75) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 76: WeaponReload" description: "Requests a reload and confirms its completion/state to clients." canonical: "https://aosplay.net/protocol-168/packets/76" markdown: "https://aosplay.net/docs/protocol-168/packets/76.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "76" packet_id_hex: "0x4C" direction: "Both" family: "Combat" implementation_status: "Handled + sent" evidence: "Implementation-backed" wire_size: "4 bytes" --- # Packet 76: WeaponReload > Requests a reload and confirms its completion/state to clients. - **Decimal ID:** 76 - **Hex ID:** 0x4C - **Direction:** Both - **Family:** Combat - **Status:** Handled + sent - **Evidence:** Implementation-backed - **Wire size:** 4 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 76 (0x4C). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `tool_id` | u8 | 1 | Equipped tool identifier. | — | | 3 | `is_done` | boolean u8 | 1 | is done value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/76) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 77: ChangeTeam" description: "Requests a team switch for a player slot." canonical: "https://aosplay.net/protocol-168/packets/77" markdown: "https://aosplay.net/docs/protocol-168/packets/77.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "77" packet_id_hex: "0x4D" direction: "C→S" family: "Players" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "3 bytes" --- # Packet 77: ChangeTeam > Requests a team switch for a player slot. - **Decimal ID:** 77 - **Hex ID:** 0x4D - **Direction:** C→S - **Family:** Players - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 77 (0x4D). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `team` | u8 | 1 | team value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/77) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 78: ChangeClass" description: "Requests a class switch for a player slot." canonical: "https://aosplay.net/protocol-168/packets/78" markdown: "https://aosplay.net/docs/protocol-168/packets/78.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "78" packet_id_hex: "0x4E" direction: "C→S" family: "Players" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "3 bytes" --- # Packet 78: ChangeClass > Requests a class switch for a player slot. - **Decimal ID:** 78 - **Hex ID:** 0x4E - **Direction:** C→S - **Family:** Players - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 78 (0x4E). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `class_id` | u8 | 1 | Selected character class identifier. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/78) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 79: LockTeam" description: "Locks or unlocks joining a team." canonical: "https://aosplay.net/protocol-168/packets/79" markdown: "https://aosplay.net/docs/protocol-168/packets/79.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "79" packet_id_hex: "0x4F" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 79: LockTeam > Locks or unlocks joining a team. - **Decimal ID:** 79 - **Hex ID:** 0x4F - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 79 (0x4F). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `locked` | boolean u8 | 1 | locked value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/79) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 80: TeamLockClass" description: "Locks or unlocks class selection for a team." canonical: "https://aosplay.net/protocol-168/packets/80" markdown: "https://aosplay.net/docs/protocol-168/packets/80.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "80" packet_id_hex: "0x50" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 80: TeamLockClass > Locks or unlocks class selection for a team. - **Decimal ID:** 80 - **Hex ID:** 0x50 - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 80 (0x50). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `locked` | boolean u8 | 1 | locked value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/80) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 81: TeamLockScore" description: "Locks or unlocks score changes for a team." canonical: "https://aosplay.net/protocol-168/packets/81" markdown: "https://aosplay.net/docs/protocol-168/packets/81.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "81" packet_id_hex: "0x51" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 81: TeamLockScore > Locks or unlocks score changes for a team. - **Decimal ID:** 81 - **Hex ID:** 0x51 - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 81 (0x51). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `locked` | boolean u8 | 1 | locked value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/81) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 82: TeamInfiniteBlocks" description: "Enables or disables infinite block stock for a team." canonical: "https://aosplay.net/protocol-168/packets/82" markdown: "https://aosplay.net/docs/protocol-168/packets/82.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "82" packet_id_hex: "0x52" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 82: TeamInfiniteBlocks > Enables or disables infinite block stock for a team. - **Decimal ID:** 82 - **Hex ID:** 0x52 - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 82 (0x52). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `infinite_blocks` | boolean u8 | 1 | infinite blocks value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/82) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 83: TeamMapVisibility" description: "Toggles team radar/minimap visibility while an authoritative radar station exists." canonical: "https://aosplay.net/protocol-168/packets/83" markdown: "https://aosplay.net/docs/protocol-168/packets/83.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "83" packet_id_hex: "0x53" direction: "S→C" family: "Teams" implementation_status: "Sent" evidence: "Live-verified" wire_size: "3 bytes" --- # Packet 83: TeamMapVisibility > Toggles team radar/minimap visibility while an authoritative radar station exists. - **Decimal ID:** 83 - **Hex ID:** 0x53 - **Direction:** S→C - **Family:** Teams - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 83 (0x53). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `visible` | boolean u8 | 1 | visible value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/83) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 84: DisplayCountdown" description: "Updates the native HUD round countdown in seconds." canonical: "https://aosplay.net/protocol-168/packets/84" markdown: "https://aosplay.net/docs/protocol-168/packets/84.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "84" packet_id_hex: "0x54" direction: "S→C" family: "Interface" implementation_status: "Sent" evidence: "Live-verified" wire_size: "5 bytes" --- # Packet 84: DisplayCountdown > Updates the native HUD round countdown in seconds. - **Decimal ID:** 84 - **Hex ID:** 0x54 - **Direction:** S→C - **Family:** Interface - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** 5 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 84 (0x54). | — | | 1 | `timer` | IEEE-754 f32 LE | 4 | Seconds remaining. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/84) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 85: SetScore" description: "Applies a lightweight mid-game team or player score update to the HUD." canonical: "https://aosplay.net/protocol-168/packets/85" markdown: "https://aosplay.net/docs/protocol-168/packets/85.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "85" packet_id_hex: "0x55" direction: "S→C" family: "Progression" implementation_status: "Sent" evidence: "Implementation-backed" wire_size: "8 bytes" --- # Packet 85: SetScore > Applies a lightweight mid-game team or player score update to the HUD. - **Decimal ID:** 85 - **Hex ID:** 0x55 - **Direction:** S→C - **Family:** Progression - **Status:** Sent - **Evidence:** Implementation-backed - **Wire size:** 8 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 85 (0x55). | — | | 1 | `type` | u8 | 1 | Score target/type discriminator. | — | | 2 | `reason` | u8 | 1 | reason value. | — | | 3 | `specifier` | u8 | 1 | Player, team, or mode-specific target. | — | | 4 | `value` | i32 LE | 4 | New score or delta, selected by type/reason. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/85) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 86: UseCommand" description: "Requests use of the nearest valid interactive object; BattleSpades uses it to mount or dismount an unoccupied machine gun." canonical: "https://aosplay.net/protocol-168/packets/86" markdown: "https://aosplay.net/docs/protocol-168/packets/86.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "86" packet_id_hex: "0x56" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "1 byte" --- # Packet 86: UseCommand > Requests use of the nearest valid interactive object; BattleSpades uses it to mount or dismount an unoccupied machine gun. - **Decimal ID:** 86 - **Hex ID:** 0x56 - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 86 (0x56). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/86) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 87: PlaceMG" description: "Requests placement of a type-7 mounted machine gun. The server owns yaw, team, health, occupancy, and join persistence after validation." canonical: "https://aosplay.net/protocol-168/packets/87" markdown: "https://aosplay.net/docs/protocol-168/packets/87.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "87" packet_id_hex: "0x57" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "14 bytes" --- # Packet 87: PlaceMG > Requests placement of a type-7 mounted machine gun. The server owns yaw, team, health, occupancy, and join persistence after validation. - **Decimal ID:** 87 - **Hex ID:** 0x57 - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 14 bytes ## Implementation note Corrected runtime layout: coordinates are literal u16 voxels; only yaw is fixed-point. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 87 (0x57). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | | 4 | `yaw` | sign-magnitude fixed16 LE (1/64) | 2 | yaw value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/87) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 88: PlaceRocketTurret" description: "Requests an Engineer/Rocketeer turret placement. Target selection, projectile creation, health, and persistence remain server-owned." canonical: "https://aosplay.net/protocol-168/packets/88" markdown: "https://aosplay.net/docs/protocol-168/packets/88.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "88" packet_id_hex: "0x58" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "14 bytes" --- # Packet 88: PlaceRocketTurret > Requests an Engineer/Rocketeer turret placement. Target selection, projectile creation, health, and persistence remain server-owned. - **Decimal ID:** 88 - **Hex ID:** 0x58 - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 14 bytes ## Implementation note Corrected runtime layout: coordinates are literal u16 voxels; only yaw is fixed-point. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 88 (0x58). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | | 4 | `yaw` | sign-magnitude fixed16 LE (1/64) | 2 | yaw value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/88) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 89: PlaceLandmine" description: "Requests a landmine placement. The server validates it, then owns the four-second arm time, buried proximity detection, and blast." canonical: "https://aosplay.net/protocol-168/packets/89" markdown: "https://aosplay.net/docs/protocol-168/packets/89.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "89" packet_id_hex: "0x59" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "12 bytes" --- # Packet 89: PlaceLandmine > Requests a landmine placement. The server validates it, then owns the four-second arm time, buried proximity detection, and blast. - **Decimal ID:** 89 - **Hex ID:** 0x59 - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 12 bytes ## Implementation note Corrected runtime layout uses raw voxel coordinates. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 89 (0x59). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/89) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 90: PlaceMedPack" description: "Requests a type-30 MedPack placement. The server owns its three team uses, 25-HP increments, health, and destruction." canonical: "https://aosplay.net/protocol-168/packets/90" markdown: "https://aosplay.net/docs/protocol-168/packets/90.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "90" packet_id_hex: "0x5A" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "13 bytes" --- # Packet 90: PlaceMedPack > Requests a type-30 MedPack placement. The server owns its three team uses, 25-HP increments, health, and destruction. - **Decimal ID:** 90 - **Hex ID:** 0x5A - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 13 bytes ## Implementation note Corrected raw-voxel layout and two-client retail render lifecycle are verified. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 90 (0x5A). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | | 4 | `face` | u8 | 1 | Voxel face or placement orientation index. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/90) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 91: PlaceRadarStation" description: "Requests a type-36 radar station placement. The server owns its lifetime and team minimap reveal." canonical: "https://aosplay.net/protocol-168/packets/91" markdown: "https://aosplay.net/docs/protocol-168/packets/91.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "91" packet_id_hex: "0x5B" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "12 bytes" --- # Packet 91: PlaceRadarStation > Requests a type-36 radar station placement. The server owns its lifetime and team minimap reveal. - **Decimal ID:** 91 - **Hex ID:** 0x5B - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 12 bytes ## Implementation note Corrected raw-voxel layout and two-client retail render lifecycle are verified. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 91 (0x5B). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 3 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/91) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 92: PlaceC4" description: "Requests an oriented type-38 C4 placement with server-owned stock and ownership tracking." canonical: "https://aosplay.net/protocol-168/packets/92" markdown: "https://aosplay.net/docs/protocol-168/packets/92.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "92" packet_id_hex: "0x5C" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "12 bytes" --- # Packet 92: PlaceC4 > Requests an oriented type-38 C4 placement with server-owned stock and ownership tracking. - **Decimal ID:** 92 - **Hex ID:** 0x5C - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 12 bytes ## Implementation note Corrected raw-voxel layout and two-client retail render lifecycle are verified. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 92 (0x5C). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | | 3 | `face` | u8 | 1 | Voxel face or placement orientation index. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/92) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 93: DetonateC4" description: "Requests detonation of only the sender's currently live C4 charges." canonical: "https://aosplay.net/protocol-168/packets/93" markdown: "https://aosplay.net/docs/protocol-168/packets/93.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "93" packet_id_hex: "0x5D" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "5 bytes" --- # Packet 93: DetonateC4 > Requests detonation of only the sender's currently live C4 charges. - **Decimal ID:** 93 - **Hex ID:** 0x5D - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 5 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 93 (0x5D). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/93) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 94: BlockSuckerPacket" description: "Replicates sanitized Block Sucker state while the server performs the authoritative timed voxel pull and block grant." canonical: "https://aosplay.net/protocol-168/packets/94" markdown: "https://aosplay.net/docs/protocol-168/packets/94.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "94" packet_id_hex: "0x5E" direction: "Both" family: "Building" implementation_status: "Handled + sent" evidence: "Implementation-backed" wire_size: "8 bytes" --- # Packet 94: BlockSuckerPacket > Replicates sanitized Block Sucker state while the server performs the authoritative timed voxel pull and block grant. - **Decimal ID:** 94 - **Hex ID:** 0x5E - **Direction:** Both - **Family:** Building - **Status:** Handled + sent - **Evidence:** Implementation-backed - **Wire size:** 8 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 94 (0x5E). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `shooter_id` | u8 | 1 | Player slot that initiated the action. | — | | 3 | `state` | u8 | 1 | Entity or gameplay state value. | — | | 4 | `shot` | u8 | 1 | Trigger/pulse state. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/94) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 95: DisguisePacket" description: "Requests a loadout/tool-gated disguise state, later replicated through WorldUpdate state bit 0x02." canonical: "https://aosplay.net/protocol-168/packets/95" markdown: "https://aosplay.net/docs/protocol-168/packets/95.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "95" packet_id_hex: "0x5F" direction: "C→S" family: "Players" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "6 bytes" --- # Packet 95: DisguisePacket > Requests a loadout/tool-gated disguise state, later replicated through WorldUpdate state bit 0x02. - **Decimal ID:** 95 - **Hex ID:** 0x5F - **Direction:** C→S - **Family:** Players - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 6 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 95 (0x5F). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `active` | boolean u8 | 1 | active value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/95) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 96: DisableEntity" description: "Disables an entity without destroying or removing its scene record." canonical: "https://aosplay.net/protocol-168/packets/96" markdown: "https://aosplay.net/docs/protocol-168/packets/96.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "96" packet_id_hex: "0x60" direction: "Inactive" family: "Entities" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 96: DisableEntity > Disables an entity without destroying or removing its scene record. - **Decimal ID:** 96 - **Hex ID:** 0x60 - **Direction:** Inactive - **Family:** Entities - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 96 (0x60). | — | | 1 | `entity_id` | i16 LE | 2 | Scene-local entity identifier. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/96) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 97: PlaceUGC" description: "Places or removes a UGC object at a literal voxel coordinate." canonical: "https://aosplay.net/protocol-168/packets/97" markdown: "https://aosplay.net/docs/protocol-168/packets/97.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "97" packet_id_hex: "0x61" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "13 bytes" --- # Packet 97: PlaceUGC > Places or removes a UGC object at a literal voxel coordinate. - **Decimal ID:** 97 - **Hex ID:** 0x61 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 13 bytes ## Implementation note The corrected raw-voxel runtime decoder exists, but the end-to-end UGC placement workflow is not active. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 97 (0x61). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | | 3 | `ugc_item_id` | u8 | 1 | ugc item id value. | — | | 4 | `placing` | boolean u8 | 1 | placing value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/97) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 98: InitialUGCBatch" description: "Transfers an initial batch of UGC scene objects." canonical: "https://aosplay.net/protocol-168/packets/98" markdown: "https://aosplay.net/docs/protocol-168/packets/98.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "98" packet_id_hex: "0x62" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 + 11N bytes" --- # Packet 98: InitialUGCBatch > Transfers an initial batch of UGC scene objects. - **Decimal ID:** 98 - **Hex ID:** 0x62 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 + 11N bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 98 (0x62). | — | | 1 | `item_count` | u8 | 1 | N: number of records. | — | | 2 | `items[].mode` | u8 | 1 | items[].mode value. | — | | 3 | `items[].ugc_item_id` | i32 LE | 4 | items[].ugc item id value. | — | | 4 | `items[].x` | i16 LE | 2 | items[].x value. | — | | 5 | `items[].y` | i16 LE | 2 | items[].y value. | — | | 6 | `items[].z` | i16 LE | 2 | items[].z value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/98) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 99: ReqestUGCEntities" description: "Requests the UGC entity set for a game mode. The retail class name preserves its original `Reqest` misspelling." canonical: "https://aosplay.net/protocol-168/packets/99" markdown: "https://aosplay.net/docs/protocol-168/packets/99.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "99" packet_id_hex: "0x63" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 99: ReqestUGCEntities > Requests the UGC entity set for a game mode. The retail class name preserves its original `Reqest` misspelling. - **Decimal ID:** 99 - **Hex ID:** 0x63 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 99 (0x63). | — | | 1 | `game_mode` | u8 | 1 | game mode value. | — | | 2 | `in_ugc_mode` | boolean u8 | 1 | in ugc mode value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/99) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 100: UGCMessage" description: "Carries a compact UGC workflow message identifier." canonical: "https://aosplay.net/protocol-168/packets/100" markdown: "https://aosplay.net/docs/protocol-168/packets/100.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "100" packet_id_hex: "0x64" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 bytes" --- # Packet 100: UGCMessage > Carries a compact UGC workflow message identifier. - **Decimal ID:** 100 - **Hex ID:** 0x64 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 100 (0x64). | — | | 1 | `message_id` | u8 | 1 | message id value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/100) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 101: UGCMapLoadingFromHost" description: "Reports UGC map-loading progress from the host." canonical: "https://aosplay.net/protocol-168/packets/101" markdown: "https://aosplay.net/docs/protocol-168/packets/101.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "101" packet_id_hex: "0x65" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 bytes" --- # Packet 101: UGCMapLoadingFromHost > Reports UGC map-loading progress from the host. - **Decimal ID:** 101 - **Hex ID:** 0x65 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 101 (0x65). | — | | 1 | `percent_complete` | u8 | 1 | percent complete value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/101) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 102: UGCMapInfo" description: "Carries length-prefixed PNG map information/preview data for a UGC map." canonical: "https://aosplay.net/protocol-168/packets/102" markdown: "https://aosplay.net/docs/protocol-168/packets/102.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "102" packet_id_hex: "0x66" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "5 + N bytes" --- # Packet 102: UGCMapInfo > Carries length-prefixed PNG map information/preview data for a UGC map. - **Decimal ID:** 102 - **Hex ID:** 0x66 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 5 + N bytes ## Implementation note The recovered source still marks the binary payload interpretation for confirmation. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 102 (0x66). | — | | 1 | `png_length` | i32 LE | 4 | N: byte length of the PNG payload. | — | | 2 | `png_data` | raw PNG bytes | N | Map preview image. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/102) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 103: VoiceData" description: "Carries one player's voice-chat frame." canonical: "https://aosplay.net/protocol-168/packets/103" markdown: "https://aosplay.net/docs/protocol-168/packets/103.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "103" packet_id_hex: "0x67" direction: "Inactive" family: "UGC" implementation_status: "Planned" evidence: "Provisional" wire_size: "4 + N bytes" --- # Packet 103: VoiceData > Carries one player's voice-chat frame. - **Decimal ID:** 103 - **Hex ID:** 0x67 - **Direction:** Inactive - **Family:** UGC - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 4 + N bytes ## Implementation note The inactive generated loader decodes the bytes as text; the codec and correct binary handling still require live recovery. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 103 (0x67). | — | | 1 | `player_id` | u8 | 1 | Compact player-slot identifier. | — | | 2 | `data_size` | u16 LE | 2 | N: encoded voice-frame length. | — | | 3 | `data` | raw/legacy byte string | N | Encoded voice data. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/103) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 104: PlaceFlareBlock" description: "Requests the flare tool's ten-block-cost voxel light placement. The server validates tool, range, contact, colour, and late-join persistence." canonical: "https://aosplay.net/protocol-168/packets/104" markdown: "https://aosplay.net/docs/protocol-168/packets/104.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "104" packet_id_hex: "0x68" direction: "C→S" family: "Deployables" implementation_status: "Handled" evidence: "Live-verified" wire_size: "11 bytes" --- # Packet 104: PlaceFlareBlock > Requests the flare tool's ten-block-cost voxel light placement. The server validates tool, range, contact, colour, and late-join persistence. - **Decimal ID:** 104 - **Hex ID:** 0x68 - **Direction:** C→S - **Family:** Deployables - **Status:** Handled - **Evidence:** Live-verified - **Wire size:** 11 bytes ## Implementation note Corrected runtime layout: the retail client sends raw u16 voxel coordinates; the older generated loader incorrectly treated them as fixed-point. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 104 (0x68). | — | | 1 | `loop_count` | i32 LE | 4 | Simulation-loop stamp used for ordering, prediction, or reconciliation. | — | | 2 | `position` | 3 × u16 LE | 6 | Raw X, Y, and Z voxel coordinates. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/104) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 105: SteamSessionTicket" description: "The retail client's first application handshake packet. It carries the opaque Steam session ticket that a Steam-enabled game server must validate before accepting the player's identity." canonical: "https://aosplay.net/protocol-168/packets/105" markdown: "https://aosplay.net/docs/protocol-168/packets/105.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "105" packet_id_hex: "0x69" direction: "C→S" family: "Authentication" implementation_status: "Handshake" evidence: "Live-verified" wire_size: "5 + N bytes" --- # Packet 105: SteamSessionTicket > The retail client's first application handshake packet. It carries the opaque Steam session ticket that a Steam-enabled game server must validate before accepting the player's identity. - **Decimal ID:** 105 - **Hex ID:** 0x69 - **Direction:** C→S - **Family:** Authentication - **Status:** Handshake - **Evidence:** Live-verified - **Wire size:** 5 + N bytes ## Implementation note Wire layout is packet id 0x69, signed i32 little-endian length, then exactly N ticket bytes. The retail client uses those bytes as the repeating XOR key for subsequent application payloads. That obfuscation is not authentication. Packet 105 carries no separate SteamID; the recovered retail wrapper therefore matches Valve's legacy connect-auth flow, which returns a candidate SteamID and completes through GSClientApprove or GSClientDeny. A modern BeginAuthSession flow requires a claimed SteamID from a separate authenticated channel and must not be mixed with the legacy API. Never authenticate a peer merely because packet 105 parsed successfully. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 105 (0x69). | — | | 1 | `ticket_size` | i32 LE | 4 | N: ticket length; reject negative values and lengths beyond the remaining packet. | — | | 2 | `ticket` | opaque Steam ticket bytes | N | Ticket bytes supplied by the Steam client API. Treat as secret, bounded binary data rather than text. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/105) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 106: TerritoryBaseState" description: "Updates a territory/base ownership and capture state for territory-control modes." canonical: "https://aosplay.net/protocol-168/packets/106" markdown: "https://aosplay.net/docs/protocol-168/packets/106.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "106" packet_id_hex: "0x6A" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "7 bytes" --- # Packet 106: TerritoryBaseState > Updates a territory/base ownership and capture state for territory-control modes. - **Decimal ID:** 106 - **Hex ID:** 0x6A - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 7 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 106 (0x6A). | — | | 1 | `base_index` | u8 | 1 | base index value. | — | | 2 | `action` | u8 | 1 | Selects the operation and therefore any conditional payload that follows. | — | | 3 | `controlled_by` | u8 | 1 | controlled by value. | — | | 4 | `attacked_by` | u8 | 1 | attacked by value. | — | | 5 | `capture_amount` | sign-magnitude fixed16 LE (1/64) | 2 | capture amount value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/106) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 107: DebugDraw" description: "Draws temporary development primitives. Type 0 is a box, type 1 a sphere, and types 2–4 carry only the common header." canonical: "https://aosplay.net/protocol-168/packets/107" markdown: "https://aosplay.net/docs/protocol-168/packets/107.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "107" packet_id_hex: "0x6B" direction: "Inactive" family: "Diagnostics" implementation_status: "Planned" evidence: "Provisional" wire_size: "10, 24, or 34 bytes" --- # Packet 107: DebugDraw > Draws temporary development primitives. Type 0 is a box, type 1 a sphere, and types 2–4 carry only the common header. - **Decimal ID:** 107 - **Hex ID:** 0x6B - **Direction:** Inactive - **Family:** Diagnostics - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 10, 24, or 34 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 107 (0x6B). | — | | 1 | `type` | u8 | 1 | 0 box, 1 sphere, 2–4 header-only recovered primitives. | — | | 2 | `colour` | i32 LE | 4 | colour value. | — | | 3 | `frames` | i32 LE | 4 | frames value. | — | | 4 | `corner_min` | 3 × IEEE-754 f32 LE | 12 | First box corner. | type = 0 | | 5 | `corner_max` | 3 × IEEE-754 f32 LE | 12 | Second box corner. | type = 0 | | 6 | `center` | 3 × IEEE-754 f32 LE | 12 | Sphere centre. | type = 1 | | 7 | `size` | sign-magnitude fixed16 LE (1/64) | 2 | Sphere radius/size. | type = 1 | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/107) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 108: LockToZone" description: "Constrains a player or mode to a six-coordinate voxel zone." canonical: "https://aosplay.net/protocol-168/packets/108" markdown: "https://aosplay.net/docs/protocol-168/packets/108.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "108" packet_id_hex: "0x6C" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "13 bytes" --- # Packet 108: LockToZone > Constrains a player or mode to a six-coordinate voxel zone. - **Decimal ID:** 108 - **Hex ID:** 0x6C - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 13 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 108 (0x6C). | — | | 1 | `min_x` | i16 LE | 2 | min x value. | — | | 2 | `min_y` | i16 LE | 2 | min y value. | — | | 3 | `min_z` | i16 LE | 2 | min z value. | — | | 4 | `max_x` | i16 LE | 2 | max x value. | — | | 5 | `max_y` | i16 LE | 2 | max y value. | — | | 6 | `max_z` | i16 LE | 2 | max z value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/108) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 109: HelpMessage" description: "Schedules one or more retail help/tutorial localization IDs after a delay." canonical: "https://aosplay.net/protocol-168/packets/109" markdown: "https://aosplay.net/docs/protocol-168/packets/109.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "109" packet_id_hex: "0x6D" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 6 + message strings" --- # Packet 109: HelpMessage > Schedules one or more retail help/tutorial localization IDs after a delay. - **Decimal ID:** 109 - **Hex ID:** 0x6D - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 6 + message strings ## Implementation note The generated reader calls an obsolete read_bytes() helper while the writer emits the shape above; activation requires a live-client verification and decoder fix. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 109 (0x6D). | — | | 1 | `delay` | IEEE-754 f32 BE | 4 | Delay before presentation; this packet uniquely uses big-endian float packing in the recovered writer. | — | | 2 | `message_count` | u8 | 1 | message count value. | — | | 3 | `message_ids[]` | repeated NUL strings | Σ(N + 1) | Non-empty localization IDs. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/109) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 110: ClientInMenu" description: "Reports whether the client is currently in a menu for handshake and idle gating." canonical: "https://aosplay.net/protocol-168/packets/110" markdown: "https://aosplay.net/docs/protocol-168/packets/110.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "110" packet_id_hex: "0x6E" direction: "C→S" family: "Players" implementation_status: "Handled" evidence: "Implementation-backed" wire_size: "2 bytes" --- # Packet 110: ClientInMenu > Reports whether the client is currently in a menu for handshake and idle gating. - **Decimal ID:** 110 - **Hex ID:** 0x6E - **Direction:** C→S - **Family:** Players - **Status:** Handled - **Evidence:** Implementation-backed - **Wire size:** 2 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 110 (0x6E). | — | | 1 | `in_menu` | boolean u8 | 1 | in menu value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/110) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 111: Password" description: "Carries a NUL-terminated server password in the legacy authentication family." canonical: "https://aosplay.net/protocol-168/packets/111" markdown: "https://aosplay.net/docs/protocol-168/packets/111.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "111" packet_id_hex: "0x6F" direction: "Inactive" family: "Authentication" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 2 + password bytes" --- # Packet 111: Password > Carries a NUL-terminated server password in the legacy authentication family. - **Decimal ID:** 111 - **Hex ID:** 0x6F - **Direction:** Inactive - **Family:** Authentication - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 2 + password bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 111 (0x6F). | — | | 1 | `password` | NUL-terminated UTF-8 string | N + 1 | password value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/111) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 112: PasswordNeeded" description: "Requests that the client provide a server password." canonical: "https://aosplay.net/protocol-168/packets/112" markdown: "https://aosplay.net/docs/protocol-168/packets/112.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "112" packet_id_hex: "0x70" direction: "Inactive" family: "Authentication" implementation_status: "Planned" evidence: "Provisional" wire_size: "1 byte" --- # Packet 112: PasswordNeeded > Requests that the client provide a server password. - **Decimal ID:** 112 - **Hex ID:** 0x70 - **Direction:** Inactive - **Family:** Authentication - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 1 byte ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 112 (0x70). | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/112) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 113: PasswordProvided" description: "Submits the requested NUL-terminated server password." canonical: "https://aosplay.net/protocol-168/packets/113" markdown: "https://aosplay.net/docs/protocol-168/packets/113.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "113" packet_id_hex: "0x71" direction: "Inactive" family: "Authentication" implementation_status: "Planned" evidence: "Provisional" wire_size: "Variable: 2 + password bytes" --- # Packet 113: PasswordProvided > Submits the requested NUL-terminated server password. - **Decimal ID:** 113 - **Hex ID:** 0x71 - **Direction:** Inactive - **Family:** Authentication - **Status:** Planned - **Evidence:** Provisional - **Wire size:** Variable: 2 + password bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 113 (0x71). | — | | 1 | `password` | NUL-terminated UTF-8 string | N + 1 | password value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/113) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 114: InitialInfo" description: "The first loader packet: server identity, mode copy, map filename/checksum, presentation capabilities, rule toggles, disabled equipment/classes, movement multipliers, and ground palettes." canonical: "https://aosplay.net/protocol-168/packets/114" markdown: "https://aosplay.net/docs/protocol-168/packets/114.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "114" packet_id_hex: "0x72" direction: "S→C" family: "Map sync" implementation_status: "Sent" evidence: "Live-verified" wire_size: "Variable: 55-byte shell + 9 strings and counted arrays" --- # Packet 114: InitialInfo > The first loader packet: server identity, mode copy, map filename/checksum, presentation capabilities, rule toggles, disabled equipment/classes, movement multipliers, and ground palettes. - **Decimal ID:** 114 - **Hex ID:** 0x72 - **Direction:** S→C - **Family:** Map sync - **Status:** Sent - **Evidence:** Live-verified - **Wire size:** Variable: 55-byte shell + 9 strings and counted arrays ## Implementation note List shapes and terminators are crash-sensitive. Classic CTF remains mode_key CTF with classic=1; it is not sent as a separate unsupported retail scene enum. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 114 (0x72). | — | | 1 | `server_steam_id` | u64 LE | 8 | server steam id value. | — | | 2 | `server_ip` | i32 LE | 4 | Packed server IPv4 value. | — | | 3 | `server_port` | i32 LE | 4 | server port value. | — | | 4 | `mode_name` | NUL-terminated UTF-8 string | N + 1 | mode name value. | — | | 5 | `mode_description` | NUL-terminated UTF-8 string | N + 1 | mode description value. | — | | 6 | `mode_infographic_text1` | NUL-terminated UTF-8 string | N + 1 | mode infographic text1 value. | — | | 7 | `mode_infographic_text2` | NUL-terminated UTF-8 string | N + 1 | mode infographic text2 value. | — | | 8 | `mode_infographic_text3` | NUL-terminated UTF-8 string | N + 1 | mode infographic text3 value. | — | | 9 | `map_name` | NUL-terminated UTF-8 string | N + 1 | map name value. | — | | 10 | `filename` | NUL-terminated UTF-8 string | N + 1 | VXL filename used by map validation. | — | | 11 | `checksum` | i32 LE | 4 | checksum value. | — | | 12 | `mode_key` | u8 | 1 | mode key value. | — | | 13 | `map_is_ugc` | boolean u8 | 1 | map is ugc value. | — | | 14 | `query_port` | u16 LE | 2 | query port value. | — | | 15 | `classic` | boolean u8 | 1 | classic value. | — | | 16 | `enable_minimap` | boolean u8 | 1 | enable minimap value. | — | | 17 | `same_team_collision` | boolean u8 | 1 | same team collision value. | — | | 18 | `max_draw_distance` | u8 | 1 | max draw distance value. | — | | 19 | `enable_colour_picker` | boolean u8 | 1 | enable colour picker value. | — | | 20 | `enable_colour_palette` | boolean u8 | 1 | enable colour palette value. | — | | 21 | `enable_deathcam` | boolean u8 | 1 | enable deathcam value. | — | | 22 | `enable_sniper_beam` | boolean u8 | 1 | enable sniper beam value. | — | | 23 | `enable_spectator` | boolean u8 | 1 | enable spectator value. | — | | 24 | `exposed_teams_always_on_minimap` | boolean u8 | 1 | exposed teams always on minimap value. | — | | 25 | `enable_numeric_hp` | boolean u8 | 1 | enable numeric hp value. | — | | 26 | `texture_skin` | NUL-terminated UTF-8 string | N + 1 | Empty selects normal skin; VIP uses `mafia`. | — | | 27 | `beach_z_modifiable` | boolean u8 | 1 | beach z modifiable value. | — | | 28 | `enable_minimap_height_icons` | boolean u8 | 1 | enable minimap height icons value. | — | | 29 | `enable_fall_on_water_damage` | boolean u8 | 1 | enable fall on water damage value. | — | | 30 | `block_wallet_multiplier` | sign-magnitude fixed16 LE (1/64) | 2 | block wallet multiplier value. | — | | 31 | `block_health_multiplier` | sign-magnitude fixed16 LE (1/64) | 2 | block health multiplier value. | — | | 32 | `disabled_tool_count` | u8 | 1 | disabled tool count value. | — | | 33 | `disabled_tools[]` | D × u8 | D | Disabled tool IDs. | — | | 34 | `disabled_class_count` | u8 | 1 | disabled class count value. | — | | 35 | `disabled_classes[]` | C × u8 | C | Disabled class IDs. | — | | 36 | `movement_multiplier_count` | u8 | 1 | movement multiplier count value. | — | | 37 | `movement_speed_multipliers[]` | M × fixed16 LE | 2M | Class/movement speed multipliers. | — | | 38 | `ugc_prefab_set_count` | u8 | 1 | ugc prefab set count value. | — | | 39 | `ugc_prefab_sets[]` | U × u8 | U | UGC prefab-set IDs. | — | | 40 | `enable_player_score` | boolean u8 | 1 | enable player score value. | — | | 41 | `server_name` | NUL-terminated UTF-8 string | N + 1 | server name value. | — | | 42 | `ground_color_count` | u8 | 1 | ground color count value. | — | | 43 | `ground_colors[]` | G × RGBA8888 | 4G | Per-team/per-surface ground palettes. | — | | 44 | `ground_color_terminator` | u8 | 1 | Required zero byte after the colour array. | — | | 45 | `allow_shooting_holding_intel` | boolean u8 | 1 | allow shooting holding intel value. | — | | 46 | `friendly_fire` | boolean u8 | 1 | friendly fire value. | — | | 47 | `padding` | u8 | 1 | Required zero byte. | — | | 48 | `enable_corpse_explosion` | boolean u8 | 1 | enable corpse explosion value. | — | | 49 | `ugc_mode` | u8 | 1 | ugc mode value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/114) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 115: ForceTeamJoin" description: "Forces the receiving player onto a team, optionally immediately." canonical: "https://aosplay.net/protocol-168/packets/115" markdown: "https://aosplay.net/docs/protocol-168/packets/115.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "115" packet_id_hex: "0x73" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "3 bytes" --- # Packet 115: ForceTeamJoin > Forces the receiving player onto a team, optionally immediately. - **Decimal ID:** 115 - **Hex ID:** 0x73 - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 3 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 115 (0x73). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `instant` | boolean u8 | 1 | Boolean-like byte requesting immediate application. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/115) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 116: PositionData" description: "A position-only input shape retained for compatibility tooling. The targeted retail 1.x client does not send it in normal play." canonical: "https://aosplay.net/protocol-168/packets/116" markdown: "https://aosplay.net/docs/protocol-168/packets/116.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "116" packet_id_hex: "0x74" direction: "C→S" family: "Input" implementation_status: "Handled" evidence: "Provisional" wire_size: "7 or 13 bytes" --- # Packet 116: PositionData > A position-only input shape retained for compatibility tooling. The targeted retail 1.x client does not send it in normal play. - **Decimal ID:** 116 - **Hex ID:** 0x74 - **Direction:** C→S - **Family:** Input - **Status:** Handled - **Evidence:** Provisional - **Wire size:** 7 or 13 bytes ## Implementation note A handler is registered, but the known retail send path is a no-op; this packet must not replace ClientData/WorldUpdate ownership. ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 116 (0x74). | — | | 1 | `position` | 3 × fixed16 LE or 3 × f32 LE | 6 or 12 | The tolerant runtime decoder selects raw floats when 12 payload bytes are available, otherwise fixed-point shorts. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/116) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 117: TeamProgress" description: "Displays objective progress for a team as either a percentage or a numerator/denominator pair." canonical: "https://aosplay.net/protocol-168/packets/117" markdown: "https://aosplay.net/docs/protocol-168/packets/117.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "117" packet_id_hex: "0x75" direction: "Inactive" family: "Teams" implementation_status: "Planned" evidence: "Provisional" wire_size: "6 or 12 bytes" --- # Packet 117: TeamProgress > Displays objective progress for a team as either a percentage or a numerator/denominator pair. - **Decimal ID:** 117 - **Hex ID:** 0x75 - **Direction:** Inactive - **Family:** Teams - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 6 or 12 bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 117 (0x75). | — | | 1 | `team_id` | u8 | 1 | Team identifier. | — | | 2 | `flags` | u8 | 1 | 0x01 visible, 0x02 particle, 0x04 previous value, 0x08 percentage mode. | — | | 3 | `percent` | sign-magnitude fixed16 LE (1/64) | 2 | percent value. | flags & 0x08 | | 4 | `numerator` | i32 LE | 4 | numerator value. | percentage flag clear | | 5 | `denominator` | i32 LE | 4 | denominator value. | percentage flag clear | | 6 | `icon_id` | u8 | 1 | icon id value. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/117) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168) --- --- title: "Packet 118: SetGroundColors" description: "Sets a counted per-team/per-surface ground-colour palette." canonical: "https://aosplay.net/protocol-168/packets/118" markdown: "https://aosplay.net/docs/protocol-168/packets/118.md" last_updated: "2026-07-16" protocol: "Ace of Spades Battle Builder 168" packet_id_decimal: "118" packet_id_hex: "0x76" direction: "Inactive" family: "Interface" implementation_status: "Planned" evidence: "Provisional" wire_size: "2 + 4N bytes" --- # Packet 118: SetGroundColors > Sets a counted per-team/per-surface ground-colour palette. - **Decimal ID:** 118 - **Hex ID:** 0x76 - **Direction:** Inactive - **Family:** Interface - **Status:** Planned - **Evidence:** Provisional - **Wire size:** 2 + 4N bytes ## Exact wire layout The application packet ID is the first byte. The remaining rows are in decode order. Byte sizes exclude ENet headers, wrapper prefixes, LZF chunk framing, and compression effects. | # | Field | Encoding | Bytes | Purpose | Condition | | ---: | --- | --- | ---: | --- | --- | | 0 | `packet_id` | u8 | 1 | Always 118 (0x76). | — | | 1 | `color_count` | u8 | 1 | N: number of RGBA entries. | — | | 2 | `colors[]` | RGBA8888 | 4 | Red, green, blue, and alpha channels. | — | ## Encoding conventions - `LE` means least-significant byte first. - `fixed16` is two-byte sign-magnitude at 1/64 precision. - `orientation16` uses the measured 1/8192 orientation mapping. - NUL strings consume their encoded byte length plus one `00` terminator. - Counted arrays repeat immediately in the documented order. ## Related resources - [HTML packet page](https://aosplay.net/protocol-168/packets/118) - [Complete packet catalog](https://aosplay.net/protocol-168/packets) - [Packet catalog in Markdown](https://aosplay.net/docs/protocol-168/packets.md) - [Protocol 168 guide](https://aosplay.net/protocol-168)