Skip to content

NEURO And AntiStack System Reference

rayswaynl edited this page Jul 3, 2026 · 1 revision

NEURO And AntiStack System Reference

Source-verified 2026-07-03 against origin/claude/build84-cmdcon36@5fca3239069a5eff6335f06fecb26bb72e8c9ceb. Paths below are relative to Missions/[55-2hc]warfarev2_073v48co.chernarus/ unless noted. Arma 2 OA 1.64.

This is the route page for the two similarly named but separate systems:

  • AntiStack is player/team balancing and persistence glue. It owns join-side checks, team skill reads, score sampling, player-list DB flushes, side-supply compensation and launch/JIP side tracking.
  • NEURO is Benny's AI taxi / vehicle-sharing module. In current Build84 it is compiled and its vehicle opt-out flag is still stamped by many systems, but the dispatch entry points have no runtime callers.

Use this page to decide which owner page to open before changing code. Do not treat AntiStack, NEURO, AICOM air transport or supply-mission player lists as the same system.

Ownership Map

Need Go to Current source anchor
Join, reconnect, launch-side and disconnect lifecycle Player join/disconnect and AntiStack lifecycle Server/PVFunctions/RequestJoin.sqf:10-98, Server/Module/AntiStack/clientHasConnectedAtLaunch.sqf:1-17, Client/Module/AntiStack/hasConnectedAtLaunchACK.sqf:1-7
AntiStack formulas and player-count handicap Anti-stack skill-balance mechanic compareTeamScores.sqf:20-87, skillDiffCompensation.sqf:8-147, Common/Init/Init_CommonConstants.sqf:1296-1304
AntiStack DB extension risk and wrapper hardening AntiStack database extension audit Server/Module/AntiStack/callDatabase*.sqf, Server/Init/Init_Server.sqf:109-124,1201-1217
Direct publicVariable inventory Public variable channel index WFBE_CLIENT_HAS_CONNECTED_AT_LAUNCH, WFBE_P_HAS_CONNECTED_AT_LAUNCH_ACK, SUPPLY_COMPENSATION_AMOUNT_*
Module inventory and boot edges Modules atlas AntiStack compile/start, NEURO compile/hook
NEURO function-level behavior NEURO AI-taxi module reference Server/Module/NEURO/NEURO.sqf:7-239
AICOM vehicle movement / air transport AI commander execution loop, Commander-team driver Do not route through NEURO unless a caller is added.

Boot Shape

System Boot behavior Runtime status
AntiStack compile registry Server init compiles wrappers, score helpers, join compare and launch PVEH at Init_Server.sqf:109-124. Always compiled because other paths call helpers.
AntiStack enabled gate WFBE_C_ANTISTACK_ENABLED has lobby parameter coverage and a fallback default of 1 (Rsc/Parameters.hpp:603, Init_CommonConstants.sqf:1296). Init_Server.sqf:1201-1212 starts score, monitor and compensation loops only when enabled.
AntiStack map DB stamp When enabled, server init calls ["SET_MAP", 1] call WFBE_SE_FNC_CallDatabaseSetMap at Init_Server.sqf:1217. Uses the out-of-repo A2WaspDatabase extension, not the in-repo Extension project.
NEURO compile Server init runs [] Call Compile preprocessFile "Server\Module\NEURO\NEURO.sqf" at Init_Server.sqf:157-158. Functions exist in mission namespace.
NEURO taxi condition Server init sets NEURO_TAXI_CONDITION to reject WFBE_Taxi_Prohib vehicles and require local _x at Init_Server.sqf:165-166. The condition is only used inside NEURO helper filtering.
NEURO dispatch callers Repo-wide scan found only definitions and internal helper calls for NEURO_BE_AssignToVehicle, NEURO_BE_UpdateTeamDestination and NEURO_BE_HandleArrivalCargo. Dormant in current Build84 unless a future server loop calls those entry points.

AntiStack Data Flow

