FF SUITEArma 3 addons

Developer · scripting and raw resources

Use it, bend it, understand it

This role is about consuming the addon: public functions, mission-facing state, assets you can reuse, and — when you choose — the internals that explain why a system behaves the way it does.

624 functions 139 documented public 25 internals pages 0 PBO edits required

This role is about using the addon: calling its functions, reading and writing its state, and repurposing its models, icons, music, overlays and lore. You do not need to modify the PBO. When you do want to go deeper, every system's internals are documented with the exact functions, keys and ownership rules.

i

Two things you get from outside this suite. Zombies come from the WebKnight (WBK) Zombies addon — FF Horror only spawns, scores and directs them. ACE and CBA are hard dependencies. Anything that reads FFATM_fnc_zombieProfile, a horde pool or the AI-balancing scope is talking about WBK classes.

1. Namespaces and naming

Each component compiles its own functions with CBA macros. A function's name tells you where it lives and where the implementation is.

ComponentNamespaceExample
CoreFF_core_fnc_*FF_core_fnc_isCuratorRequest ? shared curator guard
UtilsFF_utils_fnc_*FF_utils_fnc_wardrobeOpen
CinematicFF_cinematic_fnc_*FF_cinematic_fnc_cameraPath
CBRNFF_cbrn_fnc_*FF_cbrn_fnc_cbrnGetDanger
ZeusFF_zeus_fnc_*FF_zeus_fnc_registerZeusFooterStatus
HorrorFF_horror_fnc_*, plus the FFATM_, FFPP_ and FFSC_ system namespacesFF_horror_fnc_flyingSpawn

Horror also exposes alias functions under its own prefix. They take the same arguments and return the same values as the implementation owned by the feature component, so either name is safe to call. The component-prefixed name is the recommended one because it says where the code lives.

Function aliases: Aliases and naming.

2. How to call a function

Functions are compiled globals. Call them normally; no CfgFunctions namespace is involved.

// no arguments
private _config = call FF_cbrn_fnc_cbrnGetConfig;

// arguments array
[player] call FF_cbrn_fnc_cbrnGetDanger;

// return values are documented per function; many return a boolean or a hash map
private _ok = ["server", createHashMapFromArray [["enabled", true]]]
    call FF_utils_fnc_persistenceStart;
!

Suspending functions must be spawned. wardrobeOpen sleeps during the blackout and needs spawn. Anything documented as returning "immediately" must not be called from a suspended context that expects synchronous results, and providers that must not suspend (CBRN dangerProvider, safePredicate, footer callbacks) must return without sleep or waitUntil.

3. Where code runs

SystemAuthorityPractical rule
Soul respawnLocal playerNever remote-exec the sequence; the template hooks run locally by design.
Shield capsuleServerConsumption is server-validated; call the request event, not the consumer.
CBRNEach clientStart it per machine; there is no server hazard state to query.
CircuitsServerClient builds the action, server re-checks before writing state.
Faulty opticsUnit ownerLoadout rewrites happen where the unit is local.
WardrobeClient + server policyPolicy is published by the server; the arsenal is built locally.
Flying spawn / hordesServerA client call is sent to the server; the local call returns an empty result.
SkullsServer state, client renderingCommands go to the server; visuals are local.
AtmosphereServer moodClients report and play; never set the mood locally.
ScaresServer controllerAudience and lifecycle live on the server; visuals are local.
AI balancingServerOnly runs in multiplayer and only when enabled.
PersistenceServer snapshots, client applyStart both roles; never apply a plan manually.
Zeus footerOwning machineRegister server values on the server, local values on the client.

4. Recipes

Teleport a player into the wardrobe

[[8531.37, 4342.85, 0.148003]] spawn FF_utils_fnc_wardrobeOpen;
[getMarkerPos "locker_room"] spawn FF_utils_fnc_wardrobeOpen;

Curate the arsenal for one mission

