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>
93 lines
4.1 KiB
Markdown
93 lines
4.1 KiB
Markdown
# 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`:
|
||
|
||
```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)
|
||
|
||
```c
|
||
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.
|