---
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)
