-
Notifications
You must be signed in to change notification settings - Fork 0
Discord Status Bot Setup And Reference
Source-verified 2026-06-21 against master cf2a6d6a4. All DiscordBot paths are relative to DiscordBot/ in the repo root (not the Chernarus mission dir). Arma 2 OA 1.64.
The DiscordBot component is a .NET 9 executable that reads mission telemetry from a shared JSON file written by the a2waspwarfare_Extension Arma extension, and publishes a live status embed to a Discord channel. This page covers everything an operator needs to deploy and run it from scratch.
Create a bot application at discord.com/developers/applications and enable all three Privileged Gateway Intents (Presence, Server Members, Message Content) under the Bot tab. The bot client is configured with GatewayIntents.All — missing any privileged intent will cause the bot to silently misbehave or fail to see guild members.
DiscordBot/src/BotReference.cs:51-59—SetClientRefAndReturnIt()constructsDiscordSocketConfig { GatewayIntents = GatewayIntents.All }.
The bot depends on three NuGet packages. No additional runtime installation is required beyond .NET 9.
| Package | Version | Purpose |
|---|---|---|
Discord.Net |
3.10.0 | Discord gateway and REST client |
Newtonsoft.Json |
13.0.2 | JSON deserialization of database.json and preferences.json
|
Pastel |
4.0.2 | Coloured console log output |
DiscordBot/DiscordBot.csproj:16-20
Two files must be placed beside the compiled .exe before launch. Both are excluded from version control.
Contains the Discord bot token, one line, no extra whitespace.
Startup checks in order (ProgramRuntime.cs:21-35):
-
File.Exists("token.txt")— missing file → ERROR log and immediate return (bot does not start). -
string.IsNullOrWhiteSpace(token)— empty file → ERROR log and immediate return.
Note: GameData and Preferences are loaded before the token check (ProgramRuntime.cs:14-18). A missing or malformed preferences.json can therefore produce a different failure before the clean missing-token exit. Provide a valid preferences.json first.
Singleton read at first access via Preferences.Instance (src/Preferences.cs:24-25). Parsed with JsonConvert.DeserializeObject<Preferences>. A null return is suppressed with #pragma warning disable CS8603 (Preferences.cs:28-30); a malformed file will throw at deserialisation rather than fail cleanly.
The file is written back by Preferences.SaveToFile() after /setup and when a new status message is created, so it must be writable by the process.
Sample file: DiscordBot/preferences_sample.json.
{
"GuildID": "440257265941872660",
"AuthorizedUserIDs": [
111788167195033600
],
"GameStatusChannelID": null,
"GameStatusMessageID": null,
"DataSourcePath": "C:\\a2waspwarfare\\Data",
"a3Mode": false
}| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
GuildID |
ulong |
Yes | — | Discord guild (server) snowflake ID. Used to look up the guild for slash-command registration and status updates. BotReference.cs:66
|
AuthorizedUserIDs |
ulong[] |
Yes | [] |
Snowflake IDs of users permitted to run /setup and /cleanup. All other users receive an ephemeral "not authorized" response. Preferences.cs:47-50, CommandHandler.cs:49,127
|
GameStatusChannelID |
ulong? |
No | null |
Set automatically by /setup. The channel where status embeds are posted and whose name is updated. Leave null on first deploy; the bot will fill it in. Preferences.cs:11
|
GameStatusMessageID |
ulong? |
No | null |
Set automatically when the first status message is posted. The bot edits this message in place on every 60-second tick. Preferences.cs:12
|
DataSourcePath |
string? |
No | C:\a2waspwarfare\Data |
Filesystem path to the directory containing database.json. See §5 for the full resolution chain. Preferences.cs:13
|
a3Mode |
bool |
No | false |
When true, forces the displayed max-player cap to 40 regardless of terrain. See §6. Preferences.cs:14
|
FileConfiguration.cs provides a secondary data-path source via a botconfig.json file beside the .exe. It is only consulted if Preferences.Instance.DataSourcePath is null or empty — if preferences.json sets a non-empty path, botconfig.json is never read for that field.
{
"DataSourcePath": "C:\\a2waspwarfare\\Data"
}Resolution order for FileConfiguration.DataSourcePath (FileConfiguration.cs:9-44):
-
Preferences.Instance.DataSourcePath(non-empty) → use it. -
customDataPath(set viaSetCustomDataSourcePath()at runtime) → use it. -
botconfig.json→ if it exists and has a non-emptyDataSourcePath, use it and cache incustomDataPath. - Hardcoded fallback:
C:\a2waspwarfare\Data.
In practice, the live game-data reader (GameData.LoadFromFile()) always goes directly to Preferences.Instance.DataSourcePath ?? @"C:\a2waspwarfare\Data" (GameData.cs:36). FileConfiguration.DataSourcePath is not used by the live status-reader path; only FileConfiguration.LogsPath (.logs/) is used by the logging system. Treat botconfig.json as a dormant helper; preferences.json is the effective config for the running bot.
Program.Main()
└─ ProgramRuntime.ProgramRuntimeTask() (ProgramRuntime.cs:9)
├─ LogLevelNormalization.InitLogLevelNormalizationStrings() (line 11)
├─ GameData.Instance = GameData.LoadFromFile() (line 15)
│ └─ reads Preferences.Instance.DataSourcePath (GameData.cs:36)
│ └─ reads preferences.json on first access (Preferences.cs:24)
├─ client = BotReference.SetClientRefAndReturnIt() (line 18 / BotReference.cs:51-59)
├─ token = File.ReadAllText("token.txt") (line 28)
├─ client.LoginAsync() / client.StartAsync() (lines 37-38)
└─ client.Ready event
├─ GameDataDeSerialization.DeSerializeGameDataFromExtension()
│ └─ GameData.LoadFromFile() again (GameDataDeSerialization.cs:13)
└─ SetupProgramListenersAndSchedulers() (ProgramRuntime.cs:63-73)
├─ CommandHandler.InstallCommandsAsync()
│ └─ registers /setup and /cleanup as guild commands (CommandHandler.cs:7-35)
└─ GameStatusUpdater.StartGameStatusUpdates(client)
└─ starts 60-second update timer (GameStatusUpdater.cs:14-25)
The process blocks indefinitely on await Task.Delay(-1) (ProgramRuntime.cs:60). Stop it via the process manager (SIGTERM/task kill); no graceful shutdown path exists in the current source.
| Symptom | Cause | Fix |
|---|---|---|
| "Token file 'token.txt' not found" (ERROR) |
token.txt missing |
Create the file beside the .exe
|
| "Token file 'token.txt' is empty" (ERROR) |
token.txt has no content |
Add the bot token |
| Exception before the token check |
preferences.json missing or malformed |
Provide a valid preferences.json first |
| Bot connects but slash commands fail |
GuildID wrong in preferences.json
|
Check the guild ID in Discord (right-click server → Copy Server ID with developer mode on) |
| Bot connects but status never posts |
GameStatusChannelID is null (not yet configured) |
Run /setup in the target channel |
| Gateway privileged intent errors | Intents not enabled on the Discord application | Enable all privileged intents in the Discord Developer Portal → Bot page |
Both commands are registered as guild commands (not global) against Preferences.Instance.GuildID (CommandHandler.cs:24-25). They are registered every time the bot reaches Ready. Authorization is checked via Preferences.Instance.IsUserAuthorized(userId) which returns AuthorizedUserIDs.Contains(userId) (Preferences.cs:47-50).
Sets the channel where the command is issued as the game-status channel. Authorized users only (CommandHandler.cs:43-119).
What it does:
- Records
command.Channel.IdasPreferences.Instance.GameStatusChannelID. - Computes the channel name string from the in-memory
GameData.InstanceviaGetGameMapAndPlayerCountWithEmojiForChannelName()(CommandHandler.cs:64). - Renames the channel via
guildChannel.ModifyAsync(). - Sets the bot's presence activity via
client.SetGameAsync(newChannelName, null, ActivityType.Playing). - Calls
CreateGameStatusEmbed(), which performs a freshGameData.LoadFromFile()before building the embed (CommandHandler.cs:211). - Posts the initial status embed to the channel.
- Saves the resulting message ID to
Preferences.Instance.GameStatusMessageID. - Calls
Preferences.SaveToFile()to persist both IDs topreferences.json. - Responds with an ephemeral confirmation.
The bot must have Manage Channels and Send Messages permissions in the target channel. Missing permissions on message send (step 6) produce Discord HTTP 403 errors caught at CommandHandler.cs:98-107 with specific user-facing messages. A 403 on channel rename (step 3) has no local catch and propagates to the outer SlashCommandHandler catch at line 189, producing a generic error ephemeral. Ensure the bot has Manage Channels and Send Messages permissions to avoid both.
Removes duplicate status embeds from the current channel. Authorized users only (CommandHandler.cs:121-181).
What it does:
- Fetches the last 50 messages in the current channel (
CommandHandler.cs:139). - Filters for bot-authored messages whose embed title contains
ChernarusorTakistan(case-insensitive), or whose embed description containsScore:(CommandHandler.cs:141-148). - Keeps the newest matching message; deletes all older ones (
CommandHandler.cs:157). - Responds with a count of deleted messages.
Warning: the title/description heuristic (CommandHandler.cs:144-147) can match any embed the bot posted with those strings — including embeds from other channels if the channel is shared. Prefer running /cleanup only in the dedicated status channel, and only after /setup has been run to pin a message ID.
Started by GameStatusUpdater.StartGameStatusUpdates() after Ready. The timer fires every 60 seconds (GameStatusUpdater.cs:9 — UPDATE_INTERVAL_SECONDS = 60). A SemaphoreSlim(1,1) prevents overlapping updates; if the previous tick has not finished, the new tick is skipped with a DEBUG log (GameStatusUpdater.cs:30-33).
Each tick (UpdateGameStatus(), GameStatusUpdater.cs:52-158):
- Reads
Preferences.Instance.GameStatusChannelID; if null, skips with DEBUG log. - Calls
GameData.LoadFromFile()to get fresh data fromdatabase.json. - Computes new channel name and embed (see §8).
- Calls
guild.GetChannel(...).ModifyAsync()with a 30-secondCancellationTokenSourcetimeout (GameStatusUpdater.cs:93-97). - Calls
client.SetGameAsync()for bot presence — no timeout is applied to this call (GameStatusUpdater.cs:100-107). - Tries to edit
GameStatusMessageIDin place. If the message is not found (deleted externally), creates a new message and updatespreferences.json.
Timeout counter: consecutiveTimeouts increments on each TaskCanceledException or unexpected exception but is never reset to zero except on a successful message update or new-message creation (GameStatusUpdater.cs:121). It is also reset to zero in CreateNewStatusMessage() (GameStatusUpdater.cs:176) when a replacement message is created successfully. It is only a diagnostic counter — no circuit breaker is implemented in the current source.
The embed is built by GameStatusMessage.GenerateMessage() (GAMESTATUSMESSAGE.cs:17-23) and CreateGameStatusEmbed() (shared between GameStatusUpdater.cs:195-208 and CommandHandler.cs:208-224).
<emoji> <playerCount>︱<maxPlayerCount> <TerrainDisplayName>
Separator between counts is U+FE30 TWO DOT LEADER (︱) — a Unicode character, not a pipe — following the literal spaces in GameData.cs:134.
Example: 🌲 12︱55 Chernarus or 🏜️ 8︱61 Takistan
| Token | Source |
|---|---|
Terrain emoji (🌲 / 🏜️) |
EmojiName.EVERGREENTREE / EmojiName.DESERT (EmojiName.cs:14,18) |
playerCount |
exportedArgs[4] from database.json; falls back to "0" if absent or short array (GameData.cs:80-83) |
maxPlayerCount |
Terrain DetermineMissionTypeIfItsForestOrDesertAndGetThePlayerCount() → "55" (FOREST) or "61" (DESERT) (BaseTerrain.cs:40-48); or "40" when a3Mode is true (see §9) |
| Terrain display name |
TerrainName enum's EnumMember(Value) string (e.g., "Chernarus", "Takistan") (TerrainName.cs) |
Same content as the channel name, but using a different format string (without the ︱ separator) — see GetGameMapAndPlayerCountWithEmoji() (GameData.cs:74-103):
<emoji> [<playerCount>/<maxPlayerCount>] <TerrainDisplayName>
Score: <BLUFOR_emoji><bluforScore> vs <opforScore><OPFOR_emoji>
Uptime: HH:MM:SS
Please balance the teams accordingly!
| Token | Source |
|---|---|
| BLUFOR emoji | Custom Discord emoji <:blufor_icon:1079531790873673819> (EmojiName.cs:8) |
| OPFOR emoji | Custom Discord emoji <:opfor_icon:1079531788319330304> (EmojiName.cs:11) |
bluforScore / opforScore
|
exportedArgs[0] / exportedArgs[1]; fallback "0" (GameData.cs:165-171) |
| Uptime |
exportedArgs[3] parsed as ulong seconds, formatted via TimeService; fallback "00:00:00" (GameData.cs:181-193) |
| Condition | Color |
|---|---|
TerrainType.FOREST (Chernarus etc.) |
Color.DarkGreen |
TerrainType.DESERT (Takistan etc.) |
Color.Gold |
GAMESTATUSMESSAGE.cs:31-41
"Last updated at: " + DateTime.UtcNow.ToLongTimeString() + " " + DateTime.UtcNow.ToLongDateString() + " (GMT+0)" (GAMESTATUSMESSAGE.cs:26-29).
When Preferences.a3Mode is true, GetGameMapAndPlayerCountWithEmoji() and GetGameMapAndPlayerCountWithEmojiForChannelName() both substitute "40" for maxPlayerCount regardless of which terrain is loaded (GameData.cs:87-89, GameData.cs:119-121).
This was added to support displaying an Arma 3 mission cap without changing the Arma 2 terrain config. It has no effect on the mission itself — only on the displayed max-player count in the Discord channel name, embed title, and bot presence. Default is false (Preferences.cs:14).
The full telemetry chain:
Server/CallExtensions/GlobalGameStats.sqf (mission side)
└─ runs in a while {true} loop, sleep 60 each iteration
└─ builds callExtension string: "GLOBALGAMESTATS,<west>,<east>,<map>,<uptime>,<playerCount>"
└─ "a2waspwarfare_Extension" callExtension <string> (line 22)
a2waspwarfare_Extension DLL (Extension/ in repo)
└─ ExtensionMethods._RVExtension@12() (ExtensionMethods.cs:10)
└─ splits on comma, resolves "GLOBALGAMESTATS" enum
└─ GLOBALGAMESTATS.ActivateExtensionMethodOnTheDerivedClass()
└─ GameData.Instance.exportedArgs = _args (GLOBALGAMESTATS.cs:19)
└─ SerializationManager.SerializeDB() (via BaseExtensionClass)
└─ writes temp file then File.Replace → C:\a2waspwarfare\Data\database.json
TypeNameHandling.None (SerializationManager.cs:33)
DiscordBot (60-second poll)
└─ GameData.LoadFromFile() reads C:\a2waspwarfare\Data\database.json
TypeNameHandling.All ← security caveat, see External-Integrations
└─ updates channel name, bot presence, edits or creates status embed
| Index | Mission variable | Bot reader location | Fallback |
|---|---|---|---|
[0] |
_scoreSideWest (BLUFOR score) |
GameData.cs:169 |
"0" |
[1] |
_scoreSideEast (OPFOR score) |
GameData.cs:170 |
"0" |
[2] |
worldName (map name string) |
GameData.cs:150-156 |
defaults to TAKISTAN
|
[3] |
round(time) (server uptime, seconds) |
GameData.cs:184-191 |
"00:00:00" |
[4] |
abs(_playerCount - 1) |
GameData.cs:80-83 |
"0" |
Mission source:
Server/CallExtensions/GlobalGameStats.sqf:1-25. Extension writer:Extension/src/GameData.cs:29(array sizenew string[2]— stale declaration; runtime fills all five slots). Bot reader:DiscordBot/src/ExtensionData/GameData/GameData.cs:30(array sizenew string[4]— also stale; index[4]is guarded at runtime).
Player-count heuristic: GlobalGameStats.sqf:20 uses abs(_playerCount - 1) to exclude one assumed headless client. This under-reports on servers with zero or more than one HC, and does not use WFBE_C_* gate constants — it is an unconditional arithmetic adjustment.
The bot resolves the terrain name from exportedArgs[2] (the Arma worldName string, compared case-insensitively via EnumExtensions.GetInstance()). Unknown world names fall back to TAKISTAN (GameData.cs:151-153).
worldName value |
TerrainName |
TerrainType |
Max players (normal) |
|---|---|---|---|
Chernarus |
CHERNARUS |
FOREST |
55 |
Takistan |
TAKISTAN |
DESERT |
61 |
Tasmania |
TASMANIA2010 |
(see class) | varies |
Dingor |
DINGOR |
(see class) | varies |
Everon |
EDEN |
(see class) | varies |
Lingor |
LINGOR |
(see class) | varies |
Sahrani |
SMD_SAHRANI_A2 |
(see class) | varies |
Taviana |
TAVI |
(see class) | varies |
Isla Duala |
ISLADUALA |
(see class) | varies |
Napf |
NAPF |
(see class) | varies |
TerrainName.cs:1-30,BaseTerrain.cs:40-48, terrain implementation classes inDiscordBot/src/ExtensionData/GameData/SharedWithLoadoutManager/Terrains/Implementations/.
All log output goes to:
-
Console (colour-coded by level via
Pastel). -
File under
.logs/relative to the.exe— one file per log level plus anEVERYTHINGfile.FileConfiguration.cs:3,Log.cs:61-65. -
Discord channel — only messages at
WARNING(1) or below (i.e.,WARNINGandERROR) are sent to a Discord channel ifBotMessageLogging.loggingChannelIdis non-zero.LoggingParameters.cs:4.WARNING-level messages also ping the hardcoded user ID111788167195033600(BotMessageLogging.cs:13-16).
Note: BotMessageLogging.loggingChannelId defaults to 0 (BotMessageLogging.cs:5) and has no setter in preferences.json. The Discord log channel feature is effectively inactive unless the field is set in code before deployment.
| Log level value | Constant | Meaning |
|---|---|---|
| 0 | ERROR |
Fatal / unrecoverable |
| 1 | WARNING |
Unexpected but survivable |
| 2 | IMPORTANT |
Key lifecycle events |
| 3 | SERIALIZATION |
DB serialize/deserialize tracing |
| 4 | DEBUG |
Detailed step tracing |
| 5–8 |
ADD/SET/GET_VERBOSE, VERBOSE
|
High-frequency variable tracing |
LogLevel.cs:1-12,LoggingParameters.cs:1-9
-
Console/log: Look for
"Bot is connected!"(DEBUG) and"Program listeners and schedulers setup completed"(DEBUG) inProgramRuntime.cs:45,72. -
Slash commands: Run
/setupin the target channel. You should receive an ephemeral confirmation and see the channel renamed immediately. -
Embed: After
/setup, the initial status embed appears in the channel. The footer timestamp advances every 60 seconds. -
Channel name: Should update every 60 seconds. If the channel name is stuck, check for
"Skipping update - previous update still in progress"(DEBUG) or timeout warnings (WARNING) in the logs. -
No embed, no channel rename: Check
preferences.jsonfor a non-nullGameStatusChannelID. If it is null,/setupwas not completed successfully. -
database.jsonnot found (WARNING): The extension DLL has not run yet, orDataSourcePathinpreferences.jsonpoints to the wrong directory. The bot will display default/fallback values ("0"scores,"00:00:00"uptime) until the extension writes data.
- External Integrations — full security and trust-boundary analysis of the bot, extension, AntiStack database, and BattlEye filter
-
Integration Trust Boundary Audit —
TypeNameHandling.Alldeserialization risk in the bot's JSON reader and the in-repo extension writer boundary -
Tools And Build Workflow — how to build
DiscordBot,Extension, andLoadoutManagerfrom source - Server Ops Runbook — deployment checklist and server file layout
- GLOBALGAMESTATS Extension Reference — in-batch deep-dive on the extension DLL side of the pipeline
Home | Agent Guide | Current live state | Release 1.2.2 (B91) | Quickstart | Progress | Lifecycle wait-chain | Join/disconnect | Parameters/build | Assets/config | SQF atlas | PV index | Modules | Support/specials | Commander/HQ | Commander vote/reassign | Construction/CoIn | Construction cleanup | WDDM compositions | Factory/purchase | Upgrades/research | Towns/camps/capture | Victory/endgame | Markers/cleanup | Server runtime | AI runtime/HC | AI commander audit | HC delegation | Town AI safety | Commander reassignment | Resistance supply | Player UI workflow | UI atlas | Respawn/death | Gear template filter | Vehicle cargo loop | Service guards | UI IDD repair | UI design inspiration | WASP overlay | Feature status | Source propagation | release readiness | Tooling readiness | Integration trust | AntiStack DB | Owner decisions | Shelved registry | Abandoned feature revival | Hardening roadmap | PVF dispatch | Server authority | ICBM authority | Attack-wave authority | Telemetry families | AICOM V2 cutover | Consumer port map | Testing workflow | Server ops | Web tools | Ecosystem repos | Arma 2 OA refs | A2 traps | OA compatibility audit | Coverage ledger | Navigation inventory | Pruning ledger | Knowledge roadmap | Agent context | Collab protocol | Worklog | Audit archive 2026-07 | Briefing reference | Utes invasion concept
- Shelved AICOM concepts - revivable someday ideas (owner-shelved 2026-07-03)
Docs rule: source-backed claims only; Arma 2 OA scripting docs only; gameplay edits start in Missions/[55-2hc]warfarev2_073v48co.chernarus.
- Getting started
- Status and coordination
- Agent context
- Agent collaboration protocol
- Agent worklog
- Agent worklog archive
- Progress dashboard
- PR cleanup and integration lab
- Shelved PR #169: gear price double-count
- Shelved PR #194: Chernarus no-trees
- Coordination board
- Codebase coverage ledger
- Bottleneck removal queue
- Current source status
- Wiki mirror reconciliation
- Navigation inventory
- Registers
- Agent orchestration
- Architecture
- Architecture overview
- Mission entrypoints and lifecycle
- Lifecycle wait chain
- Player join/disconnect and AntiStack lifecycle
- Mission parameters/localization/build inputs
- Stringtable localization key-family catalog
- Source inventory
- Content structure and maps
- Assets/config/localization/parameters
- Mission start parameters index
- Code and networking
- Gameplay systems
- Core systems index
- Gameplay systems atlas
- Commander/HQ lifecycle atlas
- Economy, towns and supply
- Economy system reference
- Balance asymmetries
- Anti-stack skill-balance mechanic
- Empty-side supply income stagnation
- Towns, camps and capture atlas
- Victory and endgame atlas
- Victory conditions reference
- Territorial victory reference
- Marker cleanup and restoration
- Marker loop engine and registries
- Map marker families content catalog
- Marker subsystem function reference
- Client marker FSM updater map
- Support specials and tactical modules
- SCUD TEL tactical munitions
- Naval HVT objectives (carriers/SCUD)
- SCUD saturation strike mechanic
- Takistan airfield FPV drone design
- Construction and CoIn systems
- Structure damage reduction & friendly-fire
- Construction logic list cleanup
- Flak tower & WDDM anchor compositions
- Resistance supply scaffold
- GUER Insurgents faction overview
- GUER Insurgents branch audit
- GUER insurgent player economy
- GUER Commissar Panel
- GUER air-defense loop (Ka-137/Mi-24)
- Upgrades and research atlas
- Supply mission architecture
- Supply mission authority cleanup
- Current supply helicopters PR1
- Respawn and death-loop lifecycle
- Vehicle theft economy pitch
- GUER tunnel network pitch
- Content, reference and catalogs
- Faction unit/vehicle roster catalog
- Auxiliary/SF/civilian unit catalog
- Gear store loadout route catalog
- Upgrade research (cross-faction)
- Gear store price and upgrade catalog
- Gear store catalog (complete, per faction)
- Defense structures catalog
- Artillery reference per faction
- AI squad team templates catalog
- Town AI lifecycle reference
- Town AI group composition catalog
- Class-skill system reference
- Player skill abilities reference
- Default gear template content catalog
- Chernarus map content reference
- Takistan map content reference
- Takistan features
- Takistan parity reference
- Takistan oilfields objective reference
- IRS IR-smoke countermeasure
- Arty module special munitions
- Zeta cargo sling-load reference
- Spawn primitive function reference
- Kill and score pipeline
- Waypoint helper function reference
- Position and proximity function reference
- Side/team state function reference
- Player AI watchdog and recovery
- AICOM stuck-recovery v2
- LoadoutManager data-model contributor guide
- Discord status bot setup and reference
- GLOBALGAMESTATS extension reference
- New player quickstart (player guide)
- Optional client mods (player guide)
- Earning funds and score (player guide)
- Vehicle service and logistics (player guide)
- Commander's handbook (player guide)
- Tactical support menu
- Paradrop player experience
- Supply missions (player guide)
- In-game briefing & Diary field manual
- Playable maps catalog
- Faction root variables reference
- Faction base structures catalog
- Counter-battery radar system
- Bank, Reserve and Artillery Radar structures
- Map ruleset model and object config
- Countermeasures module reference
- Vehicle countermeasure (flares/spoofing)
- UAV terminal and spotter system
- Artillery firing function reference
- Service Point pricing model
- Medic redeployment truck (forward spawn)
- Side-patrol runtime and convoy mechanics
- Day/night cycle and weather system
- Config lookup helper reference
- CIPHER sort utilities reference
- Modded maps status and content
- BattlEye filter setup and OA taxonomy
- Player squad/group join protocol
- AutoFlip vehicle recovery
- Engine stealth fuel toggle
- Valhalla vehicle climbing-assist
- Missile and ordnance Fired-EH reference
- Vehicle equip and rearm reference
- Array and collection utilities
- Server composition spawner reference
- Upgrade queue server loop
- Map boundaries and off-map enforcement
- Namespace/profile/diagnostic utilities
- Group bool getVariable A2-OA trap
- Vehicle weapon balance init
- View distance auto-throttle
- Camp & respawn-camp getters
- Performance audit writer
- Site clearance (bulldozer)
- Factory queue cancel & refund
- AI commander tunable constants
- Experimental feature-flag constants
- Flag system quick reference
- Mission tunable constants catalog
- Gear parsing & cargo capacity
- Structure dressing function
- Paradrop delivery functions
- ICBM nuke client VFX & radiation
- Server HandleSpecial router
- LocalizeMessage chat router
- Gear buy-menu render & price functions
- Server broadcast & telemetry loops
- Per-unit client init pipeline
- Vehicle marking & texture pipeline
- Defense category & budget
- Legacy AI order primitives
- Commander-team driver
- AICOM command verbs
- AICOM behavior fix taxonomy
- AI commander wildcard deck reference
- AICOM aircraft and airfield system
- Static-defense manning
- End-of-game stats screen
- AI commander execution loop
- Deployable bipod / weapon resting
- Town-economy getters
- Server-init deadspawn & airfield probe
- GUER VBIED detonate action
- Resource income-tick engine
- AI commander treasury accessors
- PVF send-helper contracts
- AICOM logging & AICOMSTAT telemetry
- AICOMSTAT v2 event census
- WASPSCALE v2 telemetry
- WASPSCALE v2-ext coverage audit
- Telemetry families reference
- Group lifecycle & entity reaping
- Batch AI spawner orchestrator
- Client funds/income HUD readout
- Server group GC & cap warning
- Town runtime tuning constants
- Client input/hotkey handler
- WASP base-repair system
- WASP DropRPG launcher/ordnance
- CoIn construction-interface client engine
- Town-capture garrison & airfield rebuild
- Map-control & minimap templates
- Client FPS & state telemetry
- Client service-proximity getters
- Airfield-exclusive roster & unit hints
- Unit-camera spectator system
- Town-garrison patrol/defense worker
- RequestTeamUpdate squad-discipline
- Arma2Warfare GPT assistant
- LoadoutManager build configs & defines
- GLOBALGAMESTATS extension logging
- Discord bot instrumented logging
- Eden/Everon & Taviana map content
- Cruise missile strike asset
- AI / HC
- AI headless and performance
- AI mods and pathfinding reference
- Headless client scaling and topology
- AI runtime/HC loop map
- Headless client init and stat loop
- HC delegation target selection
- Player AI caps and role balance
- Old WarfareBE FPS comparison
- AI commander autonomy audit
- Upstream BE 2073 AICOM delta
- Parent 2.073 divergence audit
- AI commander capture & fun plan
- AI commander B69 improvement roadmap
- AI commander B69 implementation sketches
- AICOM V2 cutover status
- Headless delegation and failover
- Commander reassignment call shape
- GUER Director living-resistance pitch
- Quality and operations
- Foundation perf findings & Tier-3 dead-ends
- Dead/stale code register
- Commander vote/reassignment
- Attack-wave authority
- Server runtime and operations
- Server ops runbook
- JIP enrollment & client data delivery (b74.2 lessons)
- Server gameplay runtime atlas
- PerformanceAuditAnalyzer
- Performance opportunity sweep
- Documentation plan
- Knowledge platform roadmap
- Wiki quality audit
- Wiki pruning and relevance ledger
- Audit findings queue (2026-06-03)
- Deep review findings
- Client UI / server-loop perf findings
- Performance gain simulation
- Self-host testing field notes
- Cleanup and work lanes
- Hardening and authority
- UI / player workflows
- Client UI, HUD and menus
- UI HUD and dialogs
- Player UI workflow map
- Client UI systems atlas
- UI IDD collision repair
- UI control class library reference
- UI theme palette and style macros
- UI design inspiration 2026-07
- Available-actions client gate FSM
- Gear/loadout/EASA atlas
- Gear template profile filter
- Vehicle cargo equip loop bounds
- Factory and purchase systems atlas
- Service menu affordability guards
- WASP overlay
- Class-skill system reference
- Skin selector and class swap
- Earplugs audio toggle
- Mission audio catalog
- HQ radio knowledge-base catalog
- QoL trio player hints
- Player vehicle/travel actions
- Tooling / release / integrations
- Tools and build workflow
- Warfare web tools
- Ecosystem & companion repos
- Zargabad tooling parity
- July 2026 release readiness
- Operator monitor and CPU affinity tools
- Tooling release readiness audit
- Source fix propagation queue
- Agent release readiness ledger
- Release source intake map
- Testing/debugging/release workflow
- Current RPT release gate
- RPT telemetry consumer port map
- External integrations
- Integration trust boundary audit
- AntiStack database extension audit
- Community & Dev
- Community & Dev
- Miksuu upstream wiki import / archive index
- Upstream changelog feature leads
- Developer history and upstream lessons
- Upstream Miksuu commit intel
- Upstream mining ledger
- Archive script mining v2
- Upstream BE 2073 AICOM delta
- Parent 2.073 divergence audit
- PR8 and Drone upstream lesson match
- Development lessons learned
- External research reports
- Audit archive 2026-07
- Briefing reference
- Utes invasion concept
- Miksuu archive: Home
- Miksuu archive: Welcome
- Miksuu archive: Big announcements
- Miksuu archive: Changelog
- Miksuu archive: Development process
- Miksuu archive: Discord bot
- Miksuu archive: Gameplay videos
- Miksuu archive: LoadoutManager
- Miksuu archive: Chernarus script architecture
- Base-game visual catalogs
- Compatibility and references
- HC upstream history and lessons
- Player stats branch audit
- BuyMenu EASA QoL branch audit
- Perf quick wins branch audit
- Commander positions branch audit
- Zargabad branch audit
- Quad AI Commander concept
- Arma 2 OA external reference guide
- Base-game config & image reference
- Arma 2 OA compatibility audit
- Arma 2 OA agent traps reference
- Arma 2 OA command versions
- Wiki source consistency
- External Arma 2 OA reference index