flowchart TD
    Init["Init_Server.sqf"] -->|"compile wrappers"| Wrappers["callDatabase*.sqf"]
    Init -->|"if enabled"| Count["countPlayerScores.sqf"]
    Count --> Main["mainLoop.sqf score flush"]
    Count --> Update["updateScoreInternal.sqf score sample"]
    Count --> Flush["flushLoop.sqf player-list send"]
    Init --> Monitor["monitorTeamToJoin.sqf"]
    Init --> Comp["skillDiffCompensation.sqf"]
    RequestJoin["RequestJoin.sqf"] --> GetTeam["getTeamScore.sqf"]
    GetTeam --> SideSkill["callDatabaseRequestSideTotalSkill.sqf"]
    Main --> Retrieve["callDatabaseRetrieve.sqf"]
    Main --> Store["callDatabaseStore.sqf"]
    Flush --> SendList["callDatabaseSendPlayerList.sqf"]
    Comp --> SideSkill
    Victory["server_victory_threeway.sqf"] --> FlushList["callDatabaseFlushPlayerList.sqf"]
    Wrappers --> Ext["A2WaspDatabase callExtension"]
Loading

Current loop cadence and scope:

Loop Cadence / scan DB side effect Notes
countPlayerScores.sqf Starts workers with _miniSleep = 0.15, _mainSleep = 120, score sample sleep 1, flush sleep 120 (:8-24). Starts workers only. Direct-call guard exits when AntiStack is disabled (:3-6).
mainLoop.sqf Sleeps 120 seconds, then iterates playableUnits (:15-48). Retrieves and stores per-player score diff. Current Build84 avoids the older all-AI scan pattern for this loop; allUnits count is recorded only for performance audit context.
updateScoreInternal.sqf Sleeps 1 second, then iterates playableUnits (:13-31). Caches current score in mission namespace. Stops on WFBE_GameOver.
flushLoop.sqf Initial 10 seconds, then every 120 seconds; iterates playableUnits (:15-56). Sends current player UID/side list to SEND_PLAYERLIST. Rebuilds _playersOnServer each pass. The remaining risk is unstructured DB payload validation, not historical accumulation in this wrapper.
skillDiffCompensation.sqf Outer 120 seconds; inner 60 seconds while compensation is active (:8-147). Reads side skill and grants weaker-side supply compensation. Formula and hysteresis details live in Anti-stack skill-balance mechanic.
monitorTeamToJoin.sqf Runs once and exits (:1-15). None. Partial/dead scaffolding: computes a local weaker side but publishes no result and has no RequestJoin consumer.

Database Procedure Map

All enabled-mode wrappers use "A2WaspDatabase" callExtension and parse return strings. Build84 has disabled-mode no-op returns and nil/array guards in the wrappers, but the extension itself is not in this repo and the owner decision still belongs to AntiStack database extension audit.

Wrapper Procedure Current return shape
callDatabaseRetrieve.sqf 101, poll 505 Disabled returns [0,1]; malformed request id or timeout returns [1,1]; success returns [totalScore,ticks].
callDatabaseRequestSideTotalSkill.sqf 606, poll 707 Disabled or malformed request id returns scalar 0; timeout returns scalar 1; success returns scalar total side skill.
callDatabaseStore.sqf 202 Disabled or malformed extension response returns 1; success returns response code.
callDatabaseStoreSide.sqf 404 Converts west/east/NONE to 1/2/0; disabled or malformed extension response returns 1.
callDatabaseSendPlayerList.sqf 303 Builds a comma-separated UID/side-code payload from the current pass, then returns response code or 1 on disabled/malformed response.
callDatabaseFlushPlayerList.sqf 808 Flushes the DB player list at match end; disabled/malformed response returns 1.
callDatabaseSetMap.sqf 909 Stores map/session id at enabled startup; disabled/malformed response returns 1.

Join And Launch Edges