[createHashMapFromArray [
    ["arsenalMode", "custom"],
    ["arsenalItems", ["arifle_MX_F", "30Rnd_65x39_caseless_mag"]],
    ["preserveLoadout", "once"],
    ["selfAction", true]
]] call FF_utils_fnc_wardrobeSetConfig;

Danger from a mission variable

FF_cbrn_config = createHashMapFromArray [
    ["enabled", true],
    ["dangerProvider", {
        params ["_unit", "_cfg"];
        _unit distance2D (getMarkerPos "reactor") < 120
    }]
];
[] call FF_cbrn_fnc_cbrnRefresh;

A provider returning a boolean is rejected; return a number.

Night-vision blackout at a story beat

// action 0 = once, 0 = players, NVGs only, 2 s interval
[0, 0, [], true, false, false, 2] call FF_utils_fnc_faultyVision;

Pulse on a generator

private _id = [generator, createHashMapFromArray [
    ["radius", 100], ["speed", 80], ["count", 0], ["pause", 4],
    ["debris", 0.5], ["blur", 0.5], ["shake", 1], ["light", 2]
]] call FF_cinematic_fnc_gravityPulse;

["stop", _id] call FF_cinematic_fnc_gravityPulse;

Blackout for a night scene

// safe circles stay lit: [[positionATL, radius], ...]
private _r = [[[[getPosATL base, 400]]]] call FF_utils_fnc_blackout;

Curator-authorized loadout save

[player, "save", _target] remoteExecCall
    ["FF_utils_fnc_loadoutRecoveryRequest", 2];

One camera shot from script

[[
    [getPosASL camBase, [0, 20, 0], [0.75, 1]],
    [getPosASL camTarget, [90, 10, 0], [0.6, 1]]
], 8, true] call FF_cinematic_fnc_cameraPath;

[false] call FF_cinematic_fnc_cameraPath; // release

Animate an existing unit into the scene

[_unit, getPosASL _unit] call FF_horror_fnc_flyingSpawn;

["O_Soldier_F", AGLToASL [1000,1000,0]] call FF_horror_fnc_flyingSpawn;

Destination arrays are ASL. The first form preserves identity, group and loadout.

Freeze a skull for screenshots

missionNamespace setVariable ["FF_horror_skullFrozen", true, true];
// then false to resume

Claim the music channel

// local client, before your own track
["briefing", true, true] call FF_cinematic_fnc_musicHold;
playMusic "myBriefingTrack";
// after your track
["briefing", false] call FF_cinematic_fnc_musicHold;

Leaves the native follower with nothing to fight over and restores its own timeline afterwards.

Automate one UAV

[_uav, createHashMapFromArray [["watch", true]]]
    call FF_utils_fnc_droneRegister;
[_uav, "patrol", []] call FF_utils_fnc_droneAssign;

Server only. Status is public; the airframe keeps working through JIP.

Gate a service on real power

["station", _terminal, createHashMapFromArray [
    ["power", {["campPower"] call FF_utils_fnc_powerHasSupply}]
]] call FF_utils_fnc_terminalRegister;

The predicate is re-checked server-side on every operation, never trusted from a client snapshot.

5. Raw resources

Everything the PBOs ship is addressable from a mission. Prefixes are stable.

