YALootBoxes/README.md
smthspec ff51bde976 Fix open action (register custom action), stop restart-stacking, numeric log level, config docs
Action (the real "no action" cause):
- DayZ does not auto-discover custom actions; ActionConstructor holds a
  hardcoded list and AddAction() silently drops anything missing from it.
  Added a modded ActionConstructor that registers YALB_ActionOpenLootbox, so
  the open action finally attaches to the box.
- Switched the action target condition CCTObject -> CCTCursor (the look-at
  pattern vanilla uses for world-object interactions).

Restart stacking:
- Spawn boxes with CreateObjectEx + ECE_NOPERSISTENCY_WORLD so they are never
  saved to the world DB and don't survive restarts.
- Added CleanupOrphanedBoxes(): on init, scan each spawn location and delete
  any leftover YALootBoxes_Base before spawning (clears boxes persisted before
  this change).

Logging:
- DebugLogLevel changed from a string to a numeric field (0=off 1=ERROR
  2=WARN 3=INFO 4=DEBUG 5=VERBOSE), clamped at load. Removed the string parser.
  NOTE: existing main_config.json has a string value and must be regenerated.

Config docs:
- Each generated JSON now includes a "_comment" array describing every field
  and its range (ignored by the loader). README + configfiles.readme updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-20 11:31:20 +03:00

4.1 KiB
Raw Permalink Blame History

YALootBoxes

A DayZ server mod that spawns lockable lootboxes at config-defined locations. Players need a specific held item to attempt opening a box via a hold-to-open action: success unlocks and fills the box; failure rolls one random negative effect. Locked boxes despawn/respawn on a timer so the loot stays fresh; opened boxes despawn a configurable number of minutes after being unlocked.

All settings live in four JSON files auto-generated on first run at $profile:YALootBoxes\:

File Purpose
main_config.json Global tunables (limits, timers, logging)
box_types.json Box definitions: required items, open chance, fail effects
loot_lists.json Per-type loot tables
spawn_locations.json Named world positions and which box type spawns there

Edit the copies under $profile:YALootBoxes\, not the ones inside the PBO. Reference/default versions of all four are in configfiles.readme.

Install & first run

  1. Pack the mod into @YALootBoxes\addons and add @YALootBoxes to the server's -mod= list (after any frameworks it uses).
  2. Start the server. On first run the mod auto-generates all four JSON files with working defaults at $profile:YALootBoxes\, so boxes spawn immediately — no manual config needed.
  3. No init.c edit is required. The mod self-starts via a modded MissionServer (scripts/5_Mission/YALootBoxes_MissionServer.c).
  4. Stop the server, edit the generated JSONs to taste, restart.

Confirm it loaded by looking for these lines in the server .RPT:

[YALootBoxes][INFO] Config loaded: 3 box types, 7 spawn locations, 3 loot lists. Log level = 3.
[YALootBoxes][INFO] Manager initialized. N lootboxes spawned.

Logging

Logging verbosity is controlled by a single numeric field in main_config.json:

{
  "DebugLogLevel": 3
}

The value is read once at load into YALB_ConfigLoader.ActiveLogLevel and clamped to 0–5, so every runtime log call is a cheap integer comparison.

Levels

Levels are ordered. A message is printed only when the configured level is at or above the message's level:

0 = off < 1 = ERROR < 2 = WARN < 3 = INFO < 4 = DEBUG < 5 = VERBOSE

Set DebugLogLevel to the highest level you want to see; everything more severe is included. Default is 3 (INFO), recommended for production.

Level When to use Examples in this mod
NONE Silence all mod logging. —
ERROR The mod cannot do its job; needs admin attention. Routed through ErrorEx() so it stands out in the .RPT. box_types.json / spawn_locations.json missing; an entity class failed to spawn.
WARN Recoverable problem; the mod continues with degraded behaviour. Unknown boxType on a spawn location; loot_lists.json missing (boxes open empty); unknown fail-effect type.
INFO Normal high-level operational milestones. Recommended for production. Manager initialized; config loaded summary; box spawned; box unlocked and filled.
DEBUG Periodic internal state useful when diagnosing behaviour. Per-tick lifecycle summary (removed N, active now M).
VERBOSE Very high-frequency, per-player / per-roll detail. Each proximity message sent; each fail-effect roll resolved.

Setting the level to X enables X and everything more severe. For example DEBUG shows ERROR + WARN + INFO + DEBUG, but not VERBOSE.

A note on VERBOSE

VERBOSE fires on hot paths (proximity messages run every ~1.5s per nearby player; fail-effect rolls run on every failed open). It will flood your .RPT on a populated server and is intended only for active debugging sessions. Leave production servers at INFO (or WARN/ERROR if you want it quieter).

Log code API (for modders)

Log_Error("...");    // ERROR — also ErrorEx() to the .RPT
Log_Warn("...");     // WARN
Log_Info("...");     // INFO
Log_Debug("...");    // DEBUG
Log_Verbose("...");  // VERBOSE

Each prefixes its output as [YALootBoxes][LEVEL] ... and self-gates on the configured level — no need to check the level at the call site.