/
total_mobs config. Previous behavior fell back to a hard-coded 6 and only ratcheted upward as mobs visibly spawned — server-set values like total_mobs: 8 / total_mobs_added_per_player: 4 were invisible to the wave tracker, so the boss bar reported ?/6 regardless of what the spawner was configured to do. New SpawnerWaveManager.computeExpectedMobs(location, isOminous, playerCount) reads TrialSpawnerConfiguration.baseSpawnsBeforeCooldown + additionalSpawnsBeforeCooldown × players straight from the block state and uses that as the initial expected count; subsequent spawns re-ratchet against the same formula so the figure grows correctly as more players join the spawner's tracked-player set.EntityDeathEvent. Mobs removed by /kill, void death on some forks, despawn ticks, or other plugins (entity.remove()) used to stay in WaveState.trackedMobs forever; completion required trackedMobs.isEmpty(), so the bar would stick at e.g. 2/6 until server restart. New periodic sweeper (sweepWaves, runs every 100 ticks) per active wave: drops UUIDs whose world.getEntity(uuid) returns null/dead/invalid, force-completes if the spawner block has already entered trial_spawner_state=cooldown or ejecting_reward vanilla-side, and cancels cleanly if the block is gone. Each phase runs on the spawner's region thread for Folia safety.BlockBreakEvent handler in SpawnerWaveListener calls a new SpawnerWaveManager.cancelWaveAt(location) that tears down the boss bar, removes the wave entry, and purges the orphaned mob-UUID → spawner mappings. Without this the bar lingered indefinitely because its tracked mobs were typically still alive somewhere and never satisfied the normal completion condition.
Because Trial Chambers deserve better than being a "one and done" dungeon.