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