FF SUITEArma 3 addons

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.

FF_Utils 4 related functions

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_readyRoomSettings and 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

KeyDefaultBounds / meaning
title / subtitleGeneric translated textString or [EN, CZ] pair, 2,000 characters each
briefingOne generic paragraph0–16 literal paragraphs or pairs
questionsThree generic questions0–8 entries; empty hides the questionnaire
requireAnswersfalseAll answers nonempty before ready; disabled when there are no questions
countdown80–120 s after every eligible human is ready
voteEnabledfalseEnable when an opening-scene consumer handles the skip decision
voteNumerator / voteDenominator2 / 3Integer ratio; numerator 1..denominator, denominator 1–100
answerLimit / chatLimit400 / 4001–2,000 characters
chatHistory801–200 retained messages
chatCooldown10.1–60 s per UID
audienceAll human playersServer CODE [unit] returning boolean; headless clients always excluded
onRelease{}Server CODE [skip, participantUIDs, epoch]
music / musicVolumeempty / 1CfgMusic class and 0–1 bed volume
muteGamefalseTemporarily mutes game and environment channels
releaseFade30–10 s fade for manual releases without an active countdown
emblememptyEmbedded 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.

EndpointDirectionRole
readyRoomRequest → readyRoomHandleRequest → readyRoomReplyClient → server → clientReady, answer, vote, chat and curator operations
readyRoomSendClient → serverPacket with sequence, operation and bounded payload
readyRoomClientStart / readyRoomClientSet / readyRoomClientTickServer → local clientOpens and maintains the embedded browser panel
readyRoomServerTick / readyRoomPublish / readyRoomRowsServerHalf-second roster and chat replication
readyRoomRelease / readyRoomStopServerManual 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

↑ Back to top