
TrialChamberPro
Because Trial Chambers deserve better than being a "one and done" dungeon.
2.3K
26
This plugin version is compatible with Minecraft 26.X.X
1.5.8 - 2026-06-14
Added
- Hologram vault feedback (
vaults.feedback.mode, defaultTEXT= unchanged). Switch toHOLOGRAMand the chat lines for every vault outcome are replaced by a floating green ✔ / red ✘ above the vault — shown only to the player who interacted, so looters get a clean, glanceable result instead of a column of[TCP]chat. Covers all outcomes: a tick on a successful open, a cross on every failure (no key, wrong key type, on cooldown/locked, can't afford a reopen). Each result is paired with a configurable sound (defaults to the pillager celebrate cheer for success and the pillager grumble for failure) and despawns after a configurable duration. Position, scale, see-through, the symbols themselves, and both sounds are all tunable undervaults.feedback.hologram/vaults.feedback.sounds. Particles and advancements are unaffected, so existing setups keep their sparkles either way.
- Hologram vault feedback (
1.5.8 - 2026-06-14
Added
- Hologram vault feedback (
vaults.feedback.mode, defaultTEXT= unchanged). Switch toHOLOGRAMand the chat lines for every vault outcome are replaced by a floating green ✔ / red ✘ above the vault — shown only to the player who interacted, so looters get a clean, glanceable result instead of a column of[TCP]chat. Covers all outcomes: a tick on a successful open, a cross on every failure (no key, wrong key type, on cooldown/locked, can't afford a reopen). Each result is paired with a configurable sound (defaults to the pillager celebrate cheer for success and the pillager grumble for failure) and despawns after a configurable duration. Position, scale, see-through, the symbols themselves, and both sounds are all tunable undervaults.feedback.hologram/vaults.feedback.sounds. Particles and advancements are unaffected, so existing setups keep their sparkles either way.
- Hologram vault feedback (
This plugin version is compatible with Minecraft 26.X.X
1.5.7 - 2026-06-10
Added
- Per-player chamber container loot (
chests.per-player-loot, opt-in). Lootr-style: every player who opens a chest, trapped chest, or barrel inside a registered chamber gets their own private copy of its contents — the second player into a chamber no longer finds gutted chests. The real container is never modified (it stays the pristine template each player's copy is cloned from on first open); copies persist in a newplayer_container_loottable, survive restarts, and reset with the chamber so every cycle is fresh loot for everyone. Double chests share one copy. Hopper automation in/out of chamber containers is blocked while enabled (it would drain or pollute the shared template). Containers placed by players inside chambers are tagged at place time and keep vanilla behaviour. Admins withtcp.admin.containers(default op) sneak-click to open the real container and edit the template — a normal click gives them their own copy like any player, so the feature can't be silently "broken for ops only". Together with per-player vaults, the entire chamber is now per-player. Decorated pots are deliberately excluded (their loot is break-based and already renews via chamber resets). - Wild vault placement blocked (
protection.block-wild-vault-placement, default on). Placing a functioning VAULT block outside a registered chamber is now cancelled with a friendly message — a wild vault is a permanent vanilla loot dispenser TCP can't manage (no per-player tracking, no resets, no loot tables). Players withtcp.bypass.vaultplace(default op) are exempt, so creative builds and crate setups are unaffected. - Key-to-reopen vaults (
vaults.reopen-cost-keys, default0= off). Players can open an already-used vault again by paying the configured number of matching trial keys in total (a fresh open costs 1, so1= reopen at the same price,2= one extra key). Keys are taken from the main hand; the cooldown/locked message is replaced by a price hint when the player can't afford it. Covers the key-gated-reopen model popularized by single-feature vault-reset plugins while keeping TCP's time/reset-based cooldowns as the default. - Vanilla / datapack loot-table passthrough in loot.yml. A pool entry of
type: VANILLA_TABLEwithtable: "namespace:path"(e.g.minecraft:chests/trial_chambers/rewardor any datapack key) populates the referenced server loot table when rolled and adds every generated stack to the drop. Resolved via the Bukkit LootTable API at roll time on the player's region thread; unknown keys log a warning and yield nothing without breaking the rest of the pool. Examples documented at the bottom ofloot.yml. - Clickable
/tcp list. Each chamber line is now interactive for players: click the chamber name to copy it to the clipboard (hover hint included), or click the new [menu] button to jump straight into that chamber's GUI detail view. Backed by a new/tcp menu <chamber>deep-link (tab-completed; sametcp.admin.menupermission). Console output keeps the plain localized format. - Anonymous usage metrics (bStats). Aggregate, non-personal charts that guide development: database backend, discovery enabled, glow mode, chamber-count bucket, and which premium modules are installed. Opt out via
metrics.enabled: falseor the global bStats config.
- Per-player chamber container loot (
1.5.7 - 2026-06-10
Added
- Per-player chamber container loot (
chests.per-player-loot, opt-in). Lootr-style: every player who opens a chest, trapped chest, or barrel inside a registered chamber gets their own private copy of its contents — the second player into a chamber no longer finds gutted chests. The real container is never modified (it stays the pristine template each player's copy is cloned from on first open); copies persist in a newplayer_container_loottable, survive restarts, and reset with the chamber so every cycle is fresh loot for everyone. Double chests share one copy. Hopper automation in/out of chamber containers is blocked while enabled (it would drain or pollute the shared template). Containers placed by players inside chambers are tagged at place time and keep vanilla behaviour. Admins withtcp.admin.containers(default op) sneak-click to open the real container and edit the template — a normal click gives them their own copy like any player, so the feature can't be silently "broken for ops only". Together with per-player vaults, the entire chamber is now per-player. Decorated pots are deliberately excluded (their loot is break-based and already renews via chamber resets). - Wild vault placement blocked (
protection.block-wild-vault-placement, default on). Placing a functioning VAULT block outside a registered chamber is now cancelled with a friendly message — a wild vault is a permanent vanilla loot dispenser TCP can't manage (no per-player tracking, no resets, no loot tables). Players withtcp.bypass.vaultplace(default op) are exempt, so creative builds and crate setups are unaffected. - Key-to-reopen vaults (
vaults.reopen-cost-keys, default0= off). Players can open an already-used vault again by paying the configured number of matching trial keys in total (a fresh open costs 1, so1= reopen at the same price,2= one extra key). Keys are taken from the main hand; the cooldown/locked message is replaced by a price hint when the player can't afford it. Covers the key-gated-reopen model popularized by single-feature vault-reset plugins while keeping TCP's time/reset-based cooldowns as the default. - Vanilla / datapack loot-table passthrough in loot.yml. A pool entry of
type: VANILLA_TABLEwithtable: "namespace:path"(e.g.minecraft:chests/trial_chambers/rewardor any datapack key) populates the referenced server loot table when rolled and adds every generated stack to the drop. Resolved via the Bukkit LootTable API at roll time on the player's region thread; unknown keys log a warning and yield nothing without breaking the rest of the pool. Examples documented at the bottom ofloot.yml. - Clickable
/tcp list. Each chamber line is now interactive for players: click the chamber name to copy it to the clipboard (hover hint included), or click the new [menu] button to jump straight into that chamber's GUI detail view. Backed by a new/tcp menu <chamber>deep-link (tab-completed; sametcp.admin.menupermission). Console output keeps the plain localized format. - Anonymous usage metrics (bStats). Aggregate, non-personal charts that guide development: database backend, discovery enabled, glow mode, chamber-count bucket, and which premium modules are installed. Opt out via
metrics.enabled: falseor the global bStats config.
- Per-player chamber container loot (
This plugin version is compatible with Minecraft 26.X.X
1.5.6 - 2026-06-10
Fixed
- CRITICAL: chamber reset could wipe terrain far beyond what the snapshot covers. When an auto-discovered chamber's bounds grew after its snapshot was captured (discovery region merges), the reset's clear-added-blocks pass cleared the entire current AABB while the snapshot could only restore the old, smaller region — deleting every block in the newly annexed volume (terrain, builds, neighbouring structures). The clear region is now clamped to the intersection of the chamber bounds and the snapshot's actual coverage, with a console warning pointing at
/tcp snapshot createwhen a mismatch is detected. A snapshot can no longer destroy ground it cannot put back.- If one of your chambers was already affected: run
/tcp delete <chamber>— this removes the broken registration and its stale snapshot in one step (discovery will cleanly re-register the chamber afterwards if enabled). Terrain that a pre-1.5.6 reset already deleted cannot be recovered by the plugin; restore that area from a world backup (or let it regenerate if it was untouched wilderness).
- If one of your chambers was already affected: run
- Discovery auto-snapshot never linked the snapshot in the database.
discovery.auto-snapshot: truecaptured the.datfile but skipped thesnapshot_fileDB update (the step/tcp generateperforms), so auto-discovered chambers reported "No snapshot found" at reset time and skipped restoration — or worse, kept a stale link. Both the registration and merge paths now link the file and log loudly if the DB write fails. - Stale snapshot after a discovery merge. Merging a newly discovered region into an existing chamber now re-captures the snapshot whenever the chamber already had one (previously only when
discovery.auto-snapshotwas on), because a pre-merge snapshot no longer covers the grown bounds and is dangerous to restore. If the re-capture fails, the console warns that the existing snapshot is stale. - Glow marker was killable, collidable, and farmable. The invisible glow Shulker had no invulnerability or collision flags: players could target it (health-indicator mods showed "Shulker 30❤" when looking at a glowing spawner), kill it (removing the glow mid-wave and rolling vanilla shulker loot — farmable shulker shells at every glowing spawner), and arrows aimed near the spawner collided with it. The marker is now
invulnerable+ non-collidableat both spawn sites (wave-attached and chamber-remaining standalone). - First wave completion in a large chamber could freeze the server.
ChamberClearedEvent's spawner census (and the chamber-remaining glow's location scan) iterated every block in the chamber AABB on the region thread — up to 1.5MgetBlockAtcalls plus sync chunk loads on a merged discovery chamber. Both now share a chunk tile-entity scan (Chunk#getTileEntities, the same patternChamberDiscoveryListeneruses): O(chunks × tile-entities) instead of O(volume). - Stale spawner counts made
ChamberClearedEventfire early or never. The per-chamber spawner count/location caches were only cleared at shutdown, but the spawner set changes on discovery merges (bounds grow),/tcp scan, and spawner block breaks. NewSpawnerWaveManager.invalidateChamberSpawnerCaches(chamberId)is now called fromChamberManager.updateBounds,scanChamber, and the spawnerBlockBreakEventhandler — premium-module tier-ups (TCP-MythicTrials) depend on this signal being correct. - Breaking a standalone-glowed spawner orphaned its glow. In
chamber-remainingmode, breaking a non-active glowing spawner left its glow entity floating until the next chamber reset (cancelWaveAtonly cleans the wave-attached glow). The block-break handler now also removes the standalone glow. - Pending spectator offers leaked when a dead player disconnected.
PlayerDeathListener.pendingOfferswas only cleared on respawn; a player who quit on the death screen and never rejoined left their entry (and itsLocation→ world reference) in memory permanently. Now also cleared onPlayerQuitEvent. tcp.admin.createwas never declared in plugin.yml. The permission gating/tcp deleteand/tcp setexitwas checked in code but missing from the permission tree — so it wasn't a child oftcp.admin.*, and staff granted the wildcard couldn't delete chambers or set exits (ops were unaffected). Now declared withdefault: opand included intcp.admin.*.
- CRITICAL: chamber reset could wipe terrain far beyond what the snapshot covers. When an auto-discovered chamber's bounds grew after its snapshot was captured (discovery region merges), the reset's clear-added-blocks pass cleared the entire current AABB while the snapshot could only restore the old, smaller region — deleting every block in the newly annexed volume (terrain, builds, neighbouring structures). The clear region is now clamped to the intersection of the chamber bounds and the snapshot's actual coverage, with a console warning pointing at
1.5.6 - 2026-06-10
Fixed
- CRITICAL: chamber reset could wipe terrain far beyond what the snapshot covers. When an auto-discovered chamber's bounds grew after its snapshot was captured (discovery region merges), the reset's clear-added-blocks pass cleared the entire current AABB while the snapshot could only restore the old, smaller region — deleting every block in the newly annexed volume (terrain, builds, neighbouring structures). The clear region is now clamped to the intersection of the chamber bounds and the snapshot's actual coverage, with a console warning pointing at
/tcp snapshot createwhen a mismatch is detected. A snapshot can no longer destroy ground it cannot put back.- If one of your chambers was already affected: run
/tcp delete <chamber>— this removes the broken registration and its stale snapshot in one step (discovery will cleanly re-register the chamber afterwards if enabled). Terrain that a pre-1.5.6 reset already deleted cannot be recovered by the plugin; restore that area from a world backup (or let it regenerate if it was untouched wilderness).
- If one of your chambers was already affected: run
- Discovery auto-snapshot never linked the snapshot in the database.
discovery.auto-snapshot: truecaptured the.datfile but skipped thesnapshot_fileDB update (the step/tcp generateperforms), so auto-discovered chambers reported "No snapshot found" at reset time and skipped restoration — or worse, kept a stale link. Both the registration and merge paths now link the file and log loudly if the DB write fails. - Stale snapshot after a discovery merge. Merging a newly discovered region into an existing chamber now re-captures the snapshot whenever the chamber already had one (previously only when
discovery.auto-snapshotwas on), because a pre-merge snapshot no longer covers the grown bounds and is dangerous to restore. If the re-capture fails, the console warns that the existing snapshot is stale. - Glow marker was killable, collidable, and farmable. The invisible glow Shulker had no invulnerability or collision flags: players could target it (health-indicator mods showed "Shulker 30❤" when looking at a glowing spawner), kill it (removing the glow mid-wave and rolling vanilla shulker loot — farmable shulker shells at every glowing spawner), and arrows aimed near the spawner collided with it. The marker is now
invulnerable+ non-collidableat both spawn sites (wave-attached and chamber-remaining standalone). - First wave completion in a large chamber could freeze the server.
ChamberClearedEvent's spawner census (and the chamber-remaining glow's location scan) iterated every block in the chamber AABB on the region thread — up to 1.5MgetBlockAtcalls plus sync chunk loads on a merged discovery chamber. Both now share a chunk tile-entity scan (Chunk#getTileEntities, the same patternChamberDiscoveryListeneruses): O(chunks × tile-entities) instead of O(volume). - Stale spawner counts made
ChamberClearedEventfire early or never. The per-chamber spawner count/location caches were only cleared at shutdown, but the spawner set changes on discovery merges (bounds grow),/tcp scan, and spawner block breaks. NewSpawnerWaveManager.invalidateChamberSpawnerCaches(chamberId)is now called fromChamberManager.updateBounds,scanChamber, and the spawnerBlockBreakEventhandler — premium-module tier-ups (TCP-MythicTrials) depend on this signal being correct. - Breaking a standalone-glowed spawner orphaned its glow. In
chamber-remainingmode, breaking a non-active glowing spawner left its glow entity floating until the next chamber reset (cancelWaveAtonly cleans the wave-attached glow). The block-break handler now also removes the standalone glow. - Pending spectator offers leaked when a dead player disconnected.
PlayerDeathListener.pendingOfferswas only cleared on respawn; a player who quit on the death screen and never rejoined left their entry (and itsLocation→ world reference) in memory permanently. Now also cleared onPlayerQuitEvent. tcp.admin.createwas never declared in plugin.yml. The permission gating/tcp deleteand/tcp setexitwas checked in code but missing from the permission tree — so it wasn't a child oftcp.admin.*, and staff granted the wildcard couldn't delete chambers or set exits (ops were unaffected). Now declared withdefault: opand included intcp.admin.*.
- CRITICAL: chamber reset could wipe terrain far beyond what the snapshot covers. When an auto-discovered chamber's bounds grew after its snapshot was captured (discovery region merges), the reset's clear-added-blocks pass cleared the entire current AABB while the snapshot could only restore the old, smaller region — deleting every block in the newly annexed volume (terrain, builds, neighbouring structures). The clear region is now clamped to the intersection of the chamber bounds and the snapshot's actual coverage, with a console warning pointing at
This plugin version is compatible with Minecraft 26.X.X
1.5.5 - 2026-06-09
Fixed
- Spawner glow outline rendered one block too high. The glow Shulker was spawned at the spawner block's centre (
+0.5on Y), but a Shulker's bounding box originates at its feet, so the 1×1×1 outline floated a full block above the spawner. It's now spawned with its feet on the block floor (+0.0Y) so the shell encloses the spawner block exactly. Applies to both the wave-active andchamber-remainingglow modes.
Changed
/tcp snapshot createand/tcp snapshot restorenow take the chamber name as an optional argument. Omit it while standing inside a chamber and the command targets that chamber — the same convenience/tcp snapshot updatealready had. On servers with many chambers, typing exact names for create/restore was impractical; you can now just stand in the chamber and run the bare command. Naming a chamber explicitly still works exactly as before.
- Spawner glow outline rendered one block too high. The glow Shulker was spawned at the spawner block's centre (
1.5.5 - 2026-06-09
Fixed
- Spawner glow outline rendered one block too high. The glow Shulker was spawned at the spawner block's centre (
+0.5on Y), but a Shulker's bounding box originates at its feet, so the 1×1×1 outline floated a full block above the spawner. It's now spawned with its feet on the block floor (+0.0Y) so the shell encloses the spawner block exactly. Applies to both the wave-active andchamber-remainingglow modes.
Changed
/tcp snapshot createand/tcp snapshot restorenow take the chamber name as an optional argument. Omit it while standing inside a chamber and the command targets that chamber — the same convenience/tcp snapshot updatealready had. On servers with many chambers, typing exact names for create/restore was impractical; you can now just stand in the chamber and run the bare command. Naming a chamber explicitly still works exactly as before.
- Spawner glow outline rendered one block too high. The glow Shulker was spawned at the spawner block's centre (
This plugin version is compatible with Minecraft 26.X.X
1.5.4 - 2026-06-09
Fixed
- Spawner glow outline never rendered (v1.2.27 regression). The opt-in
spawner-waves.glow-active-spawnersfeature spawned an Interaction entity at each active spawner and set itsisGlowingflag — but Interaction entities are explicitly immune to the Glowing effect (no renderable model for the outline pass), so the feature silently rendered nothing on every client since v1.2.27. Swap to an invisible Shulker: shell-cube hidden byINVISIBILITY, glow outline remains, perfect 1×1×1 cube marker through walls. Inert mob (no AI, silent, non-persistent), PDC-tagged so mob-cap / anti-cheat plugins can identify the overlay and skip it from monster counts.
Added
ChamberEnteredEvent/ChamberExitedEvent— public Bukkit events for "player crossed into/out of a registered chamber." Fired fromPlayerMovementListeneron the block-boundary-crossing transition, and fromPlayerQuitEventfor any player who disconnects while inside (keeping entry/exit pairs balanced for downstream listeners that allocate per-player state on entry). Both fire un-gated by thestatistics.*config flags — listeners that need chamber-presence signals shouldn't have their behaviour silently disabled by the admin's stats preferences. Direct chamber→chamber transitions fire an exit-then-entry pair (with entry/exit messages suppressed on the transition to avoid spam). Primary intended consumer: the TCP-MythicTrials HUD; useful for any plugin reacting to chamber presence (welcome messages, region effects, etc.).spawner-waves.glow-mode(defaultwave-active). Newchamber-remainingmode lights up every uncleared spawner in a chamber when any wave starts inside it, not just the wave-active one — solves "which spawner did I miss?" navigation on large chambers. Standalone glow entities are tracked per chamber, cleaned up on each spawner's wave completion and on chamber reset. Recommended for premium difficulty modules (TCP-MythicTrials's HUD pairs with this).
[1.5.3] - UNRELEASED
Fixed
- Update checker mis-parsed
-mc26release tags.fetchLatestVersion()only stripped a leadingv, so areleases/latesttag ofv1.5.2-mc26became1.5.2-mc26andisNewerVersion()parsed the third segment (2-mc26) as0— i.e.1.5.0— producing wrong update results whenever the most recently published release was an mc26 tag. It now also strips the track suffix (.substringBefore('-')) so bothvX.Y.ZandvX.Y.Z-mc26collapse to the sameX.Y.Zbefore comparison.
- Spawner glow outline never rendered (v1.2.27 regression). The opt-in
1.5.4 - 2026-06-09
Fixed
- Spawner glow outline never rendered (v1.2.27 regression). The opt-in
spawner-waves.glow-active-spawnersfeature spawned an Interaction entity at each active spawner and set itsisGlowingflag — but Interaction entities are explicitly immune to the Glowing effect (no renderable model for the outline pass), so the feature silently rendered nothing on every client since v1.2.27. Swap to an invisible Shulker: shell-cube hidden byINVISIBILITY, glow outline remains, perfect 1×1×1 cube marker through walls. Inert mob (no AI, silent, non-persistent), PDC-tagged so mob-cap / anti-cheat plugins can identify the overlay and skip it from monster counts.
Added
ChamberEnteredEvent/ChamberExitedEvent— public Bukkit events for "player crossed into/out of a registered chamber." Fired fromPlayerMovementListeneron the block-boundary-crossing transition, and fromPlayerQuitEventfor any player who disconnects while inside (keeping entry/exit pairs balanced for downstream listeners that allocate per-player state on entry). Both fire un-gated by thestatistics.*config flags — listeners that need chamber-presence signals shouldn't have their behaviour silently disabled by the admin's stats preferences. Direct chamber→chamber transitions fire an exit-then-entry pair (with entry/exit messages suppressed on the transition to avoid spam). Primary intended consumer: the TCP-MythicTrials HUD; useful for any plugin reacting to chamber presence (welcome messages, region effects, etc.).spawner-waves.glow-mode(defaultwave-active). Newchamber-remainingmode lights up every uncleared spawner in a chamber when any wave starts inside it, not just the wave-active one — solves "which spawner did I miss?" navigation on large chambers. Standalone glow entities are tracked per chamber, cleaned up on each spawner's wave completion and on chamber reset. Recommended for premium difficulty modules (TCP-MythicTrials's HUD pairs with this).
[1.5.3] - UNRELEASED
Fixed
- Update checker mis-parsed
-mc26release tags.fetchLatestVersion()only stripped a leadingv, so areleases/latesttag ofv1.5.2-mc26became1.5.2-mc26andisNewerVersion()parsed the third segment (2-mc26) as0— i.e.1.5.0— producing wrong update results whenever the most recently published release was an mc26 tag. It now also strips the track suffix (.substringBefore('-')) so bothvX.Y.ZandvX.Y.Z-mc26collapse to the sameX.Y.Zbefore comparison.
- Spawner glow outline never rendered (v1.2.27 regression). The opt-in
This plugin version is compatible with Minecraft 26.X.X
1.5.2 - 2026-05-27
Added
- In-game update notification with clickable Modrinth download link.
UpdateCheckeris now also aListener. When the periodic GitHub check detects a newer release, any admin (tcp.admin) who logs in afterwards (and any already-online admins) gets a short MiniMessage line:You are using version X.Y.Z, latest version is A.B.C.followed by a clickable[Download Latest Version]pointing at the Modrinth versions page (hover tooltip explains it opens in a browser). One-shot per check; no in-game spam beyond the join ping.
Fixed
/tcp resetsilently failing with "check console" but nothing in the console. When a previous reset for the same chamber was still ininProgress(mid-restore, or stuck), the duplicate request returned false after only alogger.fineline, which Bukkit suppresses by default — so admins saw the failure chat message with no visible explanation. The log line is now awarningand tells you exactly what happened plus the restart-to-clear hint./tcp snapshot createreporting success when the chamber row wasn't actually updated.captureSnapshotwrote the.datfile then calledsetSnapshotFile()without checking the return value; a failed DB update left the chamber'ssnapshot_filecolumn NULL, so the next reset logged "No snapshot found" and skipped restoration even though the file was on disk. BothcreateSnapshotandsetSnapshotFileare now wrapped — exceptions are logged with stack traces, and a failed DB link produces a clearsnapshot-failedchat message instead of the misleading "created" line.- Tab completion missing for
/tcp loot audit. The 1.5.1 audit subcommand worked but wasn't suggested by tab-complete; added tolootActions.
- In-game update notification with clickable Modrinth download link.
1.5.2 - 2026-05-27
Added
- In-game update notification with clickable Modrinth download link.
UpdateCheckeris now also aListener. When the periodic GitHub check detects a newer release, any admin (tcp.admin) who logs in afterwards (and any already-online admins) gets a short MiniMessage line:You are using version X.Y.Z, latest version is A.B.C.followed by a clickable[Download Latest Version]pointing at the Modrinth versions page (hover tooltip explains it opens in a browser). One-shot per check; no in-game spam beyond the join ping.
Fixed
/tcp resetsilently failing with "check console" but nothing in the console. When a previous reset for the same chamber was still ininProgress(mid-restore, or stuck), the duplicate request returned false after only alogger.fineline, which Bukkit suppresses by default — so admins saw the failure chat message with no visible explanation. The log line is now awarningand tells you exactly what happened plus the restart-to-clear hint./tcp snapshot createreporting success when the chamber row wasn't actually updated.captureSnapshotwrote the.datfile then calledsetSnapshotFile()without checking the return value; a failed DB update left the chamber'ssnapshot_filecolumn NULL, so the next reset logged "No snapshot found" and skipped restoration even though the file was on disk. BothcreateSnapshotandsetSnapshotFileare now wrapped — exceptions are logged with stack traces, and a failed DB link produces a clearsnapshot-failedchat message instead of the misleading "created" line.- Tab completion missing for
/tcp loot audit. The 1.5.1 audit subcommand worked but wasn't suggested by tab-complete; added tolootActions.
- In-game update notification with clickable Modrinth download link.
This plugin version is compatible with Minecraft 26.X.X
1.5.1 - 2026-05-27
Added
- Per-chamber spawner cooldown can now match the chamber's reset interval. New cycle option in
ChamberSettingsView's spawner-cooldown toggle: Match Chamber Reset. At reset time, each trial spawner in the chamber is stamped withcooldownLength = chamber.resetInterval, so the spawner naturally rearms right as the chamber resets. Stored as the sentinel value-2onchambers.spawner_cooldown_minutes; existing per-chamber values, thenull = global configdefault, and the-1 = vanilla 30m/0 = immediatemodes are unchanged. - Legacy loot audit (
/tcp loot audit+ startup warning + GUI badge). Pre-1.5.0 loot entries were stored as material + amount only — so an "enchanted book" row added before the v1.5.0 faithful-loot fix still drops as a plain book (no migration is possible because the enchant data was never persisted). Three new touchpoints surface this without reading the user's mind: (a) at startup, a single warning line counts entries whose structured fields can't produce the intended item (enchanted book without enchants, potion/tipped arrow without potion type, goat horn without instrument) and points at the audit command; (b)/tcp loot auditlists them grouped bytable / poolwith the row kind/index/material/reason, capped at 50 rows; (c)LootEditorViewdecorates each legacy row with a⚠ Legacy entry — re-add to capture NBTlore line so it's obvious which to re-enter. Plain10 cobblestone-style entries are deliberately not flagged. - Snapshot reminder for snapshotless discovered chambers. Auto-discovered chambers can sit in the DB without a snapshot, in which case they silently can't be reset. New
SnapshotReminderServicepings admins withtcp.admin.snapshot(a) once on login if any chamber lacks a snapshot, and (b) periodically as a coalesced console + admin-chat summary. Configurable underdiscovery.snapshot-reminder.*(enabled,on-join,interval-minutes). Defaults: on, 30 min interval.
Changed
- Pending-reset console output coalesced. With
global.reset-require-confirmationenabled, the per-chamberis due for reset — awaiting confirmationlog line is replaced by a single per-tick summary (N chamber(s) due for reset — M total awaiting confirmation. Use /tcp reset pending to list, /tcp reset confirm all to release.). The in-game clickable[confirm] [list all]ping for admins is unchanged. - Default vault cooldowns are now
0instead of-1.vaults.normal-cooldown-hoursandvaults.ominous-cooldown-hoursship at0(vanilla behaviour — locked until chamber reset). The old-1default was being clamped to0by the config validator and producing a startup warning on every fresh install; the value and the comment now reflect what actually happens.
- Per-chamber spawner cooldown can now match the chamber's reset interval. New cycle option in
1.5.1 - 2026-05-27
Added
- Per-chamber spawner cooldown can now match the chamber's reset interval. New cycle option in
ChamberSettingsView's spawner-cooldown toggle: Match Chamber Reset. At reset time, each trial spawner in the chamber is stamped withcooldownLength = chamber.resetInterval, so the spawner naturally rearms right as the chamber resets. Stored as the sentinel value-2onchambers.spawner_cooldown_minutes; existing per-chamber values, thenull = global configdefault, and the-1 = vanilla 30m/0 = immediatemodes are unchanged. - Legacy loot audit (
/tcp loot audit+ startup warning + GUI badge). Pre-1.5.0 loot entries were stored as material + amount only — so an "enchanted book" row added before the v1.5.0 faithful-loot fix still drops as a plain book (no migration is possible because the enchant data was never persisted). Three new touchpoints surface this without reading the user's mind: (a) at startup, a single warning line counts entries whose structured fields can't produce the intended item (enchanted book without enchants, potion/tipped arrow without potion type, goat horn without instrument) and points at the audit command; (b)/tcp loot auditlists them grouped bytable / poolwith the row kind/index/material/reason, capped at 50 rows; (c)LootEditorViewdecorates each legacy row with a⚠ Legacy entry — re-add to capture NBTlore line so it's obvious which to re-enter. Plain10 cobblestone-style entries are deliberately not flagged. - Snapshot reminder for snapshotless discovered chambers. Auto-discovered chambers can sit in the DB without a snapshot, in which case they silently can't be reset. New
SnapshotReminderServicepings admins withtcp.admin.snapshot(a) once on login if any chamber lacks a snapshot, and (b) periodically as a coalesced console + admin-chat summary. Configurable underdiscovery.snapshot-reminder.*(enabled,on-join,interval-minutes). Defaults: on, 30 min interval.
Changed
- Pending-reset console output coalesced. With
global.reset-require-confirmationenabled, the per-chamberis due for reset — awaiting confirmationlog line is replaced by a single per-tick summary (N chamber(s) due for reset — M total awaiting confirmation. Use /tcp reset pending to list, /tcp reset confirm all to release.). The in-game clickable[confirm] [list all]ping for admins is unchanged. - Default vault cooldowns are now
0instead of-1.vaults.normal-cooldown-hoursandvaults.ominous-cooldown-hoursship at0(vanilla behaviour — locked until chamber reset). The old-1default was being clamped to0by the config validator and producing a startup warning on every fresh install; the value and the comment now reflect what actually happens.
- Per-chamber spawner cooldown can now match the chamber's reset interval. New cycle option in
This plugin version is compatible with Minecraft 26.X.X
1.5.0 - 2026-05-26
Added
- Faithful loot items + bulk drag-in editor. Items added to a loot table are now stored as a serialized
ItemStack, so enchantments, potion data, custom names/lore, custom-model-data and any NBT (incl. third-party enchant tags) are preserved exactly — previously only the material+amount were kept, turning an enchanted book into a plain book and a potion into a water bottle. The loot editor's "Add" captures the whole held item, entries can be removed with Q / drop key, and a new Bulk add button opens a chest you can drag/shift-click any number of items into at once (captured faithfully and handed back on close). /tcp listpagination + locator. Lists 10 chambers per page with clickable Prev/Next instead of spamming 100+ lines, and/tcp list currentreports the chamber you're standing in (or the nearest, with coords and a[/tp]suggestion)./tcp snapshot update [chamber]— re-captures a registered chamber's snapshot, overwriting the old one, so edits made after the chamber was first registered/snapshotted become the new reset baseline. With no name it targets the chamber you're standing in; with a name it behaves likecreate.- Optional FastAsyncWorldEdit for resets (
global.use-fawe, default off, Paper-only). Scheduled resets place blocks through one FAWE EditSession to smooth out the lag of large restores; manual resets keep the batched path so WorldEdit//undostill works; falls back automatically. - Operator-confirmation reset queue (
global.reset-require-confirmation, default off). Due chambers are parked and online admins notified;/tcp reset pendinglists them and/tcp reset confirm <chamber|all>fires them through the stagger. - Reset throttle (
global.max-concurrent-resets,global.reset-stagger-seconds) so a wave of due chambers can't all restore at once and crater TPS. global.suppress-trial-spawner-spam(default true) mutes the vanillaTrial Spawner ... has no detected playersconsole line.ChamberClearedEvent— public Bukkit event for "chamber cleared in one run." Fires exactly once when every trial spawner inside a registered chamber has completed a wave within the same reset cycle. Carries the clearedChamber, the cumulativeSet<UUID>of participants across every wave in the cycle, and the wall-clockdurationMsfrom first-wave-start to last-wave-complete. Tracking is per-chamber, reset on everyChamberResetEvent. Wild spawners do not contribute.- Network-sync foundation (developer API). Groundwork for a future cross-server module:
ChamberManager,StatisticsManagerandVaultManagerare now registered with Bukkit'sServicesManager(alongsideDatabaseManager); cache-invalidation hooks added (StatisticsManager.invalidatePlayer(uuid),ChamberManager.reloadFromStore(name)/invalidateChamber(name)); newStatisticsUpdatedEventfires after every stat persist. All additive — no behaviour change for single-server installs. - Procedural dungeon generation primitives (
/tcp dungeon,dungeon.yml). Modular rooms captured via WorldEdit selections +minecraft:jigsawconnectors are stitched into a dungeon and registered as a normal chamber. Built primarily as the room-assembly substrate for the upcoming Mythic Trials module; usable standalone too but not the headline feature of this release.
Changed
- GUI framework rewrite: InventoryFramework → in-house VcGui. All 14 admin GUI views moved off the third-party InventoryFramework library onto a framework adapted from
tcp-vault-crates. Behaviour is preserved view-for-view; the wins are an event-handling overhaul (cross-inventory dup-exploits cancelled centrally, safe bottom-inventory actions pass through so cursor/pickup work normally while a GUI is open) and a cleaner deposit-style chest pattern. The IF dependency is dropped from the shaded JAR. SpawnerWaveManagergained per-chamber wave-completion bookkeeping to supportChamberClearedEvent. Three new in-memory maps plus a lazy spawner-count cache (computed once per chamber via a one-time block-scan of the chamber bounds, then O(1)). All maps clear on chamber reset.
Fixed
- Vaults dispensing vanilla loot instead of the configured table. The chamber cache was an LRU capped at 100; on servers with ≥100 chambers, vault interactions in evicted ("old") chambers resolved to no chamber and silently fell through to vanilla trial loot — and ignored updated loot tables. The cache now keeps all registered chambers (no size eviction), which also repairs spawner-wave tracking and tier scaling that relied on the same lookup.
- Bulk-add deposit crash. Closing the bulk-add chest could trigger an infinite
InventoryCloseEvent→ reopen → close cascade that overflowed the JVM stack and killed the server. The editor reopen now defers one tick out of the close-event chain. - Chamber reset now removes blocks players ADDED into formerly-empty cells (lava, cobble, etc.). Snapshots skip air on capture to save space, so restoration only re-applied captured (non-air) blocks and never reverted anything placed into a cell that was air at capture time. Reset now walks the chamber volume before restore and clears player-added blocks. Gated by
reset.clear-added-blocks(defaulttrue); disable to let players build inside chambers. - Automatic resets failing with
StandaloneCoroutine was cancelled+ endless trial-spawner error spam. A scheduled reset stored its own job and then cancelled it mid-run, leaving chambers half-reset (spawners stuck logging every tick). Scheduled jobs now de-register before running so a reset can't cancel itself; cancellation is no longer mis-logged as a failure. - All due chambers resetting simultaneously and dropping TPS to ~4. Resets now run through a concurrency limit + stagger (see new config above).
- Players teleported into walls (suffocating) on reset. The "safe location" scan ran down the chamber's own centre column and didn't verify the destination was open; it now scans columns outside the chamber and requires solid ground with two passable, non-hazard cells above.
- Loot items losing their enchantments/potions when added through the editor (see Added → faithful loot items).
- Pause-chamber tooltip rendered raw
&codes and squashed its multi-line lore into a bracketed single line. Tooltip now reads cleanly with paragraph breaks and full colour styling. - Spawner-wave proximity check no longer scans 33,500 blocks per player move.
SpawnerWaveListener.onPlayerMovepreviously walked an O(r³) cube around every moving player callingworld.getBlockAt().type(~1 ms/call in Spark profiles, compounding across players). Replaced with a per-world spatial index (TrialSpawnerIndex) populated by chunk-load tile-entity scans + block break/place tracking; the proximity query is now O(spawners-near-player) — typically zero or one chunk's worth of positions, sub-microsecond on the hot path. - Spawner-wave boss bar stayed attached after a non-walking chamber exit. The cleanup that drops far-away boss bars was wired only to
PlayerMoveEvent, which doesn't fire for teleports, respawns, or world changes. A player who died inside a chamber and respawned at spawn (or/spawn'd //home'd out, or got teleported by another plugin) kept the boss bar attached until the wave completed naturally or they logged out. Now also runs onPlayerTeleportEvent,PlayerRespawnEvent, andPlayerChangedWorldEvent(one tick later, soplayer.locationreflects the destination). Bug existed since v1.2.26 when the proximity-cleanup logic was introduced.
Config additions
reset.clear-added-blocks(defaulttrue) — whether chamber reset also clears player-added blocks that fall outside the snapshot (see Fixed above).global.use-fawe(defaultfalse) — route scheduled chamber resets through FastAsyncWorldEdit when available.global.reset-require-confirmation(defaultfalse) — park due chambers in a queue and require an operator to release them via/tcp reset confirm.global.max-concurrent-resets/global.reset-stagger-seconds— concurrency throttle so a batch of simultaneously-due chambers don't all reset at the same instant.global.suppress-trial-spawner-spam(defaulttrue) — mute the vanillaTrial Spawner ... has no detected playersconsole line.
- Faithful loot items + bulk drag-in editor. Items added to a loot table are now stored as a serialized
1.5.0 - 2026-05-26
Added
- Faithful loot items + bulk drag-in editor. Items added to a loot table are now stored as a serialized
ItemStack, so enchantments, potion data, custom names/lore, custom-model-data and any NBT (incl. third-party enchant tags) are preserved exactly — previously only the material+amount were kept, turning an enchanted book into a plain book and a potion into a water bottle. The loot editor's "Add" captures the whole held item, entries can be removed with Q / drop key, and a new Bulk add button opens a chest you can drag/shift-click any number of items into at once (captured faithfully and handed back on close). /tcp listpagination + locator. Lists 10 chambers per page with clickable Prev/Next instead of spamming 100+ lines, and/tcp list currentreports the chamber you're standing in (or the nearest, with coords and a[/tp]suggestion)./tcp snapshot update [chamber]— re-captures a registered chamber's snapshot, overwriting the old one, so edits made after the chamber was first registered/snapshotted become the new reset baseline. With no name it targets the chamber you're standing in; with a name it behaves likecreate.- Optional FastAsyncWorldEdit for resets (
global.use-fawe, default off, Paper-only). Scheduled resets place blocks through one FAWE EditSession to smooth out the lag of large restores; manual resets keep the batched path so WorldEdit//undostill works; falls back automatically. - Operator-confirmation reset queue (
global.reset-require-confirmation, default off). Due chambers are parked and online admins notified;/tcp reset pendinglists them and/tcp reset confirm <chamber|all>fires them through the stagger. - Reset throttle (
global.max-concurrent-resets,global.reset-stagger-seconds) so a wave of due chambers can't all restore at once and crater TPS. global.suppress-trial-spawner-spam(default true) mutes the vanillaTrial Spawner ... has no detected playersconsole line.ChamberClearedEvent— public Bukkit event for "chamber cleared in one run." Fires exactly once when every trial spawner inside a registered chamber has completed a wave within the same reset cycle. Carries the clearedChamber, the cumulativeSet<UUID>of participants across every wave in the cycle, and the wall-clockdurationMsfrom first-wave-start to last-wave-complete. Tracking is per-chamber, reset on everyChamberResetEvent. Wild spawners do not contribute.- Network-sync foundation (developer API). Groundwork for a future cross-server module:
ChamberManager,StatisticsManagerandVaultManagerare now registered with Bukkit'sServicesManager(alongsideDatabaseManager); cache-invalidation hooks added (StatisticsManager.invalidatePlayer(uuid),ChamberManager.reloadFromStore(name)/invalidateChamber(name)); newStatisticsUpdatedEventfires after every stat persist. All additive — no behaviour change for single-server installs. - Procedural dungeon generation primitives (
/tcp dungeon,dungeon.yml). Modular rooms captured via WorldEdit selections +minecraft:jigsawconnectors are stitched into a dungeon and registered as a normal chamber. Built primarily as the room-assembly substrate for the upcoming Mythic Trials module; usable standalone too but not the headline feature of this release.
Changed
- GUI framework rewrite: InventoryFramework → in-house VcGui. All 14 admin GUI views moved off the third-party InventoryFramework library onto a framework adapted from
tcp-vault-crates. Behaviour is preserved view-for-view; the wins are an event-handling overhaul (cross-inventory dup-exploits cancelled centrally, safe bottom-inventory actions pass through so cursor/pickup work normally while a GUI is open) and a cleaner deposit-style chest pattern. The IF dependency is dropped from the shaded JAR. SpawnerWaveManagergained per-chamber wave-completion bookkeeping to supportChamberClearedEvent. Three new in-memory maps plus a lazy spawner-count cache (computed once per chamber via a one-time block-scan of the chamber bounds, then O(1)). All maps clear on chamber reset.
Fixed
- Vaults dispensing vanilla loot instead of the configured table. The chamber cache was an LRU capped at 100; on servers with ≥100 chambers, vault interactions in evicted ("old") chambers resolved to no chamber and silently fell through to vanilla trial loot — and ignored updated loot tables. The cache now keeps all registered chambers (no size eviction), which also repairs spawner-wave tracking and tier scaling that relied on the same lookup.
- Bulk-add deposit crash. Closing the bulk-add chest could trigger an infinite
InventoryCloseEvent→ reopen → close cascade that overflowed the JVM stack and killed the server. The editor reopen now defers one tick out of the close-event chain. - Chamber reset now removes blocks players ADDED into formerly-empty cells (lava, cobble, etc.). Snapshots skip air on capture to save space, so restoration only re-applied captured (non-air) blocks and never reverted anything placed into a cell that was air at capture time. Reset now walks the chamber volume before restore and clears player-added blocks. Gated by
reset.clear-added-blocks(defaulttrue); disable to let players build inside chambers. - Automatic resets failing with
StandaloneCoroutine was cancelled+ endless trial-spawner error spam. A scheduled reset stored its own job and then cancelled it mid-run, leaving chambers half-reset (spawners stuck logging every tick). Scheduled jobs now de-register before running so a reset can't cancel itself; cancellation is no longer mis-logged as a failure. - All due chambers resetting simultaneously and dropping TPS to ~4. Resets now run through a concurrency limit + stagger (see new config above).
- Players teleported into walls (suffocating) on reset. The "safe location" scan ran down the chamber's own centre column and didn't verify the destination was open; it now scans columns outside the chamber and requires solid ground with two passable, non-hazard cells above.
- Loot items losing their enchantments/potions when added through the editor (see Added → faithful loot items).
- Pause-chamber tooltip rendered raw
&codes and squashed its multi-line lore into a bracketed single line. Tooltip now reads cleanly with paragraph breaks and full colour styling. - Spawner-wave proximity check no longer scans 33,500 blocks per player move.
SpawnerWaveListener.onPlayerMovepreviously walked an O(r³) cube around every moving player callingworld.getBlockAt().type(~1 ms/call in Spark profiles, compounding across players). Replaced with a per-world spatial index (TrialSpawnerIndex) populated by chunk-load tile-entity scans + block break/place tracking; the proximity query is now O(spawners-near-player) — typically zero or one chunk's worth of positions, sub-microsecond on the hot path. - Spawner-wave boss bar stayed attached after a non-walking chamber exit. The cleanup that drops far-away boss bars was wired only to
PlayerMoveEvent, which doesn't fire for teleports, respawns, or world changes. A player who died inside a chamber and respawned at spawn (or/spawn'd //home'd out, or got teleported by another plugin) kept the boss bar attached until the wave completed naturally or they logged out. Now also runs onPlayerTeleportEvent,PlayerRespawnEvent, andPlayerChangedWorldEvent(one tick later, soplayer.locationreflects the destination). Bug existed since v1.2.26 when the proximity-cleanup logic was introduced.
Config additions
reset.clear-added-blocks(defaulttrue) — whether chamber reset also clears player-added blocks that fall outside the snapshot (see Fixed above).global.use-fawe(defaultfalse) — route scheduled chamber resets through FastAsyncWorldEdit when available.global.reset-require-confirmation(defaultfalse) — park due chambers in a queue and require an operator to release them via/tcp reset confirm.global.max-concurrent-resets/global.reset-stagger-seconds— concurrency throttle so a batch of simultaneously-due chambers don't all reset at the same instant.global.suppress-trial-spawner-spam(defaulttrue) — mute the vanillaTrial Spawner ... has no detected playersconsole line.
- Faithful loot items + bulk drag-in editor. Items added to a loot table are now stored as a serialized
This plugin version is compatible with Minecraft 26.X.X
1.4.7 - 2026-05-19
Added
- Per-chamber reset broadcast toggle. Each chamber now has a
Reset Broadcasttoggle 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 newglobal.reset-complete-alertconfig option (defaulttrue) acts as a master override — setting it tofalsesilences 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.
Config additions
global.reset-complete-alert(defaulttrue) — master switch for the post-reset server broadcast. Set tofalseto suppress the message globally for all chambers.
Localization
- New GUI keys under
gui.chamber-settings:broadcast-reset-name,broadcast-reset-lore,broadcast-reset-overridden-lore. - New flat keys:
gui-broadcast-reset-enabled,gui-broadcast-reset-disabled,gui-broadcast-reset-failed,gui-broadcast-reset-global-override.
- Per-chamber reset broadcast toggle. Each chamber now has a
1.4.7 - 2026-05-19
Added
- Per-chamber reset broadcast toggle. Each chamber now has a
Reset Broadcasttoggle 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 newglobal.reset-complete-alertconfig option (defaulttrue) acts as a master override — setting it tofalsesilences 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.
Config additions
global.reset-complete-alert(defaulttrue) — master switch for the post-reset server broadcast. Set tofalseto suppress the message globally for all chambers.
Localization
- New GUI keys under
gui.chamber-settings:broadcast-reset-name,broadcast-reset-lore,broadcast-reset-overridden-lore. - New flat keys:
gui-broadcast-reset-enabled,gui-broadcast-reset-disabled,gui-broadcast-reset-failed,gui-broadcast-reset-global-override.
- Per-chamber reset broadcast toggle. Each chamber now has a
This plugin version is compatible with Minecraft 26.X.X
1.4.6 - 2026-05-14
Fixed
- Folia/Luminol: chamber reset no longer crashes when teleporting players out. Calling
player.teleport()on a Folia region thread throwsUnsupportedOperationException: Must use teleportAsync while in region threading.ResetManager.teleportPlayersOutnow usesteleportAsync()and chains the confirmation message + completion signal onto the returnedCompletableFuture, so the reset sequence resumes only after every player has actually been moved. - Folia/Luminol: GUI teleport buttons no longer crash. The "Teleport to Exit" and "Teleport to Center" buttons in
ChamberDetailView, and the "Teleport to Exit" button inChamberSettingsView, were calling synchronousteleport()inside GUI click handlers (which run on the player's region thread on Folia). Switched toteleportAsync(). - Folia/Luminol: spectator mode teleports no longer crash.
SpectatorManagerusesrunAtEntityfor all player operations — both entering spectator mode (teleport to chamber center) and exiting it (teleport to exit location) were still using synchronousteleport()inside those callbacks. Switched toteleportAsync(). On Paper these calls are equivalent; on Folia the async variant is required.
- Folia/Luminol: chamber reset no longer crashes when teleporting players out. Calling
1.4.6 - 2026-05-14
Fixed
- Folia/Luminol: chamber reset no longer crashes when teleporting players out. Calling
player.teleport()on a Folia region thread throwsUnsupportedOperationException: Must use teleportAsync while in region threading.ResetManager.teleportPlayersOutnow usesteleportAsync()and chains the confirmation message + completion signal onto the returnedCompletableFuture, so the reset sequence resumes only after every player has actually been moved. - Folia/Luminol: GUI teleport buttons no longer crash. The "Teleport to Exit" and "Teleport to Center" buttons in
ChamberDetailView, and the "Teleport to Exit" button inChamberSettingsView, were calling synchronousteleport()inside GUI click handlers (which run on the player's region thread on Folia). Switched toteleportAsync(). - Folia/Luminol: spectator mode teleports no longer crash.
SpectatorManagerusesrunAtEntityfor all player operations — both entering spectator mode (teleport to chamber center) and exiting it (teleport to exit location) were still using synchronousteleport()inside those callbacks. Switched toteleportAsync(). On Paper these calls are equivalent; on Folia the async variant is required.
- Folia/Luminol: chamber reset no longer crashes when teleporting players out. Calling
1
...Авторы
Сведения
Лицензия:
Опубликован:7 месяцев назад
Обновлён:2 часа назад
ID проекта:

