Assembly, questions, votes, chat, release
Ready room internals
A configurable pre-mission assembly screen: briefing text, private questions, per-player readiness, a skip vote, chat, pause handling and an optional music bed that hands back cleanly when the room releases.
1. Activation
Two explicit paths, and neither happens by loading the addon:
// server
[true, createHashMapFromArray [
["title", ["Operation briefing", "Operacni zadani"]],
["briefing", [["Review your task before marking ready.", "Prectete si zadani."]]],
["questions", [["What is your role?", "Jaka je vase role?"]]],
["countdown", 8], ["voteEnabled", true]
]] call FF_utils_fnc_readyRoomStart;
- Or set
FF_utils_readyRoomSettingsand enable the CBA setting FF Utils / Enable ready room. - Or, with ZEN, use FF: Zeus > Ready room / Assembly.
Calling start again while assembling is idempotent; pass a third true argument to begin a fresh epoch and
clear choices deliberately. The live phase lives in readyRoomState.
2. Policy
| Key | Default | Bounds / meaning |
|---|---|---|
title / subtitle | Generic translated text | String or [EN, CZ] pair, 2,000 characters each |
briefing | One generic paragraph | 0–16 literal paragraphs or pairs |
questions | Three generic questions | 0–8 entries; empty hides the questionnaire |
requireAnswers | false | All answers nonempty before ready; disabled when there are no questions |
countdown | 8 | 0–120 s after every eligible human is ready |
voteEnabled | false | Enable when an opening-scene consumer handles the skip decision |
voteNumerator / voteDenominator | 2 / 3 | Integer ratio; numerator 1..denominator, denominator 1–100 |
answerLimit / chatLimit | 400 / 400 | 1–2,000 characters |
chatHistory | 80 | 1–200 retained messages |
chatCooldown | 1 | 0.1–60 s per UID |
audience | All human players | Server CODE [unit] returning boolean; headless clients always excluded |
onRelease | {} | Server CODE [skip, participantUIDs, epoch] |
music / musicVolume | empty / 1 | CfgMusic class and 0–1 bed volume |
muteGame | false | Temporarily mutes game and environment channels |
releaseFade | 3 | 0–10 s fade for manual releases without an active countdown |
emblem | empty | Embedded PNG/JPEG/WebP data URI, capped at 262,144 characters; external URLs are not loaded |
Every roster identity change restarts the countdown, even when the new roster is already ready. Withdrawing readiness or refiling answers cancels it. Threshold arithmetic uses integer products, so exactly two thirds passes and fractional requirements round up. An empty roster never starts a countdown.
3. Records, privacy and authority
Ready and vote values are independent per UID; mutable default records are copied before mutation. Names, roles,
ready/submitted/complete/vote flags and the chat log are public, but answer text is not: it lives in the server's
FF_utils_readyRoomRecords map and in the requesting player's private welcome response only. No
client-supplied UID or author name is trusted — requests validate current ownership, audience, room epoch, sequence and
bounded payloads, and chat is trimmed, rate limited and acknowledged.
| Endpoint | Direction | Role |
|---|---|---|
readyRoomRequest → readyRoomHandleRequest → readyRoomReply | Client → server → client | Ready, answer, vote, chat and curator operations |
readyRoomSend | Client → server | Packet with sequence, operation and bounded payload |
readyRoomClientStart / readyRoomClientSet / readyRoomClientTick | Server → local client | Opens and maintains the embedded browser panel |
readyRoomServerTick / readyRoomPublish / readyRoomRows | Server | Half-second roster and chat replication |
readyRoomRelease / readyRoomStop | Server | Manual release with skip flag, or cancel without handoff |
4. Release and scene handoff
// local client, before the room releases
FF_utils_readyRoomClientConfig = createHashMapFromArray [
["onRelease", {
params ["_skip", "_participants", "_participating", "_epoch"];
// spawn your scene here; callbacks are unscheduled
}],
["onLateJoin", {
params ["_skip", "_participants", "_participating", "_epoch"];
}]
];
Nothing moves or plays an intro automatically. Client release callbacks run once per epoch, after the room closes, owned
audio restores and the native pause menu clears. A player who first sees the released phase gets onLateJoin
instead of a replay. The final UID list and skip decision are frozen by the server, and callback/epoch values are captured
before extension events fire.
Local CBA hooks: FF_utils_readyRoomServerReleased [epoch, skip, UIDs],
FF_utils_readyRoomReleased [skip, UIDs, participating, epoch] and
FF_utils_readyRoomAudioChanged [owned, epoch]. These never carry executable callbacks.
5. Browser, pause and audio lifecycle
The page is ui/ready_room/panel.html, generated from the native template, style, script and stringtable, with
everything embedded — no relative fetch, no mission path. Escape closes only the room dialog and opens the correct native
pause menu as a child of the mission display; resume reopens the room without resetting drafts. The room never imposes a
global simulation pause or changes body state.
The optional music bed survives dialog reloads, loops its track, fades over the authoritative countdown and recovers after
cancellation. When Cinematic is loaded it claims its local music hold through FF_cinematic_musicHold before
capturing volume and releases it after restoring, so native atmosphere playback resumes from its shared timeline. Utils
stays free of a Cinematic dependency because the handover is a local CBA event.
6. Failure paths and limits
- Rejected or timed-out submissions keep the player's text; the UI waits for server acceptance before claiming success.
- Reconnect with the same UID keeps records and answers for the current room; a room reset or mission restart does not.
- The room owns its music slot until release and restores channel levels rather than resuming an arbitrary recording.
- Never run two ready-room controllers in one mission flow.
Verified offline: policy helpers (independent records, optional or required answers, chat cooldown, roster-sensitive countdown, exact vote thresholds, empty rosters, bounds) and the embedded browser script in Chromium at three resolutions. Not verified: Arma ownership and concurrency, answer privacy across reconnect, Unicode boundary limits, join/leave during countdown, native pause actions, JIP after release, real audio loops and cleanup races.
Related functions
FF_utils_fnc_readyRoomStart— Starts an opt-in configurable server ready room and activates participating clients.FF_utils_fnc_readyRoomRelease— Releases the current assembly manually without any built-in mission movement or intro.FF_utils_fnc_readyRoomStop— Cancels the server ready room and restores client UI/audio without running release callbacFF_utils_fnc_readyRoomRequest— Authenticates bounded ready-room requests before scheduling server-local mutation.