ResourcePath / classNotes
Item classesFF_Horror_* in CfgMagazines36 in Utils, 4 in CBRN, 13 in Horror. Same namespace across components.
Editor pickupsFF_Horror_Item_* in CfgVehiclesPlacing one grants the matching magazine through TransportItems.
Lore libraryx\FF\addons\horror\media\lore\images, ...\texturesInspectable pages, posters and equipment sheets.
Ghost texturex\FF\addons\horror\media\ghost\ghost3.paaBillboard plus jumpscare picture; override per module.
MusicFFATM_* CfgMusic classes15 mood/event/boss tracks with measured durations.
Overlay framesmedia\overlays\tendrils, media\overlays\noise50 tendril frames, 6 noise frames, played by FF_horror_fnc_overlay.
Positional scare audiomedia\sounds\scare3d\Mono copies used by FFSC_fnc_audio.
Item modelsx\FF\addons\horror\items\*.p3dMounted by the asset PBOs; icons live in items\icons.
Zeus UIx\FF\addons\zeus_suite\ui\volunteer\*.htmlLocal browser panels used by the volunteer service.
Ready room pagex\FF\addons\utils\ui\ready_room\panel.htmlSelf-contained EN/CZ assembly browser; generated from the native template at build time.
Solar panelx\FF\addons\utils\ui\solar\panel.htmlCommissioning interface with embedded style, script and labels.
Drone cuesFF_Utils_DroneThreat, FF_Utils_DroneActivateCfgSounds classes; override per UAV with threatSound / activationSound.
Spectator UIx\FF\addons\spectator\ui_defines.hpp, stringtable.xmlPanel layout ids and the localized mode/overlay labels.
// reuse a lore image on your own object
[_poster, "equipment_sheet_01.paa", 0,
 "\x\FF\addons\horror\media\lore\images\"] call FF_utils_fnc_initDocument;

// play a bundled track
playMusic "FFATM_tension2";

6. State you can read

Missions can inspect these without calling internal functions. Treat them as read-only unless a section says otherwise.

KeyWhereMeaning
FF_horror_statelocal (dead player)Active soul state; nil while alive.
FF_horror_cbrnActivelocalCBRN simulation running on this machine.
FF_horror_cbrnExposureunit variableAccumulated exposure against damageThreshold.
FF_horror_cbrnMinutesbackpack variableRemaining air or cartridge minutes; write to refill.
FF_horror_cbrnZonesper client / broadcastExtra runtime zones.
FF_horror_spawnPendingunit variableUnit is in flight; integration hint for other zombie scripts.
FF_horror_aiBalanceExcludegroup/unit variableOpt out of balancing; safe to write.
FFPP_enabled, FFPP_epochserverRecovery state and staleness guard.
FFATM_*server / localAtmosphere mood, tracks and reports.
FFSC_overlayIntensitylocal0..1 scare stress; other systems may read it.
FF_Overlay1_fade / FF_Overlay2_fadelocalShared overlay inputs, 1 = hidden.
FF_utils_droneRegistered, FF_utils_droneStatusvehicle + broadcastUAV registration and [mode, watch, contactHold, operatorName, routeIndex, routeCount, contacts, availability, radius].
FF_utils_readyRoomStateserverLive room phase, epoch and frozen release decision.
FF_utils_powerSites, FF_utils_powerStatebroadcast / objectSite metadata and [generation, inputPresent, [lever, charge, trip, connected]].
FF_utils_solarSites, FF_utils_solarStatebroadcast / objectConsole metadata and the public challenge with its matrix.
FF_utils_terminalStateobject[revision, generation, phase, powered, serviceValues].
FF_cinematic_musicDirectorStatesbroadcastPer-director descriptor, selected key, source and revision.
FF_spectator_configserverViewer slots, controller policy, admin UIDs and allowCode.

7. Extend without forking

  • Callbacks — soul events, CBRN danger/protection changes, wardrobe item filters and entry checks.
  • Providers — dangerProvider, safePredicate, fogTopProvider replace logic instead of overriding results.
  • Class arrays — masks, suits, backpacks, detectors and respawn destinations are configuration, not code.
  • Footer registry — publish mission state to Zeus without touching the footer code.
  • Policy maps — wardrobe and CBRN policies are hash maps, so a mission can express its rules as data.
  • Service callbacks — onSupply (power), onSolved (solar), onExport and onService (terminals), onStatus and access (UAVs), onRelease (ready room). Each receives plain values and runs on the server that owns the state.
  • Channel holds — FF_cinematic_musicHold lets any system take the music channel without patching the follower, and release it again when its own cue ends.

8. Go deeper

Each internals page documents the participants, the state machine, the exact keys and the failure paths, so you can reason about behaviour before you change it.