feat: add envoy/supply drop configs (#102)
* chore: bump eco to 2026.31
* feat: add shared weighted picker and decouple Reward.giveTo from Crate
Extracts the weighted-random reward roll into a reusable helper and lets
Reward.giveTo be called without a Crate, so envoys can give rewards too.
* feat: add envoy schedule parsing
* feat: add envoy spawn location resolution
* feat: add envoy firework spawning
* Revert "chore: bump eco to 2026.31"
This reverts commit a40f3019f26ee7bb7d32beaec5c0c481f4028ad0.
* feat: add envoy config model and registry
Loads envoys/*.yml into EnvoyCategory/EnvoyRarity objects via a new
Envoys RegistrableCategory. Nothing spawns yet - config only.
* feat: add saved envoy spawn points
Adds envoypoints.yml storage for points-mode envoy categories, kept
separate from category configs so /ecocrates reload can't wipe them.
* feat: add SpawnedEnvoy for live envoy crates in the world
* feat: add envoy session lifecycle, persistence and ticker
EnvoySessions is the single source of truth for whether an envoy is
running; EnvoySessionStore mirrors it to disk so a reload or restart
mid-session doesn't leave orphaned blocks in the world.
* feat: add envoy crate collection
Right-clicking a spawned envoy gives one weighted reward, fires the
rarity's open-effects and EnvoyOpenEvent, then despawns the crate.
* feat: add envoy start flare
Per-category craftable item that starts that category's session on
right-click. Flare and an optional Prices cost are cumulative, not
alternatives - the item is always consumed on success.
* feat: add envoy commands, permissions and auto-start scheduler
Adds /ecocrates envoy set|unset|locate|start|end, mirrored on a
top-level /ecoenvoy, and hooks EnvoyScheduler into the ticker so
scheduled auto-starts finally work.
* feat: add envoy libreforge integrations and placeholders
Adds start_envoy/end_envoy effects, envoy_started condition,
open_envoy trigger, envoy_type filter, and the full PlaceholderAPI set.
* feat: add envoy compass item and activation state
Consumable per-category item that marks nearby envoy crates via eco's
waypoint API. No rendering yet - item, config, and state only.
* feat: add envoy compass waypoint rendering
Diffs each active compass's nearest-N tracked crates against what is
currently shown, so unchanged waypoints are never re-sent.
* feat: add envoy flares and compasses to give/giveall/giveoffline/take
The type token (flare/compass vs anything else) decides whether the ID
argument resolves as an envoy category or a crate, so the two ID
namespaces can safely overlap. Envoy items are physical-only, so
offline players receive them via the existing pending-delivery queue.
* feat: add per-category envoy bossbar
Shown to all online players for the duration of a session, styled
and configured like Boosters' own bossbar feature. Only one bar is
ever tracked, since only one envoy session runs at a time.
* docs: document the envoy system
Covers category config, rarities, flares, compasses, bossbars,
commands, permissions, placeholders, and the libreforge API surface.
* fix: gate compass activation on the same range check the renderer uses
* fix: give the final crate's own reward before firing session end-effects
* fix: avoid O(n^2) per-tick work in the envoy bossbar renderer
* feat: add envoy_reward filter
Mirrors crate_reward for the envoy path - crate_reward never applies
to EnvoyOpenEvent, so envoys previously had no way to filter by
specific won reward ID, only by rarity (envoy_type).
* fix: time to start placeholder format
* feat: simplify envoy fireworks and add per-rarity spawn sound
Fireworks are now always a single BALL effect, dropping the
configurable amount/type. Each rarity can also define a spawn-sound
using eco's PlayableSound, played at the crate's location on spawn.
* fix: address PR review feedback on envoys
Restore customisable firework amount/type, reverted in error by the
prior simplify commit. Rewrite SpawnLocator's shell scan to generate
only surface offsets directly instead of filtering a full cube, cutting
per-shell cost from O(radius^3) to O(radius^2).
* chore: improve code documentation
* chore: bump eco to 2026.32