/
Reset Broadcast toggle in the Chamber Settings GUI (slot 6, row 3). When disabled, the server-wide "chamber X has reset" message is suppressed for that chamber only. A new global.reset-complete-alert config option (default true) acts as a master override — setting it to false silences broadcasts for every chamber regardless of their individual setting, and the GUI toggle displays a gray "Disabled by global config" indicator instead of an on/off switch so admins immediately know why per-chamber control is unavailable.global.reset-complete-alert (default true) — master switch for the post-reset server broadcast. Set to false to suppress the message globally for all chambers.gui.chamber-settings: broadcast-reset-name, broadcast-reset-lore, broadcast-reset-overridden-lore.gui-broadcast-reset-enabled, gui-broadcast-reset-disabled, gui-broadcast-reset-failed, gui-broadcast-reset-global-override.Reset Broadcast toggle in the Chamber Settings GUI (slot 6, row 3). When disabled, the server-wide "chamber X has reset" message is suppressed for that chamber only. A new global.reset-complete-alert config option (default true) acts as a master override — setting it to false silences broadcasts for every chamber regardless of their individual setting, and the GUI toggle displays a gray "Disabled by global config" indicator instead of an on/off switch so admins immediately know why per-chamber control is unavailable.global.reset-complete-alert (default true) — master switch for the post-reset server broadcast. Set to false to suppress the message globally for all chambers.gui.chamber-settings: broadcast-reset-name, broadcast-reset-lore, broadcast-reset-overridden-lore.gui-broadcast-reset-enabled, gui-broadcast-reset-disabled, gui-broadcast-reset-failed, gui-broadcast-reset-global-override.player.teleport() on a Folia region thread throws UnsupportedOperationException: Must use teleportAsync while in region threading. ResetManager.teleportPlayersOut now uses teleportAsync() and chains the confirmation message + completion signal onto the returned CompletableFuture, so the reset sequence resumes only after every player has actually been moved.ChamberDetailView, and the "Teleport to Exit" button in ChamberSettingsView, were calling synchronous teleport() inside GUI click handlers (which run on the player's region thread on Folia). Switched to teleportAsync().SpectatorManager uses runAtEntity for all player operations — both entering spectator mode (teleport to chamber center) and exiting it (teleport to exit location) were still using synchronous teleport() inside those callbacks. Switched to teleportAsync(). On Paper these calls are equivalent; on Folia the async variant is required.player.teleport() on a Folia region thread throws UnsupportedOperationException: Must use teleportAsync while in region threading. ResetManager.teleportPlayersOut now uses teleportAsync() and chains the confirmation message + completion signal onto the returned CompletableFuture, so the reset sequence resumes only after every player has actually been moved.ChamberDetailView, and the "Teleport to Exit" button in ChamberSettingsView, were calling synchronous teleport() inside GUI click handlers (which run on the player's region thread on Folia). Switched to teleportAsync().SpectatorManager uses runAtEntity for all player operations — both entering spectator mode (teleport to chamber center) and exiting it (teleport to exit location) were still using synchronous teleport() inside those callbacks. Switched to teleportAsync(). On Paper these calls are equivalent; on Folia the async variant is required./tcp give and placed anywhere on the map was permanently stuck there with no way to retrieve it. New OrphanSpawnerMineListener intercepts the break for any TRIAL_SPAWNER block carrying a tcp:preset_id tag that is not inside a chamber: with a Silk Touch tool the block is removed and the full preset item (PDC tag intact, so it can be re-placed and re-identified) drops naturally; without Silk Touch the break is cancelled and the player receives a hint. If the source preset has since been removed from spawner_presets.yml, a plain trial_spawner item is dropped as a fallback so the block is never permanently unrecoverable. TCP-WildSpawners (when installed) is unaffected: it drives mining through BlockDamageEvent and removes the block directly, so BlockBreakEvent never fires for spawners it manages.orphan-spawner-needs-silk-touch — message sent when a player tries to break an orphaned preset spawner without Silk Touch.
Because Trial Chambers deserve better than being a "one and done" dungeon.