Edge Source Current behavior
Stored side rejoin RequestJoin.sqf:10-29 WFBE_JIP_USER%UID_TEAM_JOINED blocks a different-side rejoin with Teamswap.
Launch-side rejoin RequestJoin.sqf:33-44 WFBE_PLAYER_%UID_CONNECTED_AT_LAUNCH blocks a different-side join after launch-side record exists.
First join, AntiStack disabled RequestJoin.sqf:48-54 Allows the join without DB skill check while preserving teamswap protection.
First join, AntiStack enabled RequestJoin.sqf:56-67 Reads WEST/EAST side skill and calls compareTeamScores.sqf.
Join persistence RequestJoin.sqf:86-96 Stores accepted side and WFBE_JIP_BODY_%UID; calls STORE_SIDE.
Launch-connect sender clientHasConnectedAtLaunch.sqf:1-17 Client-published player object is used to store launch side, then ACK is owner-targeted. Validation of sender/object/UID remains the hardening route.
Launch ACK receiver hasConnectedAtLaunchACK.sqf:1-7 Stores the full public-variable event tuple in WFBE_P_HAS_CONNECTED_AT_LAUNCH_ACK, not just the boolean payload. Treat it as tuple-shaped truthiness until normalized.

NEURO Current Status

NEURO's helper body still describes a live AI taxi system: find non-assigned AI, filter nearby vehicles, assign driver/gunner/commander/cargo, and order boarding. In Build84, the module is best read as dormant scaffolding:

Surface Evidence Meaning
Defined helpers NEURO.sqf:7-239 defines nine NEURO_BE_* functions. Available if a future caller is added.
Vehicle eligibility NEURO.sqf:54-76 filters can-move, fuel, side/civilian, driver locality and the NEURO_TAXI_CONDITION hook. The hook compiles a missionNamespace string and expects _x to be the vehicle.
Dispatch entry point NEURO_BE_AssignToVehicle at NEURO.sqf:153-239. No current runtime caller found in Chernarus or maintained Vanilla roots.
Re-evaluation entry point NEURO_BE_UpdateTeamDestination at NEURO.sqf:125-151. No current runtime caller found.
Arrival/eject entry point NEURO_BE_HandleArrivalCargo at NEURO.sqf:95-123. No current runtime caller found.
Opt-out stamps WFBE_Taxi_Prohib is set on town units, HQ/MHQ, init vehicles, built vehicles and AICOM MHQ relocation drivers. These stamps are harmless while NEURO is dormant and should not be removed as dead code without an owner decision.

Do not route current AI commander transport behavior through NEURO. AICOM air legs, road-march seating and commander team movement are implemented in separate AICOM/common files and are active independently of NEURO_BE_*.

Current Build84 Notes

Topic Current status
Older player-list growth concern flushLoop.sqf rebuilds _playersOnServer each pass from playableUnits; callDatabaseSendPlayerList.sqf formats one payload per call. Keep future work focused on UID/side schema validation and payload-size bounds for the external DB boundary.
Older all-units loop concern The score sample, score flush, player-list flush and monitor helper now iterate playableUnits where relevant. compareTeamScores.sqf still counts players with two allUnits passes, but only on first-join skill checks.
Side-skill timeout shape callDatabaseRequestSideTotalSkill.sqf:67-73 now returns scalar 1 on timeout, matching scalar callers. Older [1,1] timeout wording is stale for Build84.
Supply mission player list WFBE_SE_PLAYERLIST belongs to Server/Module/supplyMission, not the AntiStack DB player-list payload. Route stale-row/disconnect cleanup through Player join/disconnect and AntiStack lifecycle and Supply mission architecture.
In-repo extension Extension/ builds the separate a2waspwarfare_Extension / GLOBALGAMESTATS path. It is not the AntiStack A2WaspDatabase extension.

Validation Routes

Change type Minimum validation route
AntiStack disabled-mode edit Start server with AntiStack disabled; prove loops do not start, first join skips only skill DB checks, teamswap protection still works, and disconnect/victory skip DB persistence cleanly.
AntiStack enabled DB wrapper edit Exercise join skill check, score sampling/storage, player-list flush, side-skill compensation and match-end flush with a known-good A2WaspDatabase; also test missing/malformed extension return.
Launch/JIP edit Test launch-side players, late join, reconnect, different-side teamswap denial, owner-targeted ACK and tuple/bool receiver shape.
NEURO reactivation Add an explicit server-side caller, then smoke locality with server/HC-owned vehicles and AI groups; verify no player vehicle is hijacked and WFBE_Taxi_Prohib is honored.

Continue Reading

Sidebar

Clone this wiki locally