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