Structure / module placement:
- Add scripts/5_Mission/YALootBoxes_MissionServer.c: a modded MissionServer
that self-starts the manager in OnInit(). No init.c edit required anymore.
- config.cpp: bind 5_Mission to missionScriptModule (4_World stays on
worldScriptModule). Core logic correctly stays in 4_World; only the
mission-lifecycle bootstrap lives in 5_Mission.
Config create/read/write:
- LoadAll now writes populated defaults for ALL four JSON files when missing
(previously only main_config.json was generated; box_types/loot_lists/
spawn_locations were left empty, so a fresh install spawned nothing).
- Add default-data factories (YALB_MkReq/MkFail/MkLoot/MkLoc/MkBoxType) and
DefaultBoxTypes/DefaultLootLists/DefaultSpawnLocations builders mirroring
configfiles.readme. The mod is now self-provisioning on first run.
Docs:
- Prefix.cpp: refreshed folder-layout summary; dropped stale init.c /
simulationModule notes.
- Manager.c: bootstrap comment now points to the 5_Mission self-start.
- README.md: add Install & first-run section.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Logging:
- Replace EnableDebugLogging (bool) with DebugLogLevel (string) in
YALB_MainConfig; default "INFO". Stored as a string for admin-friendliness,
parsed once at load into YALB_ConfigLoader.LogLevel (int) for cheap compares.
- Add YALB_LogLevel enum NONE(0)<ERROR(1)<WARN(2)<INFO(3)<DEBUG(4)<VERBOSE(5),
YALB_ParseLogLevel (case-insensitive, falls back to INFO), and leveled
helpers Log_Error/Warn/Info/Debug/Verbose. ERROR also routes via ErrorEx().
- Reclassify every existing log call by content (missing critical config ->
ERROR, recoverable -> WARN, milestones -> INFO, per-tick summary -> DEBUG,
per-player/per-roll detail -> VERBOSE). Add a VERBOSE proximity-send log.
- Update main_config.json example and the default constructor to "INFO".
- Add README.md documenting levels, the config field, and the VERBOSE warning.
Green cleanups (from Phase 2):
- Remove dead OnActionInfoUpdate override (behaviour is inherited).
- Remove unused m_LocationInUse map (the live pool is m_FreeLocationNames).
- Null-guard player identity in the fail-effect log.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Renamed code prefix LB_ -> YALB_ across all four script files
- Renamed source files LootboxSpawner_*.c -> YALootBoxes_*.c
- Deleted three empty 0-byte stub files (_BoxTypes/_LootLists/_SpawnLocations)
- Fixed folder case scripts/4_world -> scripts/4_World to match config.cpp
- Verified box_types.json className values match CfgVehicles class names
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>