Better Trial ChambersСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачать
ВЕРСИИ (177)
release
Better Trial Chambers 2.3.1-mc263
2.3.1-mc26314 окт. 2026 г.170Minecraft: 26.3folia, paper, purpur
Что нового
## [2.3.1] - 2026-10-14
### Fixed
- **Wild Spawners can be picked up again without losing their type.** With Wild Spawners installed, mining one of its spawners outside a chamber dropped a plain, empty trial spawner instead, or asked for Silk Touch. Better Trial Chambers now leaves Wild Spawners' own spawners to Wild Spawners.
release
Better Trial Chambers 2.3.1-mc26
2.3.1-mc2614 окт. 2026 г.96Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.3.1] - 2026-10-14
### Fixed
- **Wild Spawners can be picked up again without losing their type.** With Wild Spawners installed, mining one of its spawners outside a chamber dropped a plain, empty trial spawner instead, or asked for Silk Touch. Better Trial Chambers now leaves Wild Spawners' own spawners to Wild Spawners.
release
Better Trial Chambers 2.3.1
2.3.114 окт. 2026 г.80Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.3.1] - 2026-10-14
### Fixed
- **Wild Spawners can be picked up again without losing their type.** With Wild Spawners installed, mining one of its spawners outside a chamber dropped a plain, empty trial spawner instead, or asked for Silk Touch. Better Trial Chambers now leaves Wild Spawners' own spawners to Wild Spawners.
release
Better Trial Chambers 2.3.0-mc263
2.3.0-mc2637 окт. 2026 г.88Minecraft: 26.3folia, paper, purpur
Что нового
## [2.3.0] - 2026-10-07
### Added
- **Chambers can wait to be looted before they reset.** Turn on `reset-after-first-loot` and a chamber's reset clock only starts when someone first opens a vault or a chest inside it. A chamber nobody has touched never resets. On servers with many chambers this saves a lot of memory and work, because only the chambers players actually use get reset. Off by default, so nothing changes until you switch it on.
release
Better Trial Chambers 2.3.0-mc26
2.3.0-mc267 окт. 2026 г.66Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.3.0] - 2026-10-07
### Added
- **Chambers can wait to be looted before they reset.** Turn on `reset-after-first-loot` and a chamber's reset clock only starts when someone first opens a vault or a chest inside it. A chamber nobody has touched never resets. On servers with many chambers this saves a lot of memory and work, because only the chambers players actually use get reset. Off by default, so nothing changes until you switch it on.
release
Better Trial Chambers 2.3.0
2.3.07 окт. 2026 г.40Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.3.0] - 2026-10-07
### Added
- **Chambers can wait to be looted before they reset.** Turn on `reset-after-first-loot` and a chamber's reset clock only starts when someone first opens a vault or a chest inside it. A chamber nobody has touched never resets. On servers with many chambers this saves a lot of memory and work, because only the chambers players actually use get reset. Off by default, so nothing changes until you switch it on.
release
Better Trial Chambers 2.2.3-mc263
2.2.3-mc26323 сент. 2026 г.103Minecraft: 26.3folia, paper, purpur
Что нового
## [2.2.3] - 2026-09-23
### Fixed
- **Stopping the server right after it starts no longer prints an error from the update checker.** The same goes for stopping it while an update check is running.
- **The update checker picks the download made for your Minecraft version,** including the separate 26.3 download.
- **Players can no longer place item frames, paintings, armour stands or cushions in a protected chamber.** These now follow the `prevent-block-place` setting, like blocks do.
- **No more "could not save messages.yml" warnings on every restart.** The same goes for `loot.yml` and `/trial dungeon`.
- **The console now shows how many items each loot table has.** It used to say 0 for the default tables, which looked like they were empty.
release
Better Trial Chambers 2.2.3-mc26
2.2.3-mc2623 сент. 2026 г.68Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.2.3] - 2026-09-23
### Fixed
- **Stopping the server right after it starts no longer prints an error from the update checker.** The same goes for stopping it while an update check is running.
- **The update checker picks the download made for your Minecraft version,** including the separate 26.3 download.
- **Players can no longer place item frames, paintings, armour stands or cushions in a protected chamber.** These now follow the `prevent-block-place` setting, like blocks do.
- **No more "could not save messages.yml" warnings on every restart.** The same goes for `loot.yml` and `/trial dungeon`.
- **The console now shows how many items each loot table has.** It used to say 0 for the default tables, which looked like they were empty.
release
Better Trial Chambers 2.2.3
2.2.323 сент. 2026 г.37Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.2.3] - 2026-09-23
### Fixed
- **Stopping the server right after it starts no longer prints an error from the update checker.** The same goes for stopping it while an update check is running.
- **The update checker picks the download made for your Minecraft version,** including the separate 26.3 download.
- **Players can no longer place item frames, paintings, armour stands or cushions in a protected chamber.** These now follow the `prevent-block-place` setting, like blocks do.
- **No more "could not save messages.yml" warnings on every restart.** The same goes for `loot.yml` and `/trial dungeon`.
- **The console now shows how many items each loot table has.** It used to say 0 for the default tables, which looked like they were empty.
beta
Better Trial Chambers 2.2.2-mc263
2.2.2-mc26323 сент. 2026 г.7Minecraft: 26.3folia, paper, purpur
Что нового
## [2.2.2] - 2026-09-23
### Fixed
- **Fixed the chunk check error for good.** The server could break its own list of a chunk's blocks while the plugin read it. 2.2.1 fixed one of five chunk checks and wrongly blamed other plugins. All five are fixed now.
- **Chunks load faster when finding new Trial Chambers is on.** The plugin now asks the server only about vaults and trial spawners.
release
Better Trial Chambers 2.2.2-mc26
2.2.2-mc2623 сент. 2026 г.4Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.2.2] - 2026-09-23
### Fixed
- **Fixed the chunk check error for good.** The server could break its own list of a chunk's blocks while the plugin read it. 2.2.1 fixed one of five chunk checks and wrongly blamed other plugins. All five are fixed now.
- **Chunks load faster when finding new Trial Chambers is on.** The plugin now asks the server only about vaults and trial spawners.
release
Better Trial Chambers 2.2.2
2.2.223 сент. 2026 г.5Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.2.2] - 2026-09-23
### Fixed
- **Fixed the chunk check error for good.** The server could break its own list of a chunk's blocks while the plugin read it. 2.2.1 fixed one of five chunk checks and wrongly blamed other plugins. All five are fixed now.
- **Chunks load faster when finding new Trial Chambers is on.** The plugin now asks the server only about vaults and trial spawners.
beta
Better Trial Chambers 2.2.1-mc263
2.2.1-mc26319 сент. 2026 г.47Minecraft: 26.3folia, paper, purpur
Что нового
## [2.2.1] - 2026-09-20
### Fixed
- **Trial spawners are found again after a chunk that another plugin was changing.** When a chunk loaded, the plugin checked it for trial spawners. If another plugin was changing blocks in that chunk from a second thread at the same moment, the check failed with an error and that chunk's spawners were left off the list, so spawner waves could be missed there. The failure is now handled: the console says which chunk it was, and the spawners are picked up the next time the chunk loads or anything in it is broken or placed.
- **Chunks load faster on busy worlds.** The check above asked the server to build a full description of every chest, barrel, sign, hopper and banner in the chunk, just to find the trial spawners among them. It now asks only about trial spawners.
- **A repeating problem no longer sends a repeating error report.** Error reports are on by default and some are sent from places that run on every vault opened. One thing going wrong, such as a database that stopped answering, could send a report every time. Reports of the same kind are now sent at most once every ten minutes.
- **Error reports no longer include the folder your server lives in.** When a file or database problem was reported, the message quoted the full path, which names your hosting account. Reports now show it as `plugins/BetterTrialChambers` instead. Your own console keeps the full path, because that is where it is useful.
release
Better Trial Chambers 2.2.1-mc26
2.2.1-mc2619 сент. 2026 г.30Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.2.1] - 2026-09-20
### Fixed
- **Trial spawners are found again after a chunk that another plugin was changing.** When a chunk loaded, the plugin checked it for trial spawners. If another plugin was changing blocks in that chunk from a second thread at the same moment, the check failed with an error and that chunk's spawners were left off the list, so spawner waves could be missed there. The failure is now handled: the console says which chunk it was, and the spawners are picked up the next time the chunk loads or anything in it is broken or placed.
- **Chunks load faster on busy worlds.** The check above asked the server to build a full description of every chest, barrel, sign, hopper and banner in the chunk, just to find the trial spawners among them. It now asks only about trial spawners.
- **A repeating problem no longer sends a repeating error report.** Error reports are on by default and some are sent from places that run on every vault opened. One thing going wrong, such as a database that stopped answering, could send a report every time. Reports of the same kind are now sent at most once every ten minutes.
- **Error reports no longer include the folder your server lives in.** When a file or database problem was reported, the message quoted the full path, which names your hosting account. Reports now show it as `plugins/BetterTrialChambers` instead. Your own console keeps the full path, because that is where it is useful.
release
Better Trial Chambers 2.2.1
2.2.119 сент. 2026 г.13Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.2.1] - 2026-09-20
### Fixed
- **Trial spawners are found again after a chunk that another plugin was changing.** When a chunk loaded, the plugin checked it for trial spawners. If another plugin was changing blocks in that chunk from a second thread at the same moment, the check failed with an error and that chunk's spawners were left off the list, so spawner waves could be missed there. The failure is now handled: the console says which chunk it was, and the spawners are picked up the next time the chunk loads or anything in it is broken or placed.
- **Chunks load faster on busy worlds.** The check above asked the server to build a full description of every chest, barrel, sign, hopper and banner in the chunk, just to find the trial spawners among them. It now asks only about trial spawners.
- **A repeating problem no longer sends a repeating error report.** Error reports are on by default and some are sent from places that run on every vault opened. One thing going wrong, such as a database that stopped answering, could send a report every time. Reports of the same kind are now sent at most once every ten minutes.
- **Error reports no longer include the folder your server lives in.** When a file or database problem was reported, the message quoted the full path, which names your hosting account. Reports now show it as `plugins/BetterTrialChambers` instead. Your own console keeps the full path, because that is where it is useful.
beta
Better Trial Chambers 2.2.0-mc263
2.2.0-mc26317 сент. 2026 г.30Minecraft: 26.3folia, paper, purpur
Что нового
## [2.2.0] - 2026-09-17
### Added
- **Minecraft 26.3 support, as its own download.** This is the `-mc263` jar; keep using `-mc26` on 26.0 to 26.2 and the plain jar on 1.21.x. Each download now follows its own updates, so a 26.3 server is never offered a jar built for an older Minecraft.
- **Cushions inside a chamber are protected like any other decoration.** 26.3 added cushions, and picking one up is not the same action as taking a painting off a wall, so they needed watching separately. A cushion standing in a protected chamber can no longer be taken, blown up or knocked out by a mob, and `btc.bypass.protection` still lets staff move one.
### Removed
- **The `update.allow-hot-reload` setting and `/trial update apply`.** Installing an update without a restart could never work for this plugin: it ships the SQLite database driver, which cannot be loaded a second time while the server is running, so the update was always refused. Updates install on the next restart as before. If the line is still in your `config.yml` it simply does nothing, and you can delete it.
### Fixed
- **The menu's reload button now needs the reload permission.** `/trial reload` has always needed `btc.admin.reload`, but the reload button on the main menu worked for anyone who could open the menu.
- **All loot tables can be reached from the menu.** The loot table list only showed the first 36 tables and had no next page, so on a server with more tables the rest could not be opened. The list now has page buttons.
- **Chambers with automatic resets turned off say so.** The chamber list and the chamber's own page showed the next reset as "due now" for a chamber whose reset time is set to 0. They now show "Disabled".
- **A mistyped number in `config.yml` falls back to the right value.** When a setting wasn't a number, the startup check put in a replacement that didn't match the plugin's normal default for eight settings: vault cooldowns became 24 and 48 hours instead of 0 (locked until the chamber resets), trial spawner rest times became 30 minutes instead of Minecraft's own, and four chamber discovery settings got outdated numbers. A spawner rest time below the allowed range, such as -5, also turned into 0 (no rest at all); it now goes back to leaving it to Minecraft. The console messages say plainly what was wrong and what is used instead.
- **Editing a chamber's loot no longer wipes the server's default loot.** A chamber without a loot table of its own opened the loot editor on the server-wide default table. That table comes split into groups the editor page didn't show, so the page looked empty, and pressing Save replaced the entire default table with whatever was on it. Every chamber using the default lost its loot. A chamber now gets its own copy of the default the first time you edit its loot, and the default is left alone.
- **A chamber's exit has to be set in the chamber's own world.** Setting the exit while standing in a different world (for example the Nether) saved only the coordinates, so players leaving the chamber on a reset were sent to that spot in the chamber's world instead. The menu button and `/trial setexit` now refuse and tell you to go to the chamber's world first.
- **Two menu switches no longer show the wrong starting state.** "Luck effect" and container protection showed as on when the setting was missing from `config.yml`, while the plugin treated it as off.
- **Update checks look in the right place and offer the right download.** The update checker was still asking Modrinth for the plugin's old name, which Modrinth no longer knows, so every check fell back to GitHub. GitHub then offered whichever jar happened to be listed first in the release, which could be the download built for a different Minecraft version. Checks now find the plugin on Modrinth, and GitHub only ever offers the jar made for your server.
- **Chambers and dungeon rooms saved by TrialChamberPro load again.** Upgrading copies your old `plugins/TrialChamberPro/` folder across, but chambers snapshotted and dungeon rooms saved under the old name could not be read. Those chambers failed to reset and those rooms were missing from dungeon generation. They load normally now, with nothing to do on your end.
- **Loot items that don't stack far now give the full amount.** Items added through the loot editor were cut down to one stack, so an item set to give 2 to 3 totems always gave 1, and 32 ender pearls gave 16. Items written by hand in `loot.yml` went wrong the other way and arrived as oversized stacks. Both now hand out the amount rolled, split into normal stacks.
- **Tab completion matches what each command allows.** Staff who had permission to reset chambers, reset vaults or give keys, without the menu permission, got no suggestions for those commands. Chamber and loot table names with capital letters stopped being suggested as soon as you typed. Players who cannot use a command no longer see names of presets, schematics, rooms or loot tables through its suggestions.
- **Nobody gets left stuck watching after a restart or a reload.** Spectating a chamber after dying put players in the spectator view, and two things could leave them there: reloading the plugin (the change back was asked for a moment too late, when the plugin was already gone), and rejoining a server that was still starting up. Both are handled now, and anyone already stuck is put back the moment they next join.
- **Statistics no longer go missing when the database stumbles.** Two small ways counts could be lost: setting up a player's stats row for the first time could wipe something recorded in the same moment back to zero, and if a save of time spent in chambers failed, everyone's last few minutes were dropped rather than counted again on the next save. Failures now say what happened in plain words instead of printing an error.
- **Two answers in `/trial setup` did nothing.** Turning on "ask me before a chamber resets" or "use FastAsyncWorldEdit" in the setup tour wrote the answer into the wrong part of `config.yml`, so the tour said it was on while the plugin carried on as if it were off. Both are written to the right place now, and if the tour already put one in the wrong place on your server it is moved across for you at startup.
- **Mob plugins that start after this one are now noticed.** Whether MythicMobs, EliteMobs, LevelledMobs and the rest were installed was decided once and never looked at again, so on servers where those plugins happen to start later, chambers set to use them quietly spawned ordinary mobs until the next restart.
- **MythicCrucible items in loot tables work with current MythicMobs.** Mythic renamed the method that hands over the finished item, so a Crucible item in a loot table never appeared and the console logged a failure each time it was rolled. Both the old and the new name are accepted now, so any Mythic version works.
- **Custom loot items from other plugins work on more setups.** Items from Nexo, ItemsAdder, Oraxen, CraftEngine and MythicCrucible were fetched in a way Java refuses for some of those plugins' internal classes, in which case the item silently never appeared in the loot.
- **A custom mob that fails to spawn no longer breaks the wave.** Chambers set to use MythicMobs, EliteMobs and the like swap each mob the spawner produces for one of theirs. The ordinary mob was taken away first, so if the other plugin could not spawn its mob (a renamed mob id, or an update that moved its API) the wave was left a mob short, the spawner never finished, the chamber never cleared and no key dropped. The replacement is spawned first now, and the ordinary mob is only removed once it is there.
- **Land-claim protection works again on Residence, Lands and GriefPrevention.** The part that stops a claim being made over a chamber reads those plugins through their public interfaces, and the way it looked up their methods was refused by Java every time, quietly. It could therefore never block anything. It now reads them properly, and if one of those plugins changes its API in future, the console says so once instead of leaving the shield silently off.
- **A hopper can no longer collect loot that is being held for someone.** Vault loot and trial keys dropped on the ground are held for the player who earned them for a short while, but only against other players picking them up by hand. A hopper placed under the drop took them anyway, and so could a mob. Both are now refused for as long as the drop is held.
- **A generated dungeon's doorways stay open after it resets.** The doorways between rooms were opened as a separate step after the rooms were built, while the snapshot that every later reset restores was being taken at the same moment. When the snapshot won that race it recorded the doorways still walled up, and the first reset sealed the dungeon. Doorways are now open from the moment the rooms are placed. Dungeons built before this update: run `/trial snapshot update <name>` once to re-save them as they stand.
- **A chamber too big to measure in one search now says so.** Finding a player-built or datapack chamber by scanning its blocks stops after a set number of blocks. It used to register whatever it had reached by then without a word, so part of the chamber was left out and only that part ever reset. The console now tells you, and points at `/trial scan add <chamber>` to take in the rest. The limit is the new `discovery.max-scan-blocks` setting. Ordinary generated chambers are measured from Minecraft's own structure bounds and were never affected.
- **Placeholders no longer hammer the database.** Scoreboard plugins ask for a placeholder many times a second per player. Each ask that found stale data started its own database lookup, even while an earlier one for the same player was still running, so a busy server with a slow database could tie up every database connection. One lookup per player at a time now, and the leaderboard numbers can no longer get stuck on stale values.
- **A chamber's display name can no longer carry a clickable link into server announcements.** Reset announcements go to everyone and are styled as they are sent, so a display name written with a click or hover tag turned into a button in front of every player, running a command as whoever clicked it. Display names are cleaned when set and when shown, so names saved earlier are covered too. Colours and bold are unaffected.
- **The menu now checks permissions the way the documentation always said it did.** `btc.admin.menu` is meant to let someone open the menu, with each screen still asking for the permission behind it. In practice nothing inside the menu checked, so anyone who could open it could force resets, empty vault cooldowns, edit loot tables, change container loot and change your global and protection settings, whatever else you had given them. Each of those screens and buttons now asks for the same permission its command asks for, and says so plainly when someone does not have it. Nothing changes for operators or anyone holding `btc.admin.*`.
- **Changing how often a chamber resets now takes effect straight away.** The new time was saved, but the reset that had already been lined up under the old time still went ahead, warnings and all. Going from two days to one hour looked like it had done nothing until the chamber had reset once more, and setting the interval to 0 to turn resets off let one more reset through.
- **Less work per tick on servers with a lot of chambers.** Every check of "is this spot inside a chamber" went through the whole list of chambers, and some of the events that ask fire constantly, such as flowing water. The plugin now keeps track of the one area per world that holds all of its chambers and answers anywhere outside it immediately.
- **Vault clicks no longer read the whole vault table.** Looking a vault up by where it is, and looking up who has claimed a shared vault, had no index to work from, so both read every row. Two indexes are added automatically the next time the server starts, existing databases included. Nothing to do on your end.
- **A chamber can no longer be given a name its save file cannot use.** A chamber's name is also the name of its snapshot file, so a name with a slash, a dot or a space in it meant the snapshot quietly never saved and the chamber never reset properly. New chambers must use letters, numbers, `-` and `_` (up to 32 characters), with a message saying so if they do not, and you can still give the chamber any name you like for announcements with `/trial rename`. Chambers registered earlier with an unusable name are named in the console once at startup.
- **Items could be duplicated out of a per-player container on a busy server.** Closing your copy of a chamber container saves it in the background, and opening it again read straight from the database. If the save had not finished, the second open handed back what was in there before you closed it, so anything you had taken out existed twice. Reading and saving a player's copies now wait for each other.
- **Loot is no longer lost when you disconnect while a vault is opening.** The vault counted as opened for you, but the reward went nowhere, and it stayed that way until the chamber reset. It is now dropped at the vault and held for you the same way vault drops normally are.
- **Staff can take decorations out of a chamber again.** `btc.bypass.protection` did not work on paintings, item frames, armour stands or cushions: whether it was honoured depended on which of two internal handlers the server happened to run first, and usually it was the one that blocks everyone. A WorldGuard region granting build rights was ignored the same way. Both now go through one check.
- **Arriving by portal counts as teleporting in.** With `protection.prevent-teleport-into-chamber` turned on, a nether or end portal whose far end sits inside a chamber still dropped players straight in.
- **Glowing spawner outlines now use the colour you set.** `spawner-waves.glow-color-normal` and `glow-color-ominous` had no effect: every outline came out white whatever you put there. Minecraft only draws an outline in one of its own sixteen colours, so your colour is matched to the closest of those, which is why the shipped yellow and purple look right without you changing anything.
- **Container protection covers everything that holds items.** With `protection.prevent-container-access` turned on, chests and barrels were protected but shelves, lecterns, jukeboxes, chiseled bookshelves and decorated pots were not, so anyone could still empty those inside a chamber. Vault loot is unaffected, as always.
- **Resets no longer warn that a snapshot "covers a smaller region than the chamber bounds".** Snapshots do not store air, so any chamber with open space along an edge (almost every chamber) looked like its snapshot had fallen behind, and the console asked you to take a new one on every single reset. Snapshots now record the area they were taken from, so the warning only appears when the chamber really has grown since. Snapshots taken before this update keep working; take a new one when convenient and the reset will also tidy up blocks players added in open space near the chamber's edge, which it could not reach before.
### Note
- **This update adds a new message.** The plugin never overwrites your existing `messages.yml`, so until you add it you may see `<missing: exit-wrong-world>` if someone tries to set a chamber exit from the wrong world. To get it: stop the server, rename `plugins/BetterTrialChambers/messages.yml` to `messages.yml.bak`, start the server so a fresh file is made, then copy any translations back over from the `.bak`. The console also reminds you at startup whenever messages are missing.
release
Better Trial Chambers 2.2.0-mc26
2.2.0-mc2617 сент. 2026 г.28Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.2.0] - 2026-09-17
### Added
- **Minecraft 26.3 support, as its own download.** This is the `-mc263` jar; keep using `-mc26` on 26.0 to 26.2 and the plain jar on 1.21.x. Each download now follows its own updates, so a 26.3 server is never offered a jar built for an older Minecraft.
- **Cushions inside a chamber are protected like any other decoration.** 26.3 added cushions, and picking one up is not the same action as taking a painting off a wall, so they needed watching separately. A cushion standing in a protected chamber can no longer be taken, blown up or knocked out by a mob, and `btc.bypass.protection` still lets staff move one.
### Removed
- **The `update.allow-hot-reload` setting and `/trial update apply`.** Installing an update without a restart could never work for this plugin: it ships the SQLite database driver, which cannot be loaded a second time while the server is running, so the update was always refused. Updates install on the next restart as before. If the line is still in your `config.yml` it simply does nothing, and you can delete it.
### Fixed
- **The menu's reload button now needs the reload permission.** `/trial reload` has always needed `btc.admin.reload`, but the reload button on the main menu worked for anyone who could open the menu.
- **All loot tables can be reached from the menu.** The loot table list only showed the first 36 tables and had no next page, so on a server with more tables the rest could not be opened. The list now has page buttons.
- **Chambers with automatic resets turned off say so.** The chamber list and the chamber's own page showed the next reset as "due now" for a chamber whose reset time is set to 0. They now show "Disabled".
- **A mistyped number in `config.yml` falls back to the right value.** When a setting wasn't a number, the startup check put in a replacement that didn't match the plugin's normal default for eight settings: vault cooldowns became 24 and 48 hours instead of 0 (locked until the chamber resets), trial spawner rest times became 30 minutes instead of Minecraft's own, and four chamber discovery settings got outdated numbers. A spawner rest time below the allowed range, such as -5, also turned into 0 (no rest at all); it now goes back to leaving it to Minecraft. The console messages say plainly what was wrong and what is used instead.
- **Editing a chamber's loot no longer wipes the server's default loot.** A chamber without a loot table of its own opened the loot editor on the server-wide default table. That table comes split into groups the editor page didn't show, so the page looked empty, and pressing Save replaced the entire default table with whatever was on it. Every chamber using the default lost its loot. A chamber now gets its own copy of the default the first time you edit its loot, and the default is left alone.
- **A chamber's exit has to be set in the chamber's own world.** Setting the exit while standing in a different world (for example the Nether) saved only the coordinates, so players leaving the chamber on a reset were sent to that spot in the chamber's world instead. The menu button and `/trial setexit` now refuse and tell you to go to the chamber's world first.
- **Two menu switches no longer show the wrong starting state.** "Luck effect" and container protection showed as on when the setting was missing from `config.yml`, while the plugin treated it as off.
- **Update checks look in the right place and offer the right download.** The update checker was still asking Modrinth for the plugin's old name, which Modrinth no longer knows, so every check fell back to GitHub. GitHub then offered whichever jar happened to be listed first in the release, which could be the download built for a different Minecraft version. Checks now find the plugin on Modrinth, and GitHub only ever offers the jar made for your server.
- **Chambers and dungeon rooms saved by TrialChamberPro load again.** Upgrading copies your old `plugins/TrialChamberPro/` folder across, but chambers snapshotted and dungeon rooms saved under the old name could not be read. Those chambers failed to reset and those rooms were missing from dungeon generation. They load normally now, with nothing to do on your end.
- **Loot items that don't stack far now give the full amount.** Items added through the loot editor were cut down to one stack, so an item set to give 2 to 3 totems always gave 1, and 32 ender pearls gave 16. Items written by hand in `loot.yml` went wrong the other way and arrived as oversized stacks. Both now hand out the amount rolled, split into normal stacks.
- **Tab completion matches what each command allows.** Staff who had permission to reset chambers, reset vaults or give keys, without the menu permission, got no suggestions for those commands. Chamber and loot table names with capital letters stopped being suggested as soon as you typed. Players who cannot use a command no longer see names of presets, schematics, rooms or loot tables through its suggestions.
- **Nobody gets left stuck watching after a restart or a reload.** Spectating a chamber after dying put players in the spectator view, and two things could leave them there: reloading the plugin (the change back was asked for a moment too late, when the plugin was already gone), and rejoining a server that was still starting up. Both are handled now, and anyone already stuck is put back the moment they next join.
- **Statistics no longer go missing when the database stumbles.** Two small ways counts could be lost: setting up a player's stats row for the first time could wipe something recorded in the same moment back to zero, and if a save of time spent in chambers failed, everyone's last few minutes were dropped rather than counted again on the next save. Failures now say what happened in plain words instead of printing an error.
- **Two answers in `/trial setup` did nothing.** Turning on "ask me before a chamber resets" or "use FastAsyncWorldEdit" in the setup tour wrote the answer into the wrong part of `config.yml`, so the tour said it was on while the plugin carried on as if it were off. Both are written to the right place now, and if the tour already put one in the wrong place on your server it is moved across for you at startup.
- **Mob plugins that start after this one are now noticed.** Whether MythicMobs, EliteMobs, LevelledMobs and the rest were installed was decided once and never looked at again, so on servers where those plugins happen to start later, chambers set to use them quietly spawned ordinary mobs until the next restart.
- **MythicCrucible items in loot tables work with current MythicMobs.** Mythic renamed the method that hands over the finished item, so a Crucible item in a loot table never appeared and the console logged a failure each time it was rolled. Both the old and the new name are accepted now, so any Mythic version works.
- **Custom loot items from other plugins work on more setups.** Items from Nexo, ItemsAdder, Oraxen, CraftEngine and MythicCrucible were fetched in a way Java refuses for some of those plugins' internal classes, in which case the item silently never appeared in the loot.
- **A custom mob that fails to spawn no longer breaks the wave.** Chambers set to use MythicMobs, EliteMobs and the like swap each mob the spawner produces for one of theirs. The ordinary mob was taken away first, so if the other plugin could not spawn its mob (a renamed mob id, or an update that moved its API) the wave was left a mob short, the spawner never finished, the chamber never cleared and no key dropped. The replacement is spawned first now, and the ordinary mob is only removed once it is there.
- **Land-claim protection works again on Residence, Lands and GriefPrevention.** The part that stops a claim being made over a chamber reads those plugins through their public interfaces, and the way it looked up their methods was refused by Java every time, quietly. It could therefore never block anything. It now reads them properly, and if one of those plugins changes its API in future, the console says so once instead of leaving the shield silently off.
- **A hopper can no longer collect loot that is being held for someone.** Vault loot and trial keys dropped on the ground are held for the player who earned them for a short while, but only against other players picking them up by hand. A hopper placed under the drop took them anyway, and so could a mob. Both are now refused for as long as the drop is held.
- **A generated dungeon's doorways stay open after it resets.** The doorways between rooms were opened as a separate step after the rooms were built, while the snapshot that every later reset restores was being taken at the same moment. When the snapshot won that race it recorded the doorways still walled up, and the first reset sealed the dungeon. Doorways are now open from the moment the rooms are placed. Dungeons built before this update: run `/trial snapshot update <name>` once to re-save them as they stand.
- **A chamber too big to measure in one search now says so.** Finding a player-built or datapack chamber by scanning its blocks stops after a set number of blocks. It used to register whatever it had reached by then without a word, so part of the chamber was left out and only that part ever reset. The console now tells you, and points at `/trial scan add <chamber>` to take in the rest. The limit is the new `discovery.max-scan-blocks` setting. Ordinary generated chambers are measured from Minecraft's own structure bounds and were never affected.
- **Placeholders no longer hammer the database.** Scoreboard plugins ask for a placeholder many times a second per player. Each ask that found stale data started its own database lookup, even while an earlier one for the same player was still running, so a busy server with a slow database could tie up every database connection. One lookup per player at a time now, and the leaderboard numbers can no longer get stuck on stale values.
- **A chamber's display name can no longer carry a clickable link into server announcements.** Reset announcements go to everyone and are styled as they are sent, so a display name written with a click or hover tag turned into a button in front of every player, running a command as whoever clicked it. Display names are cleaned when set and when shown, so names saved earlier are covered too. Colours and bold are unaffected.
- **The menu now checks permissions the way the documentation always said it did.** `btc.admin.menu` is meant to let someone open the menu, with each screen still asking for the permission behind it. In practice nothing inside the menu checked, so anyone who could open it could force resets, empty vault cooldowns, edit loot tables, change container loot and change your global and protection settings, whatever else you had given them. Each of those screens and buttons now asks for the same permission its command asks for, and says so plainly when someone does not have it. Nothing changes for operators or anyone holding `btc.admin.*`.
- **Changing how often a chamber resets now takes effect straight away.** The new time was saved, but the reset that had already been lined up under the old time still went ahead, warnings and all. Going from two days to one hour looked like it had done nothing until the chamber had reset once more, and setting the interval to 0 to turn resets off let one more reset through.
- **Less work per tick on servers with a lot of chambers.** Every check of "is this spot inside a chamber" went through the whole list of chambers, and some of the events that ask fire constantly, such as flowing water. The plugin now keeps track of the one area per world that holds all of its chambers and answers anywhere outside it immediately.
- **Vault clicks no longer read the whole vault table.** Looking a vault up by where it is, and looking up who has claimed a shared vault, had no index to work from, so both read every row. Two indexes are added automatically the next time the server starts, existing databases included. Nothing to do on your end.
- **A chamber can no longer be given a name its save file cannot use.** A chamber's name is also the name of its snapshot file, so a name with a slash, a dot or a space in it meant the snapshot quietly never saved and the chamber never reset properly. New chambers must use letters, numbers, `-` and `_` (up to 32 characters), with a message saying so if they do not, and you can still give the chamber any name you like for announcements with `/trial rename`. Chambers registered earlier with an unusable name are named in the console once at startup.
- **Items could be duplicated out of a per-player container on a busy server.** Closing your copy of a chamber container saves it in the background, and opening it again read straight from the database. If the save had not finished, the second open handed back what was in there before you closed it, so anything you had taken out existed twice. Reading and saving a player's copies now wait for each other.
- **Loot is no longer lost when you disconnect while a vault is opening.** The vault counted as opened for you, but the reward went nowhere, and it stayed that way until the chamber reset. It is now dropped at the vault and held for you the same way vault drops normally are.
- **Staff can take decorations out of a chamber again.** `btc.bypass.protection` did not work on paintings, item frames, armour stands or cushions: whether it was honoured depended on which of two internal handlers the server happened to run first, and usually it was the one that blocks everyone. A WorldGuard region granting build rights was ignored the same way. Both now go through one check.
- **Arriving by portal counts as teleporting in.** With `protection.prevent-teleport-into-chamber` turned on, a nether or end portal whose far end sits inside a chamber still dropped players straight in.
- **Glowing spawner outlines now use the colour you set.** `spawner-waves.glow-color-normal` and `glow-color-ominous` had no effect: every outline came out white whatever you put there. Minecraft only draws an outline in one of its own sixteen colours, so your colour is matched to the closest of those, which is why the shipped yellow and purple look right without you changing anything.
- **Container protection covers everything that holds items.** With `protection.prevent-container-access` turned on, chests and barrels were protected but shelves, lecterns, jukeboxes, chiseled bookshelves and decorated pots were not, so anyone could still empty those inside a chamber. Vault loot is unaffected, as always.
- **Resets no longer warn that a snapshot "covers a smaller region than the chamber bounds".** Snapshots do not store air, so any chamber with open space along an edge (almost every chamber) looked like its snapshot had fallen behind, and the console asked you to take a new one on every single reset. Snapshots now record the area they were taken from, so the warning only appears when the chamber really has grown since. Snapshots taken before this update keep working; take a new one when convenient and the reset will also tidy up blocks players added in open space near the chamber's edge, which it could not reach before.
### Note
- **This update adds a new message.** The plugin never overwrites your existing `messages.yml`, so until you add it you may see `<missing: exit-wrong-world>` if someone tries to set a chamber exit from the wrong world. To get it: stop the server, rename `plugins/BetterTrialChambers/messages.yml` to `messages.yml.bak`, start the server so a fresh file is made, then copy any translations back over from the `.bak`. The console also reminds you at startup whenever messages are missing.
release
Better Trial Chambers 2.2.0
2.2.017 сент. 2026 г.15Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.2.0] - 2026-09-17
### Added
- **Minecraft 26.3 support, as its own download.** This is the `-mc263` jar; keep using `-mc26` on 26.0 to 26.2 and the plain jar on 1.21.x. Each download now follows its own updates, so a 26.3 server is never offered a jar built for an older Minecraft.
- **Cushions inside a chamber are protected like any other decoration.** 26.3 added cushions, and picking one up is not the same action as taking a painting off a wall, so they needed watching separately. A cushion standing in a protected chamber can no longer be taken, blown up or knocked out by a mob, and `btc.bypass.protection` still lets staff move one.
### Removed
- **The `update.allow-hot-reload` setting and `/trial update apply`.** Installing an update without a restart could never work for this plugin: it ships the SQLite database driver, which cannot be loaded a second time while the server is running, so the update was always refused. Updates install on the next restart as before. If the line is still in your `config.yml` it simply does nothing, and you can delete it.
### Fixed
- **The menu's reload button now needs the reload permission.** `/trial reload` has always needed `btc.admin.reload`, but the reload button on the main menu worked for anyone who could open the menu.
- **All loot tables can be reached from the menu.** The loot table list only showed the first 36 tables and had no next page, so on a server with more tables the rest could not be opened. The list now has page buttons.
- **Chambers with automatic resets turned off say so.** The chamber list and the chamber's own page showed the next reset as "due now" for a chamber whose reset time is set to 0. They now show "Disabled".
- **A mistyped number in `config.yml` falls back to the right value.** When a setting wasn't a number, the startup check put in a replacement that didn't match the plugin's normal default for eight settings: vault cooldowns became 24 and 48 hours instead of 0 (locked until the chamber resets), trial spawner rest times became 30 minutes instead of Minecraft's own, and four chamber discovery settings got outdated numbers. A spawner rest time below the allowed range, such as -5, also turned into 0 (no rest at all); it now goes back to leaving it to Minecraft. The console messages say plainly what was wrong and what is used instead.
- **Editing a chamber's loot no longer wipes the server's default loot.** A chamber without a loot table of its own opened the loot editor on the server-wide default table. That table comes split into groups the editor page didn't show, so the page looked empty, and pressing Save replaced the entire default table with whatever was on it. Every chamber using the default lost its loot. A chamber now gets its own copy of the default the first time you edit its loot, and the default is left alone.
- **A chamber's exit has to be set in the chamber's own world.** Setting the exit while standing in a different world (for example the Nether) saved only the coordinates, so players leaving the chamber on a reset were sent to that spot in the chamber's world instead. The menu button and `/trial setexit` now refuse and tell you to go to the chamber's world first.
- **Two menu switches no longer show the wrong starting state.** "Luck effect" and container protection showed as on when the setting was missing from `config.yml`, while the plugin treated it as off.
- **Update checks look in the right place and offer the right download.** The update checker was still asking Modrinth for the plugin's old name, which Modrinth no longer knows, so every check fell back to GitHub. GitHub then offered whichever jar happened to be listed first in the release, which could be the download built for a different Minecraft version. Checks now find the plugin on Modrinth, and GitHub only ever offers the jar made for your server.
- **Chambers and dungeon rooms saved by TrialChamberPro load again.** Upgrading copies your old `plugins/TrialChamberPro/` folder across, but chambers snapshotted and dungeon rooms saved under the old name could not be read. Those chambers failed to reset and those rooms were missing from dungeon generation. They load normally now, with nothing to do on your end.
- **Loot items that don't stack far now give the full amount.** Items added through the loot editor were cut down to one stack, so an item set to give 2 to 3 totems always gave 1, and 32 ender pearls gave 16. Items written by hand in `loot.yml` went wrong the other way and arrived as oversized stacks. Both now hand out the amount rolled, split into normal stacks.
- **Tab completion matches what each command allows.** Staff who had permission to reset chambers, reset vaults or give keys, without the menu permission, got no suggestions for those commands. Chamber and loot table names with capital letters stopped being suggested as soon as you typed. Players who cannot use a command no longer see names of presets, schematics, rooms or loot tables through its suggestions.
- **Nobody gets left stuck watching after a restart or a reload.** Spectating a chamber after dying put players in the spectator view, and two things could leave them there: reloading the plugin (the change back was asked for a moment too late, when the plugin was already gone), and rejoining a server that was still starting up. Both are handled now, and anyone already stuck is put back the moment they next join.
- **Statistics no longer go missing when the database stumbles.** Two small ways counts could be lost: setting up a player's stats row for the first time could wipe something recorded in the same moment back to zero, and if a save of time spent in chambers failed, everyone's last few minutes were dropped rather than counted again on the next save. Failures now say what happened in plain words instead of printing an error.
- **Two answers in `/trial setup` did nothing.** Turning on "ask me before a chamber resets" or "use FastAsyncWorldEdit" in the setup tour wrote the answer into the wrong part of `config.yml`, so the tour said it was on while the plugin carried on as if it were off. Both are written to the right place now, and if the tour already put one in the wrong place on your server it is moved across for you at startup.
- **Mob plugins that start after this one are now noticed.** Whether MythicMobs, EliteMobs, LevelledMobs and the rest were installed was decided once and never looked at again, so on servers where those plugins happen to start later, chambers set to use them quietly spawned ordinary mobs until the next restart.
- **MythicCrucible items in loot tables work with current MythicMobs.** Mythic renamed the method that hands over the finished item, so a Crucible item in a loot table never appeared and the console logged a failure each time it was rolled. Both the old and the new name are accepted now, so any Mythic version works.
- **Custom loot items from other plugins work on more setups.** Items from Nexo, ItemsAdder, Oraxen, CraftEngine and MythicCrucible were fetched in a way Java refuses for some of those plugins' internal classes, in which case the item silently never appeared in the loot.
- **A custom mob that fails to spawn no longer breaks the wave.** Chambers set to use MythicMobs, EliteMobs and the like swap each mob the spawner produces for one of theirs. The ordinary mob was taken away first, so if the other plugin could not spawn its mob (a renamed mob id, or an update that moved its API) the wave was left a mob short, the spawner never finished, the chamber never cleared and no key dropped. The replacement is spawned first now, and the ordinary mob is only removed once it is there.
- **Land-claim protection works again on Residence, Lands and GriefPrevention.** The part that stops a claim being made over a chamber reads those plugins through their public interfaces, and the way it looked up their methods was refused by Java every time, quietly. It could therefore never block anything. It now reads them properly, and if one of those plugins changes its API in future, the console says so once instead of leaving the shield silently off.
- **A hopper can no longer collect loot that is being held for someone.** Vault loot and trial keys dropped on the ground are held for the player who earned them for a short while, but only against other players picking them up by hand. A hopper placed under the drop took them anyway, and so could a mob. Both are now refused for as long as the drop is held.
- **A generated dungeon's doorways stay open after it resets.** The doorways between rooms were opened as a separate step after the rooms were built, while the snapshot that every later reset restores was being taken at the same moment. When the snapshot won that race it recorded the doorways still walled up, and the first reset sealed the dungeon. Doorways are now open from the moment the rooms are placed. Dungeons built before this update: run `/trial snapshot update <name>` once to re-save them as they stand.
- **A chamber too big to measure in one search now says so.** Finding a player-built or datapack chamber by scanning its blocks stops after a set number of blocks. It used to register whatever it had reached by then without a word, so part of the chamber was left out and only that part ever reset. The console now tells you, and points at `/trial scan add <chamber>` to take in the rest. The limit is the new `discovery.max-scan-blocks` setting. Ordinary generated chambers are measured from Minecraft's own structure bounds and were never affected.
- **Placeholders no longer hammer the database.** Scoreboard plugins ask for a placeholder many times a second per player. Each ask that found stale data started its own database lookup, even while an earlier one for the same player was still running, so a busy server with a slow database could tie up every database connection. One lookup per player at a time now, and the leaderboard numbers can no longer get stuck on stale values.
- **A chamber's display name can no longer carry a clickable link into server announcements.** Reset announcements go to everyone and are styled as they are sent, so a display name written with a click or hover tag turned into a button in front of every player, running a command as whoever clicked it. Display names are cleaned when set and when shown, so names saved earlier are covered too. Colours and bold are unaffected.
- **The menu now checks permissions the way the documentation always said it did.** `btc.admin.menu` is meant to let someone open the menu, with each screen still asking for the permission behind it. In practice nothing inside the menu checked, so anyone who could open it could force resets, empty vault cooldowns, edit loot tables, change container loot and change your global and protection settings, whatever else you had given them. Each of those screens and buttons now asks for the same permission its command asks for, and says so plainly when someone does not have it. Nothing changes for operators or anyone holding `btc.admin.*`.
- **Changing how often a chamber resets now takes effect straight away.** The new time was saved, but the reset that had already been lined up under the old time still went ahead, warnings and all. Going from two days to one hour looked like it had done nothing until the chamber had reset once more, and setting the interval to 0 to turn resets off let one more reset through.
- **Less work per tick on servers with a lot of chambers.** Every check of "is this spot inside a chamber" went through the whole list of chambers, and some of the events that ask fire constantly, such as flowing water. The plugin now keeps track of the one area per world that holds all of its chambers and answers anywhere outside it immediately.
- **Vault clicks no longer read the whole vault table.** Looking a vault up by where it is, and looking up who has claimed a shared vault, had no index to work from, so both read every row. Two indexes are added automatically the next time the server starts, existing databases included. Nothing to do on your end.
- **A chamber can no longer be given a name its save file cannot use.** A chamber's name is also the name of its snapshot file, so a name with a slash, a dot or a space in it meant the snapshot quietly never saved and the chamber never reset properly. New chambers must use letters, numbers, `-` and `_` (up to 32 characters), with a message saying so if they do not, and you can still give the chamber any name you like for announcements with `/trial rename`. Chambers registered earlier with an unusable name are named in the console once at startup.
- **Items could be duplicated out of a per-player container on a busy server.** Closing your copy of a chamber container saves it in the background, and opening it again read straight from the database. If the save had not finished, the second open handed back what was in there before you closed it, so anything you had taken out existed twice. Reading and saving a player's copies now wait for each other.
- **Loot is no longer lost when you disconnect while a vault is opening.** The vault counted as opened for you, but the reward went nowhere, and it stayed that way until the chamber reset. It is now dropped at the vault and held for you the same way vault drops normally are.
- **Staff can take decorations out of a chamber again.** `btc.bypass.protection` did not work on paintings, item frames, armour stands or cushions: whether it was honoured depended on which of two internal handlers the server happened to run first, and usually it was the one that blocks everyone. A WorldGuard region granting build rights was ignored the same way. Both now go through one check.
- **Arriving by portal counts as teleporting in.** With `protection.prevent-teleport-into-chamber` turned on, a nether or end portal whose far end sits inside a chamber still dropped players straight in.
- **Glowing spawner outlines now use the colour you set.** `spawner-waves.glow-color-normal` and `glow-color-ominous` had no effect: every outline came out white whatever you put there. Minecraft only draws an outline in one of its own sixteen colours, so your colour is matched to the closest of those, which is why the shipped yellow and purple look right without you changing anything.
- **Container protection covers everything that holds items.** With `protection.prevent-container-access` turned on, chests and barrels were protected but shelves, lecterns, jukeboxes, chiseled bookshelves and decorated pots were not, so anyone could still empty those inside a chamber. Vault loot is unaffected, as always.
- **Resets no longer warn that a snapshot "covers a smaller region than the chamber bounds".** Snapshots do not store air, so any chamber with open space along an edge (almost every chamber) looked like its snapshot had fallen behind, and the console asked you to take a new one on every single reset. Snapshots now record the area they were taken from, so the warning only appears when the chamber really has grown since. Snapshots taken before this update keep working; take a new one when convenient and the reset will also tidy up blocks players added in open space near the chamber's edge, which it could not reach before.
### Note
- **This update adds a new message.** The plugin never overwrites your existing `messages.yml`, so until you add it you may see `<missing: exit-wrong-world>` if someone tries to set a chamber exit from the wrong world. To get it: stop the server, rename `plugins/BetterTrialChambers/messages.yml` to `messages.yml.bak`, start the server so a fresh file is made, then copy any translations back over from the `.bak`. The console also reminds you at startup whenever messages are missing.
release
Better Trial Chambers 2.1.0-mc26
2.1.0-mc2631 июл. 2026 г.244Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.1.0] - 2026-07-31
### Added
- **Limit how often a player can win a specific item.** Every loot item now has a "redeemable" setting with three choices: **Every reset** (the old behaviour — winnable again after each reset), **Once per chamber** (each player wins it only once from that chamber, even after it resets), or **Once ever** (each player wins it only once, ever, anywhere on the server). Once a player has won a capped item it quietly drops out of their own rolls and the other loot fills the gap — everyone else is unaffected. Perfect for making armour trims drop without letting them be farmed by resetting the same chamber. Set it in-game on an item's amount page with the new **"How often can a player get this?"** button, or add a `redeemable: once | per-chamber | per-reset` line in `loot.yml`. Existing loot is unchanged — the default matches how loot has always worked.
### Note
- **This update adds new message keys.** The plugin never overwrites your existing `messages.yml`, so after updating you may see `<missing: ...>` text on the new loot button until you refresh the file. To get the new lines: stop the server, rename `plugins/BetterTrialChambers/messages.yml` to `messages.yml.bak`, start the server (a fresh file is generated), then copy any translations back over from the `.bak`. The plugin also prints this reminder in the console on startup whenever keys are missing.
release
Better Trial Chambers 2.1.0
2.1.031 июл. 2026 г.109Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.1.0] - 2026-07-31
### Added
- **Limit how often a player can win a specific item.** Every loot item now has a "redeemable" setting with three choices: **Every reset** (the old behaviour — winnable again after each reset), **Once per chamber** (each player wins it only once from that chamber, even after it resets), or **Once ever** (each player wins it only once, ever, anywhere on the server). Once a player has won a capped item it quietly drops out of their own rolls and the other loot fills the gap — everyone else is unaffected. Perfect for making armour trims drop without letting them be farmed by resetting the same chamber. Set it in-game on an item's amount page with the new **"How often can a player get this?"** button, or add a `redeemable: once | per-chamber | per-reset` line in `loot.yml`. Existing loot is unchanged — the default matches how loot has always worked.
### Note
- **This update adds new message keys.** The plugin never overwrites your existing `messages.yml`, so after updating you may see `<missing: ...>` text on the new loot button until you refresh the file. To get the new lines: stop the server, rename `plugins/BetterTrialChambers/messages.yml` to `messages.yml.bak`, start the server (a fresh file is generated), then copy any translations back over from the `.bak`. The plugin also prints this reminder in the console on startup whenever keys are missing.
release
Better Trial Chambers 2.0.12-mc26
2.0.12-mc2630 июл. 2026 г.27Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This didn't need a version bump, because `-mc26` is not affected by this update.. nevertheless;
## [2.0.12] - 2026-07-31
### Fixed
- **Building dungeon rooms works again on Minecraft 1.21 to 1.21.4.** Saving a room that contained a jigsaw block, or importing one from a structure file, failed outright on those versions — the way the plugin asked which way a jigsaw block faces only worked on 1.21.5 and newer. It now asks in a way that works on every supported version, so doorways are picked up correctly everywhere.
release
Better Trial Chambers 2.0.12
2.0.1230 июл. 2026 г.16Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.12] - 2026-07-31
### Fixed
- **Building dungeon rooms works again on Minecraft 1.21 to 1.21.4.** Saving a room that contained a jigsaw block, or importing one from a structure file, failed outright on those versions — the way the plugin asked which way a jigsaw block faces only worked on 1.21.5 and newer. It now asks in a way that works on every supported version, so doorways are picked up correctly everywhere.
release
Better Trial Chambers 2.0.11-mc26
2.0.11-mc2626 июл. 2026 г.44Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.11] - 2026-07-26
### Fixed
- **Memory no longer stays high after a chamber resets.** Putting a chamber's blocks back has to pull that whole part of the map into memory, and the server kept it there afterwards even when nobody was anywhere near it — so on a server with a lot of chambers, memory climbed a step with every reset and never came back down. The plugin now tells the server it has finished with that area once the reset is complete. (This is the same fix 2.0.9 made for chamber discovery, now applied to resets as well. Areas players are actually in are never touched.)
- **Resets no longer flood the console.** A reset used to print a progress line for every batch of blocks it placed — on a very large chamber that meant well over a thousand near-identical lines scrolling past, which looked for all the world like the reset was stuck repeating itself. Progress is now reported at every 10%, so any reset is about nine lines however big the chamber is. If you want to check a reset really is progressing, those lines now count upwards in clear steps.
- **Reset progress could stop being reported at all.** The old progress lines only appeared when a batch happened to finish on an exact multiple of 1000 blocks. That held at the default setting, but if you had changed `global.blocks-per-tick` the console could go almost completely quiet during a reset, leaving no way to tell whether anything was happening.
release
Better Trial Chambers 2.0.11
2.0.1126 июл. 2026 г.23Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.11] - 2026-07-26
### Fixed
- **Memory no longer stays high after a chamber resets.** Putting a chamber's blocks back has to pull that whole part of the map into memory, and the server kept it there afterwards even when nobody was anywhere near it — so on a server with a lot of chambers, memory climbed a step with every reset and never came back down. The plugin now tells the server it has finished with that area once the reset is complete. (This is the same fix 2.0.9 made for chamber discovery, now applied to resets as well. Areas players are actually in are never touched.)
- **Resets no longer flood the console.** A reset used to print a progress line for every batch of blocks it placed — on a very large chamber that meant well over a thousand near-identical lines scrolling past, which looked for all the world like the reset was stuck repeating itself. Progress is now reported at every 10%, so any reset is about nine lines however big the chamber is. If you want to check a reset really is progressing, those lines now count upwards in clear steps.
- **Reset progress could stop being reported at all.** The old progress lines only appeared when a batch happened to finish on an exact multiple of 1000 blocks. That held at the default setting, but if you had changed `global.blocks-per-tick` the console could go almost completely quiet during a reset, leaving no way to tell whether anything was happening.
release
Better Trial Chambers 2.0.10-mc26
2.0.10-mc2626 июл. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.10] - 2026-07-26
### Fixed
- **Memory built up every time the plugin was reloaded.** If you reload plugins with a plugin manager (PlugManX and similar) instead of restarting the server, every reload left the previous copy of BetterTrialChambers sitting in memory for as long as the server kept running — so memory crept up step by step and never came back down. Two things were holding on to it: PlaceholderAPI kept the plugin's placeholders after it had shut down, and any menu a player still had open kept it alive as well. Both are now handed back properly when the plugin stops. Servers that restart rather than reload were never affected by this.
- **Menus now close when the plugin shuts down.** A menu left open through a reload stopped responding to clicks entirely, which looked like it had frozen. Menus now close themselves on shutdown, and anything you had put into a loot deposit chest at that moment is handed straight back to you instead of being left in a menu that no longer works.
release
Better Trial Chambers 2.0.10
2.0.1026 июл. 2026 г.11Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.10] - 2026-07-26
### Fixed
- **Memory built up every time the plugin was reloaded.** If you reload plugins with a plugin manager (PlugManX and similar) instead of restarting the server, every reload left the previous copy of BetterTrialChambers sitting in memory for as long as the server kept running — so memory crept up step by step and never came back down. Two things were holding on to it: PlaceholderAPI kept the plugin's placeholders after it had shut down, and any menu a player still had open kept it alive as well. Both are now handed back properly when the plugin stops. Servers that restart rather than reload were never affected by this.
- **Menus now close when the plugin shuts down.** A menu left open through a reload stopped responding to clicks entirely, which looked like it had frozen. Menus now close themselves on shutdown, and anything you had put into a loot deposit chest at that moment is handed straight back to you instead of being left in a menu that no longer works.
release
Better Trial Chambers 2.0.9-mc26
2.0.9-mc2624 июл. 2026 г.22Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.9] - 2026-07-24
### Fixed
- **One physical chamber could register as several chambers.** Some datapacks build one big trial chamber out of several of the game's chamber structures placed right next to each other. Each piece used to register as its own chamber — same rooms, several reset timers — and those resets would overwrite each other's shared walls. A newly-found structure that sits within a few blocks of an already-registered chamber now grows that chamber instead of creating a new one. The distance is the new `discovery.structure-merge-distance-blocks` setting (16 blocks out of the box; raise it if your datapack leaves bigger gaps between pieces). If you already have duplicates: remove them with `/trial delete <name>` and walk through the chamber once — it re-registers as a single chamber.
- **Memory no longer stays high after a chamber is discovered.** Registering a chamber has to read every block in it, which pulls all of that part of the map into memory — and the server kept it there indefinitely when no player was nearby. On small servers this looked like a memory leak: each discovered chamber pushed memory up a step and it never came back down. The plugin now tells the server it's finished with that part of the map as soon as registration completes, so the memory is freed shortly after. (Areas players are actually in are never touched.)
- **Creating a snapshot of a very large chamber could crash servers with little memory.** Snapshots used to be assembled entirely in memory before being written to disk — for a multi-million-block datapack chamber that was several copies of the whole chamber at once, enough to take down a small server. Snapshots are now written straight to disk piece by piece while the chamber is being read, so the memory needed no longer depends on how big the chamber is. Chamber resets read snapshots back the same way, piece by piece.
### Changed
- **Existing snapshot files upgrade themselves.** The first reset after this update converts each chamber's snapshot file to the new format (you'll see one `Migrated legacy snapshot …` line per chamber in the console) — nothing to do on your end, and the new files are smaller on disk too.
release
Better Trial Chambers 2.0.9
2.0.924 июл. 2026 г.17Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.9] - 2026-07-24
### Fixed
- **One physical chamber could register as several chambers.** Some datapacks build one big trial chamber out of several of the game's chamber structures placed right next to each other. Each piece used to register as its own chamber — same rooms, several reset timers — and those resets would overwrite each other's shared walls. A newly-found structure that sits within a few blocks of an already-registered chamber now grows that chamber instead of creating a new one. The distance is the new `discovery.structure-merge-distance-blocks` setting (16 blocks out of the box; raise it if your datapack leaves bigger gaps between pieces). If you already have duplicates: remove them with `/trial delete <name>` and walk through the chamber once — it re-registers as a single chamber.
- **Memory no longer stays high after a chamber is discovered.** Registering a chamber has to read every block in it, which pulls all of that part of the map into memory — and the server kept it there indefinitely when no player was nearby. On small servers this looked like a memory leak: each discovered chamber pushed memory up a step and it never came back down. The plugin now tells the server it's finished with that part of the map as soon as registration completes, so the memory is freed shortly after. (Areas players are actually in are never touched.)
- **Creating a snapshot of a very large chamber could crash servers with little memory.** Snapshots used to be assembled entirely in memory before being written to disk — for a multi-million-block datapack chamber that was several copies of the whole chamber at once, enough to take down a small server. Snapshots are now written straight to disk piece by piece while the chamber is being read, so the memory needed no longer depends on how big the chamber is. Chamber resets read snapshots back the same way, piece by piece.
### Changed
- **Existing snapshot files upgrade themselves.** The first reset after this update converts each chamber's snapshot file to the new format (you'll see one `Migrated legacy snapshot …` line per chamber in the console) — nothing to do on your end, and the new files are smaller on disk too.
release
Better Trial Chambers 2.0.8-mc26
2.0.8-mc2621 июл. 2026 г.21Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.8] - 2026-07-21
### Added
- **Shared vaults: one reward per vault for the whole server.** A new `vaults.loot-mode` setting in `config.yml` decides who gets the loot from a vault. **`PER_PLAYER`** (the default, and how the plugin has always behaved) gives every player who turns up their own reward from the same vault. The new **`SHARED`** means whoever opens a vault takes it, and it stays shut for everybody else until the chamber resets — one vault, one reward, first come first served, with your custom loot tables still applying. Players who arrive too late get a message naming whoever got there first, so it doesn't look broken. **`VANILLA`** leaves vaults entirely to Minecraft. You can also switch modes from the settings menu (`/trial menu` → Settings) or during `/trial setup`.
- **`/trial vault unlockall <chamber|all>`** — opens every vault in a chamber up again for everyone, without waiting for a reset. Mainly needed after switching to `VANILLA` mode (see below).
- **`reset.spawner-cooldown-overrides-presets`** — set this to `true` to force every trial spawner on the server, presets included, onto your server-wide rest time. Off by default, so presets keep their own times as before.
### Fixed
- **The plugin failed to load at all on recent Paper builds.** The jar contained three identical copies of one internal file (a side effect of the FastStats change in 2.0.7), and Paper's plugin remapper refuses to load any jar with duplicated entries — so BetterTrialChambers silently never appeared in `/plugins`, with nothing in the console pointing at it. If 2.0.7 seemed to do nothing at all on your server, this was why.
- **MySQL is now actually included.** `config.yml` has offered `type: MYSQL` since the very first release, but the piece that talks to MySQL was never shipped with the plugin — it only worked because Paper happens to bundle a copy of its own, which is the server's choice and not something to rely on. It's now built in, so MySQL works out of the box with nothing extra to install.
- **Admins testing vaults no longer lock themselves out of them.** Opening a vault with the `btc.bypass.cooldown` permission — which every OP has — used to still record you as having opened it, in Minecraft's own records as well as the plugin's. A few minutes of testing could therefore quietly shut those vaults for you under plain Minecraft, and in the new shared mode it would have claimed them for the entire server. Bypassing players now leave no trace on a vault at all.
### Changed
- **`vaults.per-player-loot` has been replaced by `vaults.loot-mode`.** The old setting is still read when `loot-mode` is missing, so existing setups keep working untouched — `true` behaves like `PER_PLAYER` and `false` like `VANILLA`. Its name was the problem: turning it off sounded like it would give you *shared* loot, when it actually handed vaults back to plain Minecraft, which is still one open **per player** and never shared. If shared loot is what you wanted, that's now `loot-mode: SHARED`.
- **Switching vaults back to plain Minecraft now warns you, and tells you how to finish the job.** Minecraft keeps its own record of who opened each vault, so after such a switch every player who had already opened one found it shut — no loot, and it didn't even take their key, which looked exactly like the plugin had broken vaults. The plugin now flags this when you make the change and points you at `/trial vault unlockall all` to clear those records.
- **`target-cooldown-length` in `spawner_presets.yml` is now optional.** Leave the line out and spawners from that preset follow your server-wide rest time like any ordinary spawner — which is usually what you want, since you then set the time once in `config.yml`. Presets that *do* state a time keep winning over the global setting, as before; that rule was never written down anywhere, which is why the global setting looked like it was being ignored. It is now explained in `config.yml`, in `spawner_presets.yml` and in the documentation.
- **The download is a fifth smaller** — 12 MB down to 9.5 MB, even with MySQL support added. The database engine used to bundle a copy for every processor type it supports, including Android, FreeBSD, 32-bit machines and mainframes. It now ships only what a Minecraft server actually runs on: 64-bit Linux, 64-bit ARM Linux (Oracle Cloud, AWS Graviton, 64-bit Raspberry Pi OS), 64-bit Windows for people hosting from their own machine, and Apple Silicon for testing on a Mac.
- Plainer wording throughout the vault and spawner-rest-time sections of `config.yml`, and the database section now explains in plain words when you'd pick MySQL over the default.
release
Better Trial Chambers 2.0.8
2.0.821 июл. 2026 г.15Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.8] - 2026-07-21
### Added
- **Shared vaults: one reward per vault for the whole server.** A new `vaults.loot-mode` setting in `config.yml` decides who gets the loot from a vault. **`PER_PLAYER`** (the default, and how the plugin has always behaved) gives every player who turns up their own reward from the same vault. The new **`SHARED`** means whoever opens a vault takes it, and it stays shut for everybody else until the chamber resets — one vault, one reward, first come first served, with your custom loot tables still applying. Players who arrive too late get a message naming whoever got there first, so it doesn't look broken. **`VANILLA`** leaves vaults entirely to Minecraft. You can also switch modes from the settings menu (`/trial menu` → Settings) or during `/trial setup`.
- **`/trial vault unlockall <chamber|all>`** — opens every vault in a chamber up again for everyone, without waiting for a reset. Mainly needed after switching to `VANILLA` mode (see below).
- **`reset.spawner-cooldown-overrides-presets`** — set this to `true` to force every trial spawner on the server, presets included, onto your server-wide rest time. Off by default, so presets keep their own times as before.
### Fixed
- **The plugin failed to load at all on recent Paper builds.** The jar contained three identical copies of one internal file (a side effect of the FastStats change in 2.0.7), and Paper's plugin remapper refuses to load any jar with duplicated entries — so BetterTrialChambers silently never appeared in `/plugins`, with nothing in the console pointing at it. If 2.0.7 seemed to do nothing at all on your server, this was why.
- **MySQL is now actually included.** `config.yml` has offered `type: MYSQL` since the very first release, but the piece that talks to MySQL was never shipped with the plugin — it only worked because Paper happens to bundle a copy of its own, which is the server's choice and not something to rely on. It's now built in, so MySQL works out of the box with nothing extra to install.
- **Admins testing vaults no longer lock themselves out of them.** Opening a vault with the `btc.bypass.cooldown` permission — which every OP has — used to still record you as having opened it, in Minecraft's own records as well as the plugin's. A few minutes of testing could therefore quietly shut those vaults for you under plain Minecraft, and in the new shared mode it would have claimed them for the entire server. Bypassing players now leave no trace on a vault at all.
### Changed
- **`vaults.per-player-loot` has been replaced by `vaults.loot-mode`.** The old setting is still read when `loot-mode` is missing, so existing setups keep working untouched — `true` behaves like `PER_PLAYER` and `false` like `VANILLA`. Its name was the problem: turning it off sounded like it would give you *shared* loot, when it actually handed vaults back to plain Minecraft, which is still one open **per player** and never shared. If shared loot is what you wanted, that's now `loot-mode: SHARED`.
- **Switching vaults back to plain Minecraft now warns you, and tells you how to finish the job.** Minecraft keeps its own record of who opened each vault, so after such a switch every player who had already opened one found it shut — no loot, and it didn't even take their key, which looked exactly like the plugin had broken vaults. The plugin now flags this when you make the change and points you at `/trial vault unlockall all` to clear those records.
- **`target-cooldown-length` in `spawner_presets.yml` is now optional.** Leave the line out and spawners from that preset follow your server-wide rest time like any ordinary spawner — which is usually what you want, since you then set the time once in `config.yml`. Presets that *do* state a time keep winning over the global setting, as before; that rule was never written down anywhere, which is why the global setting looked like it was being ignored. It is now explained in `config.yml`, in `spawner_presets.yml` and in the documentation.
- **The download is a fifth smaller** — 12 MB down to 9.5 MB, even with MySQL support added. The database engine used to bundle a copy for every processor type it supports, including Android, FreeBSD, 32-bit machines and mainframes. It now ships only what a Minecraft server actually runs on: 64-bit Linux, 64-bit ARM Linux (Oracle Cloud, AWS Graviton, 64-bit Raspberry Pi OS), 64-bit Windows for people hosting from their own machine, and Apple Silicon for testing on a Mac.
- Plainer wording throughout the vault and spawner-rest-time sections of `config.yml`, and the database section now explains in plain words when you'd pick MySQL over the default.
release
Better Trial Chambers 2.0.7-mc26
2.0.7-mc2620 июл. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.7] - 2026-07-19
### Changed
- **Anonymous usage metrics now use [FastStats](https://faststats.dev) instead of bStats.** The same handful of aggregate numbers are collected as before — which database backend you run, whether auto-discovery is on, glow mode, a rough chamber-count bracket, and which premium add-ons are installed. **No player data.** `metrics.enabled: false` in `config.yml` still switches it off for this plugin, and there's still a server-wide off switch for every plugin that uses it: `enabled=false` in `plugins/faststats/config.properties` (the equivalent of the old `plugins/bStats/config.yml`).
- **Nothing is sent the first time you start up.** FastStats writes its opt-out file on the first run and waits until the next server restart before sending anything, so you get the chance to turn it off first. A new install showing no data for one boot is expected.
- BTC no longer writes to `plugins/bStats/`. If no other plugin on your server uses bStats, that folder can be deleted.
### Added
- **Optional error reporting — off unless you turn it on.** Set `metrics.error-reporting: true` in `config.yml` and BetterTrialChambers will report its own errors automatically, so bugs get found and fixed without you having to notice and file a report. It stays off by default because sending error reports is a bigger step than anonymous counters, so it should be your choice. When enabled: **only this plugin's own errors are sent** — other plugins' errors are never captured, even when they happen at the same moment — and before anything leaves your server, IP addresses, file paths containing your username, database credentials and player UUIDs are stripped out and replaced with placeholders. Player names, chat, inventories and world data are never included, and routine shutdown/reload cancellations are filtered out rather than reported as errors. To switch it off across every FastStats plugin at once, set `submitErrors=false` in `plugins/faststats/config.properties`.
release
Better Trial Chambers 2.0.7
2.0.720 июл. 2026 г.13Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.7] - 2026-07-19
### Changed
- **Anonymous usage metrics now use [FastStats](https://faststats.dev) instead of bStats.** The same handful of aggregate numbers are collected as before — which database backend you run, whether auto-discovery is on, glow mode, a rough chamber-count bracket, and which premium add-ons are installed. **No player data.** `metrics.enabled: false` in `config.yml` still switches it off for this plugin, and there's still a server-wide off switch for every plugin that uses it: `enabled=false` in `plugins/faststats/config.properties` (the equivalent of the old `plugins/bStats/config.yml`).
- **Nothing is sent the first time you start up.** FastStats writes its opt-out file on the first run and waits until the next server restart before sending anything, so you get the chance to turn it off first. A new install showing no data for one boot is expected.
- BTC no longer writes to `plugins/bStats/`. If no other plugin on your server uses bStats, that folder can be deleted.
### Added
- **Optional error reporting — off unless you turn it on.** Set `metrics.error-reporting: true` in `config.yml` and BetterTrialChambers will report its own errors automatically, so bugs get found and fixed without you having to notice and file a report. It stays off by default because sending error reports is a bigger step than anonymous counters, so it should be your choice. When enabled: **only this plugin's own errors are sent** — other plugins' errors are never captured, even when they happen at the same moment — and before anything leaves your server, IP addresses, file paths containing your username, database credentials and player UUIDs are stripped out and replaced with placeholders. Player names, chat, inventories and world data are never included, and routine shutdown/reload cancellations are filtered out rather than reported as errors. To switch it off across every FastStats plugin at once, set `submitErrors=false` in `plugins/faststats/config.properties`.
release
Better Trial Chambers 2.0.4-mc26
2.0.4-mc2619 июл. 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.4] - 2026-07-19
### Changed
- **"The chamber has been reset!" no longer goes to the whole server.** It now goes to the players who were actually inside that chamber when it reset. The message never said _which_ chamber it meant, so for everyone else it was an unidentifiable line of chat — and on servers with lots of auto-discovered chambers, resets are deliberately spread out to protect performance, which turned it into a steady trickle of repeated messages for everybody. Set `global.reset-complete-audience: server` in `config.yml` to get the old behaviour back (and add `{chamber}` to the `chamber-reset-complete` message in `messages.yml` so it names the chamber). `global.reset-complete-alert: false` still switches the message off entirely.
### Added
- **Optional permission for the reset message.** Set `global.reset-complete-permission` to any permission node (for example `btc.notify.reset`) and only players with it will receive the message. Works with either audience setting. Empty by default, meaning no permission is needed.
release
Better Trial Chambers 2.0.4
2.0.419 июл. 2026 г.20Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.4] - 2026-07-19
### Changed
- **"The chamber has been reset!" no longer goes to the whole server.** It now goes to the players who were actually inside that chamber when it reset. The message never said _which_ chamber it meant, so for everyone else it was an unidentifiable line of chat — and on servers with lots of auto-discovered chambers, resets are deliberately spread out to protect performance, which turned it into a steady trickle of repeated messages for everybody. Set `global.reset-complete-audience: server` in `config.yml` to get the old behaviour back (and add `{chamber}` to the `chamber-reset-complete` message in `messages.yml` so it names the chamber). `global.reset-complete-alert: false` still switches the message off entirely.
### Added
- **Optional permission for the reset message.** Set `global.reset-complete-permission` to any permission node (for example `btc.notify.reset`) and only players with it will receive the message. Works with either audience setting. Empty by default, meaning no permission is needed.
release
Better Trial Chambers 2.0.3-mc26
2.0.3-mc2618 июл. 2026 г.13Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.3] - 2026-07-19
### Fixed
- **Choosing a different loot table for a chamber now actually does something.** If you used "Loot Table Overrides" to point a chamber at another table, the chamber's Normal/Ominous Loot buttons carried on showing — and editing — the chamber's own `chamber-<name>` table instead. So your edits went into a table nothing was using, and the vaults kept handing out whatever the override pointed at. It looked like the plugin had glued a table to the chamber based on its name and refused to let go. Both buttons now follow the override, so what you see on the button is what the vaults actually give out. Nothing changes for chambers without an override.
### Changed
- **The loot buttons now tell you when a chamber is sharing a table.** When a chamber has been pointed at another loot table, its Normal/Ominous Loot buttons say so, and warn that other chambers may be using that same table — editing it there changes it for all of them. The "Loot Table Overrides" button also explains in plain words what it does, and that leaving it on `(default)` gives the chamber its own private loot table.
release
Better Trial Chambers 2.0.3
2.0.318 июл. 2026 г.15Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.3] - 2026-07-19
### Fixed
- **Choosing a different loot table for a chamber now actually does something.** If you used "Loot Table Overrides" to point a chamber at another table, the chamber's Normal/Ominous Loot buttons carried on showing — and editing — the chamber's own `chamber-<name>` table instead. So your edits went into a table nothing was using, and the vaults kept handing out whatever the override pointed at. It looked like the plugin had glued a table to the chamber based on its name and refused to let go. Both buttons now follow the override, so what you see on the button is what the vaults actually give out. Nothing changes for chambers without an override.
### Changed
- **The loot buttons now tell you when a chamber is sharing a table.** When a chamber has been pointed at another loot table, its Normal/Ominous Loot buttons say so, and warn that other chambers may be using that same table — editing it there changes it for all of them. The "Loot Table Overrides" button also explains in plain words what it does, and that leaving it on `(default)` gives the chamber its own private loot table.
release
Better Trial Chambers 2.0.2-mc26
2.0.2-mc2618 июл. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.2] - 2026-07-17
### Added
- **Independent drop-chance loot mode.** Loot pools can now roll in one of two modes. The classic **weighted** mode (default, unchanged) makes a set number of draws per opening and picks one item per draw by relative weight. The new **independent** mode gives every item its own absolute 0-100% drop chance — each item rolls on its own, chances don't have to add up to 100%, and an optional **Max Items** cap limits how many drop per opening. Much easier to reason about for large tables (e.g. 100+ items) where balancing relative weights is impractical. Set per table/pool with `mode: independent` (and optional `max-items: N`) in loot.yml, or toggle it in the loot editor GUI. Existing tables are untouched and keep behaving exactly as before.
### Changed
- **Loot editor shows the weight number while an item is enabled.** Previously the raw weight was only visible after disabling an entry, so tuning weights meant middle-clicking (which toggles the item off) to see the value. Enabled weighted items now show `Weight: X (≈Y% per draw)` directly, and the weight controls are relabelled to say "weight" (or "% chance" in independent mode). In independent mode each item shows its own drop chance.
- **Clarified the `vaults.per-player-loot` config option.** Its comment now spells out that it's a master switch — when off, the plugin doesn't manage vaults at all and they open with vanilla Minecraft loot, ignoring custom loot tables. (This was the cause of "my custom loot table is ignored" reports where the setting had been turned off.)
release
Better Trial Chambers 2.0.2
2.0.218 июл. 2026 г.15Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.2] - 2026-07-17
### Added
- **Independent drop-chance loot mode.** Loot pools can now roll in one of two modes. The classic **weighted** mode (default, unchanged) makes a set number of draws per opening and picks one item per draw by relative weight. The new **independent** mode gives every item its own absolute 0-100% drop chance — each item rolls on its own, chances don't have to add up to 100%, and an optional **Max Items** cap limits how many drop per opening. Much easier to reason about for large tables (e.g. 100+ items) where balancing relative weights is impractical. Set per table/pool with `mode: independent` (and optional `max-items: N`) in loot.yml, or toggle it in the loot editor GUI. Existing tables are untouched and keep behaving exactly as before.
### Changed
- **Loot editor shows the weight number while an item is enabled.** Previously the raw weight was only visible after disabling an entry, so tuning weights meant middle-clicking (which toggles the item off) to see the value. Enabled weighted items now show `Weight: X (≈Y% per draw)` directly, and the weight controls are relabelled to say "weight" (or "% chance" in independent mode). In independent mode each item shows its own drop chance.
- **Clarified the `vaults.per-player-loot` config option.** Its comment now spells out that it's a master switch — when off, the plugin doesn't manage vaults at all and they open with vanilla Minecraft loot, ignoring custom loot tables. (This was the cause of "my custom loot table is ignored" reports where the setting had been turned off.)
release
Better Trial Chambers 2.0.1-mc26
2.0.1-mc2617 июл. 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.1] - 2026-07-17
### Fixed
- **Loot editor: tables with more than 36 entries are now paginated.** The editor only ever rendered the first 36 entries (weighted first, then guaranteed) and silently hid the rest — they stayed in the loot table and kept dropping in-game, but couldn't be viewed or edited from the GUI. When a table overflows one page, Previous/Next arrows now appear in the gap row above the action buttons.
release
Better Trial Chambers 2.0.1
2.0.117 июл. 2026 г.16Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.1] - 2026-07-17
### Fixed
- **Loot editor: tables with more than 36 entries are now paginated.** The editor only ever rendered the first 36 entries (weighted first, then guaranteed) and silently hid the rest — they stayed in the loot table and kept dropping in-game, but couldn't be viewed or edited from the GUI. When a table overflows one page, Previous/Next arrows now appear in the gap row above the action buttons.
release
Better Trial Chambers 2.0.0-mc26
2.0.0-mc2615 июл. 2026 г.41Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
## [2.0.0] - 2026-07-15
### Changed
- **The plugin is now Better Trial Chambers.** Same plugin, new name — TrialChamberPro was always 100% free, and the name kept suggesting otherwise. The project now lives at https://github.com/ESMP-FUN/BetterTrialChambers.
- Main command is now `/trial` (aliases: `/btc`, `/bettertrialchambers`, `/chamber`). The old `/tcp` still works as a legacy alias.
- Permissions moved from `tcp.*` to `btc.*`. Existing `tcp.*` grants keep working — each old node is a legacy alias that grants its `btc.*` counterpart — but update your permission plugin when convenient.
- PlaceholderAPI placeholders are now `%btc_*%`; the old `%tcp_*%` forms keep resolving.
- Internal packages moved to `com.esmpfun.bettertrialchambers` (plugin/module developers: update imports; the premium modules ship matching updates).
### Added
- **Automatic upgrade from TrialChamberPro.** On first start, if `plugins/TrialChamberPro/` exists, its config, database, snapshots and dungeon templates are copied to `plugins/BetterTrialChambers/` automatically. The old folder is kept as a backup. World data (spawner presets, vault drop ownership) and database tables are untouched and keep working as-is.
### Fixed
- **Spawner presets: `total-mobs`, `simultaneous-mobs`, `total-mobs-added-per-player`, `simultaneous-mobs-added-per-player`, `ticks-between-spawn` and `spawn-range` were silently ignored.** These six fields were written at the top level of the item's `block_entity_data`, but vanilla only reads them from *inside* the trial spawner configuration compound (`normal_config`/`ominous_config`) — and a preset's config is a datapack reference string that can't carry per-field overrides, so they can't be expressed in item NBT at all. Preset spawners therefore always ran with the datapack/vanilla values (6 total mobs, 2 simultaneous, 40-tick spawn interval, 4-block range). `SpawnerPresetPlaceListener` now applies the overrides to the placed block via Paper's `TrialSpawnerConfiguration` API, layered on top of the resolved datapack config. Works retroactively for preset items handed out before this fix (the place-time lookup uses the item's preset tag); spawners placed *before* updating need to be broken and re-placed once.
- **Spawner presets: `reset.wild-spawner-cooldown-minutes` no longer overrides a preset spawner's `target-cooldown-length`.** Preset spawners placed outside a registered chamber count as wild spawners, so when the server-wide wild cooldown was enabled (≥ 0) it silently replaced the cooldown the preset had explicitly configured — both at wave start and at wave completion. Both paths now skip spawners carrying the preset tag; a preset's cooldown is governed solely by its `target-cooldown-length`.
- **Spawner presets: chamber resets no longer override a preset spawner's `target-cooldown-length` either.** `ResetManager` applied the per-chamber / `reset.spawner-cooldown-minutes` cooldown to every trial spawner in the chamber, including preset-sourced ones — the same silent override as the wild-spawner case above. Preset-tagged spawners now keep their configured cooldown length; tracked-player clearing and the one-shot post-reset cooldown clear still apply to them so chamber resets behave normally.
- **Trial spawners restored into a recreated block entity no longer come back dead.** Snapshots only captured `ominous` / cooldown / player range, so whenever the restore had to recreate the block entity from scratch — the spawner block was destroyed before the reset, or a dungeon room template was stamped into what used to be air — the spawner came back with the vanilla default configuration: empty spawn potentials (permanently inactive) and no preset tag. Snapshots now also capture both spawner configurations (spawn potentials, mob counts, spawn interval/range, reward loot tables) and the preset tag; the restore rebuilds them **only** when the live block entity has lost its configuration, so surviving spawners keep their full vanilla data (including `equipment`, which Bukkit's `SpawnerEntry` can't round-trip). Existing snapshot files keep working — re-create a chamber's snapshot to pick up the richer capture.
release
Better Trial Chambers 2.0.0
2.0.015 июл. 2026 г.21Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [2.0.0] - 2026-07-15
### Changed
- **The plugin is now Better Trial Chambers.** Same plugin, new name — TrialChamberPro was always 100% free, and the name kept suggesting otherwise. The project now lives at https://github.com/ESMP-FUN/BetterTrialChambers.
- Main command is now `/trial` (aliases: `/btc`, `/bettertrialchambers`, `/chamber`). The old `/tcp` still works as a legacy alias.
- Permissions moved from `tcp.*` to `btc.*`. Existing `tcp.*` grants keep working — each old node is a legacy alias that grants its `btc.*` counterpart — but update your permission plugin when convenient.
- PlaceholderAPI placeholders are now `%btc_*%`; the old `%tcp_*%` forms keep resolving.
- Internal packages moved to `com.esmpfun.bettertrialchambers` (plugin/module developers: update imports; the premium modules ship matching updates).
### Added
- **Automatic upgrade from TrialChamberPro.** On first start, if `plugins/TrialChamberPro/` exists, its config, database, snapshots and dungeon templates are copied to `plugins/BetterTrialChambers/` automatically. The old folder is kept as a backup. World data (spawner presets, vault drop ownership) and database tables are untouched and keep working as-is.
### Fixed
- **Spawner presets: `total-mobs`, `simultaneous-mobs`, `total-mobs-added-per-player`, `simultaneous-mobs-added-per-player`, `ticks-between-spawn` and `spawn-range` were silently ignored.** These six fields were written at the top level of the item's `block_entity_data`, but vanilla only reads them from *inside* the trial spawner configuration compound (`normal_config`/`ominous_config`) — and a preset's config is a datapack reference string that can't carry per-field overrides, so they can't be expressed in item NBT at all. Preset spawners therefore always ran with the datapack/vanilla values (6 total mobs, 2 simultaneous, 40-tick spawn interval, 4-block range). `SpawnerPresetPlaceListener` now applies the overrides to the placed block via Paper's `TrialSpawnerConfiguration` API, layered on top of the resolved datapack config. Works retroactively for preset items handed out before this fix (the place-time lookup uses the item's preset tag); spawners placed *before* updating need to be broken and re-placed once.
- **Spawner presets: `reset.wild-spawner-cooldown-minutes` no longer overrides a preset spawner's `target-cooldown-length`.** Preset spawners placed outside a registered chamber count as wild spawners, so when the server-wide wild cooldown was enabled (≥ 0) it silently replaced the cooldown the preset had explicitly configured — both at wave start and at wave completion. Both paths now skip spawners carrying the preset tag; a preset's cooldown is governed solely by its `target-cooldown-length`.
- **Spawner presets: chamber resets no longer override a preset spawner's `target-cooldown-length` either.** `ResetManager` applied the per-chamber / `reset.spawner-cooldown-minutes` cooldown to every trial spawner in the chamber, including preset-sourced ones — the same silent override as the wild-spawner case above. Preset-tagged spawners now keep their configured cooldown length; tracked-player clearing and the one-shot post-reset cooldown clear still apply to them so chamber resets behave normally.
- **Trial spawners restored into a recreated block entity no longer come back dead.** Snapshots only captured `ominous` / cooldown / player range, so whenever the restore had to recreate the block entity from scratch — the spawner block was destroyed before the reset, or a dungeon room template was stamped into what used to be air — the spawner came back with the vanilla default configuration: empty spawn potentials (permanently inactive) and no preset tag. Snapshots now also capture both spawner configurations (spawn potentials, mob counts, spawn interval/range, reward loot tables) and the preset tag; the restore rebuilds them **only** when the live block entity has lost its configuration, so surviving spawners keep their full vanilla data (including `equipment`, which Bukkit's `SpawnerEntry` can't round-trip). Existing snapshot files keep working — re-create a chamber's snapshot to pick up the richer capture.
release
TrialChamberPro 1.8.1-mc26
1.8.1-mc269 июл. 2026 г.51Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.8.1] - 2026-07-10
### Added
- **World exclusion.** New `global.excluded-worlds` list in config.yml keeps TCP inactive in named worlds — useful when a second overworld-type world has Trial Chambers you want to leave vanilla. In an excluded world, auto-discovery never registers chambers, `/tcp generate` and `/tcp dungeon generate` are refused, and wild trial spawners get no boss bars or wave tracking. Chambers registered before a world was excluded keep working; remove them with `/tcp delete <name>`.
### Changed
- Updated the bundled PluginPulse updater to v0.8.0 (configurable source order, authenticated private-repo updates, Jenkins update source).
[1.8.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.8.0...v1.8.1
release
TrialChamberPro 1.8.1
1.8.19 июл. 2026 г.43Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.8.1] - 2026-07-10
### Added
- **World exclusion.** New `global.excluded-worlds` list in config.yml keeps TCP inactive in named worlds — useful when a second overworld-type world has Trial Chambers you want to leave vanilla. In an excluded world, auto-discovery never registers chambers, `/tcp generate` and `/tcp dungeon generate` are refused, and wild trial spawners get no boss bars or wave tracking. Chambers registered before a world was excluded keep working; remove them with `/tcp delete <name>`.
### Changed
- Updated the bundled PluginPulse updater to v0.8.0 (configurable source order, authenticated private-repo updates, Jenkins update source).
[1.8.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.8.0...v1.8.1
release
TrialChamberPro 1.8.0-mc26
1.8.0-mc265 июл. 2026 г.46Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.8.0] - 2026-07-05
### Added
- **Built-in updater with one-command installs.** The old notify-only update check is replaced by [PluginPulse](https://github.com/darkstarworks/PluginPulse): updates are now checked on Modrinth first (GitHub Releases as fallback), and a new `/tcp update` command lets admins act on them — `check`, `download` (fetches the new jar, verifies its checksum, backs up the current jar, and stages it in the server's update folder so it installs on the next restart), `restore` (roll back to the previous jar), `ignore <version>`, and `status`. Behaviour is controlled by the new `update` section in config.yml: `mode` (`check-only` / `notify` / `download` / `auto-stage`), `check-interval-hours`, and `require-hash`. Servers running the `-mc26` build automatically follow `-mc26` releases. Nothing is ever downloaded in the default `notify` mode.
- **Optional no-restart updates.** With `update.allow-hot-reload: true`, `/tcp update apply` swaps a staged, checksum-verified update in-place — the old version is unloaded, the jar replaced, and the new version enabled live (verified end-to-end on Paper 1.21.7). Refused on Folia and while other plugins depend on TCP; if the new version fails to load, TCP rolls back to the automatic backup. Off by default — restarting remains the recommended way to apply updates.
- (if you don't use any of the premium modules, you are safe to use `allow-hot-reload: true` -> `/tcp update apply`)
### Changed
- Update checks are rate-limit friendly: check state persists across restarts in `plugins/TrialChamberPro/pluginpulse/`, and fleet servers no longer check in lockstep at startup.
[1.8.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.3...v1.8.0
release
TrialChamberPro 1.8.0
1.8.05 июл. 2026 г.42Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.8.0] - 2026-07-05
### Added
- **Built-in updater with one-command installs.** The old notify-only update check is replaced by [PluginPulse](https://github.com/darkstarworks/PluginPulse): updates are now checked on Modrinth first (GitHub Releases as fallback), and a new `/tcp update` command lets admins act on them — `check`, `download` (fetches the new jar, verifies its checksum, backs up the current jar, and stages it in the server's update folder so it installs on the next restart), `restore` (roll back to the previous jar), `ignore <version>`, and `status`. Behaviour is controlled by the new `update` section in config.yml: `mode` (`check-only` / `notify` / `download` / `auto-stage`), `check-interval-hours`, and `require-hash`. Servers running the `-mc26` build automatically follow `-mc26` releases. Nothing is ever downloaded in the default `notify` mode.
- **Optional no-restart updates.** With `update.allow-hot-reload: true`, `/tcp update apply` swaps a staged, checksum-verified update in-place — the old version is unloaded, the jar replaced, and the new version enabled live (verified end-to-end on Paper 1.21.7). Refused on Folia and while other plugins depend on TCP; if the new version fails to load, TCP rolls back to the automatic backup. Off by default — restarting remains the recommended way to apply updates.
- (if you don't use any of the premium modules, you are safe to use `allow-hot-reload: true` -> `/tcp update apply`)
### Changed
- Update checks are rate-limit friendly: check state persists across restarts in `plugins/TrialChamberPro/pluginpulse/`, and fleet servers no longer check in lockstep at startup.
[1.8.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.3...v1.8.0
release
TrialChamberPro 1.7.3-mc26
1.7.3-mc264 июл. 2026 г.32Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.7.3] - 2026-07-04
### Fixed
- **Spawner-wave counter can no longer be stalled by a dead entity when a custom-mob provider fails mid-replacement.** In both the chamber replace-after-spawn path and the wild-spawner resolver path, a provider that threw *after* the vanilla mob was removed caused the already-removed entity to be recorded into the wave — the counter then hung until the periodic sweep caught it. A failure after removal now records nothing (the wave undercounts that one spawn and completes normally); only failures *before* removal fall back to vanilla tracking.
[1.7.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.2...v1.7.3
release
TrialChamberPro 1.7.3
1.7.34 июл. 2026 г.25Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.7.3] - 2026-07-04
### Fixed
- **Spawner-wave counter can no longer be stalled by a dead entity when a custom-mob provider fails mid-replacement.** In both the chamber replace-after-spawn path and the wild-spawner resolver path, a provider that threw *after* the vanilla mob was removed caused the already-removed entity to be recorded into the wave — the counter then hung until the periodic sweep caught it. A failure after removal now records nothing (the wave undercounts that one spawn and completes normally); only failures *before* removal fall back to vanilla tracking.
[1.7.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.2...v1.7.3
release
TrialChamberPro 1.7.2-mc26
1.7.2-mc263 июл. 2026 г.16Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.7.2] - 2026-07-03
### Fixed
- **Chamber resets no longer erase decorations.** Snapshots only knew how to capture four block types (spawners, vaults, pots, chests) — everything else restored as a blank block, so sign text, player-head skins, banner patterns, lectern books, jukebox discs, chiseled-bookshelf contents, and suspicious-block items were silently wiped on every reset. All of these are now captured and restored faithfully, in chamber snapshots AND in captured/imported dungeon rooms. Re-run `/tcp snapshot create <chamber>` on decorated chambers to capture them with the new fidelity.
- **Opening a vault can no longer consume the wrong item.** The key was taken from whatever the player was holding at the moment loot was delivered — scroll your hotbar in the split second after clicking and the plugin ate your sword instead of the key. The key is now consumed from the slot that held it at click time (or wherever the key stack actually is), and never from a non-key item.
- **Logging out — or crashing — while spectating no longer strands you in spectator mode.** Quitting mid-spectate now restores your gamemode and position immediately, and a server crash/restart mid-spectate is recovered on your next join (the restore data survives in your player file).
- **Statistics no longer lose counts on shared MySQL databases.** Increments were read-modify-write, so two servers writing at once could drop each other's updates; every counter now increments atomically in the database — groundwork for cross-server networks.
- **Key-to-reopen can't burn keys on a broken loot table.** With `reopen-cost-keys` of 2+, a missing/typo'd loot table used to take part of the payment and give nothing; the table is now validated before any keys are consumed.
- **Vault loot ejection (`drop-loot-at-vault`) now drops items on the vault's own region thread** — fixes a potential cross-region error on Folia when the opener moved away during the open.
- **Deleting a chamber now clears its wave-tracking state** (active boss bars, clear-cycle progress, spawner caches) instead of leaving stale entries behind.
- `/tcp generate` fallback volume limit aligned with the rest of the plugin (750,000 — was 500,000 in one code path when the config key is absent).
- **Explosions from outside a chamber can no longer destroy blocks inside it.** The explosion filter only protected blocks when the blast *center* was inside a chamber — a creeper or TNT detonating just outside the wall blew chamber blocks up unprotected. Protection is now checked per affected block, and block-sourced explosions (beds/respawn anchors in the wrong dimension) — which previously bypassed chamber protection entirely — are covered too.
- **Pausing a chamber now actually stops a reset that's already counting down.** A chamber paused mid-countdown still reset when the timer fired, and its "resets in 30 seconds!" warnings kept broadcasting; pause (and deletion) now cancel the scheduled reset, its warnings, and any parked confirmation.
- **Per-player container copies are saved if the server stops while a player has one open** — previously the shutdown could discard the pending save, losing whatever they'd taken out or left in.
- **Teleporting across a chamber boundary now counts as entering/leaving.** Teleports don't fire movement events, so `/tp`, `/home`, ender pearls — and the reset eviction itself — left stale "in chamber" tracking (time kept accruing, exit never fired). Logging out inside a chamber and back in also registers the entry immediately now.
- **Chamber names are no longer suggested in tab-completion to players without admin permission** (they became visible to everyone when 1.7.1 opened `/tcp` for stats/leaderboard).
- The post-reset event now reports the real number of restored blocks instead of the chamber's full volume.
[1.7.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.1...v1.7.2
release
TrialChamberPro 1.7.2
1.7.23 июл. 2026 г.18Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.7.2] - 2026-07-03
### Fixed
- **Chamber resets no longer erase decorations.** Snapshots only knew how to capture four block types (spawners, vaults, pots, chests) — everything else restored as a blank block, so sign text, player-head skins, banner patterns, lectern books, jukebox discs, chiseled-bookshelf contents, and suspicious-block items were silently wiped on every reset. All of these are now captured and restored faithfully, in chamber snapshots AND in captured/imported dungeon rooms. Re-run `/tcp snapshot create <chamber>` on decorated chambers to capture them with the new fidelity.
- **Opening a vault can no longer consume the wrong item.** The key was taken from whatever the player was holding at the moment loot was delivered — scroll your hotbar in the split second after clicking and the plugin ate your sword instead of the key. The key is now consumed from the slot that held it at click time (or wherever the key stack actually is), and never from a non-key item.
- **Logging out — or crashing — while spectating no longer strands you in spectator mode.** Quitting mid-spectate now restores your gamemode and position immediately, and a server crash/restart mid-spectate is recovered on your next join (the restore data survives in your player file).
- **Statistics no longer lose counts on shared MySQL databases.** Increments were read-modify-write, so two servers writing at once could drop each other's updates; every counter now increments atomically in the database — groundwork for cross-server networks.
- **Key-to-reopen can't burn keys on a broken loot table.** With `reopen-cost-keys` of 2+, a missing/typo'd loot table used to take part of the payment and give nothing; the table is now validated before any keys are consumed.
- **Vault loot ejection (`drop-loot-at-vault`) now drops items on the vault's own region thread** — fixes a potential cross-region error on Folia when the opener moved away during the open.
- **Deleting a chamber now clears its wave-tracking state** (active boss bars, clear-cycle progress, spawner caches) instead of leaving stale entries behind.
- `/tcp generate` fallback volume limit aligned with the rest of the plugin (750,000 — was 500,000 in one code path when the config key is absent).
- **Explosions from outside a chamber can no longer destroy blocks inside it.** The explosion filter only protected blocks when the blast *center* was inside a chamber — a creeper or TNT detonating just outside the wall blew chamber blocks up unprotected. Protection is now checked per affected block, and block-sourced explosions (beds/respawn anchors in the wrong dimension) — which previously bypassed chamber protection entirely — are covered too.
- **Pausing a chamber now actually stops a reset that's already counting down.** A chamber paused mid-countdown still reset when the timer fired, and its "resets in 30 seconds!" warnings kept broadcasting; pause (and deletion) now cancel the scheduled reset, its warnings, and any parked confirmation.
- **Per-player container copies are saved if the server stops while a player has one open** — previously the shutdown could discard the pending save, losing whatever they'd taken out or left in.
- **Teleporting across a chamber boundary now counts as entering/leaving.** Teleports don't fire movement events, so `/tp`, `/home`, ender pearls — and the reset eviction itself — left stale "in chamber" tracking (time kept accruing, exit never fired). Logging out inside a chamber and back in also registers the entry immediately now.
- **Chamber names are no longer suggested in tab-completion to players without admin permission** (they became visible to everyone when 1.7.1 opened `/tcp` for stats/leaderboard).
- The post-reset event now reports the real number of restored blocks instead of the chamber's full volume.
[1.7.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.1...v1.7.2
release
TrialChamberPro 1.7.1-mc26
1.7.1-mc263 июл. 2026 г.17Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.7.1] - 2026-07-03
### Fixed
- **Ominous Bottles in loot tables are now the real `minecraft:ominous_bottle` item.** Previously, every example and doc taught a workaround — a renamed `POTION` with Bad Omen added as a custom effect. It granted Bad Omen when drunk, but it was the wrong item: potion texture, "Uncraftable Potion" underneath the custom name, and it didn't stack with bottles from vanilla vaults. Use `type: OMINOUS_BOTTLE` with `potion-level: 0-4` (Bad Omen I–V), or the new `potion-level-min` / `potion-level-max` to roll the level randomly per drop exactly like vanilla vaults do (normal vaults use 0–1, ominous vaults 2–4). All bundled examples and the vanilla-accurate tables now use the real item; old workaround configs keep functioning.
- **Editing loot in the GUI no longer strips advanced fields from hand-written loot.yml entries.** Saving from the loot editor rewrites the whole file, and the writer only knew a subset of the schema — so potion types/levels, ominous flags, effect durations, enchantment ranges, random-enchantment pools, durability ranges, and goat-horn instruments were silently deleted from every hand-authored entry, and `VANILLA_TABLE` entries were corrupted to `type: AIR`. Every field now round-trips intact. (This was also quietly manufacturing the "legacy entries with no NBT" that `/tcp loot audit` flags.)
- **A bad loot entry can no longer kill the whole vault roll.** Reversed `amount-min`/`amount-max` or `min-rolls`/`max-rolls` ranges used to throw at generation time (player gets nothing); an out-of-range ominous `potion-level` did the same. These are now fixed up at load with a console warning.
- **Typo'd enchantment names are now reported instead of silently skipped** in all three formats (`enchantments`, `enchantment-ranges`, `random-enchantment-pool`); namespaced ids from datapacks (`somepack:blaze`) are accepted too.
- **A pool whose entries all have `weight: 0` no longer drops its first entry every roll** — zero weight now reliably means "never drops".
- **Splash potions with a custom level/duration now last as long as drinkable ones** (the old 75% multiplier was the pre-1.9 rule); lingering (¼) and tipped arrows (⅛) were already correct.
- **Turtle Master potions with a custom level keep both effects** — previously only the first (Resistance was dropped).
- **Loot item names and lore now support hex colors and MiniMessage tags** (same syntax as messages.yml) and no longer render with Minecraft's forced italics.
- **Non-OP players can now actually use `/tcp stats` and `/tcp leaderboard`.** The whole `/tcp` command was gated behind `tcp.admin` in plugin.yml, so the "default: everyone" permissions (`tcp.stats`, `tcp.leaderboard`) were unreachable — regular players got a permission error before any subcommand could run. The command-level gate is gone and every subcommand now checks its own permission (stats and leaderboard included, which previously checked nothing). Admins see no change; `tcp.admin` is now a properly declared node (still gates `/tcp list` / `/tcp info` and update notifications) and is granted by the `tcp.admin.*` wildcard.
- **`vaults.sounds.ominous-open` is honored.** Ominous vaults always played the `normal-open` sound; the ominous key was read never. Set a distinct sound and ominous vaults now use it.
- **Every remaining hardcoded command message moved into messages.yml.** ~75 admin-command strings (`/tcp dungeon`, `/tcp container`, `/tcp claims`, `/tcp debug`, the reset-confirmation queue, snapshot bulk/missing listings, `/tcp list`, loot audit, setup prompts, admin reminders) are now translatable — new `dungeon-*`, `container-*`, `claims-*`, `debug-*`, `reset-*`, `snapshot-all-*`/`snapshot-missing-*`, `loot-audit-*`, `list-*` and shared `pagination-*` key families, plus new `help-*` lines. Existing messages.yml files keep working; the startup schema check lists any new keys your file is missing (regenerate or copy them over), and leftover removed keys are harmless.
- **Time durations in messages are now localizable.** The `time-days/hours/minutes/seconds/now` keys that shipped unused since forever are now actually used for every "2d 3h 5m"-style duration (cooldowns, reset warnings, `/tcp info`, stats, leaderboards, placeholders), joined by the new `time-ago` key for "… ago" timestamps.
### Changed
- **Deprecation cleanup:** sound names resolve via the registry first (enum fallback kept), goat-horn instruments resolve via the Paper registry API, plugin info reads `pluginMeta`, and GUI titles pass the Adventure Component straight through (gradients/hex in titles render at full fidelity).
- Removed the dead `global.async-block-placement` config key (restoration has been batched/async regardless since long ago) and ~30 unused messages.yml keys.
[1.7.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.0...v1.7.1
release
TrialChamberPro 1.7.1
1.7.13 июл. 2026 г.23Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.7.1] - 2026-07-03
### Fixed
- **Ominous Bottles in loot tables are now the real `minecraft:ominous_bottle` item.** Previously, every example and doc taught a workaround — a renamed `POTION` with Bad Omen added as a custom effect. It granted Bad Omen when drunk, but it was the wrong item: potion texture, "Uncraftable Potion" underneath the custom name, and it didn't stack with bottles from vanilla vaults. Use `type: OMINOUS_BOTTLE` with `potion-level: 0-4` (Bad Omen I–V), or the new `potion-level-min` / `potion-level-max` to roll the level randomly per drop exactly like vanilla vaults do (normal vaults use 0–1, ominous vaults 2–4). All bundled examples and the vanilla-accurate tables now use the real item; old workaround configs keep functioning.
- **Editing loot in the GUI no longer strips advanced fields from hand-written loot.yml entries.** Saving from the loot editor rewrites the whole file, and the writer only knew a subset of the schema — so potion types/levels, ominous flags, effect durations, enchantment ranges, random-enchantment pools, durability ranges, and goat-horn instruments were silently deleted from every hand-authored entry, and `VANILLA_TABLE` entries were corrupted to `type: AIR`. Every field now round-trips intact. (This was also quietly manufacturing the "legacy entries with no NBT" that `/tcp loot audit` flags.)
- **A bad loot entry can no longer kill the whole vault roll.** Reversed `amount-min`/`amount-max` or `min-rolls`/`max-rolls` ranges used to throw at generation time (player gets nothing); an out-of-range ominous `potion-level` did the same. These are now fixed up at load with a console warning.
- **Typo'd enchantment names are now reported instead of silently skipped** in all three formats (`enchantments`, `enchantment-ranges`, `random-enchantment-pool`); namespaced ids from datapacks (`somepack:blaze`) are accepted too.
- **A pool whose entries all have `weight: 0` no longer drops its first entry every roll** — zero weight now reliably means "never drops".
- **Splash potions with a custom level/duration now last as long as drinkable ones** (the old 75% multiplier was the pre-1.9 rule); lingering (¼) and tipped arrows (⅛) were already correct.
- **Turtle Master potions with a custom level keep both effects** — previously only the first (Resistance was dropped).
- **Loot item names and lore now support hex colors and MiniMessage tags** (same syntax as messages.yml) and no longer render with Minecraft's forced italics.
- **Non-OP players can now actually use `/tcp stats` and `/tcp leaderboard`.** The whole `/tcp` command was gated behind `tcp.admin` in plugin.yml, so the "default: everyone" permissions (`tcp.stats`, `tcp.leaderboard`) were unreachable — regular players got a permission error before any subcommand could run. The command-level gate is gone and every subcommand now checks its own permission (stats and leaderboard included, which previously checked nothing). Admins see no change; `tcp.admin` is now a properly declared node (still gates `/tcp list` / `/tcp info` and update notifications) and is granted by the `tcp.admin.*` wildcard.
- **`vaults.sounds.ominous-open` is honored.** Ominous vaults always played the `normal-open` sound; the ominous key was read never. Set a distinct sound and ominous vaults now use it.
- **Every remaining hardcoded command message moved into messages.yml.** ~75 admin-command strings (`/tcp dungeon`, `/tcp container`, `/tcp claims`, `/tcp debug`, the reset-confirmation queue, snapshot bulk/missing listings, `/tcp list`, loot audit, setup prompts, admin reminders) are now translatable — new `dungeon-*`, `container-*`, `claims-*`, `debug-*`, `reset-*`, `snapshot-all-*`/`snapshot-missing-*`, `loot-audit-*`, `list-*` and shared `pagination-*` key families, plus new `help-*` lines. Existing messages.yml files keep working; the startup schema check lists any new keys your file is missing (regenerate or copy them over), and leftover removed keys are harmless.
- **Time durations in messages are now localizable.** The `time-days/hours/minutes/seconds/now` keys that shipped unused since forever are now actually used for every "2d 3h 5m"-style duration (cooldowns, reset warnings, `/tcp info`, stats, leaderboards, placeholders), joined by the new `time-ago` key for "… ago" timestamps.
### Changed
- **Deprecation cleanup:** sound names resolve via the registry first (enum fallback kept), goat-horn instruments resolve via the Paper registry API, plugin info reads `pluginMeta`, and GUI titles pass the Adventure Component straight through (gradients/hex in titles render at full fidelity).
- Removed the dead `global.async-block-placement` config key (restoration has been batched/async regardless since long ago) and ~30 unused messages.yml keys.
[1.7.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.7.0...v1.7.1
release
TrialChamberPro 1.7.0-mc26
1.7.0-mc262 июл. 2026 г.24Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.7.0] - 2026-07-02
### Added
- **Tunnel-breaking: let players mine INTO a walled chamber — without letting them farm it.** Properly-generated Trial Chambers have no entrance; with block-break protection on, players were locked out entirely, and with it off they could strip-mine the (endlessly restored) tuff for infinite blocks. The new opt-in `protection.tunnel-breaking` mode allows breaking a configurable block set (default: the tuff-brick shell family) inside registered chambers with **drops always suppressed** — no items, no XP — so there's nothing to farm, and the tunnel heals on the next reset. An optional `shell-depth` (default 3) restricts digging to the outer wall so the interior can't be hollowed out; players digging too deep get a clear "outer wall only" message (`tunnel-only-outer-wall` in messages.yml). Everything else stays protected.
- **Import datapack rooms into the dungeon engine: `/tcp dungeon import <file|folder|zip> [tags…]`.** Vanilla `.nbt` structure templates — the format "crazy chambers"-style datapacks use for their custom rooms — can now be imported straight into TCP's procedural dungeon system. Drop a loose `.nbt`, a folder of them, or a whole datapack `.zip` into `plugins/TrialChamberPro/dungeon/import/` and import; zip imports pick up every `data/<namespace>/structure/**/*.nbt` entry and auto-tag rooms by their folder (e.g. `spawner`, `large`). Jigsaw blocks in the templates become door connectors exactly as with in-world capture, and generated dungeons register as normal chambers (resets, loot, protection all apply). Limits: rooms import literally (worldgen processor randomizers aren't applied), only the first palette is read, and vertical jigsaw connectors become walls.
- **Auto-discovery now understands datapack-enlarged chambers.** When a naturally-generated Trial Chamber is found, discovery now asks the game for the structure's exact bounds (`discovery.use-structure-bounds`, default on) instead of flood-scanning blocks — so chambers enlarged by datapacks that override the vanilla layout with custom rooms register at their full, correct size in one pass (no clipping, no fragments), and bounds are marked confirmed immediately. Player-built chambers still discover via the block scan. A separate `discovery.structure-max-volume` cap (default 15,000,000; `-1` = uncapped) applies to these, since datapack chambers can be much larger than vanilla ones.
### Changed
- **Chamber scanning, snapshot capture and spawner resets are now batched across ticks.** These three operations used to walk the chamber's entire volume in a single tick — fine at vanilla sizes, but a freeze risk for the much larger chambers this release enables (structure-bounds discoveries and imported dungeons can run to millions of blocks). Each now processes ~100k blocks per scheduled task, so even a 15-million-block chamber scans smoothly in the background; small chambers behave exactly as before. Spawner resets also swap their old whole-scan 10-second timeout for a per-batch one, so huge chambers can't time out halfway. Note that block *restoration* speed is still governed by `global.blocks-per-tick` — for very large chambers, raise it or enable `global.use-fawe`.
- **All TCP database tables are now prefixed (`tcp_chambers`, `tcp_vaults`, …) and the prefix is configurable.** TCP's generic table names (`chambers`, `vaults`, `spawners`, …) could collide with other plugins on a shared MySQL database. New `database.table-prefix` setting (default `tcp_`, letters/digits/underscore, max 16 chars). **Existing installs migrate automatically on first start**: legacy unprefixed tables are safely renamed (only when their columns unmistakably match TCP's schema — a same-named table belonging to another plugin is left alone and reported), foreign keys and data are preserved, and the migration is a no-op on every later start. No action needed; change the prefix only if you have a collision.
[1.7.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.3...v1.7.0
release
TrialChamberPro 1.7.0
1.7.02 июл. 2026 г.15Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.7.0] - 2026-07-02
### Added
- **Tunnel-breaking: let players mine INTO a walled chamber — without letting them farm it.** Properly-generated Trial Chambers have no entrance; with block-break protection on, players were locked out entirely, and with it off they could strip-mine the (endlessly restored) tuff for infinite blocks. The new opt-in `protection.tunnel-breaking` mode allows breaking a configurable block set (default: the tuff-brick shell family) inside registered chambers with **drops always suppressed** — no items, no XP — so there's nothing to farm, and the tunnel heals on the next reset. An optional `shell-depth` (default 3) restricts digging to the outer wall so the interior can't be hollowed out; players digging too deep get a clear "outer wall only" message (`tunnel-only-outer-wall` in messages.yml). Everything else stays protected.
- **Import datapack rooms into the dungeon engine: `/tcp dungeon import <file|folder|zip> [tags…]`.** Vanilla `.nbt` structure templates — the format "crazy chambers"-style datapacks use for their custom rooms — can now be imported straight into TCP's procedural dungeon system. Drop a loose `.nbt`, a folder of them, or a whole datapack `.zip` into `plugins/TrialChamberPro/dungeon/import/` and import; zip imports pick up every `data/<namespace>/structure/**/*.nbt` entry and auto-tag rooms by their folder (e.g. `spawner`, `large`). Jigsaw blocks in the templates become door connectors exactly as with in-world capture, and generated dungeons register as normal chambers (resets, loot, protection all apply). Limits: rooms import literally (worldgen processor randomizers aren't applied), only the first palette is read, and vertical jigsaw connectors become walls.
- **Auto-discovery now understands datapack-enlarged chambers.** When a naturally-generated Trial Chamber is found, discovery now asks the game for the structure's exact bounds (`discovery.use-structure-bounds`, default on) instead of flood-scanning blocks — so chambers enlarged by datapacks that override the vanilla layout with custom rooms register at their full, correct size in one pass (no clipping, no fragments), and bounds are marked confirmed immediately. Player-built chambers still discover via the block scan. A separate `discovery.structure-max-volume` cap (default 15,000,000; `-1` = uncapped) applies to these, since datapack chambers can be much larger than vanilla ones.
### Changed
- **Chamber scanning, snapshot capture and spawner resets are now batched across ticks.** These three operations used to walk the chamber's entire volume in a single tick — fine at vanilla sizes, but a freeze risk for the much larger chambers this release enables (structure-bounds discoveries and imported dungeons can run to millions of blocks). Each now processes ~100k blocks per scheduled task, so even a 15-million-block chamber scans smoothly in the background; small chambers behave exactly as before. Spawner resets also swap their old whole-scan 10-second timeout for a per-batch one, so huge chambers can't time out halfway. Note that block *restoration* speed is still governed by `global.blocks-per-tick` — for very large chambers, raise it or enable `global.use-fawe`.
- **All TCP database tables are now prefixed (`tcp_chambers`, `tcp_vaults`, …) and the prefix is configurable.** TCP's generic table names (`chambers`, `vaults`, `spawners`, …) could collide with other plugins on a shared MySQL database. New `database.table-prefix` setting (default `tcp_`, letters/digits/underscore, max 16 chars). **Existing installs migrate automatically on first start**: legacy unprefixed tables are safely renamed (only when their columns unmistakably match TCP's schema — a same-named table belonging to another plugin is left alone and reported), foreign keys and data are preserved, and the migration is a no-op on every later start. No action needed; change the prefix only if you have a collision.
[1.7.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.3...v1.7.0
release
TrialChamberPro 1.6.3-mc26
1.6.3-mc2630 июн. 2026 г.44Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.6.3] - 2026-06-30
### Changed
- **Per-player container loot now rolls fresh, random vanilla loot for each player — and again after every reset — instead of freezing one roll forever.** With `chests.per-player-loot` enabled, the first roll of a chest / barrel / dispenser / dropper used to become a frozen template that every player and every future reset reused, so the loot looked random once and then never changed. Now each player who opens an untouched container gets their **own independent roll** of its vanilla loot table (true Lootr-style), the container's loot table is **never consumed**, and after a chamber reset clears per-player copies the next open rolls fresh again — "vanilla, but repeatable." Moderators can still customise a container: open the **Container Loot GUI** (`/tcp menu` → chamber → Container Loot) and click a container to edit it, which saves an **override** that every player then receives (still per-player, re-cloned each reset). Shift-left-click (or `/tcp container resetone <chamber> <#>`) reverts a container to vanilla random rolls. Each container is labelled **Vanilla** vs **Custom override** in the GUI. In-world editing of containers was removed in favour of the GUI. The snapshot-based reset path (servers not using per-player loot) gets the same freshness fix — restored container and decorated-pot loot tables now re-roll fresh each reset rather than repeating an identical fixed-seed roll.
- The per-player container inventory is now titled **"Personal Loot"** (was the more confusing "Supply Loot (yours)").
### Added
- **`/tcp scan add <chamber>` — grow a chamber's bounds into sections auto-discovery missed.** Auto-discovery floods outward from a vault/spawner, but if neighbouring chunks were still loading when a chamber was first detected (or the chamber was big enough to hit the flood's node cap), the bounding box could be clipped at a chunk boundary — leaving part of the chamber (and its chests, vaults, spawners) outside the registered region, so per-player loot and resets ignored it. The new command re-floods from the chamber's known vaults (now that chunks are loaded) and merges the result into the existing bounds, then re-scans and re-snapshots. Flooding from multiple spread-out vaults also covers more than the original single-seed pass.
- **Auto-expand on discovery.** Because few operators will run `/tcp scan add` across 100+ chambers, newly auto-discovered chambers now get one automatic expand pass a few seconds after registration (config: `discovery.expand-on-discover`, default on; `discovery.expand-delay-seconds`). It's best-effort — it can only read chunks that are loaded when it runs — so a wing nobody has visited may still need a manual pass.
- **GUI "Travel & Expand" one-time prompt.** The chamber detail screen shows a red button when a chamber's bounds haven't been confirmed: click it to teleport to the chamber (loading its chunks), then click again from inside to scan for and add any clipped sections. It disappears once a thorough pass has run (here or via `/tcp scan add`).
- **Opt-in `discovery.expand-force-load`.** When enabled, expand passes (auto-expand and `/tcp scan add`) force-load unloaded chunks on demand so they can reach a wing nobody has visited yet. Off by default — it trades a chunk-load spike for completeness; Paper-only.
- **Per-player container loot can be toggled from the GUI.** The Container Loot view now has an on/off switch for `chests.per-player-loot`, so it no longer needs a config edit + reload.
- **Chamber detail now shows the friendly display name** as its title, with the internal ID on a separate line, so the auto-generated `auto_world_x_z` IDs are no longer mistaken for the chamber's name.
### Fixed
- **Auto-discovery chat alert always reported "0 spawners".** The notification (and console line) for a newly auto-discovered chamber was built from the flood-fill scan, whose node budget could be exhausted among a chamber's thousands of structural blocks before reaching the recessed trial spawners — so it under-reported, usually as zero. The alert now uses the authoritative full-chamber scan (the same count written to the database), so vault and spawner totals are correct.
- **Chamber resets (and `/tcp generate wand`) failed on servers without WorldEdit — or with a WorldEdit built for a different Java version.** The internal "is WorldEdit available?" check lived inside a class that imports WorldEdit types, so merely *calling the check* forced the server to load WorldEdit classes; when WorldEdit was missing or version-incompatible this threw `NoClassDefFoundError` / `UnsupportedClassVersionError` — and because that's an `Error`, not an `Exception`, it slipped past the reset's error handling, aborting the reset silently with no success/failure message and skipping cleanup. The availability check now lives in its own WorldEdit-free helper so it's always safe to call; reset degrades gracefully when WorldEdit is unusable (its optional `//undo` integration is simply skipped), catches errors of any kind, and always reports the outcome to the operator. WorldEdit remains an optional dependency — TCP no longer needs it installed to reset chambers.
[1.6.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.2...v1.6.3
release
TrialChamberPro 1.6.3
1.6.330 июн. 2026 г.19Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.6.3] - 2026-06-30
### Changed
- **Per-player container loot now rolls fresh, random vanilla loot for each player — and again after every reset — instead of freezing one roll forever.** With `chests.per-player-loot` enabled, the first roll of a chest / barrel / dispenser / dropper used to become a frozen template that every player and every future reset reused, so the loot looked random once and then never changed. Now each player who opens an untouched container gets their **own independent roll** of its vanilla loot table (true Lootr-style), the container's loot table is **never consumed**, and after a chamber reset clears per-player copies the next open rolls fresh again — "vanilla, but repeatable." Moderators can still customise a container: open the **Container Loot GUI** (`/tcp menu` → chamber → Container Loot) and click a container to edit it, which saves an **override** that every player then receives (still per-player, re-cloned each reset). Shift-left-click (or `/tcp container resetone <chamber> <#>`) reverts a container to vanilla random rolls. Each container is labelled **Vanilla** vs **Custom override** in the GUI. In-world editing of containers was removed in favour of the GUI. The snapshot-based reset path (servers not using per-player loot) gets the same freshness fix — restored container and decorated-pot loot tables now re-roll fresh each reset rather than repeating an identical fixed-seed roll.
- The per-player container inventory is now titled **"Personal Loot"** (was the more confusing "Supply Loot (yours)").
### Added
- **`/tcp scan add <chamber>` — grow a chamber's bounds into sections auto-discovery missed.** Auto-discovery floods outward from a vault/spawner, but if neighbouring chunks were still loading when a chamber was first detected (or the chamber was big enough to hit the flood's node cap), the bounding box could be clipped at a chunk boundary — leaving part of the chamber (and its chests, vaults, spawners) outside the registered region, so per-player loot and resets ignored it. The new command re-floods from the chamber's known vaults (now that chunks are loaded) and merges the result into the existing bounds, then re-scans and re-snapshots. Flooding from multiple spread-out vaults also covers more than the original single-seed pass.
- **Auto-expand on discovery.** Because few operators will run `/tcp scan add` across 100+ chambers, newly auto-discovered chambers now get one automatic expand pass a few seconds after registration (config: `discovery.expand-on-discover`, default on; `discovery.expand-delay-seconds`). It's best-effort — it can only read chunks that are loaded when it runs — so a wing nobody has visited may still need a manual pass.
- **GUI "Travel & Expand" one-time prompt.** The chamber detail screen shows a red button when a chamber's bounds haven't been confirmed: click it to teleport to the chamber (loading its chunks), then click again from inside to scan for and add any clipped sections. It disappears once a thorough pass has run (here or via `/tcp scan add`).
- **Opt-in `discovery.expand-force-load`.** When enabled, expand passes (auto-expand and `/tcp scan add`) force-load unloaded chunks on demand so they can reach a wing nobody has visited yet. Off by default — it trades a chunk-load spike for completeness; Paper-only.
- **Per-player container loot can be toggled from the GUI.** The Container Loot view now has an on/off switch for `chests.per-player-loot`, so it no longer needs a config edit + reload.
- **Chamber detail now shows the friendly display name** as its title, with the internal ID on a separate line, so the auto-generated `auto_world_x_z` IDs are no longer mistaken for the chamber's name.
### Fixed
- **Auto-discovery chat alert always reported "0 spawners".** The notification (and console line) for a newly auto-discovered chamber was built from the flood-fill scan, whose node budget could be exhausted among a chamber's thousands of structural blocks before reaching the recessed trial spawners — so it under-reported, usually as zero. The alert now uses the authoritative full-chamber scan (the same count written to the database), so vault and spawner totals are correct.
- **Chamber resets (and `/tcp generate wand`) failed on servers without WorldEdit — or with a WorldEdit built for a different Java version.** The internal "is WorldEdit available?" check lived inside a class that imports WorldEdit types, so merely *calling the check* forced the server to load WorldEdit classes; when WorldEdit was missing or version-incompatible this threw `NoClassDefFoundError` / `UnsupportedClassVersionError` — and because that's an `Error`, not an `Exception`, it slipped past the reset's error handling, aborting the reset silently with no success/failure message and skipping cleanup. The availability check now lives in its own WorldEdit-free helper so it's always safe to call; reset degrades gracefully when WorldEdit is unusable (its optional `//undo` integration is simply skipped), catches errors of any kind, and always reports the outcome to the operator. WorldEdit remains an optional dependency — TCP no longer needs it installed to reset chambers.
[1.6.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.2...v1.6.3
release
TrialChamberPro 1.6.2-mc26
1.6.2-mc2629 июн. 2026 г.28Minecraft: 26.1, 26.1.1, 26.1.2, 26.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.6.2] - 2026-06-29
### Fixed
- **Several player-facing strings rendered raw `&`/`§` codes (and an embedded `[TCP]` prefix).** A recurring class of bug: a sub-value built with `getMessage()` — which adds the chat prefix and pre-renders to legacy section codes — was being substituted into *another* message's `{placeholder}` and parsed a second time, which the parser couldn't read. Most visible in `/tcp info` (Exit / Last Reset / Snapshot lines), but the same pattern affected per-chamber loot info, `/tcp mobs` listings, and several admin-GUI items (chamber detail/settings, global & protection toggles, back buttons). All nested sub-values now use a new `rawMessage()` helper (substitutes placeholders, no prefix, no pre-parse) so the outer message parses exactly once. No `messages.yml` changes required.
[1.6.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.1...v1.6.2
release
TrialChamberPro 1.6.2
1.6.229 июн. 2026 г.15Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.6.2] - 2026-06-29
### Fixed
- **Several player-facing strings rendered raw `&`/`§` codes (and an embedded `[TCP]` prefix).** A recurring class of bug: a sub-value built with `getMessage()` — which adds the chat prefix and pre-renders to legacy section codes — was being substituted into *another* message's `{placeholder}` and parsed a second time, which the parser couldn't read. Most visible in `/tcp info` (Exit / Last Reset / Snapshot lines), but the same pattern affected per-chamber loot info, `/tcp mobs` listings, and several admin-GUI items (chamber detail/settings, global & protection toggles, back buttons). All nested sub-values now use a new `rawMessage()` helper (substitutes placeholders, no prefix, no pre-parse) so the outer message parses exactly once. No `messages.yml` changes required.
[1.6.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.1...v1.6.2
release
TrialChamberPro 1.6.1-mc26
1.6.1-mc2629 июн. 2026 г.13Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.6.1] - 2026-06-29
### Fixed
- **Trial spawners weren't actually reset on a chamber reset.** Reset cleared each spawner's *tracked players* (so it would drop keys again) and set the cooldown *length*, but never cleared the spawner's **active cooldown end** — so a spawner that a player had already completed stayed stuck in its post-completion cooldown after the chamber reset and wouldn't re-activate. Reset now clears `cooldownEnd` (and the pending spawn timer) so spawners are genuinely ready again — or, when `reset.spawner-cooldown-minutes` is positive, schedules the cooldown to end that many minutes from the reset. (Affected every chamber; most visible on freshly force-reset chambers.)
### Added
- **Chamber display names.** Chambers can now carry a friendly display name, separate from their internal name (which stays the command/database key). Set one with **`/tcp rename <chamber> <name>`** (`none` clears it) or the new **Rename** button in the chamber GUI (`/tcp menu` → chamber → Rename, then type the name in chat). Display names appear in player-facing announcements (reset warnings, the new clear broadcast) and `/tcp info`, and are exposed on the chamber API so premium modules can use them. An optional **name pool** (`naming.name-pool`, on by default via `naming.auto-assign`) auto-assigns a random unused name to each newly registered or auto-discovered chamber.
- **Chamber-cleared broadcast.** New opt-in server-wide announcement when a chamber is fully cleared in one run — "*{chamber} has been cleared by {players}!*" — using the display name and the participating players. Off by default (`global.broadcast-chamber-cleared`). Built on the existing `ChamberClearedEvent`.
### Fixed
- **"Reset Broadcast" toggle rendered raw `&` codes and a bracketed lore.** Its `messages.yml` value used `&`-codes in the name and a multi-line *list* for the lore, but `GuiComponents.toggleItem` wraps the name in the `gui.common.toggle-name-*` template and expects a single-line description — so the name double-processed into raw codes and the list stringified to `[line, line, …]`. The keys now follow the toggle contract (plain name, single-line lore); the helper supplies the colour, Status, and Click lines.
- **Loot "Edit Amount" GUI: the Minimum buttons did nothing on most items.** The yellow adjust buttons clamped the minimum to the current maximum, so on a freshly-added item (which starts at min 1 / max 1) "Minimum +N" was capped at 1 and appeared dead — as did "Minimum -N" and "Maximum -N" at their floors. The min/max range is now kept coherent both ways: raising the minimum past the maximum carries the maximum up with it, and lowering the maximum below the minimum pulls the minimum down. Every button now responds.
- **Wave mobs no longer fight each other.** A trial spawner's skeletons would clip other mobs with stray arrows, and the wave dissolved into mob-vs-mob brawls — skeleton 1v1s, the occasional 3v3 — that the player never had to touch. Worse than just looking silly: those self-kills still counted toward wave (and chamber) completion, so a wave could clear itself while the player stood there. Friendly fire and AI target-locking **strictly between two trial-spawner wave mobs** are now suppressed; player-vs-mob combat is untouched, and non-wave entities (wild animals, other plugins' mobs) are left alone. Toggle with `spawner-waves.prevent-infighting` (default `true`). Also keeps premium TCP-MythicTrials tier progression honest, since "clearing" a chamber once again means the players actually did the fighting.
[1.6.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.0...v1.6.1
release
TrialChamberPro 1.6.1
1.6.129 июн. 2026 г.17Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.6.1] - 2026-06-29
### Fixed
- **Trial spawners weren't actually reset on a chamber reset.** Reset cleared each spawner's *tracked players* (so it would drop keys again) and set the cooldown *length*, but never cleared the spawner's **active cooldown end** — so a spawner that a player had already completed stayed stuck in its post-completion cooldown after the chamber reset and wouldn't re-activate. Reset now clears `cooldownEnd` (and the pending spawn timer) so spawners are genuinely ready again — or, when `reset.spawner-cooldown-minutes` is positive, schedules the cooldown to end that many minutes from the reset. (Affected every chamber; most visible on freshly force-reset chambers.)
### Added
- **Chamber display names.** Chambers can now carry a friendly display name, separate from their internal name (which stays the command/database key). Set one with **`/tcp rename <chamber> <name>`** (`none` clears it) or the new **Rename** button in the chamber GUI (`/tcp menu` → chamber → Rename, then type the name in chat). Display names appear in player-facing announcements (reset warnings, the new clear broadcast) and `/tcp info`, and are exposed on the chamber API so premium modules can use them. An optional **name pool** (`naming.name-pool`, on by default via `naming.auto-assign`) auto-assigns a random unused name to each newly registered or auto-discovered chamber.
- **Chamber-cleared broadcast.** New opt-in server-wide announcement when a chamber is fully cleared in one run — "*{chamber} has been cleared by {players}!*" — using the display name and the participating players. Off by default (`global.broadcast-chamber-cleared`). Built on the existing `ChamberClearedEvent`.
### Fixed
- **"Reset Broadcast" toggle rendered raw `&` codes and a bracketed lore.** Its `messages.yml` value used `&`-codes in the name and a multi-line *list* for the lore, but `GuiComponents.toggleItem` wraps the name in the `gui.common.toggle-name-*` template and expects a single-line description — so the name double-processed into raw codes and the list stringified to `[line, line, …]`. The keys now follow the toggle contract (plain name, single-line lore); the helper supplies the colour, Status, and Click lines.
- **Loot "Edit Amount" GUI: the Minimum buttons did nothing on most items.** The yellow adjust buttons clamped the minimum to the current maximum, so on a freshly-added item (which starts at min 1 / max 1) "Minimum +N" was capped at 1 and appeared dead — as did "Minimum -N" and "Maximum -N" at their floors. The min/max range is now kept coherent both ways: raising the minimum past the maximum carries the maximum up with it, and lowering the maximum below the minimum pulls the minimum down. Every button now responds.
- **Wave mobs no longer fight each other.** A trial spawner's skeletons would clip other mobs with stray arrows, and the wave dissolved into mob-vs-mob brawls — skeleton 1v1s, the occasional 3v3 — that the player never had to touch. Worse than just looking silly: those self-kills still counted toward wave (and chamber) completion, so a wave could clear itself while the player stood there. Friendly fire and AI target-locking **strictly between two trial-spawner wave mobs** are now suppressed; player-vs-mob combat is untouched, and non-wave entities (wild animals, other plugins' mobs) are left alone. Toggle with `spawner-waves.prevent-infighting` (default `true`). Also keeps premium TCP-MythicTrials tier progression honest, since "clearing" a chamber once again means the players actually did the fighting.
[1.6.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.6.0...v1.6.1
release
TrialChamberPro 1.6.0-mc26
1.6.0-mc2626 июн. 2026 г.48Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.6.0] - 2026-06-26
### Added
- **`/tcp setup` — an opt-in, guided settings tour.** TCP ships conservative defaults (auto-discovery and auto-snapshot are off, among others) and most operators never open a YAML file, so genuinely useful settings go unnoticed. `/tcp setup` walks the major settings **one at a time** — each with a plain-English explanation, its current state, and **Enable / Skip / Disable** buttons, plus **← Prev**, **Pause Setup** and **Stop Setup**. Nothing is ever forced and no default is changed. On Paper 1.21.7+ it renders in the native **Dialog** UI; on older or non-Paper servers it falls back automatically to a **clickable-chat** tour with the same content. Includes preset pickers (e.g. how often chambers reset, shown with the current value as a real duration), a clear **CPU-impact** badge on the few settings that warrant one, and a gentle op-join reminder — at most weekly, three times — that stops for good once you run the tour (with a single follow-up nudge if you start but don't finish). Permission: `tcp.admin.setup` (OP).
### Changed
- Paper API target raised to **1.21.7** for the Dialog API used by `/tcp setup`. The plugin's `api-version` stays `1.21`, so it still loads on **1.21.1+** — the Dialog code is gated behind a runtime class-presence check and degrades to the clickable-chat tour wherever the Dialog API isn't available.
[1.6.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.22...v1.6.0
release
TrialChamberPro 1.6.0
1.6.026 июн. 2026 г.28Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.6.0] - 2026-06-26
### Added
- **`/tcp setup` — an opt-in, guided settings tour.** TCP ships conservative defaults (auto-discovery and auto-snapshot are off, among others) and most operators never open a YAML file, so genuinely useful settings go unnoticed. `/tcp setup` walks the major settings **one at a time** — each with a plain-English explanation, its current state, and **Enable / Skip / Disable** buttons, plus **← Prev**, **Pause Setup** and **Stop Setup**. Nothing is ever forced and no default is changed. On Paper 1.21.7+ it renders in the native **Dialog** UI; on older or non-Paper servers it falls back automatically to a **clickable-chat** tour with the same content. Includes preset pickers (e.g. how often chambers reset, shown with the current value as a real duration), a clear **CPU-impact** badge on the few settings that warrant one, and a gentle op-join reminder — at most weekly, three times — that stops for good once you run the tour (with a single follow-up nudge if you start but don't finish). Permission: `tcp.admin.setup` (OP).
### Changed
- Paper API target raised to **1.21.7** for the Dialog API used by `/tcp setup`. The plugin's `api-version` stays `1.21`, so it still loads on **1.21.1+** — the Dialog code is gated behind a runtime class-presence check and degrades to the clickable-chat tour wherever the Dialog API isn't available.
[1.6.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.22...v1.6.0
release
TrialChamberPro 1.5.22-mc26
1.5.22-mc2622 июн. 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
This plugin version is compatible with Minecraft 26.X.X
## [1.5.22] - 2026-06-22
### Added
- **Bulk snapshot backfill — `/tcp snapshot create all` and `/tcp snapshot missing`.** Chambers registered with `global.auto-snapshot-on-register` turned off have no snapshot and **can't be reset** until one is captured, and there was no way to fix a backlog short of running `create` on each chamber by hand. `create all` now snapshots every chamber that's missing one (add `force` to re-capture *all* chambers), running them **sequentially with a 20-tick gap after each capture finishes** — a capture is a single heavy main-thread pass over the whole chamber, so the stagger keeps TPS healthy across a 60+ backlog — and reporting progress every 10. `missing` lists the snapshot-less chambers 10 per page, each with a clickable `[Create]` (plus a `[Create all]` header button); the periodic "chambers have no snapshot" reminder's `[list]` link now points here too.
[1.5.22]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.21...v1.5.22
release
TrialChamberPro 1.5.22
1.5.2222 июн. 2026 г.29Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.22] - 2026-06-22
### Added
- **Bulk snapshot backfill — `/tcp snapshot create all` and `/tcp snapshot missing`.** Chambers registered with `global.auto-snapshot-on-register` turned off have no snapshot and **can't be reset** until one is captured, and there was no way to fix a backlog short of running `create` on each chamber by hand. `create all` now snapshots every chamber that's missing one (add `force` to re-capture *all* chambers), running them **sequentially with a 20-tick gap after each capture finishes** — a capture is a single heavy main-thread pass over the whole chamber, so the stagger keeps TPS healthy across a 60+ backlog — and reporting progress every 10. `missing` lists the snapshot-less chambers 10 per page, each with a clickable `[Create]` (plus a `[Create all]` header button); the periodic "chambers have no snapshot" reminder's `[list]` link now points here too.
[1.5.22]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.21...v1.5.22
release
TrialChamberPro 1.5.21-mc26
1.5.21-mc2622 июн. 2026 г.16Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.21] - 2026-06-22
### Added
- **`debug.verbose-logging` now explains protection decisions.** With it on, the console logs *why* a block-break, PvP, teleport-into-chamber, walk-in entry, or AdvancedEnchantments action was or wasn't taken — including the bypass-permission exemptions (`tcp.bypass.entry` / `tcp.bypass.protection`, which OPs hold by default). This makes "I enabled the toggle but it doesn't work" self-diagnosable: the usual answer is testing as an OP. See the new troubleshooting entry.
### Fixed
- **AdvancedEnchantments enchants could still break into a chamber from outside.** The `protection.block-advanced-enchantments` guard only checked the **player's own** location, so a player standing just outside a chamber and mining *into* it — Blast Mining the wall, or an AoE break reaching across the boundary — wasn't stopped. AE's `EnchantActivateEvent` exposes no block, so TCP now also ray-traces the block the player is looking at and checks it — expanded by the new **`protection.advanced-enchantments-block-radius`** (default `2`, set it to your largest blast enchant's radius; `0` = only the mined block itself) — against chamber bounds via `getIntersectingChamber`, closing the outside-in route. The expansion is centred on the mined block, not the player. Standing inside a chamber is blocked as before, and `tcp.bypass.protection` / the allowlist still apply.
[1.5.21]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.20...v1.5.21
release
TrialChamberPro 1.5.21
1.5.2122 июн. 2026 г.11Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.21] - 2026-06-22
### Added
- **`debug.verbose-logging` now explains protection decisions.** With it on, the console logs *why* a block-break, PvP, teleport-into-chamber, walk-in entry, or AdvancedEnchantments action was or wasn't taken — including the bypass-permission exemptions (`tcp.bypass.entry` / `tcp.bypass.protection`, which OPs hold by default). This makes "I enabled the toggle but it doesn't work" self-diagnosable: the usual answer is testing as an OP. See the new troubleshooting entry.
### Fixed
- **AdvancedEnchantments enchants could still break into a chamber from outside.** The `protection.block-advanced-enchantments` guard only checked the **player's own** location, so a player standing just outside a chamber and mining *into* it — Blast Mining the wall, or an AoE break reaching across the boundary — wasn't stopped. AE's `EnchantActivateEvent` exposes no block, so TCP now also ray-traces the block the player is looking at and checks it — expanded by the new **`protection.advanced-enchantments-block-radius`** (default `2`, set it to your largest blast enchant's radius; `0` = only the mined block itself) — against chamber bounds via `getIntersectingChamber`, closing the outside-in route. The expansion is centred on the mined block, not the player. Standing inside a chamber is blocked as before, and `tcp.bypass.protection` / the allowlist still apply.
[1.5.21]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.20...v1.5.21
release
TrialChamberPro 1.5.20-mc26
1.5.20-mc2621 июн. 2026 г.19Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.20] - 2026-06-22
### Added
- **Chamber entry control** — two opt-in protection toggles for gating who can get into a chamber:
- **`protection.prevent-teleport-into-chamber`** cancels teleporting *into* a chamber from outside — `/tpa`, `/tpahere`, `/home`, `/warp`, `/tp`, ender pearls, chorus fruit, anything. It hooks the teleport itself (`PlayerTeleportEvent`), so it catches every method rather than specific commands, and players can't `/tpa` past the intended entrance.
- **`protection.prevent-entry-without-permission`** gates *walking* into a chamber by rank — only players with the new **`tcp.bypass.entry`** permission (default op) can enter on foot; others are stopped at the boundary. Makes chambers rank-restricted.
Both are off by default. `tcp.bypass.entry`, spectators, and creative-mode players are exempt (the gamemode check also covers TCP's own spectator-entry teleport).
### Fixed
- **`/tcp info` rendered raw colour codes** instead of formatting (e.g. `&8&l&6TRIAL CHAMBER…` and `&7WorldEdit / FAWE:`) — most visible with a translated, `&`-coded prefix. The integration/feature status ticks were built with `§` section signs, which TCP's message parser rejects, making it fall back to printing the whole line literally. They now use `&` codes, so the line formats correctly.
[1.5.20]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.19...v1.5.20
release
TrialChamberPro 1.5.20
1.5.2021 июн. 2026 г.13Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.20] - 2026-06-22
### Added
- **Chamber entry control** — two opt-in protection toggles for gating who can get into a chamber:
- **`protection.prevent-teleport-into-chamber`** cancels teleporting *into* a chamber from outside — `/tpa`, `/tpahere`, `/home`, `/warp`, `/tp`, ender pearls, chorus fruit, anything. It hooks the teleport itself (`PlayerTeleportEvent`), so it catches every method rather than specific commands, and players can't `/tpa` past the intended entrance.
- **`protection.prevent-entry-without-permission`** gates *walking* into a chamber by rank — only players with the new **`tcp.bypass.entry`** permission (default op) can enter on foot; others are stopped at the boundary. Makes chambers rank-restricted.
Both are off by default. `tcp.bypass.entry`, spectators, and creative-mode players are exempt (the gamemode check also covers TCP's own spectator-entry teleport).
### Fixed
- **`/tcp info` rendered raw colour codes** instead of formatting (e.g. `&8&l&6TRIAL CHAMBER…` and `&7WorldEdit / FAWE:`) — most visible with a translated, `&`-coded prefix. The integration/feature status ticks were built with `§` section signs, which TCP's message parser rejects, making it fall back to printing the whole line literally. They now use `&` codes, so the line formats correctly.
[1.5.20]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.19...v1.5.20
release
TrialChamberPro 1.5.19-mc26
1.5.19-mc2621 июн. 2026 г.8Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.19] - 2026-06-21
### Added
- **`config.yml` and `messages.yml` now auto-update on startup.** Bukkit only writes these files when they're *absent*, so servers that installed an earlier build never got options/message keys added later — features ran on code defaults that couldn't be configured, and new messages rendered as `<missing: …>` in-game. TCP now merges any key present in the bundled default but missing from your file, **carrying its comment across**, while leaving your existing values, comments, and order untouched. The previous file is saved as `<file>.bak` first. User-content files (`loot.yml`, `spawner_presets.yml`, `dungeon.yml`) are intentionally **not** merged — they're authored by you. (This is why some servers were stuck on old configs/messages.)
- **`protection.allow-pvp` is now implemented** (was a reserved no-op). When `false`, player-vs-player damage — melee and player-shot projectiles — is cancelled inside registered chambers. `tcp.bypass.protection` exempts staff; mob and self-damage are never affected.
- **`reset.clear-trial-omen-effect` is now implemented** (was a reserved no-op). On reset, Trial Omen and Bad Omen are stripped from players who were inside the chamber, so leftover omen doesn't carry into the next cycle.
- **Translatable `{type}` labels** — the `{type}` placeholder was being filled with hardcoded English. It now resolves through new messages.yml keys so it can be localized everywhere it appears: `vault-type-normal` / `vault-type-ominous` (vault messages **and** trial-key give messages), and `wave-type-*` / `wave-boss-type-*` for the spawner-wave completion + boss-bar lines. Defaults are unchanged (`Normal`/`Ominous`, `Trial`/`Ominous`, `Trial Spawner`/`Ominous Trial`).
### Removed
- **Dropped the never-implemented `trial-keys.fix-paper-bugs`, `prevent-duplication`, and `max-stack-size` options.** They were read by no code and had no effect. A consistent key stack-size cap isn't practical (spawner keys are dropped by vanilla, and the premium add-ons hand out their own keys), and dupe protection is better left to a dedicated plugin — `validate-key-type` stays, and the comment now points to AntiDupePro. Leftover keys in an existing `config.yml` are simply ignored.
[1.5.19]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.18...v1.5.19
release
TrialChamberPro 1.5.19
1.5.1921 июн. 2026 г.8Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.19] - 2026-06-21
### Added
- **`config.yml` and `messages.yml` now auto-update on startup.** Bukkit only writes these files when they're *absent*, so servers that installed an earlier build never got options/message keys added later — features ran on code defaults that couldn't be configured, and new messages rendered as `<missing: …>` in-game. TCP now merges any key present in the bundled default but missing from your file, **carrying its comment across**, while leaving your existing values, comments, and order untouched. The previous file is saved as `<file>.bak` first. User-content files (`loot.yml`, `spawner_presets.yml`, `dungeon.yml`) are intentionally **not** merged — they're authored by you. (This is why some servers were stuck on old configs/messages.)
- **`protection.allow-pvp` is now implemented** (was a reserved no-op). When `false`, player-vs-player damage — melee and player-shot projectiles — is cancelled inside registered chambers. `tcp.bypass.protection` exempts staff; mob and self-damage are never affected.
- **`reset.clear-trial-omen-effect` is now implemented** (was a reserved no-op). On reset, Trial Omen and Bad Omen are stripped from players who were inside the chamber, so leftover omen doesn't carry into the next cycle.
- **Translatable `{type}` labels** — the `{type}` placeholder was being filled with hardcoded English. It now resolves through new messages.yml keys so it can be localized everywhere it appears: `vault-type-normal` / `vault-type-ominous` (vault messages **and** trial-key give messages), and `wave-type-*` / `wave-boss-type-*` for the spawner-wave completion + boss-bar lines. Defaults are unchanged (`Normal`/`Ominous`, `Trial`/`Ominous`, `Trial Spawner`/`Ominous Trial`).
### Removed
- **Dropped the never-implemented `trial-keys.fix-paper-bugs`, `prevent-duplication`, and `max-stack-size` options.** They were read by no code and had no effect. A consistent key stack-size cap isn't practical (spawner keys are dropped by vanilla, and the premium add-ons hand out their own keys), and dupe protection is better left to a dedicated plugin — `validate-key-type` stays, and the comment now points to AntiDupePro. Leftover keys in an existing `config.yml` are simply ignored.
[1.5.19]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.18...v1.5.19
release
TrialChamberPro 1.5.18-mc26
1.5.18-mc2621 июн. 2026 г.8Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.18] - 2026-06-21
### Added
- **AdvancedEnchantments integration.** AE custom enchants (e.g. *Blast Mining*) break blocks through their own effect path that ignores TCP's `BlockBreakEvent` cancel — so they could bypass chamber protection. With `protection.block-advanced-enchantments: true` (and AE installed), TCP cancels AE enchant activations for a player standing in a registered chamber; `protection.advanced-enchantments-allowlist` keeps named enchants (e.g. combat ones) working there. Reflection-based — no dependency on the paid AE jar, inert when AE is absent — and `tcp.bypass.protection` exempts staff. **Off by default.**
### Fixed
- **Protection-message chat spam.** A single multi-block action (Blast Mining, vein miners, rapid clicking) printed the "you can't break/place/access here" message once per affected block. The denial messages are now throttled per player via `protection.message-cooldown-ms` (default 1500 ms; `0` disables the throttle).
[1.5.18]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.17...v1.5.18
release
TrialChamberPro 1.5.18
1.5.1821 июн. 2026 г.6Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.18] - 2026-06-21
### Added
- **AdvancedEnchantments integration.** AE custom enchants (e.g. *Blast Mining*) break blocks through their own effect path that ignores TCP's `BlockBreakEvent` cancel — so they could bypass chamber protection. With `protection.block-advanced-enchantments: true` (and AE installed), TCP cancels AE enchant activations for a player standing in a registered chamber; `protection.advanced-enchantments-allowlist` keeps named enchants (e.g. combat ones) working there. Reflection-based — no dependency on the paid AE jar, inert when AE is absent — and `tcp.bypass.protection` exempts staff. **Off by default.**
### Fixed
- **Protection-message chat spam.** A single multi-block action (Blast Mining, vein miners, rapid clicking) printed the "you can't break/place/access here" message once per affected block. The denial messages are now throttled per player via `protection.message-cooldown-ms` (default 1500 ms; `0` disables the throttle).
[1.5.18]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.17...v1.5.18
release
TrialChamberPro 1.5.17-mc26
1.5.17-mc2620 июн. 2026 г.11Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.17] - 2026-06-20
### Fixed
- **1.5.16 could rename another plugin's `player_stats` table.** The collision migration checked a table's columns via `DatabaseMetaData.getColumns()`, whose table-name argument treats `_` as a SQL wildcard — so the "is this table TCP's?" test could pick up a `player_uuid` column from a *different* matching table and wrongly rename a foreign `player_stats` to `tcp_player_stats`. The metadata lookup now filters to the exact table name (and catalog). **Servers affected by 1.5.16 auto-recover on next start:** a `tcp_player_stats` that isn't TCP's (no `player_uuid`) is renamed back to `player_stats` — returning the other plugin's table and data — and TCP creates its own fresh `tcp_player_stats`. If both names are already occupied, TCP logs exactly how to reconcile instead of touching anything.
[1.5.17]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.16...v1.5.17
release
TrialChamberPro 1.5.17
1.5.1720 июн. 2026 г.8Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.17] - 2026-06-20
### Fixed
- **1.5.16 could rename another plugin's `player_stats` table.** The collision migration checked a table's columns via `DatabaseMetaData.getColumns()`, whose table-name argument treats `_` as a SQL wildcard — so the "is this table TCP's?" test could pick up a `player_uuid` column from a *different* matching table and wrongly rename a foreign `player_stats` to `tcp_player_stats`. The metadata lookup now filters to the exact table name (and catalog). **Servers affected by 1.5.16 auto-recover on next start:** a `tcp_player_stats` that isn't TCP's (no `player_uuid`) is renamed back to `player_stats` — returning the other plugin's table and data — and TCP creates its own fresh `tcp_player_stats`. If both names are already occupied, TCP logs exactly how to reconcile instead of touching anything.
[1.5.17]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.16...v1.5.17
release
TrialChamberPro 1.5.16-mc26
1.5.16-mc2619 июн. 2026 г.9Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.16] - 2026-06-20
### Fixed
- **Stats / leaderboard GUI crashed on shared databases** (`Could not pass event InventoryClickEvent`). If another plugin (e.g. a duels / PvP-stats plugin) already owned a generically-named `player_stats` table, TCP's `CREATE TABLE IF NOT EXISTS` saw it and never created its own — so every stat read/write hit the wrong table. TCP now uses its own namespaced **`tcp_player_stats`** table: existing TCP stats are migrated to it automatically on first start, and a foreign `player_stats` is left completely untouched. The stats GUI also now degrades gracefully (logs a clear `[TCP]` error and shows an empty board) instead of throwing into the click handler if a stat query ever fails.
### Added
- **Database schema self-check** on startup — reads each table's live columns and reconciles drift: missing (safe) `tcp_player_stats` columns are added automatically, and a missing critical column like the `player_uuid` primary key is reported with a loud, actionable warning that lists the table's actual columns.
- **`/tcp debug schema`** — prints every TCP table's live columns on demand (no database client needed), flagging the stats table if its primary key is absent.
[1.5.16]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.15...v1.5.16
release
TrialChamberPro 1.5.16
1.5.1619 июн. 2026 г.11Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.16] - 2026-06-20
### Fixed
- **Stats / leaderboard GUI crashed on shared databases** (`Could not pass event InventoryClickEvent`). If another plugin (e.g. a duels / PvP-stats plugin) already owned a generically-named `player_stats` table, TCP's `CREATE TABLE IF NOT EXISTS` saw it and never created its own — so every stat read/write hit the wrong table. TCP now uses its own namespaced **`tcp_player_stats`** table: existing TCP stats are migrated to it automatically on first start, and a foreign `player_stats` is left completely untouched. The stats GUI also now degrades gracefully (logs a clear `[TCP]` error and shows an empty board) instead of throwing into the click handler if a stat query ever fails.
### Added
- **Database schema self-check** on startup — reads each table's live columns and reconciles drift: missing (safe) `tcp_player_stats` columns are added automatically, and a missing critical column like the `player_uuid` primary key is reported with a loud, actionable warning that lists the table's actual columns.
- **`/tcp debug schema`** — prints every TCP table's live columns on demand (no database client needed), flagging the stats table if its primary key is absent.
[1.5.16]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.15...v1.5.16
release
TrialChamberPro 1.5.15-mc26
1.5.15-mc2619 июн. 2026 г.8Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.15] - 2026-06-19
### Added
- **Land-claim plugin protection** — registered Trial Chambers can no longer be claimed (or have a claim expanded into them) with **Residence**, **Lands**, or **GriefPrevention**. Each integration cancels that plugin's claim-create / expand events when the claimed area overlaps a chamber, with a message to the player. Per-plugin config toggles (`protection.residence-integration` / `lands-integration` / `griefprevention-integration`, default on) and per-plugin bypass permissions (`tcp.bypass.residence` / `.lands` / `.griefprevention`, default op). Integrations are reflection-based — no version pinning, and nothing is touched on servers without the plugin.
- **Claim conflict scan** — on startup (toggle: `protection.claim-conflict-scan-on-startup`) and via the new **`/tcp claims scan`**, TCP checks every registered chamber against existing claims and logs a warning per overlap (chamber name + location + claim owner), to help find and fix pre-existing conflicts on long-running servers.
[1.5.15]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.14...v1.5.15
release
TrialChamberPro 1.5.15
1.5.1519 июн. 2026 г.9Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.15] - 2026-06-19
### Added
- **Land-claim plugin protection** — registered Trial Chambers can no longer be claimed (or have a claim expanded into them) with **Residence**, **Lands**, or **GriefPrevention**. Each integration cancels that plugin's claim-create / expand events when the claimed area overlaps a chamber, with a message to the player. Per-plugin config toggles (`protection.residence-integration` / `lands-integration` / `griefprevention-integration`, default on) and per-plugin bypass permissions (`tcp.bypass.residence` / `.lands` / `.griefprevention`, default op). Integrations are reflection-based — no version pinning, and nothing is touched on servers without the plugin.
- **Claim conflict scan** — on startup (toggle: `protection.claim-conflict-scan-on-startup`) and via the new **`/tcp claims scan`**, TCP checks every registered chamber against existing claims and logs a warning per overlap (chamber name + location + claim owner), to help find and fix pre-existing conflicts on long-running servers.
[1.5.15]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.14...v1.5.15
release
TrialChamberPro 1.5.14-mc26
1.5.14-mc2619 июн. 2026 г.6Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.14] - 2026-06-19
### Fixed
- **Duplicate messages on right-clicking a vault** (e.g. the "You need a Trial Key" line printed twice). A right-click fires `PlayerInteractEvent` once per hand (main + off); `VaultInteractListener` now acts only on the main-hand pass, so feedback is sent once. The same guard was added to `ProtectionListener`'s container-access denial (`prevent-container-access`). Vault/key behaviour is unchanged — only the duplicate message is removed.
[1.5.14]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.13...v1.5.14
release
TrialChamberPro 1.5.14
1.5.1419 июн. 2026 г.6Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.14] - 2026-06-19
### Fixed
- **Duplicate messages on right-clicking a vault** (e.g. the "You need a Trial Key" line printed twice). A right-click fires `PlayerInteractEvent` once per hand (main + off); `VaultInteractListener` now acts only on the main-hand pass, so feedback is sent once. The same guard was added to `ProtectionListener`'s container-access denial (`prevent-container-access`). Vault/key behaviour is unchanged — only the duplicate message is removed.
[1.5.14]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.13...v1.5.14
release
TrialChamberPro 1.5.13-mc26
1.5.13-mc2619 июн. 2026 г.10Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.13] - 2026-06-19
### Fixed
- **MySQL/MariaDB vault saving failed** with `error in your SQL syntax … near 'CONFLICT(...)'`. Two vault upserts (`ChamberManager.saveVault`, `VaultManager.recordOpen`) hardcoded SQLite's `ON CONFLICT … DO UPDATE` syntax instead of branching on the database type. They now use `ON DUPLICATE KEY UPDATE` on MySQL/MariaDB (matching the existing unique keys), like the other upserts already did. SQLite is unaffected.
- **Missing message key** — `/tcp give` and `/tcp stats` against an unknown player rendered `Message not found: player-not-found`. Added the `player-not-found` key to messages.yml. (Verified all ~350 code-referenced message keys resolve.)
[1.5.13]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.12...v1.5.13
release
TrialChamberPro 1.5.13
1.5.1319 июн. 2026 г.7Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.13] - 2026-06-19
### Fixed
- **MySQL/MariaDB vault saving failed** with `error in your SQL syntax … near 'CONFLICT(...)'`. Two vault upserts (`ChamberManager.saveVault`, `VaultManager.recordOpen`) hardcoded SQLite's `ON CONFLICT … DO UPDATE` syntax instead of branching on the database type. They now use `ON DUPLICATE KEY UPDATE` on MySQL/MariaDB (matching the existing unique keys), like the other upserts already did. SQLite is unaffected.
- **Missing message key** — `/tcp give` and `/tcp stats` against an unknown player rendered `Message not found: player-not-found`. Added the `player-not-found` key to messages.yml. (Verified all ~350 code-referenced message keys resolve.)
[1.5.13]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.12...v1.5.13
release
TrialChamberPro 1.5.12-mc26
1.5.12-mc2617 июн. 2026 г.18Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.12] - 2026-06-17
### Added
- **Vault economy rewards in loot tables.** A pool (or legacy table) can now pay money via Vault with an `economy-rewards` list — `weight` (% chance), a fixed `amount` or a `min`/`max` range, and an optional `display-name`. Works with any Vault economy provider (EssentialsX, CMI, …), deposits on the main thread, and is cleanly skipped (without affecting other loot) when no economy plugin is installed. A native, provider-agnostic alternative to `eco give {player} …` command rewards. New `utils/VaultEconomyHook`.
- **Time-based vault cooldowns now actually work** (`vaults.normal-cooldown-hours` / `ominous-cooldown-hours`). A positive value reopens the vault that many hours after a player last opened it (tracked per player in `player_vaults`); the player sees the remaining time when it's still on cooldown. `0` (or negative) keeps the vanilla permanent-until-reset behaviour. Previously any positive value was read but ignored — vaults were always permanent. A chamber reset is still a full unlock regardless of cooldown.
### Fixed
- **Chamber completions were never recorded.** `chambers_completed` was permanently 0, dead-ending the chambers leaderboard, the `/tcp stats` "Chambers Completed" line, the "Vaults per Chamber" GUI stat, and the `%tcp_chambers_completed%` / `%tcp_leaderboard_chambers%` / `%tcp_top_chambers_*%` placeholders. Completions are now credited to every participant when a chamber is fully cleared (all its trial spawners finish their waves in one run), via the existing `ChamberClearedEvent`. Toggle with `statistics.track-chamber-completion` (default on).
- **`economy-rewards` are no longer dropped when editing a legacy loot table in the GUI** — the loot editor's legacy save path carried `command-rewards` forward but not `economy-rewards`.
- **Permissions:** `tcp.admin.loot` (required by `/tcp loot`) is now declared in plugin.yml, and `tcp.admin.loot` / `tcp.admin.containers` / `tcp.admin.mobs` are now children of `tcp.admin.*` — so a wildcard grant covers them. (Previously `loot` was undeclared and `containers`/`mobs` weren't under the wildcard.)
- **Config validation** keyed two rules to the wrong section (`reset.default-reset-interval` / `performance.blocks-per-tick`); corrected to `global.*` so those values are actually range-checked at startup.
### Removed
- **No-op config options removed:** `performance.async-database-operations`, `performance.use-folialib`, and `statistics.leaderboard-update-interval` were never read by any code (DB is always async, Folia is auto-detected, leaderboard caching is fixed). Leftover entries in an existing `config.yml` are ignored. Five other never-implemented toggles (`protection.allow-pvp`, `trial-keys.fix-paper-bugs` / `prevent-duplication` / `max-stack-size`, `reset.clear-trial-omen-effect`) are now clearly marked **not yet implemented** in `config.yml` and the docs.
### Docs
- Full factual-accuracy sweep of `/docs`: corrected the `spawner-cooldown-minutes` / `wild-spawner-cooldown-minutes` section (`reset:`, not `global:`), the `/tcp delete` & `/tcp setexit` permission (`tcp.admin.create`, not `tcp.admin.generate`), the stale `tcp.admin.containers` description, the permission hierarchy, a bogus `/tcp debug` command reference, and the missing `tcp.admin.create` / `tcp.admin.loot` permission docs.
[1.5.12]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.11...v1.5.12
release
TrialChamberPro 1.5.12
1.5.1217 июн. 2026 г.13Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.12] - 2026-06-17
### Added
- **Vault economy rewards in loot tables.** A pool (or legacy table) can now pay money via Vault with an `economy-rewards` list — `weight` (% chance), a fixed `amount` or a `min`/`max` range, and an optional `display-name`. Works with any Vault economy provider (EssentialsX, CMI, …), deposits on the main thread, and is cleanly skipped (without affecting other loot) when no economy plugin is installed. A native, provider-agnostic alternative to `eco give {player} …` command rewards. New `utils/VaultEconomyHook`.
- **Time-based vault cooldowns now actually work** (`vaults.normal-cooldown-hours` / `ominous-cooldown-hours`). A positive value reopens the vault that many hours after a player last opened it (tracked per player in `player_vaults`); the player sees the remaining time when it's still on cooldown. `0` (or negative) keeps the vanilla permanent-until-reset behaviour. Previously any positive value was read but ignored — vaults were always permanent. A chamber reset is still a full unlock regardless of cooldown.
### Fixed
- **Chamber completions were never recorded.** `chambers_completed` was permanently 0, dead-ending the chambers leaderboard, the `/tcp stats` "Chambers Completed" line, the "Vaults per Chamber" GUI stat, and the `%tcp_chambers_completed%` / `%tcp_leaderboard_chambers%` / `%tcp_top_chambers_*%` placeholders. Completions are now credited to every participant when a chamber is fully cleared (all its trial spawners finish their waves in one run), via the existing `ChamberClearedEvent`. Toggle with `statistics.track-chamber-completion` (default on).
- **`economy-rewards` are no longer dropped when editing a legacy loot table in the GUI** — the loot editor's legacy save path carried `command-rewards` forward but not `economy-rewards`.
- **Permissions:** `tcp.admin.loot` (required by `/tcp loot`) is now declared in plugin.yml, and `tcp.admin.loot` / `tcp.admin.containers` / `tcp.admin.mobs` are now children of `tcp.admin.*` — so a wildcard grant covers them. (Previously `loot` was undeclared and `containers`/`mobs` weren't under the wildcard.)
- **Config validation** keyed two rules to the wrong section (`reset.default-reset-interval` / `performance.blocks-per-tick`); corrected to `global.*` so those values are actually range-checked at startup.
### Removed
- **No-op config options removed:** `performance.async-database-operations`, `performance.use-folialib`, and `statistics.leaderboard-update-interval` were never read by any code (DB is always async, Folia is auto-detected, leaderboard caching is fixed). Leftover entries in an existing `config.yml` are ignored. Five other never-implemented toggles (`protection.allow-pvp`, `trial-keys.fix-paper-bugs` / `prevent-duplication` / `max-stack-size`, `reset.clear-trial-omen-effect`) are now clearly marked **not yet implemented** in `config.yml` and the docs.
### Docs
- Full factual-accuracy sweep of `/docs`: corrected the `spawner-cooldown-minutes` / `wild-spawner-cooldown-minutes` section (`reset:`, not `global:`), the `/tcp delete` & `/tcp setexit` permission (`tcp.admin.create`, not `tcp.admin.generate`), the stale `tcp.admin.containers` description, the permission hierarchy, a bogus `/tcp debug` command reference, and the missing `tcp.admin.create` / `tcp.admin.loot` permission docs.
[1.5.12]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.11...v1.5.12
release
TrialChamberPro 1.5.11-mc26
1.5.11-mc2617 июн. 2026 г.10Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.11] - 2026-06-17
### Fixed
- **Decorated pots came back empty after a chamber reset.** A trial-chamber pot drops its break-loot from an unrolled `LootTable` (the pot is `Lootable`), but the snapshot only captured the pot's *sherds* — so a reset restored the block without its loot table and the pot dropped nothing forever after. Snapshots now capture and re-arm the pot's loot table (or its literal item), so pots refill with fresh loot every cycle. **Re-run `/tcp snapshot create` on existing chambers** so the new snapshot includes the pot loot tables (old snapshots predate this capture).
- **Container Loot GUI tooltip rendered `&` colour codes literally** (e.g. `&ePer-player-loot: &fon`). The per-player-loot status was injected as a pre-rendered section-coded string, which broke the lore line's MiniMessage re-parse; it now passes the raw message so colours render.
### Changed
- **Container Loot GUI shows each template as its real container block** — a dispenser template displays as a dispenser, a barrel as a barrel, etc., instead of every entry being a generic chest. Makes finding a specific container among 30+ far easier. (Adds a `material` column to `container_template`, migrated automatically; templates materialized before 1.5.11 show as a chest until you reset + re-materialize them via the GUI or `/tcp container`.)
- **Editing a template from the GUI or `/tcp container edit` now returns to the Container Loot view when you close it** — a "back" affordance the deposit-style editor inventory couldn't otherwise offer. In-world sneak edits still just close.
[1.5.11]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.10...v1.5.11
release
TrialChamberPro 1.5.11
1.5.1117 июн. 2026 г.7Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.11] - 2026-06-17
### Fixed
- **Decorated pots came back empty after a chamber reset.** A trial-chamber pot drops its break-loot from an unrolled `LootTable` (the pot is `Lootable`), but the snapshot only captured the pot's *sherds* — so a reset restored the block without its loot table and the pot dropped nothing forever after. Snapshots now capture and re-arm the pot's loot table (or its literal item), so pots refill with fresh loot every cycle. **Re-run `/tcp snapshot create` on existing chambers** so the new snapshot includes the pot loot tables (old snapshots predate this capture).
- **Container Loot GUI tooltip rendered `&` colour codes literally** (e.g. `&ePer-player-loot: &fon`). The per-player-loot status was injected as a pre-rendered section-coded string, which broke the lore line's MiniMessage re-parse; it now passes the raw message so colours render.
### Changed
- **Container Loot GUI shows each template as its real container block** — a dispenser template displays as a dispenser, a barrel as a barrel, etc., instead of every entry being a generic chest. Makes finding a specific container among 30+ far easier. (Adds a `material` column to `container_template`, migrated automatically; templates materialized before 1.5.11 show as a chest until you reset + re-materialize them via the GUI or `/tcp container`.)
- **Editing a template from the GUI or `/tcp container edit` now returns to the Container Loot view when you close it** — a "back" affordance the deposit-style editor inventory couldn't otherwise offer. In-world sneak edits still just close.
[1.5.11]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.10...v1.5.11
release
TrialChamberPro 1.5.10-mc26
1.5.10-mc2616 июн. 2026 г.8Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.10] - 2026-06-16
### Added
- **More PlaceholderAPI placeholders.** New: `%tcp_kdr%` (kill/death ratio), `%tcp_current_chamber_reset%` (time until the current chamber resets), `%tcp_current_chamber_paused%`, `%tcp_chamber_count%` (registered chambers server-wide), `%tcp_leaderboard_mobs%` (rank by mobs killed), and `%tcp_top_mobs_<1-10>_name%` / `_value%`. The previously-implemented-but-undocumented `%tcp_top_time_*%` board is now documented too.
- **Full PlaceholderAPI reference** added to the docs ([reference/placeholders](https://darkstarworks.gitbook.io/plugins/mc/tcp-documentation/reference/placeholders)) — the complete, accurate list with caching/freshness notes and examples. (The old "full placeholder list" link pointed at a page that didn't exist.)
### Fixed
- **`%tcp_leaderboard_vaults%` and `%tcp_top_vaults_*%` now rank by the normal + ominous TOTAL**, matching `%tcp_vaults_opened%`. They previously ranked by *normal vaults only*, so a player's "vaults" rank could disagree with their displayed vault total. (`StatisticsManager.getLeaderboard` gains a `"vaults"` total option.)
- **Stale documentation links.** Updated all GitBook URLs in `MODRINTH.md` / `SPIGOT.md` to the current docs home (`darkstarworks.gitbook.io/plugins/mc/tcp-documentation`).
[1.5.10]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.9...v1.5.10
release
TrialChamberPro 1.5.10
1.5.1016 июн. 2026 г.11Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.10] - 2026-06-16
### Added
- **More PlaceholderAPI placeholders.** New: `%tcp_kdr%` (kill/death ratio), `%tcp_current_chamber_reset%` (time until the current chamber resets), `%tcp_current_chamber_paused%`, `%tcp_chamber_count%` (registered chambers server-wide), `%tcp_leaderboard_mobs%` (rank by mobs killed), and `%tcp_top_mobs_<1-10>_name%` / `_value%`. The previously-implemented-but-undocumented `%tcp_top_time_*%` board is now documented too.
- **Full PlaceholderAPI reference** added to the docs ([reference/placeholders](https://darkstarworks.gitbook.io/plugins/mc/tcp-documentation/reference/placeholders)) — the complete, accurate list with caching/freshness notes and examples. (The old "full placeholder list" link pointed at a page that didn't exist.)
### Fixed
- **`%tcp_leaderboard_vaults%` and `%tcp_top_vaults_*%` now rank by the normal + ominous TOTAL**, matching `%tcp_vaults_opened%`. They previously ranked by *normal vaults only*, so a player's "vaults" rank could disagree with their displayed vault total. (`StatisticsManager.getLeaderboard` gains a `"vaults"` total option.)
- **Stale documentation links.** Updated all GitBook URLs in `MODRINTH.md` / `SPIGOT.md` to the current docs home (`darkstarworks.gitbook.io/plugins/mc/tcp-documentation`).
[1.5.10]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.9...v1.5.10
release
TrialChamberPro 1.5.9-mc26
1.5.9-mc2616 июн. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.9] - 2026-06-16
### Fixed
- **Per-player chamber container loot was broken for naturally-generated chambers — every container appeared empty.** A trial-chamber chest/barrel/dispenser holds its loot as an *unrolled vanilla loot table* (the inventory is genuinely empty until a player triggers a vanilla open). The feature cancelled that vanilla open and read the empty inventory as the "template", so every player's copy came out empty. Containers are now seeded by **rolling the loot table** (Bukkit `LootTable`/`Lootable`) the first time one is accessed, so copies contain the real generated loot. Single chests, double chests (each half rolled), barrels, dispensers, and droppers are all handled.
- **The op "edit template" (sneak-open) did nothing — no inventory opened.** It only printed a message and deferred to vanilla. Sneak-opening with `tcp.admin.containers` now opens the **shared loot template** for editing; changes affect every player's first-open loot.
- **Container edits never persisted across a reset, and container loot was not restored on reset at all.** Two causes: (1) there was no template store — the "template" was just the live block, whose loot table a reset *wipes* (a block-data restore recreates an empty block entity); (2) the snapshot system never captured containers in the first place. Now: the shared template is stored in a new `container_template` table and **persists across resets** (per-player copies still reset for renewable loot), and snapshots **capture and restore each container's loot table** so a broken or reset container comes back with its loot intact. *Existing chambers should re-run `/tcp snapshot create` so their containers are captured under the new format; persisted templates already survive regardless.*
### Added
- **Dispensers and droppers** are now covered by per-player container loot (`chests.per-player-loot`), alongside chests, trapped chests, and barrels.
- **Container loot in the GUI** — the chamber screen (`/tcp menu <chamber>`) gains a **Container Loot** view: status + template/copy counts, a paginated list of every container template (left-click to edit the shared template inventory, right-click to teleport), and bulk actions to **materialize all** containers, clear player copies, or reset templates.
- **`/tcp container` command** (`tcp.admin.containers`) — CLI parity with the GUI: `list`, `materialize`, `reset`, `clearcopies`, `tp <#>`, `edit <#>`. `materialize` rolls a template for every container in a chamber at once, so loot can be curated before anyone opens it. Tab-completed.
- **WorldGuard integration is now functional** (`protection.worldguard-integration`, previously a no-op stub). When a WorldGuard region covers a spot inside a chamber and grants the player build rights (region membership, an explicit `build` allow, or WG bypass), TCP yields and skips its own block-break / block-place / container-access protection there — so region owners and staff can work inside chambers overlapping their regions. Where there's no region (or no build rights), TCP protection applies as before.
[1.5.9]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.8...v1.5.9
release
TrialChamberPro 1.5.9
1.5.916 июн. 2026 г.4Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.9] - 2026-06-16
### Fixed
- **Per-player chamber container loot was broken for naturally-generated chambers — every container appeared empty.** A trial-chamber chest/barrel/dispenser holds its loot as an *unrolled vanilla loot table* (the inventory is genuinely empty until a player triggers a vanilla open). The feature cancelled that vanilla open and read the empty inventory as the "template", so every player's copy came out empty. Containers are now seeded by **rolling the loot table** (Bukkit `LootTable`/`Lootable`) the first time one is accessed, so copies contain the real generated loot. Single chests, double chests (each half rolled), barrels, dispensers, and droppers are all handled.
- **The op "edit template" (sneak-open) did nothing — no inventory opened.** It only printed a message and deferred to vanilla. Sneak-opening with `tcp.admin.containers` now opens the **shared loot template** for editing; changes affect every player's first-open loot.
- **Container edits never persisted across a reset, and container loot was not restored on reset at all.** Two causes: (1) there was no template store — the "template" was just the live block, whose loot table a reset *wipes* (a block-data restore recreates an empty block entity); (2) the snapshot system never captured containers in the first place. Now: the shared template is stored in a new `container_template` table and **persists across resets** (per-player copies still reset for renewable loot), and snapshots **capture and restore each container's loot table** so a broken or reset container comes back with its loot intact. *Existing chambers should re-run `/tcp snapshot create` so their containers are captured under the new format; persisted templates already survive regardless.*
### Added
- **Dispensers and droppers** are now covered by per-player container loot (`chests.per-player-loot`), alongside chests, trapped chests, and barrels.
- **Container loot in the GUI** — the chamber screen (`/tcp menu <chamber>`) gains a **Container Loot** view: status + template/copy counts, a paginated list of every container template (left-click to edit the shared template inventory, right-click to teleport), and bulk actions to **materialize all** containers, clear player copies, or reset templates.
- **`/tcp container` command** (`tcp.admin.containers`) — CLI parity with the GUI: `list`, `materialize`, `reset`, `clearcopies`, `tp <#>`, `edit <#>`. `materialize` rolls a template for every container in a chamber at once, so loot can be curated before anyone opens it. Tab-completed.
- **WorldGuard integration is now functional** (`protection.worldguard-integration`, previously a no-op stub). When a WorldGuard region covers a spot inside a chamber and grants the player build rights (region membership, an explicit `build` allow, or WG bypass), TCP yields and skips its own block-break / block-place / container-access protection there — so region owners and staff can work inside chambers overlapping their regions. Where there's no region (or no build rights), TCP protection applies as before.
[1.5.9]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.8...v1.5.9
release
TrialChamberPro 1.5.8-mc26
1.5.8-mc2614 июн. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.5.8] - 2026-06-14
### Added
- **Hologram vault feedback** (`vaults.feedback.mode`, default `TEXT` = unchanged). Switch to `HOLOGRAM` and 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 under `vaults.feedback.hologram` / `vaults.feedback.sounds`. Particles and advancements are unaffected, so existing setups keep their sparkles either way.
[1.5.8]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.7...v1.5.8
release
TrialChamberPro 1.5.8
1.5.814 июн. 2026 г.12Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.8] - 2026-06-14
### Added
- **Hologram vault feedback** (`vaults.feedback.mode`, default `TEXT` = unchanged). Switch to `HOLOGRAM` and 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 under `vaults.feedback.hologram` / `vaults.feedback.sounds`. Particles and advancements are unaffected, so existing setups keep their sparkles either way.
[1.5.8]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.7...v1.5.8
release
TrialChamberPro 1.5.7-mc26
1.5.7-mc2610 июн. 2026 г.31Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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 new `player_container_loot` table, 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 with `tcp.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 with `tcp.bypass.vaultplace` (default op) are exempt, so creative builds and crate setups are unaffected.
- **Key-to-reopen vaults** (`vaults.reopen-cost-keys`, default `0` = 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, so `1` = 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_TABLE` with `table: "namespace:path"` (e.g. `minecraft:chests/trial_chambers/reward` or 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 of `loot.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; same `tcp.admin.menu` permission). 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: false` or the global bStats config.
[1.5.7]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.6...v1.5.7
release
TrialChamberPro 1.5.7
1.5.710 июн. 2026 г.12Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [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 new `player_container_loot` table, 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 with `tcp.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 with `tcp.bypass.vaultplace` (default op) are exempt, so creative builds and crate setups are unaffected.
- **Key-to-reopen vaults** (`vaults.reopen-cost-keys`, default `0` = 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, so `1` = 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_TABLE` with `table: "namespace:path"` (e.g. `minecraft:chests/trial_chambers/reward` or 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 of `loot.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; same `tcp.admin.menu` permission). 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: false` or the global bStats config.
[1.5.7]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.6...v1.5.7
release
TrialChamberPro 1.5.6-mc26
1.5.6-mc269 июн. 2026 г.5Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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 create` when 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).
- **Discovery auto-snapshot never linked the snapshot in the database.** `discovery.auto-snapshot: true` captured the `.dat` file but skipped the `snapshot_file` DB update (the step `/tcp generate` performs), 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-snapshot` was 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-`collidable` at 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.5M `getBlockAt` calls plus sync chunk loads on a merged discovery chamber. Both now share a chunk tile-entity scan (`Chunk#getTileEntities`, the same pattern `ChamberDiscoveryListener` uses): O(chunks × tile-entities) instead of O(volume).
- **Stale spawner counts made `ChamberClearedEvent` fire 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. New `SpawnerWaveManager.invalidateChamberSpawnerCaches(chamberId)` is now called from `ChamberManager.updateBounds`, `scanChamber`, and the spawner `BlockBreakEvent` handler — premium-module tier-ups (TCP-MythicTrials) depend on this signal being correct.
- **Breaking a standalone-glowed spawner orphaned its glow.** In `chamber-remaining` mode, breaking a *non-active* glowing spawner left its glow entity floating until the next chamber reset (`cancelWaveAt` only 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.pendingOffers` was only cleared on respawn; a player who quit on the death screen and never rejoined left their entry (and its `Location` → world reference) in memory permanently. Now also cleared on `PlayerQuitEvent`.
- **`tcp.admin.create` was never declared in plugin.yml.** The permission gating `/tcp delete` and `/tcp setexit` was checked in code but missing from the permission tree — so it wasn't a child of `tcp.admin.*`, and staff granted the wildcard couldn't delete chambers or set exits (ops were unaffected). Now declared with `default: op` and included in `tcp.admin.*`.
[1.5.6]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.5...v1.5.6
release
TrialChamberPro 1.5.6
1.5.69 июн. 2026 г.6Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [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 create` when 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).
- **Discovery auto-snapshot never linked the snapshot in the database.** `discovery.auto-snapshot: true` captured the `.dat` file but skipped the `snapshot_file` DB update (the step `/tcp generate` performs), 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-snapshot` was 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-`collidable` at 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.5M `getBlockAt` calls plus sync chunk loads on a merged discovery chamber. Both now share a chunk tile-entity scan (`Chunk#getTileEntities`, the same pattern `ChamberDiscoveryListener` uses): O(chunks × tile-entities) instead of O(volume).
- **Stale spawner counts made `ChamberClearedEvent` fire 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. New `SpawnerWaveManager.invalidateChamberSpawnerCaches(chamberId)` is now called from `ChamberManager.updateBounds`, `scanChamber`, and the spawner `BlockBreakEvent` handler — premium-module tier-ups (TCP-MythicTrials) depend on this signal being correct.
- **Breaking a standalone-glowed spawner orphaned its glow.** In `chamber-remaining` mode, breaking a *non-active* glowing spawner left its glow entity floating until the next chamber reset (`cancelWaveAt` only 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.pendingOffers` was only cleared on respawn; a player who quit on the death screen and never rejoined left their entry (and its `Location` → world reference) in memory permanently. Now also cleared on `PlayerQuitEvent`.
- **`tcp.admin.create` was never declared in plugin.yml.** The permission gating `/tcp delete` and `/tcp setexit` was checked in code but missing from the permission tree — so it wasn't a child of `tcp.admin.*`, and staff granted the wildcard couldn't delete chambers or set exits (ops were unaffected). Now declared with `default: op` and included in `tcp.admin.*`.
[1.5.6]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.5...v1.5.6
release
TrialChamberPro 1.5.5-mc26
1.5.5-mc269 июн. 2026 г.6Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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.5` on 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.0` Y) so the shell encloses the spawner block exactly. Applies to both the wave-active and `chamber-remaining` glow modes.
### Changed
- **`/tcp snapshot create` and `/tcp snapshot restore` now 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 update` already 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.
[1.5.5]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.4...v1.5.5
release
TrialChamberPro 1.5.5
1.5.59 июн. 2026 г.3Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [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.5` on 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.0` Y) so the shell encloses the spawner block exactly. Applies to both the wave-active and `chamber-remaining` glow modes.
### Changed
- **`/tcp snapshot create` and `/tcp snapshot restore` now 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 update` already 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.
[1.5.5]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.4...v1.5.5
release
TrialChamberPro 1.5.4-mc26
1.5.4-mc269 июн. 2026 г.5Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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-spawners` feature spawned an Interaction entity at each active spawner and set its `isGlowing` flag — 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 by `INVISIBILITY`, 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 from `PlayerMovementListener` on the block-boundary-crossing transition, and from `PlayerQuitEvent` for 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 the `statistics.*` 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`** (default `wave-active`). New `chamber-remaining` mode 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 `-mc26` release tags.** `fetchLatestVersion()` only stripped a leading `v`, so a `releases/latest` tag of `v1.5.2-mc26` became `1.5.2-mc26` and `isNewerVersion()` parsed the third segment (`2-mc26`) as `0` — 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 both `vX.Y.Z` and `vX.Y.Z-mc26` collapse to the same `X.Y.Z` before comparison.
[1.5.4]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.2...v1.5.4
release
TrialChamberPro 1.5.4
1.5.49 июн. 2026 г.6Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.4] - 2026-06-09
### Fixed
- **Spawner glow outline never rendered (v1.2.27 regression).** The opt-in `spawner-waves.glow-active-spawners` feature spawned an Interaction entity at each active spawner and set its `isGlowing` flag — 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 by `INVISIBILITY`, 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 from `PlayerMovementListener` on the block-boundary-crossing transition, and from `PlayerQuitEvent` for 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 the `statistics.*` 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`** (default `wave-active`). New `chamber-remaining` mode 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 `-mc26` release tags.** `fetchLatestVersion()` only stripped a leading `v`, so a `releases/latest` tag of `v1.5.2-mc26` became `1.5.2-mc26` and `isNewerVersion()` parsed the third segment (`2-mc26`) as `0` — 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 both `vX.Y.Z` and `vX.Y.Z-mc26` collapse to the same `X.Y.Z` before comparison.
[1.5.4]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.2...v1.5.4
release
TrialChamberPro 1.5.2-mc26
1.5.2-mc2627 мая 2026 г.60Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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.** `UpdateChecker` is now also a `Listener`. 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 reset` silently failing with "check console" but nothing in the console.** When a previous reset for the same chamber was still in `inProgress` (mid-restore, or stuck), the duplicate request returned false after only a `logger.fine` line, which Bukkit suppresses by default — so admins saw the failure chat message with no visible explanation. The log line is now a `warning` and tells you exactly what happened plus the restart-to-clear hint.
- **`/tcp snapshot create` reporting success when the chamber row wasn't actually updated.** `captureSnapshot` wrote the `.dat` file then called `setSnapshotFile()` without checking the return value; a failed DB update left the chamber's `snapshot_file` column NULL, so the *next* reset logged "No snapshot found" and skipped restoration even though the file was on disk. Both `createSnapshot` and `setSnapshotFile` are now wrapped — exceptions are logged with stack traces, and a failed DB link produces a clear `snapshot-failed` chat 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 to `lootActions`.
[1.5.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.1...v1.5.2
release
TrialChamberPro 1.5.2
1.5.227 мая 2026 г.54Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.5.2] - 2026-05-27
### Added
- **In-game update notification with clickable Modrinth download link.** `UpdateChecker` is now also a `Listener`. 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 reset` silently failing with "check console" but nothing in the console.** When a previous reset for the same chamber was still in `inProgress` (mid-restore, or stuck), the duplicate request returned false after only a `logger.fine` line, which Bukkit suppresses by default — so admins saw the failure chat message with no visible explanation. The log line is now a `warning` and tells you exactly what happened plus the restart-to-clear hint.
- **`/tcp snapshot create` reporting success when the chamber row wasn't actually updated.** `captureSnapshot` wrote the `.dat` file then called `setSnapshotFile()` without checking the return value; a failed DB update left the chamber's `snapshot_file` column NULL, so the *next* reset logged "No snapshot found" and skipped restoration even though the file was on disk. Both `createSnapshot` and `setSnapshotFile` are now wrapped — exceptions are logged with stack traces, and a failed DB link produces a clear `snapshot-failed` chat 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 to `lootActions`.
[1.5.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.1...v1.5.2
release
TrialChamberPro 1.5.1-mc26
1.5.1-mc2627 мая 2026 г.5Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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 with `cooldownLength = chamber.resetInterval`, so the spawner naturally rearms right as the chamber resets. Stored as the sentinel value `-2` on `chambers.spawner_cooldown_minutes`; existing per-chamber values, the `null = global config` default, and the `-1 = vanilla 30m` / `0 = immediate` modes 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 audit` lists them grouped by `table / pool` with the row kind/index/material/reason, capped at 50 rows; (c) `LootEditorView` decorates each legacy row with a `⚠ Legacy entry — re-add to capture NBT` lore line so it's obvious which to re-enter. Plain `10 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 `SnapshotReminderService` pings admins with `tcp.admin.snapshot` (a) once on login if any chamber lacks a snapshot, and (b) periodically as a coalesced console + admin-chat summary. Configurable under `discovery.snapshot-reminder.*` (`enabled`, `on-join`, `interval-minutes`). Defaults: on, 30 min interval.
### Changed
- **Pending-reset console output coalesced.** With `global.reset-require-confirmation` enabled, the per-chamber `is due for reset — awaiting confirmation` log 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 `0` instead of `-1`.** `vaults.normal-cooldown-hours` and `vaults.ominous-cooldown-hours` ship at `0` (vanilla behaviour — locked until chamber reset). The old `-1` default was being clamped to `0` by the config validator and producing a startup warning on every fresh install; the value and the comment now reflect what actually happens.
[1.5.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.0...v1.5.1
release
TrialChamberPro 1.5.1
1.5.127 мая 2026 г.10Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [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 with `cooldownLength = chamber.resetInterval`, so the spawner naturally rearms right as the chamber resets. Stored as the sentinel value `-2` on `chambers.spawner_cooldown_minutes`; existing per-chamber values, the `null = global config` default, and the `-1 = vanilla 30m` / `0 = immediate` modes 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 audit` lists them grouped by `table / pool` with the row kind/index/material/reason, capped at 50 rows; (c) `LootEditorView` decorates each legacy row with a `⚠ Legacy entry — re-add to capture NBT` lore line so it's obvious which to re-enter. Plain `10 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 `SnapshotReminderService` pings admins with `tcp.admin.snapshot` (a) once on login if any chamber lacks a snapshot, and (b) periodically as a coalesced console + admin-chat summary. Configurable under `discovery.snapshot-reminder.*` (`enabled`, `on-join`, `interval-minutes`). Defaults: on, 30 min interval.
### Changed
- **Pending-reset console output coalesced.** With `global.reset-require-confirmation` enabled, the per-chamber `is due for reset — awaiting confirmation` log 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 `0` instead of `-1`.** `vaults.normal-cooldown-hours` and `vaults.ominous-cooldown-hours` ship at `0` (vanilla behaviour — locked until chamber reset). The old `-1` default was being clamped to `0` by the config validator and producing a startup warning on every fresh install; the value and the comment now reflect what actually happens.
[1.5.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.5.0...v1.5.1
release
TrialChamberPro 1.5.0-mc26
1.5.0-mc2626 мая 2026 г.10Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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 list` pagination + locator.** Lists 10 chambers per page with clickable Prev/Next instead of spamming 100+ lines, and **`/tcp list current`** reports 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 like `create`.
- **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 `//undo` still works; falls back automatically.
- **Operator-confirmation reset queue** (`global.reset-require-confirmation`, default off). Due chambers are parked and online admins notified; `/tcp reset pending` lists 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 vanilla `Trial Spawner ... has no detected players` console 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 cleared `Chamber`, the cumulative `Set<UUID>` of participants across every wave in the cycle, and the wall-clock `durationMs` from first-wave-start to last-wave-complete. Tracking is per-chamber, reset on every `ChamberResetEvent`. Wild spawners do not contribute.
- **Network-sync foundation (developer API).** Groundwork for a future cross-server module: `ChamberManager`, `StatisticsManager` and `VaultManager` are now registered with Bukkit's `ServicesManager` (alongside `DatabaseManager`); cache-invalidation hooks added (`StatisticsManager.invalidatePlayer(uuid)`, `ChamberManager.reloadFromStore(name)` / `invalidateChamber(name)`); new `StatisticsUpdatedEvent` fires 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:jigsaw` connectors 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.
- **`SpawnerWaveManager` gained per-chamber wave-completion bookkeeping** to support `ChamberClearedEvent`. 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` (default `true`); 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.onPlayerMove` previously walked an O(r³) cube around every moving player calling `world.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 on `PlayerTeleportEvent`, `PlayerRespawnEvent`, and `PlayerChangedWorldEvent` (one tick later, so `player.location` reflects the destination). Bug existed since v1.2.26 when the proximity-cleanup logic was introduced.
### Config additions
- **`reset.clear-added-blocks`** (default `true`) — whether chamber reset also clears player-added blocks that fall outside the snapshot (see Fixed above).
- **`global.use-fawe`** (default `false`) — route scheduled chamber resets through FastAsyncWorldEdit when available.
- **`global.reset-require-confirmation`** (default `false`) — 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`** (default `true`) — mute the vanilla `Trial Spawner ... has no detected players` console line.
[1.5.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.7...v1.5.0
release
TrialChamberPro 1.5.0
1.5.026 мая 2026 г.12Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [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 list` pagination + locator.** Lists 10 chambers per page with clickable Prev/Next instead of spamming 100+ lines, and **`/tcp list current`** reports 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 like `create`.
- **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 `//undo` still works; falls back automatically.
- **Operator-confirmation reset queue** (`global.reset-require-confirmation`, default off). Due chambers are parked and online admins notified; `/tcp reset pending` lists 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 vanilla `Trial Spawner ... has no detected players` console 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 cleared `Chamber`, the cumulative `Set<UUID>` of participants across every wave in the cycle, and the wall-clock `durationMs` from first-wave-start to last-wave-complete. Tracking is per-chamber, reset on every `ChamberResetEvent`. Wild spawners do not contribute.
- **Network-sync foundation (developer API).** Groundwork for a future cross-server module: `ChamberManager`, `StatisticsManager` and `VaultManager` are now registered with Bukkit's `ServicesManager` (alongside `DatabaseManager`); cache-invalidation hooks added (`StatisticsManager.invalidatePlayer(uuid)`, `ChamberManager.reloadFromStore(name)` / `invalidateChamber(name)`); new `StatisticsUpdatedEvent` fires 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:jigsaw` connectors 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.
- **`SpawnerWaveManager` gained per-chamber wave-completion bookkeeping** to support `ChamberClearedEvent`. 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` (default `true`); 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.onPlayerMove` previously walked an O(r³) cube around every moving player calling `world.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 on `PlayerTeleportEvent`, `PlayerRespawnEvent`, and `PlayerChangedWorldEvent` (one tick later, so `player.location` reflects the destination). Bug existed since v1.2.26 when the proximity-cleanup logic was introduced.
### Config additions
- **`reset.clear-added-blocks`** (default `true`) — whether chamber reset also clears player-added blocks that fall outside the snapshot (see Fixed above).
- **`global.use-fawe`** (default `false`) — route scheduled chamber resets through FastAsyncWorldEdit when available.
- **`global.reset-require-confirmation`** (default `false`) — 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`** (default `true`) — mute the vanilla `Trial Spawner ... has no detected players` console line.
[1.5.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.7...v1.5.0
release
TrialChamberPro 1.4.7-mc26
1.4.7-mc2619 мая 2026 г.35Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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 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.
### Config additions
- **`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.
### 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`.
[1.4.7]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.6...v1.4.7
release
TrialChamberPro 1.4.7
1.4.719 мая 2026 г.35Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.7] - 2026-05-19
### Added
- **Per-chamber reset broadcast toggle.** Each chamber now has a `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.
### Config additions
- **`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.
### 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`.
[1.4.7]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.6...v1.4.7
release
TrialChamberPro 1.4.6-mc26
1.4.6-mc2614 мая 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### 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 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.
- **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 in `ChamberSettingsView`, were calling synchronous `teleport()` inside GUI click handlers (which run on the player's region thread on Folia). Switched to `teleportAsync()`.
- **Folia/Luminol: spectator mode teleports no longer crash.** `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.
[1.4.6]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.5...v1.4.6
release
TrialChamberPro 1.4.6
1.4.614 мая 2026 г.19Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [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 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.
- **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 in `ChamberSettingsView`, were calling synchronous `teleport()` inside GUI click handlers (which run on the player's region thread on Folia). Switched to `teleportAsync()`.
- **Folia/Luminol: spectator mode teleports no longer crash.** `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.
[1.4.6]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.5...v1.4.6
release
TrialChamberPro 1.4.5-mc26
1.4.5-mc2613 мая 2026 г.11Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.4.5] - 2026-05-13
### Fixed
- **TCP-preset spawners placed outside chambers can now be recovered with Silk Touch.** Vanilla trial spawners never drop anything when broken — not even with Silk Touch. TCP's protection listener only guards spawners *inside* registered chambers and returns early for anything outside them, meaning a spawner issued via `/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.
### Localization
- New key: `orphan-spawner-needs-silk-touch` — message sent when a player tries to break an orphaned preset spawner without Silk Touch.
[1.4.5]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.4...v1.4.5
release
TrialChamberPro 1.4.5
1.4.513 мая 2026 г.18Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.5] - 2026-05-13
### Fixed
- **TCP-preset spawners placed outside chambers can now be recovered with Silk Touch.** Vanilla trial spawners never drop anything when broken — not even with Silk Touch. TCP's protection listener only guards spawners *inside* registered chambers and returns early for anything outside them, meaning a spawner issued via `/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.
### Localization
- New key: `orphan-spawner-needs-silk-touch` — message sent when a player tries to break an orphaned preset spawner without Silk Touch.
[1.4.5]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.4...v1.4.5
release
TrialChamberPro 1.4.4-mc26
1.4.4-mc2612 мая 2026 г.10Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.4.4] - 2026-05-12
### Added
- **Bundled vanilla-accurate loot tables.** `loot.yml` now ships two ready-to-use loot tables — `vanilla-normal` and `vanilla-ominous` — as a commented section titled "VANILLA-ACCURATE LOOT TABLES". Both are faithful three-pool recreations transcribed directly from Mojang's own datapack JSONs (`data/minecraft/loot_table/chests/trial_chambers/{reward,reward_common,reward_rare,reward_unique,reward_ominous,reward_ominous_common,reward_ominous_rare,reward_ominous_unique}.json`), reproducing vanilla's structure: pool 1 picks 1 item with an 80/20 rare-or-common split, pool 2 rolls 1-3 additional common items, pool 3 has a chance at a single ultra-rare item. Every fidelity compromise the plugin's schema imposes is documented inline — vanilla's 25%/75% unique-pool gate maps to `min-rolls: 0, max-rolls: 1` (≈50%) with tuning instructions; vanilla's `enchant_with_levels` algorithm is approximated with `random-enchantment-pool` (one random enchant per item); shield damage from `set_damage` fraction; ominous bottle amplifier ranges split into separate per-level entries (Bad Omen I/II for normal, III/IV/V for ominous). To activate: uncomment the desired block, paste under `loot-tables:`, optionally rename to `default` / `ominous-default`, and `/tcp reload`.
### Documentation
- **`docs/configuration/loot.yml.md` opens with a "Want vanilla loot? It's already in the file." section** explaining where the bundled tables live and the five-step activation flow (find the section → copy the block → strip the leading `# ` → paste under `loot-tables:` → reload). Existing customization documentation is unchanged.
[1.4.4]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.3...v1.4.4
release
TrialChamberPro 1.4.4
1.4.412 мая 2026 г.12Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.4] - 2026-05-12
### Added
- **Bundled vanilla-accurate loot tables.** `loot.yml` now ships two ready-to-use loot tables — `vanilla-normal` and `vanilla-ominous` — as a commented section titled "VANILLA-ACCURATE LOOT TABLES". Both are faithful three-pool recreations transcribed directly from Mojang's own datapack JSONs (`data/minecraft/loot_table/chests/trial_chambers/{reward,reward_common,reward_rare,reward_unique,reward_ominous,reward_ominous_common,reward_ominous_rare,reward_ominous_unique}.json`), reproducing vanilla's structure: pool 1 picks 1 item with an 80/20 rare-or-common split, pool 2 rolls 1-3 additional common items, pool 3 has a chance at a single ultra-rare item. Every fidelity compromise the plugin's schema imposes is documented inline — vanilla's 25%/75% unique-pool gate maps to `min-rolls: 0, max-rolls: 1` (≈50%) with tuning instructions; vanilla's `enchant_with_levels` algorithm is approximated with `random-enchantment-pool` (one random enchant per item); shield damage from `set_damage` fraction; ominous bottle amplifier ranges split into separate per-level entries (Bad Omen I/II for normal, III/IV/V for ominous). To activate: uncomment the desired block, paste under `loot-tables:`, optionally rename to `default` / `ominous-default`, and `/tcp reload`.
### Documentation
- **`docs/configuration/loot.yml.md` opens with a "Want vanilla loot? It's already in the file." section** explaining where the bundled tables live and the five-step activation flow (find the section → copy the block → strip the leading `# ` → paste under `loot-tables:` → reload). Existing customization documentation is unchanged.
[1.4.4]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.3...v1.4.4
release
TrialChamberPro 1.4.3-mc26
1.4.3-mc2612 мая 2026 г.10Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
_(due to a mistake on my end, several yml files were not included in the previous release of 1.4.3-mc26. This re-upload fixes that)_
## [1.4.3] - 2026-05-05
### Added
- **Chamber pause state.** Registered chambers can now be paused via `/tcp pause <name>` or the new toggle in the Chamber Detail GUI. Pausing preserves the full DB record — no history, stats, or vault data is lost — but suspends all active behavior: automatic resets stop scheduling, protection events skip the chamber, vault interactions are blocked with a `chamber-is-paused` message, and player/mob tracking is silenced. Resume at any time with `/tcp resume <name>` or the GUI toggle.
- **Auto-pause on destruction.** New `protection.auto-pause-on-destruction: false` opt-in (disabled by default). When enabled, a MONITOR-priority break observer counts vault and trial spawner destructions inside a chamber; once the count reaches `protection.auto-pause-threshold` (default `6`), the chamber auto-pauses and ops with `tcp.discovery.notify` permission are notified. Counter resets on every pause/resume transition and on chamber reset, so a resumed chamber always starts fresh.
- **New permission `tcp.admin.pause`** (default op) — required to use `/tcp pause` and `/tcp resume`.
### Config additions
- **`protection.auto-pause-on-destruction`** (default `false`) — master switch for the automatic pause on critical-block destruction.
- **`protection.auto-pause-threshold`** (default `6`) — how many combined vault + trial spawner destructions inside a chamber trigger the auto-pause. Minimum effective value is `1`. A low value (1-2) catches individual mischief; the default (6) targets systematic demolition. Resets on every pause/resume cycle and on chamber reset.
### Localization
- New flat keys: `chamber-paused`, `chamber-resumed`, `chamber-already-paused`, `chamber-not-paused`, `chamber-is-paused`, `chamber-auto-paused` (with `{chamber}`, `{block}`, `{count}` placeholders), `info-paused`, `help-pause`, `help-resume`, `usage-pause`, `usage-resume`.
- New GUI keys under `gui.chamber-detail`: `pause-toggle-name`, `pause-toggle-lore-active`, `pause-toggle-lore-paused`.
[1.4.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.2...v1.4.3
release
TrialChamberPro 1.4.3
1.4.35 мая 2026 г.42Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.3] - 2026-05-05
### Added
- **Chamber pause state.** Registered chambers can now be paused via `/tcp pause <name>` or the new toggle in the Chamber Detail GUI. Pausing preserves the full DB record — no history, stats, or vault data is lost — but suspends all active behavior: automatic resets stop scheduling, protection events skip the chamber, vault interactions are blocked with a `chamber-is-paused` message, and player/mob tracking is silenced. Resume at any time with `/tcp resume <name>` or the GUI toggle.
- **Auto-pause on destruction.** New `protection.auto-pause-on-destruction: false` opt-in (disabled by default). When enabled, a MONITOR-priority break observer counts vault and trial spawner destructions inside a chamber; once the count reaches `protection.auto-pause-threshold` (default `6`), the chamber auto-pauses and ops with `tcp.discovery.notify` permission are notified. Counter resets on every pause/resume transition and on chamber reset, so a resumed chamber always starts fresh.
- **New permission `tcp.admin.pause`** (default op) — required to use `/tcp pause` and `/tcp resume`.
### Config additions
- **`protection.auto-pause-on-destruction`** (default `false`) — master switch for the automatic pause on critical-block destruction.
- **`protection.auto-pause-threshold`** (default `6`) — how many combined vault + trial spawner destructions inside a chamber trigger the auto-pause. Minimum effective value is `1`. A low value (1-2) catches individual mischief; the default (6) targets systematic demolition. Resets on every pause/resume cycle and on chamber reset.
### Localization
- New flat keys: `chamber-paused`, `chamber-resumed`, `chamber-already-paused`, `chamber-not-paused`, `chamber-is-paused`, `chamber-auto-paused` (with `{chamber}`, `{block}`, `{count}` placeholders), `info-paused`, `help-pause`, `help-resume`, `usage-pause`, `usage-resume`.
- New GUI keys under `gui.chamber-detail`: `pause-toggle-name`, `pause-toggle-lore-active`, `pause-toggle-lore-paused`.
[1.4.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.2...v1.4.3
release
TrialChamberPro 1.4.2-mc26
1.4.2-mc261 мая 2026 г.18Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.4.2] - 2026-05-02
### Fixed
- **`//undo` no longer gets hijacked by TCP after a chamber generation.** The previous `UndoListener` cancelled `//undo` at HIGHEST priority and demanded `confirm` / `cancel` in chat — but the chat handler only cleared the *pending* state on cancel, leaving the per-player `last` entry forever. Once any chamber had been generated in the session, every subsequent `//undo` (even for unrelated WorldEdit edits made hours later, or by a moderator joining after the fact) was intercepted, the chat prompt fired, and the actual WorldEdit undo never ran. There was also no path to retry: cancelling re-armed the same intercept, and confirming only deleted the DB registration without rolling back the placed blocks. The whole interception model was wrong — chamber registration is a DB write, not a WorldEdit edit, so it doesn't belong on WE's undo stack to begin with. New behavior: TCP never cancels `//undo`. WorldEdit's stack is fully untouched, any depth, any time. A new passive `PostUndoHintListener` observes `//undo` (and `/undo`) at MONITOR priority without cancelling and, *only if the player happens to be standing inside a registered chamber* when they run undo, posts a one-line tip suggesting `/tcp delete <name>` to also clean up the registration. Generation now also emits a one-time `chamber-created-rollback-tip` immediately after `chamber-created` so users learn the two-step rollback (`//undo` for blocks → `/tcp delete` for registration) up front. `UndoListener.kt` and `UndoTracker.kt` deleted.
### Localization
- **`messages.yml`**: removed obsolete `undo-confirm`, `undo-confirm-pending`, `undo-deleted`, `undo-failed`, `undo-cancelled`, `undo-expired` (the chat-prompt strings from the old confirmation flow). Added `undo-cleanup-hint` (passive post-`//undo` tip) and `chamber-created-rollback-tip` (post-generation tip). The `paste-undo-hint` key is unchanged — schematic paste still references `//undo` correctly because that path always was a normal WorldEdit edit.
[1.4.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.1...v1.4.2
release
TrialChamberPro 1.4.2
1.4.21 мая 2026 г.15Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.2] - 2026-05-02
### Fixed
- **`//undo` no longer gets hijacked by TCP after a chamber generation.** The previous `UndoListener` cancelled `//undo` at HIGHEST priority and demanded `confirm` / `cancel` in chat — but the chat handler only cleared the *pending* state on cancel, leaving the per-player `last` entry forever. Once any chamber had been generated in the session, every subsequent `//undo` (even for unrelated WorldEdit edits made hours later, or by a moderator joining after the fact) was intercepted, the chat prompt fired, and the actual WorldEdit undo never ran. There was also no path to retry: cancelling re-armed the same intercept, and confirming only deleted the DB registration without rolling back the placed blocks. The whole interception model was wrong — chamber registration is a DB write, not a WorldEdit edit, so it doesn't belong on WE's undo stack to begin with. New behavior: TCP never cancels `//undo`. WorldEdit's stack is fully untouched, any depth, any time. A new passive `PostUndoHintListener` observes `//undo` (and `/undo`) at MONITOR priority without cancelling and, *only if the player happens to be standing inside a registered chamber* when they run undo, posts a one-line tip suggesting `/tcp delete <name>` to also clean up the registration. Generation now also emits a one-time `chamber-created-rollback-tip` immediately after `chamber-created` so users learn the two-step rollback (`//undo` for blocks → `/tcp delete` for registration) up front. `UndoListener.kt` and `UndoTracker.kt` deleted.
### Localization
- **`messages.yml`**: removed obsolete `undo-confirm`, `undo-confirm-pending`, `undo-deleted`, `undo-failed`, `undo-cancelled`, `undo-expired` (the chat-prompt strings from the old confirmation flow). Added `undo-cleanup-hint` (passive post-`//undo` tip) and `chamber-created-rollback-tip` (post-generation tip). The `paste-undo-hint` key is unchanged — schematic paste still references `//undo` correctly because that path always was a normal WorldEdit edit.
[1.4.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.1...v1.4.2
release
TrialChamberPro 1.4.1-mc26
1.4.1-mc261 мая 2026 г.12Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.4.1] - 2026-04-29
### Fixed
- **Auto-discovery now merges adjacent chamber regions instead of double-registering them.** The previous flow registered every BFS result as a fresh chamber and only short-circuited if the candidate's *center* fell inside an existing AABB. Two physically distinct vanilla chambers ~500 blocks apart, or a single physical chamber whose two halves seeded discovery from different chunks, would happily produce two side-by-side `auto_world_*` entries (the user-reported case: `auto_world_851_747` + `auto_world_891_765` registered in the same millisecond, ~40 blocks apart on the X axis). New behavior: after BFS produces a candidate AABB, `ChamberDiscoveryManager` scans cached chambers in the same world for any whose AABB sits within `discovery.merge-distance-blocks` (Chebyshev edge-to-edge, default 250) of the candidate. If found, the existing chamber's bounds are unioned with the candidate via the new `ChamberManager.updateBounds(...)`, the chamber is rescanned to absorb the new vaults/spawners, and (if `discovery.auto-snapshot` is enabled) the snapshot is regenerated. If not found, registration proceeds as before. New `discovery.max-merged-volume` (default 1,500,000 blocks) caps how far a runaway daisy-chain can grow so a pathological geometry can't swallow large regions into a single logical chamber. Set `discovery.merge-distance-blocks: -1` to disable merging entirely and restore the v1.2.25 behavior.
- **Discovery registration race closed.** Two near-simultaneous BFS results (typical during the startup sweep) could both pass the existing-chamber check before either committed — the merge logic above wouldn't help if both registrations were already in flight. New `kotlinx.coroutines.sync.Mutex` in `ChamberDiscoveryManager` serializes the entire registration step (mutex acquisition → cache scan → merge-or-create → mark processed). Throughput cost is zero in practice — registration fires at most a handful of times per session and is gated by the chunk-load / startup-sweep cadence anyway.
### Changed — UX & GUI
- **Main menu flattened — `SettingsMenuView` removed.** The previous "Settings → Plugin Settings → Global Settings" path had two papercut bugs: clicking "Settings" on the main menu opened a "Plugin Settings" hub whose only meaningful contents (Global Settings, Protection Settings, Performance Info, Reload Configuration) could just as well live one level up; and the back button on Protection Settings landed on Plugin Settings instead of the main menu, leaving the user one step deeper than they started. New main menu is a 6-row layout: Chambers / Loot Tables / Global Settings / Protection Settings on row 1, Help / Performance Info / Statistics on row 2, Reload Configuration centered on row 4 (shift-click to fire so accidental clicks don't reload), Close on row 5. `SettingsMenuView.kt` deleted; `Screen.SETTINGS_MENU` and `MenuService.openSettingsMenu` removed; back-button destinations in `GlobalSettingsView` and `ProtectionMenuView` updated from `gui.common.dest-settings` → `gui.common.dest-main-menu`. `gui.settings-menu.*` keys deleted from `messages.yml`; `gui.main-menu.settings-name/lore` renamed `global-settings-name/lore`; new `performance-name/lore` and `reload-name/lore` keys added under `gui.main-menu`. `CustomMobProviderView`'s back button still uses `dest-settings` because it goes back to *chamber* settings, not the deleted plugin-settings hub.
- **Loot editor now shows the effective drop rate per item.** The Amount/Chance/Rolls model is technically accurate but genuinely confusing: a user looking at "Amount: 2-4" + "Chance: 20%" tends to read that as "20% chance of getting 2-4 of this item per opening", and the separate "Rolls: 1-3" tile multiplies the per-draw probability without making that visually obvious on the items themselves. Each item lore now includes a new `Expected: ≈X per vault opening` line computed as `avg(draws) × (weight / totalWeight) × avg(amount)` for weighted items, and `avg(amount)` for guaranteed items (which always drop once per opening). Adaptive precision: ≥10 → integer, ≥1 → one decimal, <1 → two decimals (so a 1-in-50 tier item still reads `≈0.02` rather than rounding to 0). The per-item "Chance: X%" line is now suffixed with " per draw" to make the relationship explicit. The "Rolls Configuration" tile is renamed "Draws per Opening" and its lore opens with three plain-English lines explaining that each opening picks N items from the weighted list, each draw chooses one item using its chance, and more draws = more total loot. Bumping the draws slider visibly recomputes every Expected line in real time so the multiplicative relationship becomes self-evident. Pure presentation change — `loot.yml` data model untouched.
- **Help view rebuilt to mirror `/tcp help` and cover every wired subcommand.** Audit found `mobs` (v1.3.0) was missing from chat help entirely, and both `mobs` and `give` (v1.3.1) were missing from the GUI Help view. Two dead chat-help keys (`help-procgen`, `help-teleport` — subcommands that don't exist) deleted. Chat help reordered into logical groups (Browse → Create → Manage → Loot/Mobs → Players & rewards → Admin) with a comment in `TCPCommand.sendHelp` noting the order mirrors the GUI tile grouping so future edits don't drift. Wording tightened on `help-generate`, `help-snapshot`, `help-loot`, `help-vault`, `help-key`, `help-leaderboard`, `help-info`, `help-list`, and `help-reload` to drop jargon ("WE wand", "saved var") and uninformative phrases ("Manage snapshots"). GUI Help view re-laid out to a 4 + 4 + 1 tile grid: row 1 overview (Commands / Permissions / About), row 2 gameplay command groups (Chambers / Loot / Vaults & Keys / Stats), row 3 admin & setup command groups (Snapshots / Generate / Custom Mobs / Spawner Presets), row 4 lone Admin Tools tile, row 5 navigation. New `mobs-cmd` and `give-cmd` tiles cover the previously absent commands. Every tile lore opens with one plain-English sentence describing the group ("Browse and manage existing chambers." / "View or override per-chamber loot." etc.) before listing the actual commands. The `permissions` tile expanded from 5 entries to ~13 organized into Admin / Player / Bypass / Notifications groups.
### Localization
- **Every text change in this release routes through `messages.yml`.** No `Component.text(...)` literals introduced anywhere; all new and changed strings are translatable through the existing `gui.<view>.*` and flat `*` key system. New keys: `discovery-merged`, `gui.main-menu.global-settings-name/lore`, `gui.main-menu.performance-name/lore`, `gui.main-menu.reload-name/lore`, `gui.loot-editor.item-expected`, `gui.help-menu.mobs-cmd-name/lore`, `gui.help-menu.give-cmd-name/lore`, `help-mobs`. Removed keys: every key under `gui.settings-menu.*`, `help-procgen`, `help-teleport`, `gui.main-menu.settings-name/lore` (renamed). Changed keys: `gui.loot-editor.item-chance`, `gui.loot-editor.rolls-name`, `gui.loot-editor.rolls-lore`, `gui.main-menu.protection-name`, every `gui.help-menu.*` lore. The chat-help block in `messages.yml` was scattered across two locations (lines 152-166 and 225-228); all entries are now consolidated into a single contiguous block in the order `sendHelp` emits them.
### Added
- **Startup schema check for `messages.yml`.** New `MessagesSchemaValidator` (run from `onEnable` immediately after `ConfigValidator`) loads the JAR-bundled `messages.yml` and the user's deployed copy, walks both for leaf keys (filtering out `ConfigurationSection` containers so a parent path doesn't mask a missing leaf), and logs a warning listing every key the bundle defines that the user's file lacks — up to 25 enumerated, then truncated with `... and N more`. Output includes a 4-step recovery path (rename → restart → port translations) and notes the `debug.skip-messages-schema-check: true` opt-out. Pure log surface — never modifies the user's file, never blocks startup. Motivated by a v1.4.0 user bug report where `<missing: gui.loot-table-list.table-name-normal>` reached the GUI because the deployed `messages.yml` was an older copy that predated the `gui.loot-table-list.*` block; the check would have surfaced that as a console warning at startup.
### Config additions
- **`discovery.merge-distance-blocks`** (default `250`) — Chebyshev edge-to-edge distance below which two regions are folded into a single chamber. Set to `-1` to disable merging.
- **`discovery.max-merged-volume`** (default `1500000`) — hard cap on the post-merge bounding-box volume in blocks. Above this the merge is rejected and the new region is logged as a skip (region debounce still applies).
- **`debug.skip-messages-schema-check`** (default `false`) — set to `true` to silence the new `messages.yml` schema check. Not recommended; the check is purely informative and the warning means GUI/chat surfaces are showing literal `<missing: ...>` placeholders.
[1.4.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.0...v1.4.1
release
TrialChamberPro 1.4.1
1.4.11 мая 2026 г.4Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.1] - 2026-04-29
### Fixed
- **Auto-discovery now merges adjacent chamber regions instead of double-registering them.** The previous flow registered every BFS result as a fresh chamber and only short-circuited if the candidate's *center* fell inside an existing AABB. Two physically distinct vanilla chambers ~500 blocks apart, or a single physical chamber whose two halves seeded discovery from different chunks, would happily produce two side-by-side `auto_world_*` entries (the user-reported case: `auto_world_851_747` + `auto_world_891_765` registered in the same millisecond, ~40 blocks apart on the X axis). New behavior: after BFS produces a candidate AABB, `ChamberDiscoveryManager` scans cached chambers in the same world for any whose AABB sits within `discovery.merge-distance-blocks` (Chebyshev edge-to-edge, default 250) of the candidate. If found, the existing chamber's bounds are unioned with the candidate via the new `ChamberManager.updateBounds(...)`, the chamber is rescanned to absorb the new vaults/spawners, and (if `discovery.auto-snapshot` is enabled) the snapshot is regenerated. If not found, registration proceeds as before. New `discovery.max-merged-volume` (default 1,500,000 blocks) caps how far a runaway daisy-chain can grow so a pathological geometry can't swallow large regions into a single logical chamber. Set `discovery.merge-distance-blocks: -1` to disable merging entirely and restore the v1.2.25 behavior.
- **Discovery registration race closed.** Two near-simultaneous BFS results (typical during the startup sweep) could both pass the existing-chamber check before either committed — the merge logic above wouldn't help if both registrations were already in flight. New `kotlinx.coroutines.sync.Mutex` in `ChamberDiscoveryManager` serializes the entire registration step (mutex acquisition → cache scan → merge-or-create → mark processed). Throughput cost is zero in practice — registration fires at most a handful of times per session and is gated by the chunk-load / startup-sweep cadence anyway.
### Changed — UX & GUI
- **Main menu flattened — `SettingsMenuView` removed.** The previous "Settings → Plugin Settings → Global Settings" path had two papercut bugs: clicking "Settings" on the main menu opened a "Plugin Settings" hub whose only meaningful contents (Global Settings, Protection Settings, Performance Info, Reload Configuration) could just as well live one level up; and the back button on Protection Settings landed on Plugin Settings instead of the main menu, leaving the user one step deeper than they started. New main menu is a 6-row layout: Chambers / Loot Tables / Global Settings / Protection Settings on row 1, Help / Performance Info / Statistics on row 2, Reload Configuration centered on row 4 (shift-click to fire so accidental clicks don't reload), Close on row 5. `SettingsMenuView.kt` deleted; `Screen.SETTINGS_MENU` and `MenuService.openSettingsMenu` removed; back-button destinations in `GlobalSettingsView` and `ProtectionMenuView` updated from `gui.common.dest-settings` → `gui.common.dest-main-menu`. `gui.settings-menu.*` keys deleted from `messages.yml`; `gui.main-menu.settings-name/lore` renamed `global-settings-name/lore`; new `performance-name/lore` and `reload-name/lore` keys added under `gui.main-menu`. `CustomMobProviderView`'s back button still uses `dest-settings` because it goes back to *chamber* settings, not the deleted plugin-settings hub.
- **Loot editor now shows the effective drop rate per item.** The Amount/Chance/Rolls model is technically accurate but genuinely confusing: a user looking at "Amount: 2-4" + "Chance: 20%" tends to read that as "20% chance of getting 2-4 of this item per opening", and the separate "Rolls: 1-3" tile multiplies the per-draw probability without making that visually obvious on the items themselves. Each item lore now includes a new `Expected: ≈X per vault opening` line computed as `avg(draws) × (weight / totalWeight) × avg(amount)` for weighted items, and `avg(amount)` for guaranteed items (which always drop once per opening). Adaptive precision: ≥10 → integer, ≥1 → one decimal, <1 → two decimals (so a 1-in-50 tier item still reads `≈0.02` rather than rounding to 0). The per-item "Chance: X%" line is now suffixed with " per draw" to make the relationship explicit. The "Rolls Configuration" tile is renamed "Draws per Opening" and its lore opens with three plain-English lines explaining that each opening picks N items from the weighted list, each draw chooses one item using its chance, and more draws = more total loot. Bumping the draws slider visibly recomputes every Expected line in real time so the multiplicative relationship becomes self-evident. Pure presentation change — `loot.yml` data model untouched.
- **Help view rebuilt to mirror `/tcp help` and cover every wired subcommand.** Audit found `mobs` (v1.3.0) was missing from chat help entirely, and both `mobs` and `give` (v1.3.1) were missing from the GUI Help view. Two dead chat-help keys (`help-procgen`, `help-teleport` — subcommands that don't exist) deleted. Chat help reordered into logical groups (Browse → Create → Manage → Loot/Mobs → Players & rewards → Admin) with a comment in `TCPCommand.sendHelp` noting the order mirrors the GUI tile grouping so future edits don't drift. Wording tightened on `help-generate`, `help-snapshot`, `help-loot`, `help-vault`, `help-key`, `help-leaderboard`, `help-info`, `help-list`, and `help-reload` to drop jargon ("WE wand", "saved var") and uninformative phrases ("Manage snapshots"). GUI Help view re-laid out to a 4 + 4 + 1 tile grid: row 1 overview (Commands / Permissions / About), row 2 gameplay command groups (Chambers / Loot / Vaults & Keys / Stats), row 3 admin & setup command groups (Snapshots / Generate / Custom Mobs / Spawner Presets), row 4 lone Admin Tools tile, row 5 navigation. New `mobs-cmd` and `give-cmd` tiles cover the previously absent commands. Every tile lore opens with one plain-English sentence describing the group ("Browse and manage existing chambers." / "View or override per-chamber loot." etc.) before listing the actual commands. The `permissions` tile expanded from 5 entries to ~13 organized into Admin / Player / Bypass / Notifications groups.
### Localization
- **Every text change in this release routes through `messages.yml`.** No `Component.text(...)` literals introduced anywhere; all new and changed strings are translatable through the existing `gui.<view>.*` and flat `*` key system. New keys: `discovery-merged`, `gui.main-menu.global-settings-name/lore`, `gui.main-menu.performance-name/lore`, `gui.main-menu.reload-name/lore`, `gui.loot-editor.item-expected`, `gui.help-menu.mobs-cmd-name/lore`, `gui.help-menu.give-cmd-name/lore`, `help-mobs`. Removed keys: every key under `gui.settings-menu.*`, `help-procgen`, `help-teleport`, `gui.main-menu.settings-name/lore` (renamed). Changed keys: `gui.loot-editor.item-chance`, `gui.loot-editor.rolls-name`, `gui.loot-editor.rolls-lore`, `gui.main-menu.protection-name`, every `gui.help-menu.*` lore. The chat-help block in `messages.yml` was scattered across two locations (lines 152-166 and 225-228); all entries are now consolidated into a single contiguous block in the order `sendHelp` emits them.
### Added
- **Startup schema check for `messages.yml`.** New `MessagesSchemaValidator` (run from `onEnable` immediately after `ConfigValidator`) loads the JAR-bundled `messages.yml` and the user's deployed copy, walks both for leaf keys (filtering out `ConfigurationSection` containers so a parent path doesn't mask a missing leaf), and logs a warning listing every key the bundle defines that the user's file lacks — up to 25 enumerated, then truncated with `... and N more`. Output includes a 4-step recovery path (rename → restart → port translations) and notes the `debug.skip-messages-schema-check: true` opt-out. Pure log surface — never modifies the user's file, never blocks startup. Motivated by a v1.4.0 user bug report where `<missing: gui.loot-table-list.table-name-normal>` reached the GUI because the deployed `messages.yml` was an older copy that predated the `gui.loot-table-list.*` block; the check would have surfaced that as a console warning at startup.
### Config additions
- **`discovery.merge-distance-blocks`** (default `250`) — Chebyshev edge-to-edge distance below which two regions are folded into a single chamber. Set to `-1` to disable merging.
- **`discovery.max-merged-volume`** (default `1500000`) — hard cap on the post-merge bounding-box volume in blocks. Above this the merge is rejected and the new region is logged as a skip (region debounce still applies).
- **`debug.skip-messages-schema-check`** (default `false`) — set to `true` to silence the new `messages.yml` schema check. Not recommended; the check is purely informative and the warning means GUI/chat surfaces are showing literal `<missing: ...>` placeholders.
[1.4.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.4.0...v1.4.1
release
TrialChamberPro 1.4.0-mc26
1.4.0-mc2626 апр. 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.4.0] - 2026-04-26
### Added
- **Phase 2 of the public extension API** — three more seams aimed at premium add-on modules and third-party integrations. No breaking changes; all existing behavior preserved when no listener / service is registered.
- **`DatabaseManager` opened for extension.** Class is now `open` (was final) and the `plugin` constructor parameter is `protected` so subclasses in other packages can access it. The instance is auto-registered with Bukkit's `ServicesManager` at TCP startup so consumers can resolve it via `Bukkit.getServicesManager().load(DatabaseManager::class.java)`. Designed for the planned premium "Network Sync" module that adds Postgres / MariaDB / Redis backends. (Note: TCP itself currently still references its own `databaseManager` field directly throughout its own codebase, so subclass replacement only takes effect for callers that explicitly resolve via the services manager — full runtime substitution at every call site is planned for a future major version.)
- **`ChamberResetEvent.snapshotOverride`** (mutable `ByteArray?`) — pre-reset hook lets listeners substitute a different snapshot for a single reset cycle without persistently modifying the chamber's on-disk snapshot. Bytes must be a gzip-compressed serialized `SnapshotData` (TCP's native snapshot format). New `SnapshotManager.loadSnapshotFromBytes(bytes, contextLabel)` deserializes the override; falls back to the on-disk snapshot with a logged warning if the override fails to load. Designed for premium / third-party "schematic injection" or "instance variant" workflows.
- **`WildSpawnerResolver`** SPI in `api/` — pluggable lookup for the question "should this wild trial spawner spawn custom-plugin mobs, and if so, which provider + mob ids?". Lifts the long-standing limitation that TCP's Custom Mob Provider only worked inside registered chambers. Implementations register as a Bukkit service (`ServicesManager.register(WildSpawnerResolver::class.java, ...)`); TCP's `SpawnerWaveListener` consults the active resolver on every wild-spawner spawn observation. Returning a non-null `Config(providerId, normalIds, ominousIds)` triggers TCP's existing replace-after-spawn logic — vanilla mob removed the same tick, custom provider mob spawned at the same location, wave tracking and key drops preserved. **The seam lives in free TCP; the resolver implementation will ship in the planned premium "Wild Custom-Mob Spawners" module** (per the v1.3.1 architectural boundary: trial-spawner-only is the line, wild-spawner custom mobs are premium territory).
- **`SpawnerPresetManager.PRESET_ID_KEY_NAME`** + automatic PDC tagging — every item produced by `SpawnerPresetManager.getItem` (i.e. given out via `/tcp give <preset>`) now carries a `tcp:preset_id` PersistentDataContainer tag with the source preset's id.
- **`SpawnerPresetPlaceListener`** — copies the `tcp:preset_id` tag from a placed trial-spawner item onto the resulting block's `TileState`. Lets `WildSpawnerResolver` implementations identify which preset a placed wild spawner originated from, even after the source ItemStack is gone. Tag survives chamber resets, chunk unloads, and world reloads via Minecraft's standard TileEntity persistence. Vanilla `/give minecraft:trial_spawner` items (no tag) are ignored.
### Added — MiniMessage support
- **First-class [MiniMessage](https://docs.advntr.dev/minimessage/format.html) support across every user-facing text surface.** New `MessageParser` utility (`utils/MessageParser.kt`) translates raw `messages.yml` entries through MiniMessage as the primary syntax while remaining fully backwards-compatible with legacy `&` colour/format codes (and `&#RRGGBB` hex). Existing `messages.yml` files render unchanged; users adopt MM syntax entry-by-entry on their own schedule. Mixed input works too — `&aHello <gradient:#ff0000:#0000ff>world</gradient>` renders correctly.
- **MM features now usable in TCP messages** that legacy `&` codes can't express:
- Gradients: `<gradient:#ff5500:#0000ff>Sunset to ocean</gradient>`
- Click events: `<click:run_command:'/tcp menu'>[Open menu]</click>`
- Hover tooltips: `<hover:show_text:'Bonus active'><gold>★</gold></hover>`
- Custom fonts (resource-pack supplied): `<font:server:fancy>...</font>`
- Cleaner hex syntax: `<#FF5500>` instead of `&#FF5500`
- **New `TrialChamberPro.getMessageComponent(key, ...): Component`** — companion to the existing `getMessage()` String method. Returns a fully-styled Adventure Component preserving all MiniMessage features (gradients, click/hover, fonts) end-to-end through `Player.sendMessage(Component)`.
- **All ~349 `sendMessage` call sites in TCP migrated** from the legacy String path to `getMessageComponent` so chat messages get full MiniMessage fidelity. Includes boss bar text, chat notifications (vault opened, chamber entered, reset warnings, spectator messages, discovery announcements, wave completion), death messages, and all command feedback.
- **GUI helpers (`getGuiText`, `getGuiLore`) now route through MessageParser** — item names and lore in all 18 admin GUI views support full MM fidelity.
- **Documentation updated** ([docs/configuration/messages.yml.md](docs/configuration/messages.yml.md)) — comprehensive coverage of both syntaxes side-by-side, mixed-format examples, and MM-only feature documentation. The `messages.yml` resource header explains the two formats with examples.
- **Conflict-free with other plugins** — TCP parses its own messages internally; chat plugins (DiscordSRV, EssentialsXChat, ChatControl) only intercept `AsyncChatEvent` (player-typed chat), not plugin-sent notifications, so there's no double-processing risk. This is the same pattern MythicMobs, EcoEnchants, LuckPerms, and CMI use.
### Fixed
- **Trial-spawner wave size off-by-one (the v1.3.2 follow-up).** v1.3.2 introduced `SpawnerWaveManager.computeExpectedMobs` to read the spawner's actual `total_mobs` / `total_mobs_added_per_player` config instead of hard-coding 6. The formula was `base + perPlayer × players`, but Mojang's actual `TrialSpawnerData` formula is `base + perPlayer × max(0, players - 1)` — the FIRST detected player gets the base count, each ADDITIONAL player adds the per-player bonus. The off-by-one over-counted by `perPlayer` per nearby player, producing the user-reported bug "spawner has 20 configured, bar shows 1/30, wave actually ends at 20". Plugin now matches vanilla exactly: `floor(base + perPlayer × additional)` where `additional = max(0, players - 1)`. Also switched `ceil` → `floor` to match Mojang's rounding.
- **Secondary fallback bug surfaced by the same code path.** When Paper's `state.trackedPlayers` returned empty (e.g. between waves), the recompute fell back to `wave.participatingPlayers.size` — which counts players within the boss-bar detection radius (default 20 blocks), not within the spawner's `requiredPlayerRange` (default 14). With more players in the boss-bar radius than vanilla actually tracked, the fallback could inflate the result beyond what `state.trackedPlayers.size` would have produced. Fallback is now `1` so it can never exceed what the authoritative API would say.
### Changed
- `ResetManager.resetChamber` now consults `ChamberResetEvent.snapshotOverride` after firing the pre-event. If non-null, the override bytes are restored instead of the on-disk snapshot; if the override fails to load, the on-disk snapshot is used and a warning is logged. Internal helper `restoreFromSnapshotBlocks` extracted to share the BlockRestorer call between the on-disk and override paths.
- `SpawnerWaveListener` gains a wild-spawner-replacement branch that fires immediately after `configureWildSpawnerCooldown`. When no `WildSpawnerResolver` service is registered (the default in free TCP), the branch is a single nullable lookup and a return-false — zero behavior change for end users.
- `TrialChamberPro.onEnable` registers `SpawnerPresetPlaceListener` alongside the existing listener block, and registers the `DatabaseManager` instance with `ServicesManager` immediately after it initializes.
- `TrialChamberPro.getMessage` and `getMessageComponent` share a new private helper `rawMessageWithPrefix` for placeholder substitution + chat-prefix logic. Behavior is identical to v1.3.x but the Component path now exists alongside the String path.
- `SpawnerWaveManager`'s private boss-bar `getMessageComponent` helper now delegates to `plugin.getMessageComponent` so boss bars inherit the same MM-aware parsing as chat messages. The local `LegacyComponentSerializer` import is removed.
[1.4.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.3...v1.4.0
release
TrialChamberPro 1.4.0
1.4.026 апр. 2026 г.25Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.4.0] - 2026-04-26
### Added
- **Phase 2 of the public extension API** — three more seams aimed at premium add-on modules and third-party integrations. No breaking changes; all existing behavior preserved when no listener / service is registered.
- **`DatabaseManager` opened for extension.** Class is now `open` (was final) and the `plugin` constructor parameter is `protected` so subclasses in other packages can access it. The instance is auto-registered with Bukkit's `ServicesManager` at TCP startup so consumers can resolve it via `Bukkit.getServicesManager().load(DatabaseManager::class.java)`. Designed for the planned premium "Network Sync" module that adds Postgres / MariaDB / Redis backends. (Note: TCP itself currently still references its own `databaseManager` field directly throughout its own codebase, so subclass replacement only takes effect for callers that explicitly resolve via the services manager — full runtime substitution at every call site is planned for a future major version.)
- **`ChamberResetEvent.snapshotOverride`** (mutable `ByteArray?`) — pre-reset hook lets listeners substitute a different snapshot for a single reset cycle without persistently modifying the chamber's on-disk snapshot. Bytes must be a gzip-compressed serialized `SnapshotData` (TCP's native snapshot format). New `SnapshotManager.loadSnapshotFromBytes(bytes, contextLabel)` deserializes the override; falls back to the on-disk snapshot with a logged warning if the override fails to load. Designed for premium / third-party "schematic injection" or "instance variant" workflows.
- **`WildSpawnerResolver`** SPI in `api/` — pluggable lookup for the question "should this wild trial spawner spawn custom-plugin mobs, and if so, which provider + mob ids?". Lifts the long-standing limitation that TCP's Custom Mob Provider only worked inside registered chambers. Implementations register as a Bukkit service (`ServicesManager.register(WildSpawnerResolver::class.java, ...)`); TCP's `SpawnerWaveListener` consults the active resolver on every wild-spawner spawn observation. Returning a non-null `Config(providerId, normalIds, ominousIds)` triggers TCP's existing replace-after-spawn logic — vanilla mob removed the same tick, custom provider mob spawned at the same location, wave tracking and key drops preserved. **The seam lives in free TCP; the resolver implementation will ship in the planned premium "Wild Custom-Mob Spawners" module** (per the v1.3.1 architectural boundary: trial-spawner-only is the line, wild-spawner custom mobs are premium territory).
- **`SpawnerPresetManager.PRESET_ID_KEY_NAME`** + automatic PDC tagging — every item produced by `SpawnerPresetManager.getItem` (i.e. given out via `/tcp give <preset>`) now carries a `tcp:preset_id` PersistentDataContainer tag with the source preset's id.
- **`SpawnerPresetPlaceListener`** — copies the `tcp:preset_id` tag from a placed trial-spawner item onto the resulting block's `TileState`. Lets `WildSpawnerResolver` implementations identify which preset a placed wild spawner originated from, even after the source ItemStack is gone. Tag survives chamber resets, chunk unloads, and world reloads via Minecraft's standard TileEntity persistence. Vanilla `/give minecraft:trial_spawner` items (no tag) are ignored.
### Added — MiniMessage support
- **First-class [MiniMessage](https://docs.advntr.dev/minimessage/format.html) support across every user-facing text surface.** New `MessageParser` utility (`utils/MessageParser.kt`) translates raw `messages.yml` entries through MiniMessage as the primary syntax while remaining fully backwards-compatible with legacy `&` colour/format codes (and `&#RRGGBB` hex). Existing `messages.yml` files render unchanged; users adopt MM syntax entry-by-entry on their own schedule. Mixed input works too — `&aHello <gradient:#ff0000:#0000ff>world</gradient>` renders correctly.
- **MM features now usable in TCP messages** that legacy `&` codes can't express:
- Gradients: `<gradient:#ff5500:#0000ff>Sunset to ocean</gradient>`
- Click events: `<click:run_command:'/tcp menu'>[Open menu]</click>`
- Hover tooltips: `<hover:show_text:'Bonus active'><gold>★</gold></hover>`
- Custom fonts (resource-pack supplied): `<font:server:fancy>...</font>`
- Cleaner hex syntax: `<#FF5500>` instead of `&#FF5500`
- **New `TrialChamberPro.getMessageComponent(key, ...): Component`** — companion to the existing `getMessage()` String method. Returns a fully-styled Adventure Component preserving all MiniMessage features (gradients, click/hover, fonts) end-to-end through `Player.sendMessage(Component)`.
- **All ~349 `sendMessage` call sites in TCP migrated** from the legacy String path to `getMessageComponent` so chat messages get full MiniMessage fidelity. Includes boss bar text, chat notifications (vault opened, chamber entered, reset warnings, spectator messages, discovery announcements, wave completion), death messages, and all command feedback.
- **GUI helpers (`getGuiText`, `getGuiLore`) now route through MessageParser** — item names and lore in all 18 admin GUI views support full MM fidelity.
- **Documentation updated** ([docs/configuration/messages.yml.md](docs/configuration/messages.yml.md)) — comprehensive coverage of both syntaxes side-by-side, mixed-format examples, and MM-only feature documentation. The `messages.yml` resource header explains the two formats with examples.
- **Conflict-free with other plugins** — TCP parses its own messages internally; chat plugins (DiscordSRV, EssentialsXChat, ChatControl) only intercept `AsyncChatEvent` (player-typed chat), not plugin-sent notifications, so there's no double-processing risk. This is the same pattern MythicMobs, EcoEnchants, LuckPerms, and CMI use.
### Fixed
- **Trial-spawner wave size off-by-one (the v1.3.2 follow-up).** v1.3.2 introduced `SpawnerWaveManager.computeExpectedMobs` to read the spawner's actual `total_mobs` / `total_mobs_added_per_player` config instead of hard-coding 6. The formula was `base + perPlayer × players`, but Mojang's actual `TrialSpawnerData` formula is `base + perPlayer × max(0, players - 1)` — the FIRST detected player gets the base count, each ADDITIONAL player adds the per-player bonus. The off-by-one over-counted by `perPlayer` per nearby player, producing the user-reported bug "spawner has 20 configured, bar shows 1/30, wave actually ends at 20". Plugin now matches vanilla exactly: `floor(base + perPlayer × additional)` where `additional = max(0, players - 1)`. Also switched `ceil` → `floor` to match Mojang's rounding.
- **Secondary fallback bug surfaced by the same code path.** When Paper's `state.trackedPlayers` returned empty (e.g. between waves), the recompute fell back to `wave.participatingPlayers.size` — which counts players within the boss-bar detection radius (default 20 blocks), not within the spawner's `requiredPlayerRange` (default 14). With more players in the boss-bar radius than vanilla actually tracked, the fallback could inflate the result beyond what `state.trackedPlayers.size` would have produced. Fallback is now `1` so it can never exceed what the authoritative API would say.
### Changed
- `ResetManager.resetChamber` now consults `ChamberResetEvent.snapshotOverride` after firing the pre-event. If non-null, the override bytes are restored instead of the on-disk snapshot; if the override fails to load, the on-disk snapshot is used and a warning is logged. Internal helper `restoreFromSnapshotBlocks` extracted to share the BlockRestorer call between the on-disk and override paths.
- `SpawnerWaveListener` gains a wild-spawner-replacement branch that fires immediately after `configureWildSpawnerCooldown`. When no `WildSpawnerResolver` service is registered (the default in free TCP), the branch is a single nullable lookup and a return-false — zero behavior change for end users.
- `TrialChamberPro.onEnable` registers `SpawnerPresetPlaceListener` alongside the existing listener block, and registers the `DatabaseManager` instance with `ServicesManager` immediately after it initializes.
- `TrialChamberPro.getMessage` and `getMessageComponent` share a new private helper `rawMessageWithPrefix` for placeholder substitution + chat-prefix logic. Behavior is identical to v1.3.x but the Component path now exists alongside the String path.
- `SpawnerWaveManager`'s private boss-bar `getMessageComponent` helper now delegates to `plugin.getMessageComponent` so boss bars inherit the same MM-aware parsing as chat messages. The local `LegacyComponentSerializer` import is removed.
[1.4.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.3...v1.4.0
release
TrialChamberPro 1.3.3-mc26
1.3.3-mc2626 апр. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.3.3] - 2026-04-26
### Added
- **Public extension API** — first instalment of the prerequisite seams that third-party plugins (and the planned premium add-on modules) need to integrate with TCP cleanly. No behavior change for end users; pure new surface area.
- **`PreVaultOpenEvent`** (cancellable, `api/events/`) — fires immediately before a vault open resolves its loot table, after all gates pass (cooldown, spam-click, key validation). Listeners can cancel the open entirely (no key consumed, no reward marked) or set `lootTableOverride` to a non-null table id to substitute a different loot table for that specific open. Designed for premium custom-keys / vault-crate workflows where the consumed key dictates the loot tier.
- **`ChamberMobSpawnedEvent`** (`api/events/`) — fires after a trial-spawner wave mob is spawned and recorded by `SpawnerWaveManager`. Carries chamber + spawner location + ominous flag + provider id. Fires for both vanilla spawns (`providerId = "vanilla"`) and replacement spawns from custom mob providers. Gives third-party plugins a single hook with full chamber/wave context — what `CreatureSpawnEvent` doesn't carry. Designed for difficulty-scaling addons, analytics pipelines, and the planned premium "Legendary Trials" module.
- **`TCPModule` SPI + `TCPModuleRegistry`** (`api/`) — uniform lifecycle contract for plugins that extend TCP. Implementations register themselves with `plugin.moduleRegistry.register(this)` during their own `onEnable`; the registry calls back into `onLoad(tcp)` once TCP reaches `isReady = true` (or immediately if TCP was already ready). Modules unregister automatically when their backing plugin is disabled (via `PluginDisableEvent` observer). Reverse-registration-order shutdown is preserved so modules with cross-dependencies tear down safely. Lifecycle callbacks always dispatch on the primary thread regardless of caller context.
- **Jitpack publication** — `jitpack.yml` + `maven-publish` configuration so consumers can declare TCP as a compile-time dependency:
```kotlin
repositories { maven("https://jitpack.io") }
dependencies { compileOnly("com.github.darkstarworks:TrialChamberPro:v1.3.3") }
```
Compile-time consumers reference classes from the public `io.github.darkstarworks.trialChamberPro.api.*` package; at runtime the host server has TCP installed as a normal Bukkit plugin so the bundled-deps shadow JAR is inert.
### Changed
- `TrialChamberPro.onEnable` instantiates the module registry synchronously (right after the scheduler), so external plugins can register modules before TCP's async startup completes. `loadAllPending()` runs at the end of startup to flush queued registrations. `onDisable` invokes `shutdownAll()` first so modules can still touch TCP managers and the database during their own teardown.
- `VaultInteractListener.openVault` now fires `PreVaultOpenEvent` after the loot table is resolved but before any side effect. The event's `lootTableOverride` (when set) takes priority over chamber overrides and vault defaults; the existing override-resolution chain is unchanged when no listener intervenes.
- `SpawnerWaveListener.onCreatureSpawn` fires `ChamberMobSpawnedEvent` once per recorded spawn — once on the provider-replaced path with the actual provider id, once on the vanilla fallback with `providerId = "vanilla"`. Wild spawners deliver the event with `chamber = null`.
[1.3.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.2...v1.3.3
release
TrialChamberPro 1.3.3
1.3.326 апр. 2026 г.7Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.3.3] - 2026-04-26
### Added
- **Public extension API** — first instalment of the prerequisite seams that third-party plugins (and the planned premium add-on modules) need to integrate with TCP cleanly. No behavior change for end users; pure new surface area.
- **`PreVaultOpenEvent`** (cancellable, `api/events/`) — fires immediately before a vault open resolves its loot table, after all gates pass (cooldown, spam-click, key validation). Listeners can cancel the open entirely (no key consumed, no reward marked) or set `lootTableOverride` to a non-null table id to substitute a different loot table for that specific open. Designed for premium custom-keys / vault-crate workflows where the consumed key dictates the loot tier.
- **`ChamberMobSpawnedEvent`** (`api/events/`) — fires after a trial-spawner wave mob is spawned and recorded by `SpawnerWaveManager`. Carries chamber + spawner location + ominous flag + provider id. Fires for both vanilla spawns (`providerId = "vanilla"`) and replacement spawns from custom mob providers. Gives third-party plugins a single hook with full chamber/wave context — what `CreatureSpawnEvent` doesn't carry. Designed for difficulty-scaling addons, analytics pipelines, and the planned premium "Legendary Trials" module.
- **`TCPModule` SPI + `TCPModuleRegistry`** (`api/`) — uniform lifecycle contract for plugins that extend TCP. Implementations register themselves with `plugin.moduleRegistry.register(this)` during their own `onEnable`; the registry calls back into `onLoad(tcp)` once TCP reaches `isReady = true` (or immediately if TCP was already ready). Modules unregister automatically when their backing plugin is disabled (via `PluginDisableEvent` observer). Reverse-registration-order shutdown is preserved so modules with cross-dependencies tear down safely. Lifecycle callbacks always dispatch on the primary thread regardless of caller context.
- **Jitpack publication** — `jitpack.yml` + `maven-publish` configuration so consumers can declare TCP as a compile-time dependency:
```kotlin
repositories { maven("https://jitpack.io") }
dependencies { compileOnly("com.github.darkstarworks:TrialChamberPro:v1.3.3") }
```
Compile-time consumers reference classes from the public `io.github.darkstarworks.trialChamberPro.api.*` package; at runtime the host server has TCP installed as a normal Bukkit plugin so the bundled-deps shadow JAR is inert.
### Changed
- `TrialChamberPro.onEnable` instantiates the module registry synchronously (right after the scheduler), so external plugins can register modules before TCP's async startup completes. `loadAllPending()` runs at the end of startup to flush queued registrations. `onDisable` invokes `shutdownAll()` first so modules can still touch TCP managers and the database during their own teardown.
- `VaultInteractListener.openVault` now fires `PreVaultOpenEvent` after the loot table is resolved but before any side effect. The event's `lootTableOverride` (when set) takes priority over chamber overrides and vault defaults; the existing override-resolution chain is unchanged when no listener intervenes.
- `SpawnerWaveListener.onCreatureSpawn` fires `ChamberMobSpawnedEvent` once per recorded spawn — once on the provider-replaced path with the actual provider id, once on the vanilla fallback with `providerId = "vanilla"`. Wild spawners deliver the event with `chamber = null`.
[1.3.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.2...v1.3.3
release
TrialChamberPro 1.3.2-mc26
1.3.2-mc2625 апр. 2026 г.7Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.3.2] - 2026-04-26
### Fixed
- **Trial spawner wave size now reads the spawner's actual `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.
- **Boss bar no longer deadlocks when a tracked mob disappears without firing `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.
- **Breaking a trial spawner now removes its boss bar.** New `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.
[1.3.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.1...v1.3.2
release
TrialChamberPro 1.3.2
1.3.225 апр. 2026 г.6Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.3.2] - 2026-04-26
### Fixed
- **Trial spawner wave size now reads the spawner's actual `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.
- **Boss bar no longer deadlocks when a tracked mob disappears without firing `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.
- **Breaking a trial spawner now removes its boss bar.** New `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.
[1.3.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.1...v1.3.2
release
TrialChamberPro 1.3.1-mc26
1.3.1-mc2625 апр. 2026 г.6Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.3.1] - 2026-04-26
### Added
- **Spawner presets + `/tcp give` command** — server admins can now define named templates of trial-spawner configurations in a new `spawner_presets.yml` and hand them out as preconfigured items via `/tcp give <preset> [player] [amount]`. Each preset materializes as a `minecraft:trial_spawner` item with `block_entity_data` baked in (the same NBT vanilla `/give` accepts), so placing it produces a working spawner with the configured `normal_config` / `ominous_config` (datapack resource locations), `required_player_range`, `target_cooldown_length`, and any optional wave-shape overrides (`total_mobs`, `simultaneous_mobs`, `ticks_between_spawn`, `spawn_range`, etc.). Display name and lore are applied via `ItemMeta` so they survive future component remaps.
- **`SpawnerPresetManager`** loads `spawner_presets.yml` on enable and on `/tcp reload`. Map swaps are atomic — in-flight `/tcp give` calls aren't affected by reloads. ItemStacks are built through `Bukkit.getItemFactory().createItemStack(...)` (the modern, non-deprecated path that parses the same `material[components]` syntax as vanilla `/give`), not via `Bukkit.getUnsafe().modifyItemStack`.
- **`tcp.give` permission** (default op, included in the `tcp.admin.*` aggregate) gates the new command. Tab completion lists every loaded preset id and online player names; lookups are case-insensitive.
- **Trial-spawner-only hardening** — the YAML schema deliberately has no `material:` field. Every preset always produces `Material.TRIAL_SPAWNER`. This is an intentional architectural seam: custom keys, vault crates, and other custom items are out of scope for this file (they belong to the planned premium "Vault Crate" module, which will mirror the same preset/give pattern under its own `vault_presets.yml` + `/tcp vault give` command).
- **Documentation** — new GitBook page [docs/configuration/spawner-presets.yml.md](docs/configuration/spawner-presets.yml.md) with full field reference, command usage, troubleshooting, and a cross-link to the [Trial Spawner wiki](https://minecraft.wiki/w/Trial_Spawner#Spawner_configuration) for the datapack JSON format. `commands.md` and `permissions.md` updated with the new entries.
### Changed
- `TrialChamberPro.onEnable` now constructs `SpawnerPresetManager` after `LootManager.loadLootTables()` and calls `load()`. `reloadPluginConfig()` re-loads the preset file alongside loot tables.
[1.3.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.0...v1.3.1
release
TrialChamberPro 1.3.1
1.3.125 апр. 2026 г.9Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.3.1] - 2026-04-26
### Added
- **Spawner presets + `/tcp give` command** — server admins can now define named templates of trial-spawner configurations in a new `spawner_presets.yml` and hand them out as preconfigured items via `/tcp give <preset> [player] [amount]`. Each preset materializes as a `minecraft:trial_spawner` item with `block_entity_data` baked in (the same NBT vanilla `/give` accepts), so placing it produces a working spawner with the configured `normal_config` / `ominous_config` (datapack resource locations), `required_player_range`, `target_cooldown_length`, and any optional wave-shape overrides (`total_mobs`, `simultaneous_mobs`, `ticks_between_spawn`, `spawn_range`, etc.). Display name and lore are applied via `ItemMeta` so they survive future component remaps.
- **`SpawnerPresetManager`** loads `spawner_presets.yml` on enable and on `/tcp reload`. Map swaps are atomic — in-flight `/tcp give` calls aren't affected by reloads. ItemStacks are built through `Bukkit.getItemFactory().createItemStack(...)` (the modern, non-deprecated path that parses the same `material[components]` syntax as vanilla `/give`), not via `Bukkit.getUnsafe().modifyItemStack`.
- **`tcp.give` permission** (default op, included in the `tcp.admin.*` aggregate) gates the new command. Tab completion lists every loaded preset id and online player names; lookups are case-insensitive.
- **Trial-spawner-only hardening** — the YAML schema deliberately has no `material:` field. Every preset always produces `Material.TRIAL_SPAWNER`. This is an intentional architectural seam: custom keys, vault crates, and other custom items are out of scope for this file (they belong to the planned premium "Vault Crate" module, which will mirror the same preset/give pattern under its own `vault_presets.yml` + `/tcp vault give` command).
- **Documentation** — new GitBook page [docs/configuration/spawner-presets.yml.md](docs/configuration/spawner-presets.yml.md) with full field reference, command usage, troubleshooting, and a cross-link to the [Trial Spawner wiki](https://minecraft.wiki/w/Trial_Spawner#Spawner_configuration) for the datapack JSON format. `commands.md` and `permissions.md` updated with the new entries.
### Changed
- `TrialChamberPro.onEnable` now constructs `SpawnerPresetManager` after `LootManager.loadLootTables()` and calls `load()`. `reloadPluginConfig()` re-loads the preset file alongside loot tables.
[1.3.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.3.0...v1.3.1
beta
TrialChamberPro 1.3.0-beta.1-mc26
1.3.0-beta.1-mc2625 апр. 2026 г.15Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.3.0] - 2026-04-23
### Added
- **Custom Mob Provider API** — new pluggable `TrialMobProvider` interface (`providers/TrialMobProvider.kt`) lets trial-spawner waves source mobs from external plugins instead of vanilla. Two built-in providers ship in this release: `vanilla` (default, unchanged behavior) and `mythicmobs` (reflection-based soft-dep on MythicMobs — no compile-time binding).
- **Replace-after-spawn strategy** — when a chamber is configured with a non-vanilla provider, `SpawnerWaveListener` lets the vanilla trial spawner spawn its mob, then removes that entity the same tick and asks the provider to spawn its replacement at the same location. The vanilla spawner's state machine (tracked UUIDs, wave counter, cooldown) is preserved, so boss bars, glow outlines, and cooldown management all continue to work with custom mobs.
- **Plugin-driven Trial Key drops** — vanilla's key-ejection path relies on tracked mob UUIDs that no longer exist when we replace the spawns, so `SpawnerWaveManager.maybeDropProviderKeys` drops `TRIAL_KEY` / `OMINOUS_TRIAL_KEY` itself: one per unique participant, above the spawner block, with a small upward velocity that approximates vanilla's pop. The key type is captured at wave start (`WaveState.isOminous` is a `val`) and cannot flip mid-wave.
- **Owner-only spawner-key pickup** — new `SpawnerKeyDropOwnerListener` sibling of `VaultDropOwnerListener` (v1.2.28). Drops are PDC-tagged with `tcp:spawner_key_owner` + `tcp:spawner_key_dropped_at`; non-owner pickups are cancelled during the grace window. Config: `reset.spawner-key-drop-owner-grace-seconds` (default `30`, `0` = owner-locked until despawn). Shared `tcp.bypass.droplock` permission with vault drops.
- **Per-chamber provider configuration** — new DB columns `custom_mob_provider`, `custom_mob_ids_normal`, `custom_mob_ids_ominous` (JSON-encoded id lists) on `chambers` via idempotent migration. Ominous waves fall back to the normal list if the ominous list is empty, matching the loot-table override pattern. `ChamberManager.updateCustomMobProvider(id, provider, normalIds, ominousIds)` is the single write path; `Chamber.pickMobId(ominous)` and `Chamber.hasCustomMobProvider(ominous)` are the read-side helpers.
- **`CustomMobProviderView` GUI** — new 6-row admin view reachable from `ChamberSettingsView` (spawner icon, row 2 centre). Cycle providers with left/right-click, shift-click to reset to vanilla; add mob ids via a one-shot chat input (`MobIdInputListener`) with 30-second timeout and `cancel` keyword; click a mob-id icon to remove it. All writes go through `ChamberManager.updateCustomMobProvider` and the view refreshes on the player's region thread after each change.
- **`/tcp mobs` command** — CLI path for per-chamber provider config:
- `/tcp mobs providers` — list registered providers and their availability
- `/tcp mobs <chamber> provider <id|vanilla|none>` — set the provider
- `/tcp mobs <chamber> add normal|ominous <mobId>` — add a mob id to the pool
- `/tcp mobs <chamber> remove normal|ominous <mobId>` — remove a mob id
- `/tcp mobs <chamber> list` — show current config
- Permission: `tcp.admin.mobs` (default op)
- **MythicMobs integration** as a soft-dependency via `plugin.yml` `softdepend`. `MythicMobsProvider` resolves `io.lumine.mythic.bukkit.MythicBukkit` + `MobManager.spawnMob(String, Location, double)` reflectively and degrades gracefully if the API shape changes.
- **Additional provider integrations** — five more providers, all zero-compile-time-dependency reflection with cached availability and verbose-logging-gated warnings:
- `elitemobs` — EliteMobs custom-boss spawning via `new CustomBossEntity(filename)` + `spawn(Location, 0, true)` + `getLivingEntity()`. Mob id = boss filename (with or without `.yml`).
- `ecomobs` — Auxilor [EcoMobs](https://github.com/Auxilor/EcoMobs) (hard-depends on [Eco](https://github.com/Auxilor/eco)) via `EcoMobs[id].spawn(Location, SpawnReason.CUSTOM)`. Mob id = entry id from `plugins/EcoMobs/mobs/<id>.yml`.
- `levelledmobs` — spawns a vanilla `EntityType` and applies a LevelledMobs level through `LevelInterface2.applyLevelToMob(LivingEntityWrapper, int, ...)`. Mob id format `ENTITY_TYPE[:level|ominous]` (e.g. `ZOMBIE:15`, `HUSK:ominous`). The ominous keyword maps to tiered levels (20 for ominous waves, 10 otherwise).
- `infernalmobs` — spawns a vanilla `EntityType` and enriches it via `infernal_mobs.makeInfernal(Entity, false)` (abilities are rolled by the plugin from config). Mob id format `ENTITY_TYPE`.
- `citizens` — clones a template NPC from the default `NPCRegistry` (by numeric id or exact name) and spawns the clone so template NPCs are never moved. Mob id = Citizens NPC id or name.
- **Plugin.yml softdepends** — `EliteMobs`, `Eco`, `EcoMobs`, `LevelledMobs`, `InfernalMobs`, `Citizens` added alongside `MythicMobs` so load order guarantees the provider registry sees every backing plugin before seeding.
### Changed
- `TrialChamberPro.onEnable` now constructs a `TrialMobProviderRegistry` after manager init and conditionally registers `MythicMobsProvider` when MythicMobs is present on the server. Accessible via `plugin.trialMobProviderRegistry`.
### Added — GUI translatability
- **Full GUI localization** — every name, lore line, and button label across all 18 admin GUI views is now driven by `messages.yml` under a nested `gui.*` section (~330 new keys). No hard-coded `Component.text(...)` calls left in any view file. See [docs/configuration/localization.md](docs/configuration/localization.md) for the key naming conventions and translator workflow.
- **`gui/components/GuiComponents.kt`** — reusable builders (`infoItem`, `toggleItem`, `backButton`, `closeButton`, `prevPageButton`, `nextPageButton`, `playerHead` x2) plus a class-doc that codifies icon material conventions in 5 categories (Navigation, Action buttons, State indicators, Settings categories, Domain icons). All views now build through this layer; future GUI code uses the localization layer by default.
- **`TrialChamberPro` helper additions** — `loadedMessages()`, `getMessageList(key, ...)`, `getGuiText(key, ...)` returning a `Component`, `getGuiLore(key, ...)` returning a `List<Component>`. `getMessage()` auto-skips the chat prefix for any key starting with `gui.` so admin items don't get `[TCP]` prepended.
- **Empty-state placeholders** added to 6 list/grid views (chamber list, chambers overview, loot table list, vault management, custom mob provider, loot editor) so admins always see a localized "no entries" card instead of a confusing blank pane.
### Added — Public event API
- **6 events under `api/events/`** — Bukkit-style events that third-party plugins can hook without forking. See [docs/api/events.md](docs/api/events.md) for field tables and integration examples.
- `ChamberResetEvent` (cancellable) with `Reason` enum (SCHEDULED / MANUAL / FORCED)
- `ChamberResetCompleteEvent` — post-reset with duration + blocks restored
- `VaultOpenedEvent` — post-open with cloned item snapshot
- `SpawnerWaveCompleteEvent` — post-wave with participants set
- `ChamberDiscoveredEvent` (cancellable) with `Method` enum (CHUNK_LOAD / STARTUP_SWEEP)
- `TrialKeyDropEvent` (cancellable) — per-participant key drop for provider-driven waves
- All events use `Event(!Bukkit.isPrimaryThread())` so they correctly identify as async when fired from coroutines or Folia region threads.
- **5 fire sites wired**: `ResetManager.resetChamber` (pre + post; `reason` parameter added with `MANUAL` default — scheduled paths pass `SCHEDULED`, GUI shift+right force-reset paths pass `FORCED`); `VaultInteractListener.openVault` (post, with cloned items snapshot); `SpawnerWaveManager.completeWave` (post); `SpawnerWaveManager.maybeDropProviderKeys` (per-participant pre/cancellable); `ChamberDiscoveryManager.registerChamber` (pre/cancellable).
### Added — Stability + reliability
- **`MenuSessionCleanupListener`** — drops a player's GUI session on `PlayerQuitEvent`. Belt-and-braces soft-cap eviction at 500 sessions inside `MenuService` covers any future code paths that forget to clean up.
- **`config/ConfigValidator`** — startup sanity check that clamps ~12 numeric config values back into safe ranges with logged warnings (no hard-fail). Sentinel values (e.g. `-1` for "use vanilla cooldown") pass through untouched. Runs early in `onEnable` so the rest of the bootstrap sees corrected values.
- **`/tcp mobs` tab completer** — second/third/fourth-arg completion for `providers`, `provider`, `add`, `remove`, `list` and the `normal`/`ominous` wave keywords.
- **`/tcp mobs` localization** — ~23 new `mobs-*` keys in `messages.yml`; the command no longer hard-codes any English strings.
### Added — Test foundation
- **67 unit tests across 5 test classes** (`./gradlew test` runs in seconds; covers gzip roundtripping, Chamber bounds math, coordinate parsing, LootEditorDraft mutability/equality, and ConfigValidator clamp behavior). Paper API added to `testImplementation` so tests can mock Bukkit types via MockK without spinning up a server.
### Changed — Internal structure
- **`models/LootEditorDraft`** — extracted from `LootEditorView.Draft` so amount/loot editors and `MenuService` no longer reach into the view class for a shared data type.
- **`commands/handlers/`** — three of the largest `/tcp` subcommands extracted to dedicated `SubcommandHandler` classes: `GenerateCommand` (548 → 432 lines, with all `parse*` / `validate*` / `placeBoxFromPlayer` helpers and `MIN_XZ` / `MIN_Y` constants moved out of `TCPCommand`), `MobsCommand`, and `LootCommand` (with the four sub-actions — set, clear, info, list — as private methods on the class). The four `generate` mode branches now share a `createChamberAsync` helper that deduplicated ~120 lines of identical scan/snapshot follow-up code.
- **`TCPCommand.kt`: 1461 → 627 lines (57% reduction).** The dispatcher is a thin when-chain that routes to size-appropriate cases — small handlers stay inline, big ones delegate.
- **`commands/handlers/CoordinateParser`** — pure parsing logic (`parseTriple`, `parseHyphenated`, `isTripleString`) extracted from `GenerateCommand` to enable unit testing without mocking `Bukkit.getWorld()`. `GenerateCommand.parseCoordsArgs` now delegates to `CoordinateParser` for the pure parts and keeps only the world-aware composition logic.
### Notes
- **Not persisted across restart**: in-progress waves still reset to vanilla on server stop (matches pre-1.3.0 behavior). Acceptable for this release; revisit if restart-mid-wave becomes a common report.
- **All planned providers ship in 1.3.0**: the six providers originally split between 1.3.0 (vanilla + MythicMobs) and 1.3.1+ (EliteMobs, EcoMobs, LevelledMobs, InfernalMobs, Citizens) are now all in the initial release. The `TrialMobProvider` interface is stable for third-party providers to register against — see [docs/api/mob-providers.md](docs/api/mob-providers.md) for the developer guide.
- **Public API stability**: the v1.3.0 event classes and `TrialMobProvider` interface are considered stable. Field names, enum constants, and method signatures will go through a deprecation cycle before any breaking change.
- **No config file format changes** — existing `config.yml`, `loot.yml`, and `messages.yml` files continue to work. Existing chambers, loot tables, and snapshots are unaffected. Translators who already customized `messages.yml` will see the new GUI translation keys auto-merged from the bundled defaults on first reload.
[1.3.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.29...v1.3.0
beta
TrialChamberPro 1.3.0-beta.1
1.3.0-beta.125 апр. 2026 г.11Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.3.0] - 2026-04-23
### Added
- **Custom Mob Provider API** — new pluggable `TrialMobProvider` interface (`providers/TrialMobProvider.kt`) lets trial-spawner waves source mobs from external plugins instead of vanilla. Two built-in providers ship in this release: `vanilla` (default, unchanged behavior) and `mythicmobs` (reflection-based soft-dep on MythicMobs — no compile-time binding).
- **Replace-after-spawn strategy** — when a chamber is configured with a non-vanilla provider, `SpawnerWaveListener` lets the vanilla trial spawner spawn its mob, then removes that entity the same tick and asks the provider to spawn its replacement at the same location. The vanilla spawner's state machine (tracked UUIDs, wave counter, cooldown) is preserved, so boss bars, glow outlines, and cooldown management all continue to work with custom mobs.
- **Plugin-driven Trial Key drops** — vanilla's key-ejection path relies on tracked mob UUIDs that no longer exist when we replace the spawns, so `SpawnerWaveManager.maybeDropProviderKeys` drops `TRIAL_KEY` / `OMINOUS_TRIAL_KEY` itself: one per unique participant, above the spawner block, with a small upward velocity that approximates vanilla's pop. The key type is captured at wave start (`WaveState.isOminous` is a `val`) and cannot flip mid-wave.
- **Owner-only spawner-key pickup** — new `SpawnerKeyDropOwnerListener` sibling of `VaultDropOwnerListener` (v1.2.28). Drops are PDC-tagged with `tcp:spawner_key_owner` + `tcp:spawner_key_dropped_at`; non-owner pickups are cancelled during the grace window. Config: `reset.spawner-key-drop-owner-grace-seconds` (default `30`, `0` = owner-locked until despawn). Shared `tcp.bypass.droplock` permission with vault drops.
- **Per-chamber provider configuration** — new DB columns `custom_mob_provider`, `custom_mob_ids_normal`, `custom_mob_ids_ominous` (JSON-encoded id lists) on `chambers` via idempotent migration. Ominous waves fall back to the normal list if the ominous list is empty, matching the loot-table override pattern. `ChamberManager.updateCustomMobProvider(id, provider, normalIds, ominousIds)` is the single write path; `Chamber.pickMobId(ominous)` and `Chamber.hasCustomMobProvider(ominous)` are the read-side helpers.
- **`CustomMobProviderView` GUI** — new 6-row admin view reachable from `ChamberSettingsView` (spawner icon, row 2 centre). Cycle providers with left/right-click, shift-click to reset to vanilla; add mob ids via a one-shot chat input (`MobIdInputListener`) with 30-second timeout and `cancel` keyword; click a mob-id icon to remove it. All writes go through `ChamberManager.updateCustomMobProvider` and the view refreshes on the player's region thread after each change.
- **`/tcp mobs` command** — CLI path for per-chamber provider config:
- `/tcp mobs providers` — list registered providers and their availability
- `/tcp mobs <chamber> provider <id|vanilla|none>` — set the provider
- `/tcp mobs <chamber> add normal|ominous <mobId>` — add a mob id to the pool
- `/tcp mobs <chamber> remove normal|ominous <mobId>` — remove a mob id
- `/tcp mobs <chamber> list` — show current config
- Permission: `tcp.admin.mobs` (default op)
- **MythicMobs integration** as a soft-dependency via `plugin.yml` `softdepend`. `MythicMobsProvider` resolves `io.lumine.mythic.bukkit.MythicBukkit` + `MobManager.spawnMob(String, Location, double)` reflectively and degrades gracefully if the API shape changes.
- **Additional provider integrations** — five more providers, all zero-compile-time-dependency reflection with cached availability and verbose-logging-gated warnings:
- `elitemobs` — EliteMobs custom-boss spawning via `new CustomBossEntity(filename)` + `spawn(Location, 0, true)` + `getLivingEntity()`. Mob id = boss filename (with or without `.yml`).
- `ecomobs` — Auxilor [EcoMobs](https://github.com/Auxilor/EcoMobs) (hard-depends on [Eco](https://github.com/Auxilor/eco)) via `EcoMobs[id].spawn(Location, SpawnReason.CUSTOM)`. Mob id = entry id from `plugins/EcoMobs/mobs/<id>.yml`.
- `levelledmobs` — spawns a vanilla `EntityType` and applies a LevelledMobs level through `LevelInterface2.applyLevelToMob(LivingEntityWrapper, int, ...)`. Mob id format `ENTITY_TYPE[:level|ominous]` (e.g. `ZOMBIE:15`, `HUSK:ominous`). The ominous keyword maps to tiered levels (20 for ominous waves, 10 otherwise).
- `infernalmobs` — spawns a vanilla `EntityType` and enriches it via `infernal_mobs.makeInfernal(Entity, false)` (abilities are rolled by the plugin from config). Mob id format `ENTITY_TYPE`.
- `citizens` — clones a template NPC from the default `NPCRegistry` (by numeric id or exact name) and spawns the clone so template NPCs are never moved. Mob id = Citizens NPC id or name.
- **Plugin.yml softdepends** — `EliteMobs`, `Eco`, `EcoMobs`, `LevelledMobs`, `InfernalMobs`, `Citizens` added alongside `MythicMobs` so load order guarantees the provider registry sees every backing plugin before seeding.
### Changed
- `TrialChamberPro.onEnable` now constructs a `TrialMobProviderRegistry` after manager init and conditionally registers `MythicMobsProvider` when MythicMobs is present on the server. Accessible via `plugin.trialMobProviderRegistry`.
### Added — GUI translatability
- **Full GUI localization** — every name, lore line, and button label across all 18 admin GUI views is now driven by `messages.yml` under a nested `gui.*` section (~330 new keys). No hard-coded `Component.text(...)` calls left in any view file. See [docs/configuration/localization.md](docs/configuration/localization.md) for the key naming conventions and translator workflow.
- **`gui/components/GuiComponents.kt`** — reusable builders (`infoItem`, `toggleItem`, `backButton`, `closeButton`, `prevPageButton`, `nextPageButton`, `playerHead` x2) plus a class-doc that codifies icon material conventions in 5 categories (Navigation, Action buttons, State indicators, Settings categories, Domain icons). All views now build through this layer; future GUI code uses the localization layer by default.
- **`TrialChamberPro` helper additions** — `loadedMessages()`, `getMessageList(key, ...)`, `getGuiText(key, ...)` returning a `Component`, `getGuiLore(key, ...)` returning a `List<Component>`. `getMessage()` auto-skips the chat prefix for any key starting with `gui.` so admin items don't get `[TCP]` prepended.
- **Empty-state placeholders** added to 6 list/grid views (chamber list, chambers overview, loot table list, vault management, custom mob provider, loot editor) so admins always see a localized "no entries" card instead of a confusing blank pane.
### Added — Public event API
- **6 events under `api/events/`** — Bukkit-style events that third-party plugins can hook without forking. See [docs/api/events.md](docs/api/events.md) for field tables and integration examples.
- `ChamberResetEvent` (cancellable) with `Reason` enum (SCHEDULED / MANUAL / FORCED)
- `ChamberResetCompleteEvent` — post-reset with duration + blocks restored
- `VaultOpenedEvent` — post-open with cloned item snapshot
- `SpawnerWaveCompleteEvent` — post-wave with participants set
- `ChamberDiscoveredEvent` (cancellable) with `Method` enum (CHUNK_LOAD / STARTUP_SWEEP)
- `TrialKeyDropEvent` (cancellable) — per-participant key drop for provider-driven waves
- All events use `Event(!Bukkit.isPrimaryThread())` so they correctly identify as async when fired from coroutines or Folia region threads.
- **5 fire sites wired**: `ResetManager.resetChamber` (pre + post; `reason` parameter added with `MANUAL` default — scheduled paths pass `SCHEDULED`, GUI shift+right force-reset paths pass `FORCED`); `VaultInteractListener.openVault` (post, with cloned items snapshot); `SpawnerWaveManager.completeWave` (post); `SpawnerWaveManager.maybeDropProviderKeys` (per-participant pre/cancellable); `ChamberDiscoveryManager.registerChamber` (pre/cancellable).
### Added — Stability + reliability
- **`MenuSessionCleanupListener`** — drops a player's GUI session on `PlayerQuitEvent`. Belt-and-braces soft-cap eviction at 500 sessions inside `MenuService` covers any future code paths that forget to clean up.
- **`config/ConfigValidator`** — startup sanity check that clamps ~12 numeric config values back into safe ranges with logged warnings (no hard-fail). Sentinel values (e.g. `-1` for "use vanilla cooldown") pass through untouched. Runs early in `onEnable` so the rest of the bootstrap sees corrected values.
- **`/tcp mobs` tab completer** — second/third/fourth-arg completion for `providers`, `provider`, `add`, `remove`, `list` and the `normal`/`ominous` wave keywords.
- **`/tcp mobs` localization** — ~23 new `mobs-*` keys in `messages.yml`; the command no longer hard-codes any English strings.
### Added — Test foundation
- **67 unit tests across 5 test classes** (`./gradlew test` runs in seconds; covers gzip roundtripping, Chamber bounds math, coordinate parsing, LootEditorDraft mutability/equality, and ConfigValidator clamp behavior). Paper API added to `testImplementation` so tests can mock Bukkit types via MockK without spinning up a server.
### Changed — Internal structure
- **`models/LootEditorDraft`** — extracted from `LootEditorView.Draft` so amount/loot editors and `MenuService` no longer reach into the view class for a shared data type.
- **`commands/handlers/`** — three of the largest `/tcp` subcommands extracted to dedicated `SubcommandHandler` classes: `GenerateCommand` (548 → 432 lines, with all `parse*` / `validate*` / `placeBoxFromPlayer` helpers and `MIN_XZ` / `MIN_Y` constants moved out of `TCPCommand`), `MobsCommand`, and `LootCommand` (with the four sub-actions — set, clear, info, list — as private methods on the class). The four `generate` mode branches now share a `createChamberAsync` helper that deduplicated ~120 lines of identical scan/snapshot follow-up code.
- **`TCPCommand.kt`: 1461 → 627 lines (57% reduction).** The dispatcher is a thin when-chain that routes to size-appropriate cases — small handlers stay inline, big ones delegate.
- **`commands/handlers/CoordinateParser`** — pure parsing logic (`parseTriple`, `parseHyphenated`, `isTripleString`) extracted from `GenerateCommand` to enable unit testing without mocking `Bukkit.getWorld()`. `GenerateCommand.parseCoordsArgs` now delegates to `CoordinateParser` for the pure parts and keeps only the world-aware composition logic.
### Notes
- **Not persisted across restart**: in-progress waves still reset to vanilla on server stop (matches pre-1.3.0 behavior). Acceptable for this release; revisit if restart-mid-wave becomes a common report.
- **All planned providers ship in 1.3.0**: the six providers originally split between 1.3.0 (vanilla + MythicMobs) and 1.3.1+ (EliteMobs, EcoMobs, LevelledMobs, InfernalMobs, Citizens) are now all in the initial release. The `TrialMobProvider` interface is stable for third-party providers to register against — see [docs/api/mob-providers.md](docs/api/mob-providers.md) for the developer guide.
- **Public API stability**: the v1.3.0 event classes and `TrialMobProvider` interface are considered stable. Field names, enum constants, and method signatures will go through a deprecation cycle before any breaking change.
- **No config file format changes** — existing `config.yml`, `loot.yml`, and `messages.yml` files continue to work. Existing chambers, loot tables, and snapshots are unaffected. Translators who already customized `messages.yml` will see the new GUI translation keys auto-merged from the bundled defaults on first reload.
[1.3.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.29...v1.3.0
release
TrialChamberPro 1.2.29
1.2.29-mc2622 апр. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.2.29] - 2026-04-22
### Added
- **CraftEngine custom-item support** in loot tables: `type: CUSTOM_ITEM` with `plugin: CraftEngine` and `item-id: <namespace:item>`. Items are resolved via `Key.from(id)` → `CraftEngineItems.byId(key)` → `CustomItem.buildItemStack()`. IDs accept the standard namespaced form (e.g. `"my_pack:legendary_sword"`); a bare id defaults to the `minecraft` namespace per CraftEngine's `Key.from` contract, so namespaced IDs are strongly recommended
- **MythicCrucible custom-item support** in loot tables: `type: CUSTOM_ITEM` with `plugin: MythicCrucible` (alias `Crucible`) and `item-id: <your_item>`. Crucible items are registered into the MythicMobs item manager, so the gate check uses `MythicMobs` — install MythicMobs + MythicCrucible, define the item in Crucible, then reference it by id
### Changed
- `CUSTOM_ITEM` supported-plugin warning now lists all five supported plugins: Nexo, ItemsAdder, Oraxen, CraftEngine, MythicCrucible
### Notes
- No new compile-time dependencies — both integrations use reflection behind an `isPluginEnabled` gate, consistent with the existing Nexo/ItemsAdder/Oraxen pattern. Plugins ship zero runtime cost when the target plugin isn't installed
[1.2.29]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.28...v1.2.29
release
TrialChamberPro 1.2.29
1.2.2922 апр. 2026 г.26Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.29] - 2026-04-22
### Added
- **CraftEngine custom-item support** in loot tables: `type: CUSTOM_ITEM` with `plugin: CraftEngine` and `item-id: <namespace:item>`. Items are resolved via `Key.from(id)` → `CraftEngineItems.byId(key)` → `CustomItem.buildItemStack()`. IDs accept the standard namespaced form (e.g. `"my_pack:legendary_sword"`); a bare id defaults to the `minecraft` namespace per CraftEngine's `Key.from` contract, so namespaced IDs are strongly recommended
- **MythicCrucible custom-item support** in loot tables: `type: CUSTOM_ITEM` with `plugin: MythicCrucible` (alias `Crucible`) and `item-id: <your_item>`. Crucible items are registered into the MythicMobs item manager, so the gate check uses `MythicMobs` — install MythicMobs + MythicCrucible, define the item in Crucible, then reference it by id
### Changed
- `CUSTOM_ITEM` supported-plugin warning now lists all five supported plugins: Nexo, ItemsAdder, Oraxen, CraftEngine, MythicCrucible
### Notes
- No new compile-time dependencies — both integrations use reflection behind an `isPluginEnabled` gate, consistent with the existing Nexo/ItemsAdder/Oraxen pattern. Plugins ship zero runtime cost when the target plugin isn't installed
[1.2.29]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.28...v1.2.29
release
TrialChamberPro 1.2.28
1.2.2820 апр. 2026 г.14Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.2.28] - 2026-04-20
### Fixed
- **Vault cooldown not cleared on chamber reset** (long-standing, surfaced on any chamber larger than a few thousand blocks): players kept seeing "You have already opened this Vault! It will unlock when the chamber resets" even after an automatic reset
- Root cause: `BlockRestorer.restoreBlocks` scheduled region-thread batches via `runAtLocation` (fire-and-forget) and returned as soon as every batch was *queued*, not when they had *run*. `ResetManager.resetChamber` then waited just `delay(200)` before running Step 4 (spawner reset) and Step 6 (`resetAllCooldowns` → `clearAllVaultRewardedPlayers`). For anything beyond a trivially small chamber, those steps fired against blocks that had not yet been restored — `clearAllVaultRewardedPlayers` saw `block.type != VAULT` and returned without touching `rewarded_players`, so the native Vault API kept reporting the player as already rewarded forever
- Fix: `BlockRestorer.restoreBlocks` now tracks pending batches with an `AtomicInteger` + `CompletableDeferred` and `await()`s actual completion before returning. `ResetManager.resetChamber` drops the `delay(200)` hack — Steps 4 and 6 now always run against fully-restored blocks
### Added
- **Vanilla-style vault loot ejection** (opt-in): When enabled, vault loot pops out of the vault block with a short upward velocity instead of teleporting straight into the opener's inventory
- New `VaultDropOwnerListener` enforces owner-only pickup via `EntityPickupItemEvent` — dropped items are tagged with the opener's UUID in their `PersistentDataContainer` plus a drop timestamp. After the grace window elapses the tag is ignored and any player can pick up, preventing loot from lingering forever if the owner logs off
- Command rewards and status-effect rewards (Bad Omen etc.) still apply directly to the player — only itemized loot drops from the vault
- Defaults preserve existing behavior (feature is off by default)
### Config
- New `vaults.drop-loot-at-vault: false` — master switch for vanilla-style ejection
- New `vaults.drop-loot-owner-only: true` — restrict pickup to the opener during the grace window
- New `vaults.drop-loot-owner-grace-seconds: 30` — how long owner-only enforcement lasts (`0` = until item despawns)
### Permissions
- New `tcp.bypass.droplock` (default `op`) — bypass owner-only pickup restrictions on vault drops
[1.2.28]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.27...v1.2.28
release
TrialChamberPro 1.2.28
1.2.2820 апр. 2026 г.23Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.28] - 2026-04-20
### Fixed
- **Vault cooldown not cleared on chamber reset** (long-standing, surfaced on any chamber larger than a few thousand blocks): players kept seeing "You have already opened this Vault! It will unlock when the chamber resets" even after an automatic reset
- Root cause: `BlockRestorer.restoreBlocks` scheduled region-thread batches via `runAtLocation` (fire-and-forget) and returned as soon as every batch was *queued*, not when they had *run*. `ResetManager.resetChamber` then waited just `delay(200)` before running Step 4 (spawner reset) and Step 6 (`resetAllCooldowns` → `clearAllVaultRewardedPlayers`). For anything beyond a trivially small chamber, those steps fired against blocks that had not yet been restored — `clearAllVaultRewardedPlayers` saw `block.type != VAULT` and returned without touching `rewarded_players`, so the native Vault API kept reporting the player as already rewarded forever
- Fix: `BlockRestorer.restoreBlocks` now tracks pending batches with an `AtomicInteger` + `CompletableDeferred` and `await()`s actual completion before returning. `ResetManager.resetChamber` drops the `delay(200)` hack — Steps 4 and 6 now always run against fully-restored blocks
### Added
- **Vanilla-style vault loot ejection** (opt-in): When enabled, vault loot pops out of the vault block with a short upward velocity instead of teleporting straight into the opener's inventory
- New `VaultDropOwnerListener` enforces owner-only pickup via `EntityPickupItemEvent` — dropped items are tagged with the opener's UUID in their `PersistentDataContainer` plus a drop timestamp. After the grace window elapses the tag is ignored and any player can pick up, preventing loot from lingering forever if the owner logs off
- Command rewards and status-effect rewards (Bad Omen etc.) still apply directly to the player — only itemized loot drops from the vault
- Defaults preserve existing behavior (feature is off by default)
### Config
- New `vaults.drop-loot-at-vault: false` — master switch for vanilla-style ejection
- New `vaults.drop-loot-owner-only: true` — restrict pickup to the opener during the grace window
- New `vaults.drop-loot-owner-grace-seconds: 30` — how long owner-only enforcement lasts (`0` = until item despawns)
### Permissions
- New `tcp.bypass.droplock` (default `op`) — bypass owner-only pickup restrictions on vault drops
[1.2.28]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.27...v1.2.28
release
TrialChamberPro 1.2.27-mc26
1.2.27-mc2620 апр. 2026 г.5Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
### This plugin version is compatible with Minecraft 26.X.X
## [1.2.27] - 2026-04-20
### Added
- **Glow outline on active trial spawners** (opt-in): when a spawner activates, a colored outline is rendered around it that is visible through walls, making it easy to find the remaining active spawners in large chambers
- Implemented by spawning a non-responsive, non-persistent `Interaction` entity sized to wrap the spawner (1.2x1.2), with `isGlowing = true` and `glowColorOverride` set per wave type
- Cleared automatically when the wave completes, immediately (does not wait for the boss bar's 3s outro), and also on chamber reset via the existing `clearWavesInChamber` cleanup path
- Folia-safe: entity spawn and removal both run via `scheduler.runAtLocation` on the owning region thread
### Config
- New `spawner-waves.glow-active-spawners: false` — master switch for the glow outline (opt-in)
- New `spawner-waves.glow-color-normal: "#FFFF55"` — hex RGB outline color for normal trial spawners (default: yellow)
- New `spawner-waves.glow-color-ominous: "#A020F0"` — hex RGB outline color for ominous trial spawners (default: purple)
[1.2.27]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.26...v1.2.27
release
TrialChamberPro 1.2.27
1.2.2720 апр. 2026 г.13Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.27] - 2026-04-20
### Added
- **Glow outline on active trial spawners** (opt-in): when a spawner activates, a colored outline is rendered around it that is visible through walls, making it easy to find the remaining active spawners in large chambers
- Implemented by spawning a non-responsive, non-persistent `Interaction` entity sized to wrap the spawner (1.2x1.2), with `isGlowing = true` and `glowColorOverride` set per wave type
- Cleared automatically when the wave completes, immediately (does not wait for the boss bar's 3s outro), and also on chamber reset via the existing `clearWavesInChamber` cleanup path
- Folia-safe: entity spawn and removal both run via `scheduler.runAtLocation` on the owning region thread
### Config
- New `spawner-waves.glow-active-spawners: false` — master switch for the glow outline (opt-in)
- New `spawner-waves.glow-color-normal: "#FFFF55"` — hex RGB outline color for normal trial spawners (default: yellow)
- New `spawner-waves.glow-color-ominous: "#A020F0"` — hex RGB outline color for ominous trial spawners (default: purple)
[1.2.27]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.26...v1.2.27
release
TrialChamberPro 1.2.26-mc26
1.2.26-mc2619 апр. 2026 г.9Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
## This plugin version is compatible with Minecraft 26.X.X
## [1.2.26] - 2026-04-19
### Added
- **Edit default (global) loot tables from the GUI**: Clicking a table in the Loot Tables menu now opens the full editor directly — no need to open each chamber one by one
- Multi-pool tables route through the pool selector first; legacy single-pool tables open the editor directly
- Edits persist to `loot.yml` via `LootManager.saveAllToFile()` and apply automatically to every chamber that references the table (i.e. every chamber without a per-chamber override)
- The full editor feature set works in global mode: weight/amount/rolls adjustments, add-from-hand, toggle enabled, discard draft
- **Spawner-wave boss bar now hides when you leave the area**: Walking past `spawner-waves.remove-distance` (default 32 blocks, hysteresis above `detection-radius`) from a spawner removes the player from that wave's boss bar so it no longer lingers on screen after you exit a chamber
- **Chamber reset clears active wave boss bars**: `ResetManager.resetChamber` now calls `SpawnerWaveManager.clearWavesInChamber` so boss bars for any in-progress wave inside the chamber are force-removed alongside the block/entity cleanup — fixes boss bars persisting after admin-initiated resets
### Changed
- `LootEditorView`, `PoolSelectorView`, and `AmountEditorView` now accept either a `Chamber` *or* a `globalTableName` so the same editor powers both chamber-scoped and global table editing
- `MenuService` gained `openGlobalPoolSelect`, `openGlobalLootEditor`, `openGlobalAmountEditor`, and `saveGlobalDraft`; session restoration via `Session.globalLootEdit` routes the user back to the right flow after reopen
### Config
- New `spawner-waves.remove-distance: 32` — distance at which a player is removed from a boss bar they were previously added to. Must be greater than `detection-radius` to prevent flicker at the boundary.
[1.2.26]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.25...v1.2.26
release
TrialChamberPro 1.2.26
1.2.2619 апр. 2026 г.18Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.26] - 2026-04-19
### Added
- **Edit default (global) loot tables from the GUI**: Clicking a table in the Loot Tables menu now opens the full editor directly — no need to open each chamber one by one
- Multi-pool tables route through the pool selector first; legacy single-pool tables open the editor directly
- Edits persist to `loot.yml` via `LootManager.saveAllToFile()` and apply automatically to every chamber that references the table (i.e. every chamber without a per-chamber override)
- The full editor feature set works in global mode: weight/amount/rolls adjustments, add-from-hand, toggle enabled, discard draft
- **Spawner-wave boss bar now hides when you leave the area**: Walking past `spawner-waves.remove-distance` (default 32 blocks, hysteresis above `detection-radius`) from a spawner removes the player from that wave's boss bar so it no longer lingers on screen after you exit a chamber
- **Chamber reset clears active wave boss bars**: `ResetManager.resetChamber` now calls `SpawnerWaveManager.clearWavesInChamber` so boss bars for any in-progress wave inside the chamber are force-removed alongside the block/entity cleanup — fixes boss bars persisting after admin-initiated resets
### Changed
- `LootEditorView`, `PoolSelectorView`, and `AmountEditorView` now accept either a `Chamber` *or* a `globalTableName` so the same editor powers both chamber-scoped and global table editing
- `MenuService` gained `openGlobalPoolSelect`, `openGlobalLootEditor`, `openGlobalAmountEditor`, and `saveGlobalDraft`; session restoration via `Session.globalLootEdit` routes the user back to the right flow after reopen
### Config
- New `spawner-waves.remove-distance: 32` — distance at which a player is removed from a boss bar they were previously added to. Must be greater than `detection-radius` to prevent flicker at the boundary.
[1.2.26]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.25...v1.2.26
release
TrialChamberPro 1.2.25-mc26
1.2.25-mc2618 апр. 2026 г.10Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
## This plugin version is compatible with Minecraft 26.X.X
## [1.2.25] - 2026-04-19
### Added
- **Auto-Discovery of Trial Chambers**: Opt-in system that automatically registers naturally-generated Trial Chambers the first time a player loads one of its chunks
- New `ChamberDiscoveryListener` hooks `ChunkLoadEvent` and checks `chunk.tileEntities` for `VAULT` or `TRIAL_SPAWNER` — cheap, no block iteration on the hot path
- New `ChamberDiscoveryManager` runs a BFS flood-fill over chamber structural blocks (tuff brick family, polished/chiseled tuff, copper bulb/grate/chiseled/door/trapdoor incl. all oxidation + waxed variants, heavy core, vaults, trial spawners) to compute a tight bounding box
- Radius-capped BFS (configurable `max-radius-xz` / `max-radius-y`) prevents runaway scans and cannot merge neighboring chambers (generation places them 544+ blocks apart)
- Partial-load handling: if BFS hits an unloaded chunk, the seed is re-queued with a retry budget so the AABB grows as adjacent chunks load naturally
- Per-region debounce (128-block buckets) prevents re-triggering from the same area
- Auto-name format: `auto_<world>_<centerX>_<centerZ>` (deterministic, collision-safe)
- Works on both freshly-generated AND existing worlds — `ChunkLoadEvent` fires on every chunk load, regardless of whether the chunk was generated now or pre-existed on disk
- **Startup sweep**: on plugin enable, iterates every currently-loaded chunk across all Overworld worlds and seeds discovery for any `VAULT`/`TRIAL_SPAWNER` tile-entities found — covers chambers in chunks that were already loaded before the `ChunkLoadEvent` listener was registered (e.g. spawn regions, pre-loaded worlds)
- Reuses existing `ChamberManager.createChamber` + `scanChamber` to register and populate vaults/spawners
- Optional auto-snapshot on registration (`discovery.auto-snapshot`, default off because snapshots are expensive)
- Broadcasts registration to players with new `tcp.discovery.notify` permission
- **New config section `discovery:`**: `enabled` (default `false`, opt-in), `max-radius-xz`, `max-radius-y`, `min-vaults-plus-spawners`, `max-center-y`, `auto-snapshot`, `notify-ops`, `cooldown-seconds`, `pending-retry-seconds`
- **New permission `tcp.discovery.notify`** (default `op`): receive in-game notifications when discovery registers a chamber
- **New message `discovery-registered`** in messages.yml
### Technical Details
- BFS bounds checked against the `generation.max-volume` cap so a malformed run cannot produce an oversized chamber
- Overworld-only (`World.Environment.NORMAL`) — trial chambers do not generate in Nether/End
- Center-Y validation (`max-center-y: 10`, default) rejects above-ground tuff/copper builds that would false-positive
- All block reads scheduled via `plugin.scheduler.runAtLocation` for Folia compatibility
- Listener runs at `EventPriority.MONITOR` and short-circuits if disabled, wrong environment, empty tile-entity list, or location already inside a registered chamber
- Recently-processed region set uses a bounded cleanup pass to avoid unbounded memory growth
[1.2.25]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.24...v1.2.25
release
TrialChamberPro 1.2.25
1.2.2518 апр. 2026 г.15Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.25] - 2026-04-19
### Added
- **Auto-Discovery of Trial Chambers**: Opt-in system that automatically registers naturally-generated Trial Chambers the first time a player loads one of its chunks
- New `ChamberDiscoveryListener` hooks `ChunkLoadEvent` and checks `chunk.tileEntities` for `VAULT` or `TRIAL_SPAWNER` — cheap, no block iteration on the hot path
- New `ChamberDiscoveryManager` runs a BFS flood-fill over chamber structural blocks (tuff brick family, polished/chiseled tuff, copper bulb/grate/chiseled/door/trapdoor incl. all oxidation + waxed variants, heavy core, vaults, trial spawners) to compute a tight bounding box
- Radius-capped BFS (configurable `max-radius-xz` / `max-radius-y`) prevents runaway scans and cannot merge neighboring chambers (generation places them 544+ blocks apart)
- Partial-load handling: if BFS hits an unloaded chunk, the seed is re-queued with a retry budget so the AABB grows as adjacent chunks load naturally
- Per-region debounce (128-block buckets) prevents re-triggering from the same area
- Auto-name format: `auto_<world>_<centerX>_<centerZ>` (deterministic, collision-safe)
- Works on both freshly-generated AND existing worlds — `ChunkLoadEvent` fires on every chunk load, regardless of whether the chunk was generated now or pre-existed on disk
- **Startup sweep**: on plugin enable, iterates every currently-loaded chunk across all Overworld worlds and seeds discovery for any `VAULT`/`TRIAL_SPAWNER` tile-entities found — covers chambers in chunks that were already loaded before the `ChunkLoadEvent` listener was registered (e.g. spawn regions, pre-loaded worlds)
- Reuses existing `ChamberManager.createChamber` + `scanChamber` to register and populate vaults/spawners
- Optional auto-snapshot on registration (`discovery.auto-snapshot`, default off because snapshots are expensive)
- Broadcasts registration to players with new `tcp.discovery.notify` permission
- **New config section `discovery:`**: `enabled` (default `false`, opt-in), `max-radius-xz`, `max-radius-y`, `min-vaults-plus-spawners`, `max-center-y`, `auto-snapshot`, `notify-ops`, `cooldown-seconds`, `pending-retry-seconds`
- **New permission `tcp.discovery.notify`** (default `op`): receive in-game notifications when discovery registers a chamber
- **New message `discovery-registered`** in messages.yml
### Technical Details
- BFS bounds checked against the `generation.max-volume` cap so a malformed run cannot produce an oversized chamber
- Overworld-only (`World.Environment.NORMAL`) — trial chambers do not generate in Nether/End
- Center-Y validation (`max-center-y: 10`, default) rejects above-ground tuff/copper builds that would false-positive
- All block reads scheduled via `plugin.scheduler.runAtLocation` for Folia compatibility
- Listener runs at `EventPriority.MONITOR` and short-circuits if disabled, wrong environment, empty tile-entity list, or location already inside a registered chamber
- Recently-processed region set uses a bounded cleanup pass to avoid unbounded memory growth
[1.2.25]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.24...v1.2.25
release
TrialChamberPro 1.2.24-mc26
1.2.24-mc2615 апр. 2026 г.26Minecraft: 26.1, 26.1.1, 26.1.2folia, paper, purpur
Что нового
## This plugin version is compatible with Minecraft 26.X.X
---
## [1.2.24] - 2026-04-15
### Added
- **Custom Plugin Item Support in loot.yml**: Nexo, ItemsAdder, and Oraxen items can now be used as loot drops
- Use `type: CUSTOM_ITEM` with `plugin: Nexo/ItemsAdder/Oraxen` and `item-id: "..."` fields
- Resolved at runtime via reflection — no compile-time dependency on any custom item plugin
- If the plugin is not installed, the item is skipped with a console warning
- Extra `name:`, `lore:`, and `enchantments:` fields are applied on top of the resolved item
- **`custom-model-data` field for vanilla items**: Set custom model data (resource pack texture override) on any vanilla item in loot.yml
- Works with all other item fields (enchantments, lore, durability ranges, etc.)
[1.2.24]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.23...v1.2.24
release
TrialChamberPro 1.2.24
1.2.2415 апр. 2026 г.36Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.24] - 2026-04-15
### Added
- **Custom Plugin Item Support in loot.yml**: Nexo, ItemsAdder, and Oraxen items can now be used as loot drops
- Use `type: CUSTOM_ITEM` with `plugin: Nexo/ItemsAdder/Oraxen` and `item-id: "..."` fields
- Resolved at runtime via reflection — no compile-time dependency on any custom item plugin
- If the plugin is not installed, the item is skipped with a console warning
- Extra `name:`, `lore:`, and `enchantments:` fields are applied on top of the resolved item
- **`custom-model-data` field for vanilla items**: Set custom model data (resource pack texture override) on any vanilla item in loot.yml
- Works with all other item fields (enchantments, lore, durability ranges, etc.)
[1.2.24]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.23...v1.2.24
release
TrialChamberPro 1.2.23
1.2.2314 февр. 2026 г.239Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.23] - 2026-02-14
### Fixed
- **Vanilla Vaults Broken**: Unregistered/vanilla vaults now work correctly when plugin is installed
- Root cause: `VaultInteractListener` intercepted ALL vault interactions server-wide, cancelling the event for vaults not in the plugin's database
- Fix: Early-return check skips plugin logic for vaults outside registered chambers
- **Custom Death Message Not Working**: Death messages set from async thread had no effect (event already processed)
- Fix: Use synchronous cache lookup (`getCachedChamberAt`) so death message is set while event is still being processed
- **Async Block Data Access**: `saveVault()` accessed `block.blockData.asString` on IO thread (unsafe Bukkit API access)
- Fix: Block data string is now read on the main thread and passed as a parameter
- **`runBlocking` in Async Thread**: `UndoListener` used `runBlocking` inside `runTaskAsync`, blocking Bukkit's async thread pool
- Fix: Replaced with `plugin.launchAsync {}` coroutine pattern
- **JDBC Resource Leaks**: `StatisticsManager` had 5 methods with `PreparedStatement`/`ResultSet` not wrapped in `.use{}`
- Fix: All JDBC resources now use `.use{}` for automatic cleanup
- **`loadingLocks` Memory Leak**: Per-player mutex map in `StatisticsManager` grew without bound
- Fix: Entries now cleaned up alongside cache invalidation
### Improved
- **Messages Performance**: `getMessage()` now caches the parsed `messages.yml` instead of re-reading and re-parsing the file on every call; cache invalidated on `/tcp reload`
- **Shutdown Reliability**: `PlayerMovementListener`, `PlayerDeathListener`, and `PasteConfirmListener` coroutine scopes now properly cancelled on plugin disable
- **Time Tracking Data Preservation**: Player time-in-chamber data is flushed to database on plugin shutdown (previously up to 5 minutes of data could be lost)
- **Duplicate Command Handlers**: Removed redundant `TCPCommand`/`TCPTabCompleter` creation during async initialization (already registered at startup)
[1.2.23]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.22...v1.2.23
release
TrialChamberPro 1.2.22
1.2.2210 янв. 2026 г.167Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.22] - 2026-01-10
### Fixed
- **GUI Teleport Right-Click**: Fixed teleport button in ChamberDetailView ignoring click type
- Right-click was teleporting to chamber center instead of exit location
- Root cause: `handleTeleport()` didn't check for left vs right click - always teleported to center
- Fix: Added `isLeftClick` and `isRightClick` parameters to handler
- Left click: Teleport to chamber center (as before)
- Right click: Teleport to exit location (now works correctly)
- Shows "No exit location set" message if exit not configured
### Technical Details
- `ChamberDetailView.handleTeleport()` now accepts `left: Boolean, right: Boolean` parameters
- Uses `when` expression to differentiate click types
- Existing messages `gui-teleport-to-center`, `gui-teleport-to-exit`, and `gui-no-exit-location` used
[1.2.22]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.21...v1.2.22
release
TrialChamberPro 1.2.21
1.2.219 янв. 2026 г.132Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.21] - 2026-01-10
### Fixed
- **Vault Cooldown Not Working**: Fixed permanent vault cooldown not being enforced after the 5-second spam protection expires
- Root cause: We were cancelling the `PlayerInteractEvent` to handle loot ourselves, but this prevented vanilla from tracking the player in the vault's `rewarded_players` NBT
- Our database tracking was supposed to handle cooldowns, but wasn't being respected properly
- Fix: Now uses Paper's native `Vault` TileState API for cooldown tracking:
- `hasRewardedPlayer(UUID)` to check if player already opened the vault
- `addRewardedPlayer(UUID)` to mark player as rewarded after giving loot
- `update()` to persist the block state changes
- This is more reliable because it uses Minecraft's built-in tracking that persists with the block
- Cooldowns automatically reset when the vault block is restored during chamber reset
### Improved
- **SpawnerWaveListener**: Removed reflection-based ominous detection, now uses Paper's native `TrialSpawner.isOminous` property directly
- **VaultInteractListener**: Simplified trial key detection using direct `Material.OMINOUS_TRIAL_KEY` enum instead of string comparison
- Note: Vault ominous detection still uses block data string parsing as Paper's Vault TileState doesn't have `isOminous` property (unlike TrialSpawner)
- **Vault Reset Commands**: Now properly clear both database tracking AND native Vault `rewarded_players`
- `/tcp vault reset <chamber> <player>` - Clears specific player from vault cooldown
- GUI "Reset All Cooldowns" button - Clears all players from vault cooldowns
- Chamber automatic reset - Clears all vault cooldowns (both DB and native API)
- Uses `Vault.removeRewardedPlayer(UUID)` and `Vault.update()` to clear native state
- Fully Folia-compatible using `scheduler.runAtLocation()` for block operations
### Technical Details
- `VaultInteractListener` now imports `org.bukkit.block.Vault` TileState
- Cooldown check: `block.state as? Vault` then `vaultState.hasRewardedPlayer(player.uniqueId)`
- After loot: `vaultState.addRewardedPlayer(player.uniqueId)` then `vaultState.update()` (CRITICAL: must call update!)
- Database `recordOpen` is still called for statistics tracking, but not used for cooldown enforcement
- Both operations run on the region thread (Folia compatible) using `scheduler.runAtLocation()`
- Added `vault-error` message to messages.yml for edge cases where vault state can't be updated
- Key detection: `Material.TRIAL_KEY` and `Material.OMINOUS_TRIAL_KEY` direct enum comparison
- Spawner ominous check: `state.isOminous` property (no reflection needed)
[1.2.21]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.20...v1.2.21
release
TrialChamberPro 1.2.20
1.2.209 янв. 2026 г.15Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.20] - 2026-01-10
### Fixed
- **GUI Icons Misplaced**: Updated InventoryFramework from 0.11.5 to 0.11.6 to fix potential GUI rendering issues
- Reported: Menu icons appearing in wrong positions
- May also fix issues with ProtocolLib conflicts
- **Vault Spam-Click Race Condition at 5-Second Boundary**: Fixed race condition where multiple vault opens could occur when spam protection lock expires
- Root cause: The `delay(5000); remove(lockKey)` in the coroutine's finally block races with new events at exactly 5 seconds
- At T+5s, the old coroutine removes the lock while new events are checking it, allowing multiple events through
- Fix: Removed explicit lock removal; rely on timestamp-based expiration check instead
- Added periodic cleanup (when map size > 100) to prevent memory leaks
### Technical Details
- Updated `com.github.stefvanschie.inventoryframework:IF` dependency from 0.11.5 to 0.11.6
- `VaultInteractListener`: Removed `finally { delay(5000); remove() }` block that caused race condition
- Spam protection lock now uses timestamp expiration only (checked on each event)
- Memory leak prevention: Old entries (>30s) cleaned up when map exceeds 100 entries
[1.2.20]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.19...v1.2.20
release
TrialChamberPro 1.2.19
1.2.199 янв. 2026 г.12Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.19] - 2026-01-09
### Added
- **Plugin Info Command**: `/tcp info` now shows plugin information when used without arguments
- Displays version, authors, database type, chamber count, platform (Paper/Folia)
- Shows integration status: WorldEdit/FAWE, WorldGuard, PlaceholderAPI, Vault
- Shows feature status: Per-Player Loot, Spawner Waves, Spectator Mode, Statistics
- Requires `tcp.admin` permission
- `/tcp info <chamber>` still shows chamber info (existing behavior)
### Fixed
- **GUI Item Drag Exploit**: Fixed players being able to drag items inside GUI menus
- Root cause: `setOnGlobalDrag` was missing from all 17 GUI views
- Players could drag items by holding click and moving, bypassing click handlers
- Now all views have both `setOnGlobalClick` and `setOnGlobalDrag` handlers
- **Vault Spam-Click Exploit**: Fixed players being able to spam-click vaults to get multiple loot drops
- Root cause: The in-memory lock check was inside the async coroutine, not the sync event handler
- Multiple clicks could launch multiple coroutines before any of them checked/set the lock
- Fix: Lock check now happens SYNCHRONOUSLY in the event handler before any async work
- Uses location-based lock key (player + coordinates + vault type) for immediate protection
- **Keys Consumed Without Loot**: Fixed trial keys being consumed even when no loot is generated
- Now checks if loot table exists BEFORE attempting to open vault
- If loot generation fails (empty result), key is NOT consumed and vault is NOT marked as opened
- Player receives error message explaining the configuration issue
- Common cause: TAB characters in loot.yml (YAML requires spaces, not tabs!)
### Technical Details
- Added `gui.setOnGlobalDrag { it.isCancelled = true }` to all 17 GUI view files
- `VaultInteractListener.onVaultInteract()` now checks/sets the spam protection lock before launching coroutine
- Lock key format changed from `{uuid}:{vaultId}` to `{uuid}:{x}:{y}:{z}:{type}` for sync access (no DB lookup needed)
- Debug logging shows "Vault interaction ignored - already opening (spam protection)" when spam detected
- New messages in messages.yml: `plugin-info-*` for plugin info display
[1.2.19]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.18...v1.2.19
release
TrialChamberPro 1.2.18
1.2.186 янв. 2026 г.24Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.18] - 2026-01-07
### Fixed
- **Wild Spawner Cooldown Not Working**: Fixed cooldown setting having no effect on wild spawners
- Root cause: Cooldown was set at wave start, but spawner caches cooldown value at that point
- Fix: Now sets cooldown at **wave completion** (before spawner enters cooldown state)
- For `cooldown-minutes: 0`: Also clears tracked players/entities for true instant reactivation
### Technical Details
- `SpawnerWaveManager.configureWildSpawnerCooldownAtCompletion()` handles the timing
- For cooldown=0: Calls `stopTrackingPlayer()` and `stopTrackingEntity()` so spawner reactivates for same players
- Debug logging available with `debug.verbose-logging: true`
[1.2.18]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.17...v1.2.18
release
TrialChamberPro 1.2.17
1.2.176 янв. 2026 г.13Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.17] - 2026-01-06
### Added
- **Wild Spawner Cooldown Configuration**: Control cooldown for trial spawners OUTSIDE registered chambers
- New config option: `reset.wild-spawner-cooldown-minutes`
- Values: `-1` = vanilla default (30 min), `0` = no cooldown (instant reactivation), `1-60` = custom minutes
- Applies server-wide to all unregistered Trial Chamber spawners
- Useful for servers wanting consistent spawner behavior across the world
- Boss bar wave tracking now also works for wild spawners (not just registered chambers)
### Technical Details
- `SpawnerWaveListener` now tracks and configures wild spawner cooldowns
- Cooldown is set once per wave start (not on every mob spawn) to avoid repeated `state.update()` calls
- Uses `TrialSpawner.cooldownLength` property from Paper API
- Debug logging available with `debug.verbose-logging: true`
[1.2.17]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.16...v1.2.17
release
TrialChamberPro 1.2.16
1.2.166 янв. 2026 г.8Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.16] - 2026-01-06
### Fixed
- **Thread Safety Improvements**: Fixed multiple concurrency issues discovered during code review
- `VaultManager.setLootTableForChamber()`: Now properly async with `suspend` and `Dispatchers.IO`
- `StatisticsManager.getStats()`: Added per-player mutex to prevent redundant database loads
- `BlockRestorer.processedBlocks`: Changed to `AtomicInteger` for Folia multi-region safety
- `SpawnerWaveManager` counters: Changed `mobsKilled`, `mobsSpawned`, `totalMobsExpected` to `AtomicInteger`
- **Memory Leak Fix**: `VaultInteractListener.openingVaults` map now properly cleaned up on plugin disable
- Added `shutdown()` method to cancel coroutine scope and clear the map
- Plugin now calls shutdown on listener during `onDisable()`
### Changed
- **Full Message Localization**: All remaining hardcoded messages are now translatable via messages.yml
- Boss bar messages for spawner wave tracking (normal/ominous titles, progress, completion)
- Plugin startup message shown when commands are used during initialization
- Chamber info display format strings (exit location, snapshot status)
- Generate command usage/help messages
### Technical Details
- `StatisticsManager` uses `kotlinx.coroutines.sync.Mutex` for per-player locking with double-check pattern
- `SpawnerWaveManager.WaveState` now uses `AtomicInteger` for all counters and `@Volatile` for `completed` flag
- `VaultInteractListener` stored as field in main plugin class for proper lifecycle management
- `SpawnerWaveManager` now uses `getMessageComponent()` helper to convert message strings to Adventure Components
- `getMessage()` now skips prefix for keys containing "boss-bar"
- Added 15 new message keys: `spawner-wave-boss-bar-*`, `usage-generate-*`, `info-*`, `plugin-starting-up`
[1.2.16]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.15...v1.2.16
release
TrialChamberPro 1.2.15
1.2.156 янв. 2026 г.11Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.15] - 2026-01-06
### Fixed
- **CRITICAL: Spawner Cooldown Config Not Working**: Fixed `spawner-cooldown-minutes` setting having no effect
- Root cause: NBTUtil was restoring the old cooldown from snapshot data, overwriting the config value
- Fix: Removed cooldown restoration from NBTUtil - cooldown is now controlled exclusively by config
- Added 200ms safety delay between block restoration and spawner reset to ensure proper ordering
- Now works correctly with all values: 0 (no cooldown), -1 (vanilla default), or custom minutes
- Debug logging available with `debug.verbose-logging: true` to troubleshoot cooldown issues
### Technical Details
- `NBTUtil.restoreTrialSpawner()` no longer restores `cooldownLength` from snapshot data
- `ResetManager.resetTrialSpawners()` now has comprehensive debug logging for cooldown configuration
- Added verification check after `state.update()` to detect if cooldown was properly applied
[1.2.15]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.14...v1.2.15
release
TrialChamberPro 1.2.14
1.2.146 янв. 2026 г.15Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.14] - 2026-01-06
### Added
- **Disable Automatic Resets**: Set `default-reset-interval: 0` to disable automatic chamber resets
- Chambers will only reset via manual `/tcp reset <chamber>` command or GUI
- Per-chamber override available in Chamber Settings GUI with "Disabled" option
- Useful for event chambers or manually-controlled dungeons
### Technical Details
- `ResetManager.scheduleResetIfNeeded()` now skips scheduling when `resetInterval <= 0`
- Added "Disabled" preset to `ChamberSettingsView` reset interval options
[1.2.14]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.13...v1.2.14
release
TrialChamberPro 1.2.13
1.2.136 янв. 2026 г.23Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.13] - 2026-01-06
### Added
- **Configurable Trial Spawner Cooldown**: Control how long trial spawners stay in cooldown after being completed
- Global setting: `spawner-cooldown-minutes` in config.yml (default: -1 for vanilla 30 min)
- Per-chamber override: Set custom cooldown for individual chambers via GUI or database
- Values: `-1` = vanilla default (30 min), `0` = no cooldown (instant reactivation), `1-60` = custom minutes
- GUI support in Chamber Settings view with preset options (0, 5, 10, 15, 30 min, or vanilla default)
- **WorldEdit Undo Support for Chamber Resets**: Block restoration now integrates with WorldEdit's undo system
- When a player initiates a reset (command or GUI), changes are recorded in their WorldEdit undo history
- Use `//undo` to revert chamber resets initiated by you
- Automatic resets (scheduled) don't create undo entries (no initiating player)
- Uses WorldEdit's EditSession API via reflection (soft dependency)
### Changed
- **Complete Message Localization**: All user-facing messages are now translatable via messages.yml
- Added 50+ new message keys for GUI operations
- Chamber operations: teleport, reset, exit players, snapshot create/restore
- Settings operations: reset interval, exit location, loot table, spawner cooldown
- Loot editor operations: add item, save changes
- All hardcoded `Component.text()` messages replaced with `plugin.getMessage()`
- GUI categories: `gui-` prefixed keys for easy organization
- Placeholders: `{chamber}`, `{count}`, `{seconds}`, `{error}`, `{value}`, `{type}`, `{table}`, `{item}`, `{pool}`, `{setting}`
### Technical Details
- New config option: `spawner-cooldown-minutes` in global section
- New Chamber model property: `spawnerCooldownMinutes: Int?` (null = use global)
- Database migration: Added `spawner_cooldown_minutes` column to chambers table
- `ResetManager.resetTrialSpawners()` now applies cooldown via `TrialSpawner.setCooldownLength()`
- `BlockRestorer.restoreBlocks()` accepts optional `initiatingPlayer` parameter for WorldEdit integration
- WorldEdit integration via reflection: `createWorldEditSession()`, `restoreBlockWithWorldEdit()`, `finalizeWorldEditSession()`
- New messages.yml keys: 35+ GUI action messages with placeholder support
[1.2.13]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.12...v1.2.13
release
TrialChamberPro 1.2.12
1.2.1214 дек. 2025 г.108Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.12] - 2025-12-14
### Fixed
- **Advancement granted in spectator mode**: Fixed "Minecraft: Trial(s) Edition" advancement being granted when entering a chamber in spectator or creative mode
- Now only grants to players in Survival or Adventure mode
- **Duplicate boss bar bug**: Fixed wave progress boss bars duplicating when a new wave starts during the 3-second completion delay
- Root cause: Old "Wave Complete!" bar remained visible while new wave created another bar
- Fix: Immediately remove old boss bar when starting a new wave at the same spawner
- Also added safeguard to prevent adding the same player as a viewer multiple times
### Technical Details
- `PlayerMovementListener` now checks game mode before granting entry advancement
- `SpawnerWaveManager.startWave()` now cleans up completed waves before creating new ones
- `SpawnerWaveManager.addPlayerToBossBar()` now checks if player is already viewing
[1.2.12]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.11...v1.2.12
release
TrialChamberPro 1.2.11
1.2.1110 дек. 2025 г.71Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11folia, paper, purpur
Что нового
## [1.2.11] - 2025-12-10
### Fixed
- **CRITICAL: Trial Spawners Not Dropping Keys After Reset**: Fixed trial spawners stuck in cooldown state after chamber reset
- Root cause: Snapshots captured the `trial_spawner_state` block data (e.g., `cooldown`, `ejecting_reward`)
- When restored, spawners remained in that state and wouldn't activate for 30 minutes
- Fix: `BlockRestorer.resetTrialSpawnerState()` now resets spawner state to `waiting_for_players` during restoration
- Spawners are now immediately ready to activate after chamber reset, regardless of snapshot timing
- All 6 spawner states are handled: `inactive`, `active`, `waiting_for_reward_ejection`, `ejecting_reward`, `cooldown`
- **Note**: Existing chambers will be fixed automatically on next reset - no action needed
### Technical Details
- New function: `BlockRestorer.resetTrialSpawnerState()` - Modifies trial spawner block data strings during restoration
[1.2.11]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.10...v1.2.11
release
TrialChamberPro 1.2.10
1.2.109 дек. 2025 г.69Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.10] - 2025-12-09
### Added
- **Vanilla Advancement Granting**: Plugin-created chambers now grant vanilla Trial Chamber advancements
- **"Minecraft: Trial(s) Edition"** (`adventure/minecraft_trials_edition`) - Granted when entering a plugin-managed chamber
- **"Under Lock and Key"** (`adventure/under_lock_and_key`) - Granted when opening a normal vault
- **"Revaulting"** (`adventure/revaulting`) - Granted when opening an ominous vault
- Preserves the vanilla progression experience for schematic-pasted chambers
- Folia compatible: Uses `runAtEntity()` for advancement granting in PlayerMovementListener
### Technical Details
- New utility: `AdvancementUtil.kt` with thread-safe advancement granting methods
- `grantTrialChamberEntry(player)` - For chamber entry
- `grantVaultUnlock(player)` - For normal vault opening
- `grantOminousVaultUnlock(player)` - For ominous vault (auto-grants prerequisite)
- `VaultInteractListener` grants vault advancements after successful loot distribution
- `PlayerMovementListener` grants entry advancement when player crosses into chamber bounds
- All advancement operations run on entity thread for Folia compatibility
[1.2.10]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.9...v1.2.10
release
TrialChamberPro 1.2.9
1.2.97 дек. 2025 г.139Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.9] - 2025-12-07
### Changed
- **Update Checker**: Migrated from plain text logging to MiniMessage format for colored console output
- Update notifications now display with proper colors in console
- `update.txt` now supports MiniMessage tags (e.g., `<green>`, `<yellow>`, `<gold>`)
[1.2.9]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.8...v1.2.9
release
TrialChamberPro 1.2.8
1.2.84 дек. 2025 г.78Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.8] - 2025-12-04
### Added
- **Complete GUI Overhaul**: 14 new views replacing the old 6-view system
- **MainMenuView**: New central hub with 6 category buttons (Chambers, Loot Tables, Statistics, Settings, Protection, Help)
- **ChamberListView**: Paginated chamber list (36 per page) replacing ChambersOverviewView
- **ChamberDetailView**: Enhanced chamber management hub with quick actions
- **ChamberSettingsView**: Per-chamber settings (reset interval, exit location, loot overrides)
- **VaultManagementView**: Vault cooldown management with player lock display
- **SettingsMenuView**: Settings category hub with config reload
- **GlobalSettingsView**: Runtime-toggleable settings (13 config options, instant save)
- **ProtectionMenuView**: Protection toggle switches without YAML editing
- **StatsMenuView**: Statistics category menu with leaderboard shortcuts
- **LeaderboardView**: Top 10 players by category with player heads
- **PlayerStatsView**: Individual player stats with K/D ratio and averages
- **LootTableListView**: Direct loot table browser
- **HelpMenuView**: Command reference, permissions, and plugin info
- **Runtime Config Editing**: Toggle 13 config options directly in the GUI
- Reset settings: clear-ground-items, remove-spawner-mobs, reset-trial-spawners, reset-vault-cooldowns
- Feature settings: spawner-waves, boss-bar, spectator-mode, statistics tracking
- Loot settings: apply-luck-effect, per-player-loot
- Protection settings: All 6 protection toggles
- Changes save immediately to config.yml
- **Pagination Support**: Handle unlimited chambers with 36 items per page
- **Session Restoration**: Return to previous screens with proper state preservation
### Fixed
- **MySQL Database Compatibility**: Fixed SQL syntax errors when using MySQL database
- `StatisticsManager.batchAddTimeSpent()` now uses `ON DUPLICATE KEY UPDATE` for MySQL (was SQLite-only `ON CONFLICT`)
- `StatisticsManager.saveStats()` now uses `ON DUPLICATE KEY UPDATE` for MySQL (was SQLite-only `INSERT OR REPLACE`)
- Exposed `DatabaseManager.databaseType` property for runtime database type detection
- **Folia Compatibility in ChamberDetailView**: Fixed player ejection not using Folia-safe scheduling
- `exitPlayers()` now uses `scheduler.runAtEntity()` for each player (required for Folia where players may be in different regions)
- Added `player.isOnline` check before teleporting to prevent errors with disconnected players
- **Coroutine Scope Leak in Commands**: Fixed orphaned coroutine scope causing resource leaks
- Removed standalone `commandScope` from `TCPCommand.kt` and `TCPCommandExtensions.kt`
- Commands now use `plugin.launchAsync {}` which is properly cancelled on plugin disable
- Ensures all async command operations are tied to plugin lifecycle
- **SpawnerWaveManager Async Thread Safety**: Fixed boss bar cleanup running on wrong thread
- Changed `runTaskLaterAsync` to `runTaskLater` for boss bar removal
- `removeBossBar()` calls `server.getPlayer()` which requires main thread access
- **GlobalSettingsView Code Cleanup**: Removed unused parameters from extension function
- Removed redundant `pane` and `player` parameters from `StaticPane.addItem()` extension
- Cleaned up all 10 call sites
### Changed
- **MenuService**: Rewritten with 16 screen enums and unified navigation methods
- **Legacy Compatibility**: Old GUI methods deprecated but still functional
- **/tcp menu**: Now opens MainMenuView instead of ChambersOverviewView
### Technical Details
- New helper methods in ChamberManager: `updateResetInterval()`, `updateExitLocation()`
- New helper method in VaultManager: `getVaultLockCount()`
- GUI system uses consistent back/close navigation pattern
- All views use StaticPane and OutlinePane for layout
- `DatabaseManager.databaseType` now publicly accessible for database-specific SQL queries
[1.2.8]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.7...v1.2.8
release
TrialChamberPro 1.2.7
1.2.74 дек. 2025 г.24Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.7] - 2025-12-04
### Added
- **Per-Chamber Loot Tables**: Override global loot tables on a per-chamber basis
- Set chamber-specific loot tables for normal and/or ominous vaults
- Priority hierarchy: Chamber override > Vault's stored table > Global default
- Fully backwards compatible - existing chambers use defaults automatically
### New Commands
- `/tcp loot set <chamber> <normal|ominous> <table>` - Set loot table override for a chamber
- `/tcp loot clear <chamber> [normal|ominous|all]` - Clear loot table override(s)
- `/tcp loot info <chamber>` - Show current loot table settings for a chamber
- `/tcp loot list` - List all available loot tables from loot.yml
### Technical Details
- New database columns: `normal_loot_table` and `ominous_loot_table` in `chambers` table
- Automatic database migration on startup (safe to run multiple times)
- New permission: `tcp.admin.loot` for loot table management
- Full tab completion support for all loot subcommands
- Chamber model extended with `getLootTable(VaultType)` helper method
- ChamberManager provides `getEffectiveLootTable()` for priority resolution
[1.2.7]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.6...v1.2.7
release
TrialChamberPro 1.2.6
1.2.64 дек. 2025 г.21Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.6] - 2025-12-04
### Fixed
- **CRITICAL: Trial Spawners Not Dropping Keys**: Fixed trial spawners not dropping trial keys after chamber resets
- Root cause: `NBTUtil.kt` had empty implementations for trial spawner capture/restore
- Trial spawners store `registered_players` (UUIDs of players who've used them)
- Without clearing this data, spawners "remembered" they were already completed
- Now properly clears tracked players using Paper API's `TrialSpawner.stopTrackingPlayer()`
- Spawners will now drop keys (50% chance per player) after mobs are defeated per vanilla behavior
- **NBTUtil Trial Spawner Capture**: Now captures ominous state, cooldown length, and required player range
- **NBTUtil Trial Spawner Restore**: Now clears all tracked players/entities and restores proper state
- **ResetManager Trial Spawner Reset**: Implemented the TODO for resetting trial spawners during chamber reset
- Scans chamber for all TRIAL_SPAWNER blocks
- Clears tracked players (the key fix for key drops)
- Clears tracked entities (spawned mobs)
- Optionally resets ominous spawners back to normal
### Added
- New config option `reset.reset-trial-spawners: true` to control trial spawner state reset
- When enabled (default), trial spawners clear their tracked players on chamber reset
- This allows spawners to be reactivated and drop keys again
- Documented with explanation of vanilla 50% key drop chance
### Changed
- Config option `reset.reset-ominous-spawners` now properly implemented (was a TODO)
- Trial spawner reset is now a separate step in chamber reset sequence (Step 4)
### Technical Details
- Uses Paper API 1.21+ `TrialSpawner` interface methods:
- `getTrackedPlayers()` / `stopTrackingPlayer()` - Player tracking
- `getTrackedEntities()` / `stopTrackingEntity()` - Entity tracking
- `isOminous()` / `setOminous()` - Ominous state management
- Folia compatible: Uses location-based scheduling for spawner operations
- 10-second timeout for spawner reset to handle larger chambers
[1.2.6]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.5...v1.2.6
release
TrialChamberPro 1.2.5
1.2.51 дек. 2025 г.113Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.5] - 2025-11-30
### Added
- **PlaceholderAPI Integration**: Full support for PlaceholderAPI placeholders
- Player statistics: `%tcp_vaults_opened%`, `%tcp_vaults_normal%`, `%tcp_vaults_ominous%`
- Progress tracking: `%tcp_chambers_completed%`, `%tcp_mobs_killed%`, `%tcp_deaths%`
- Time tracking: `%tcp_time_spent%` (formatted), `%tcp_time_spent_raw%` (seconds)
- Current state: `%tcp_current_chamber%`, `%tcp_in_chamber%`
- Leaderboard positions: `%tcp_leaderboard_vaults%`, `%tcp_leaderboard_chambers%`, `%tcp_leaderboard_time%`
- Top players: `%tcp_top_vaults_1_name%` through `%tcp_top_vaults_10_name%` (and `_value`)
- Same pattern for `%tcp_top_chambers_X_name%` and `%tcp_top_time_X_name%`
- Built-in 60-second cache for leaderboard data to reduce database load
- **Trial Spawner Wave System**: Real-time wave progress tracking with boss bar display
- Boss bar shows wave progress (mobs killed / total mobs)
- Ominous spawners display purple boss bar, normal shows yellow
- Automatic mob tracking from trial spawner spawn events
- Wave completion message with kill count and duration
- Configurable options: `spawner-waves.enabled`, `spawner-waves.show-boss-bar`
- Detection radius for adding nearby players to boss bar display
- Integration with existing statistics system
- **Spectator Mode**: Players can spectate chambers after death
- Offer spectator mode to players who die in a chamber
- Chat-based confirmation: type "spectate" to watch, "no" to decline
- Spectators put in GameMode.SPECTATOR and teleported to chamber center
- Boundary restriction keeps spectators within chamber bounds (configurable buffer)
- Exit by typing "exit" in chat or when chamber resets
- Automatic cleanup on player disconnect or chamber reset
- New permission: `tcp.spectate` (default: true)
- Configurable timeout, boundary buffer, and solo spectate option
### Changed
- Plugin now initializes through 12 phases (added Spawner Wave System and Spectator Mode phases)
- Startup logging shows status of new features (PlaceholderAPI, Boss Bar, Death Spectate)
[1.2.5]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.4...v1.2.5
release
TrialChamberPro 1.2.4
1.2.430 нояб. 2025 г.24Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.4] - 2025-11-30
### Fixed
- **Tipped Arrow Duration Bug**: Fixed tipped arrows showing "00:00" duration when looted from vaults
- Root cause: Minimum duration check only triggered when calculated duration was exactly 0
- If Paper API returned small duration values (1-99 ticks), integer division produced tiny but non-zero values that bypassed the minimum check
- Now uses `maxOf(calculatedDuration, minDuration)` to always enforce minimum durations
- Also fixed: `effect-duration: 0` in config now correctly falls back to calculated duration instead of using 0
### Added
- **Full Folia Support**: Complete rewrite of scheduler system for Folia compatibility
- New `SchedulerAdapter` abstraction layer with Paper and Folia implementations
- Automatic Folia detection at startup with appropriate scheduler selection
- Location-based scheduling (`runAtLocation`) for block operations (snapshots, restoration, scanning)
- Entity-based scheduling (`runAtEntity`) for player operations (teleportation, inventory, messages)
- Global region scheduling for non-location-specific tasks
- Added `folia-supported: true` to plugin.yml
### Changed
- **17 files updated** to use the new scheduler abstraction:
- Core: `TrialChamberPro.kt`, `CoroutineExtensions.kt`
- Managers: `ResetManager.kt`, `ChamberManager.kt`, `SnapshotManager.kt`, `LootManager.kt`, `PasteConfirmationManager.kt`
- Listeners: `VaultInteractListener.kt`, `PlayerMovementListener.kt`, `UndoListener.kt`
- GUI: `MenuService.kt`, `LootTypeSelectView.kt`, `LootEditorView.kt`
- Utils: `BlockRestorer.kt`, `ParticleVisualizer.kt`, `UpdateChecker.kt`
- Player teleportation during chamber resets now uses entity-specific scheduling for thread safety
- Block restoration batches now schedule to the correct region thread per chunk
- Chamber scanning uses location-based scheduling for proper Bukkit API access
### Technical Details
- `SchedulerAdapter` interface provides unified API for both platforms:
- `runTask()` / `runTaskAsync()` - Global/async tasks
- `runTaskLater()` / `runTaskLaterAsync()` - Delayed tasks (now return `ScheduledTask` for cancellation)
- `runTaskTimer()` / `runTaskTimerAsync()` - Repeating tasks
- `runAtLocation()` / `runAtLocationLater()` - Region-specific tasks (critical for Folia)
- `runAtEntity()` / `runAtEntityLater()` - Entity-specific tasks (critical for Folia)
- On Paper: All location/entity methods delegate to main thread
- On Folia: Uses `RegionScheduler`, `EntityScheduler`, `GlobalRegionScheduler`, and `AsyncScheduler`
[1.2.4]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.3...v1.2.4
release
TrialChamberPro 1.2.3
1.2.324 нояб. 2025 г.47Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.3] - 2025-11-24
### Added
- **Configurable Potion Effect Durations**: New `effect-duration` field for complete control over potion/tipped arrow effect duration
- Optional field in loot.yml (measured in ticks, where 20 ticks = 1 second)
- When not specified, automatically calculates duration using **vanilla Minecraft behavior**
- **Tipped arrows now use 1/8 of potion duration** (matching vanilla mechanics)
- Smart multipliers: POTION (1.0×), SPLASH_POTION (0.75×), LINGERING_POTION (0.25×), TIPPED_ARROW (0.125×)
- Examples: Speed I arrow (22.5s), Slowness I arrow (11.25s), Poison I arrow (5.625s)
- Works with both `potion-type` (auto-calculated) and `custom-effect-type` (hardcoded fallbacks)
- Fully documented in loot.yml and loot.yml.md with calculation tables and examples
### Technical Improvements
- Duration calculation now reads base duration from PotionType at runtime
- Automatic scaling ensures consistency with vanilla Minecraft across all potion types
- Custom effect types (BAD_OMEN, etc.) use sensible fallback durations
[1.2.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.2...v1.2.3
release
TrialChamberPro 1.2.2
1.2.223 нояб. 2025 г.31Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.2] - 2025-11-23
### Fixed
- **CRITICAL:** Fixed ominous bottles creating "uncraftable potion" items instead of actual OMINOUS_BOTTLE items
- When `ominous-potion: true` was set in loot.yml, the plugin was creating a POTION item with custom effects
- Now correctly creates Material.OMINOUS_BOTTLE (the 1.21 item type with proper texture and properties)
- Ominous bottles now display correctly in inventory and match vanilla behavior
- Custom effects (Bad Omen levels, names, lore) still apply correctly via PotionMeta
[1.2.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.1...v1.2.2
release
TrialChamberPro 1.2.1
1.2.122 нояб. 2025 г.13Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.1] - 2025-11-22
### Added
- **Ominous Bottles (1.21+ Bad Omen Potions)**: Custom effect type support for special potions
- New `custom-effect-type` field for potion effects not available as PotionType
- Full support for BAD_OMEN effect (triggers Ominous Trials)
- Create ominous bottles with levels III-V (matching vanilla behavior)
- Duration automatically set to 100 minutes for Bad Omen (matching vanilla)
- Support for other custom effects: HERO_OF_THE_VILLAGE, LUCK, UNLUCK, GLOWING
- Works with POTION, SPLASH_POTION, LINGERING_POTION, and TIPPED_ARROW
- Comprehensive documentation in loot.yml and loot.yml.md
- Examples for all ominous bottle levels with proper naming and lore
### Fixed
- **CRITICAL:** Fixed duplicate potion effects on tipped arrows and potions with custom levels
- When using `potion-level`, the code was applying BOTH the base potion effect AND a custom effect
- Now only applies the custom effect when `potion-level` is specified
- Example: `potion-type: SLOWNESS, potion-level: 4` now correctly creates Slowness V (not Slowness I + Slowness V)
- Default potion behavior (without custom level) unchanged
- **Eliminated all deprecation warnings** for Minecraft 1.21.1+ compatibility
- Migrated from deprecated `AsyncPlayerChatEvent` to modern `AsyncChatEvent` (Paper 1.19+)
- Now uses Adventure component API with PlainTextComponentSerializer
- Maintains backward compatibility with confirmation system
- Added `@OptIn(ExperimentalCoroutinesApi::class)` for suspendCancellableCoroutine usage
- Replaced deprecated `Sound.valueOf()` with registry access API
- Uses `Registry.SOUNDS.get()` with NamespacedKey conversion
- Automatic conversion from enum-style names (BLOCK_VAULT_OPEN_SHUTTER) to namespaced keys
- Replaced deprecated `PotionEffectType.getByName()` with `Registry.POTION_EFFECT_TYPE.get()`
- Replaced deprecated `PotionType.effectType` property with `potionEffects.firstOrNull()?.type`
- Fixed WorldEdit BlockVector3 coordinate deprecations
- Changed from deprecated `getX()/getY()/getZ()` to modern `x()/y()/z()` methods
- Compatible with WorldEdit 7.3+ and FastAsyncWorldEdit
- Zero deprecation warnings when building with Kotlin 2.3.0 and Paper API 1.21.1
### Technical Improvements
- All code now uses modern Paper/Bukkit registry access APIs
- Better compatibility with future Minecraft versions
- Cleaner build output with no deprecation noise
- Future-proof API usage following Paper best practices
[1.2.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.2.0...v1.2.1
release
TrialChamberPro 1.2.0
1.2.021 нояб. 2025 г.21Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.2.0] - 2025-11-22
### Added
- **COMMAND Rewards System**: Run console commands when players open vaults
- Economy rewards (requires Vault plugin): `eco give {player} 1000`
- Permission grants (LuckPerms): `lp user {player} parent add vip`
- Experience rewards: `xp add {player} 1000`
- Item rewards: `give {player} diamond 64`
- Title/action bar messages and any console command
- Weight-based probability system (e.g., 25% chance for 1000 coins)
- Multiple commands per reward execute in sequence
- Player placeholders: `{player}` (name), `{uuid}` (UUID)
- Visual feedback with customizable display names
- Commands run with CONSOLE permissions (OP)
- **Comprehensive COMMAND rewards documentation** in loot.yml
- 100+ lines of examples and use cases
- Basic single-pool format examples
- Advanced multi-pool format examples (separate items and bonuses)
- Common command examples for economy, permissions, items, XP
- Jackpot/rare reward examples with multiple commands
- Full placeholder reference
### Fixed
- Added detailed error message when using incorrect `type: COMMAND` format
- Shows clear comparison of WRONG vs CORRECT format
- Directs users to proper `command-rewards` list format
- Prevents common configuration mistakes
### Documentation
- Added COMMAND rewards section to loot.yml with comprehensive examples
- Documented weight-based probability system for command rewards
- Added examples for economy (Vault), permissions (LuckPerms), and vanilla commands
- Included multi-command reward examples (jackpots, VIP upgrades)
[1.2.0]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.9...v1.2.0
release
TrialChamberPro 1.1.9
1.1.921 нояб. 2025 г.12Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.9] - 2025-11-22
### Added
- **Advanced Loot Features**: Vanilla-style loot customization with full 1.21+ support
- **Tipped Arrows**: Add any potion effect to arrows (POISON, SLOWNESS, etc.) with custom levels
- Example: `type: TIPPED_ARROW`, `potion-type: POISON`, `potion-level: 1` for Poison II arrows
- **Potions with Custom Levels**: Create potions beyond vanilla limits
- Works with POTION, SPLASH_POTION, and LINGERING_POTION types
- Set `potion-type` and `potion-level` (0 = Level I, 1 = Level II, etc.)
- Supports level IV+ for ominous potions (1.21+ exclusive feature)
- **Ominous Potions**: Rare 1.21+ bottles with extreme effect levels
- Set `ominous-potion: true` for special ominous bottle appearance
- Perfect for rare ominous vault rewards
- **Enchantment Randomization**: Dynamic enchantment levels like vanilla
- `enchantment-ranges`: Apply enchantments with random levels (e.g., `SHARPNESS:1:5` for I-V)
- `random-enchantment-pool`: Pick ONE random enchantment from a list
- Combine fixed enchantments, ranges, and random pools on the same item
- **Variable Durability**: Drop pre-damaged items with random wear
- Set `durability-min` and `durability-max` for random damage values
- Great for "used" weapons and tools as loot
- **Debug Mode Startup Banner**: Visual confirmation when debug mode is enabled
- Displays prominent warning banner in console on server startup
- Helps verify `debug.verbose-logging: true` is loaded correctly
- Shows: "DEBUG MODE ENABLED - Verbose logging is active"
### Fixed
- **CRITICAL:** Fixed race condition causing duplicate vault entries
- Multiple async saveVault() calls could insert duplicates for the same location
- Changed to atomic UPSERT operation with `INSERT ... ON CONFLICT DO UPDATE`
- Prevents duplicate vault entries during concurrent scanning operations
- **CRITICAL:** Fixed separate cooldowns for normal vs ominous vaults
- Changed UNIQUE constraint from `(chamber_id, x, y, z)` to `(chamber_id, x, y, z, type)`
- Now stores BOTH normal and ominous vault entries at each location for independent cooldown tracking
- Players can have separate 24h/48h cooldowns for normal and ominous modes at the same vault
- `VaultManager.getVault()` now requires vault type parameter to fetch correct entry
- When scanning, creates both NORMAL and OMINOUS entries regardless of current block state
- **CRITICAL:** Enabled SQLite foreign key constraints
- Added `?foreign_keys=on` to SQLite JDBC URL
- Fixes CASCADE deletion not working when chambers are deleted
- Orphaned vault/spawner/player data is now automatically cleaned up
- No more stale vault entries from deleted chambers
- **CRITICAL:** Fixed ominous vaults giving normal loot after rescanning
- Root cause: `ChamberManager.saveVault()` was skipping existing vaults instead of updating them
- Changed logic to UPDATE existing vaults with correct type and loot_table when rescanning
- Old vaults in database retained stale `lootTable="default"` even for ominous vaults
- Now properly updates vault type and loot table on every scan
- **Action Required**: Delete database and rescan all chambers with `/tcp scan <name>`
- Fixed vault counts showing 0 in `/tcp menu` after reload
- Root cause: `VaultManager.countsCache` was not being cleared on reload
- Added `VaultManager.clearCache()` method to clear vault counts cache
- `/tcp reload` now clears both chamber cache and vault counts cache
- Vault counts are now correctly refreshed after reload
- Added comprehensive debug logging for loot generation
- Shows requested loot table name and available tables
- Displays whether table lookup succeeded
- Logs number of items generated per vault opening
- Helps diagnose loot table configuration issues
### Changed
- **Database Schema**: Updated vaults table UNIQUE constraint to include vault type
- Changed from `UNIQUE (chamber_id, x, y, z)` to `UNIQUE (chamber_id, x, y, z, type)`
- Allows both NORMAL and OMINOUS vaults to coexist at same location
- **Breaking Change**: Requires deleting existing database
- **Vault Scanning**: Now creates two database entries per vault location
- One entry for NORMAL type with default loot table
- One entry for OMINOUS type with ominous-default loot table
- Enables independent cooldown tracking for each vault type
- **Vault Lookup**: `VaultManager.getVault()` signature changed
- Added required `type: VaultType` parameter
- Looks up vault by location AND type for accurate cooldown checking
- Enhanced `LootItem` model with 7 new optional fields for advanced features
- Enhanced `LootManager.parseLootItem()` to parse all new YAML fields
- Enhanced `LootManager.createItemStack()` to apply potions, enchantments, and durability
- Potion durations automatically adjusted based on type:
- POTION: 3 minutes (3600 ticks)
- SPLASH_POTION: 2:15 (2700 ticks)
- LINGERING_POTION: 45 seconds (900 ticks)
- TIPPED_ARROW: 20 seconds (400 ticks)
### Migration Notes
**IMPORTANT: This version requires deleting your existing database!**
1. Stop your server
2. Delete `plugins/TrialChamberPro/database.db`
3. Update to v1.1.9
4. Start your server (new database with updated schema will be created)
5. Re-register all chambers with `/tcp register` or `/tcp generate`
6. Scan all chambers with `/tcp scan <chamber-name>`
7. Create snapshots with `/tcp snapshot create <chamber-name>`
**Why**: Database schema changed to support separate NORMAL/OMINOUS vault tracking and enable foreign key constraints. Player cooldown data will be lost, but this ensures proper vault behavior going forward.
### Documentation
- Added 170+ lines of examples to `loot.yml` covering all new advanced features
- Added comprehensive documentation for potion types, enchantment syntax, and combinations
- Updated with vanilla-style loot table examples (tipped arrows, ominous potions, etc.)
[1.1.9]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.8...v1.1.9
release
TrialChamberPro 1.1.8
1.1.821 нояб. 2025 г.27Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.8] - 2025-11-21
### Fixed
- **CRITICAL:** Fixed ominous vault detection using blockstate string parsing instead of `isOminous` property
- Changed from `blockData.isOminous` to checking `blockData.asString` for `ominous=true`
- Ominous vaults now correctly identified during scanning and interaction
- Ominous vault loot tables now properly applied instead of using normal vault loot
- Menu now correctly displays ominous vault counts
- Updated both `ChamberManager.saveVault()` and `VaultInteractListener` to use string-based detection
- Fixed chambers disappearing from `/tcp menu` after `/tcp reload`
- `ChamberManager.clearCache()` now automatically reloads all chambers from database asynchronously
- Chambers are immediately available after reload without needing to run `/tcp info`
### Changed
- Debug logging now shows full blockstate string for vault detection: `blockData='minecraft:vault[ominous=true,...]'`
### Migration Notes
- **Action Required:** Rescan existing chambers with `/tcp scan <name>` to update vault types in database
- Existing vaults may be stored with incorrect types (all as NORMAL)
- Rescanning will correctly identify ominous vs normal vaults using the new detection method
[1.1.8]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.7...v1.1.8
release
TrialChamberPro 1.1.7
1.1.720 нояб. 2025 г.19Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.7] - 2025-11-21
### Added
- **Multi-Pool Loot System**: Vanilla-style loot pools (common/rare/unique) with independent roll ranges
- Support for up to 5 pools per loot table (configurable via `loot.max-pools-per-table`)
- Backwards compatible with legacy single-pool format
- Each pool has its own min/max rolls, weighted items, and guaranteed items
- Loot tables automatically convert from legacy format when needed
- **GUI Pool Support**: Complete GUI workflow for managing multi-pool loot tables
- New `PoolSelectorView` displays all pools in a multi-pool table with visual icons
- Pool icons: Iron Ingot (common), Diamond (rare), Nether Star (unique), Chest (other)
- `LootTypeSelectView` automatically detects multi-pool vs legacy tables and routes accordingly
- `LootEditorView` now supports editing specific pools within multi-pool tables
- Navigation flow: Overview → Loot Type → Pool Selector (if multi-pool) → Editor → Amount Editor
- Per-pool draft preservation with session-based tracking
- **LUCK Effect Support**: Optional bonus loot rolls based on player LUCK
- Configurable via `loot.apply-luck-effect: false` (default: disabled)
- Checks both potion effects (temporary) and item attributes (permanent)
- Each LUCK level adds +1 bonus roll to each pool
- Works with potions, beacons, suspicious stew, and custom items with LUCK modifiers
- Debug logging available with `debug.verbose-logging: true`
- Increased max chamber volume from 500,000 to 750,000 blocks (`generation.max-volume`)
### Fixed
- **CRITICAL:** Fixed ominous vault detection - now properly checks block state (`vault[ominous=true]`)
- Ominous vaults can now be opened with ominous trial keys
- Vault scanning correctly identifies ominous vs normal vaults via `BlockData.isOminous`
- Updated both `VaultInteractListener` and `ChamberManager` to use block state checking
### Changed
- `LootManager` now supports both legacy single-pool and new multi-pool loot table formats
- `MenuService.Session` now tracks `poolName` for pool-specific navigation
- Draft key generation includes pool name to isolate edits per pool
- `AmountEditorView` now accepts `poolName` parameter for proper back navigation
### Internal
- Added `LootPool` data class with min/max rolls and item lists
- Updated `LootTable.isLegacyFormat()` to detect format automatically
- Added `LootTable.getEffectivePools()` to convert legacy tables to pool format on-the-fly
- MenuService now has 6 GUI views: Overview, LootTypeSelect, PoolSelector, LootEditor, AmountEditor
- GUI navigation state machine expanded with `POOL_SELECT` screen
- CLAUDE.md updated with multi-pool architecture and GUI navigation flow
### Documentation
- Updated `loot.yml` with extensive multi-pool examples and migration guide
- Updated `config.yml.md` with LUCK effect documentation and balance warnings
[1.1.7]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.6...v1.1.7
release
TrialChamberPro 1.1.6
1.1.620 нояб. 2025 г.19Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.6] - 2025-11-20
### Added
- Added "Locked: X Normal, X Ominous" display to `/tcp menu` chamber tooltips showing per-player locked vault counts
- Added `vault-locked` message for permanent vault locks (distinct from time-based cooldowns)
- Added in-memory lock to prevent vault spam-clicking race condition (5-second window per player-vault)
- Added `getLockedVaultCounts()` function to query locked vaults per player per chamber
### Fixed
- **CRITICAL:** Fixed `Dispatchers.Main` error when opening vaults - now uses Bukkit scheduler instead of non-existent Android Main dispatcher
- **CRITICAL:** Fixed vault statistics never being recorded - `incrementVaultsOpened()` now called when opening vaults
- **CRITICAL:** Fixed database connection pool exhaustion causing 60s timeouts:
- Increased SQLite connection pool from 1 to 5 (WAL mode supports concurrent readers)
- Reduced connection timeout from 60s to 30s (fail faster)
- Added SQLite `busy_timeout=5000` for better lock handling
- Added leak detection threshold (10s) to identify connection leaks
- Staggered vault count refreshes in menu to prevent connection stampede
- Fixed UPSERT race condition in `recordOpen()` - now uses atomic SQL `INSERT ... ON CONFLICT DO UPDATE`
- Fixed vault spam-clicking allowing multiple opens before database write completed
- Removed all references to deprecated `/tcp add` command from help, docs, and tab completion
### Changed
- **BREAKING:** Changed default vault cooldown from 24/48 hours to -1 (permanent lock, vanilla behavior)
- Set `normal-cooldown-hours: -1` (permanent until chamber reset)
- Set `ominous-cooldown-hours: -1` (permanent until chamber reset)
- Set `reset-vault-cooldowns: true` by default (required for vanilla behavior)
- Cooldown can still be customized to time-based (e.g., 24 = 24 hours)
- Updated `canOpenVault()` to interpret negative cooldown as permanent lock
- Vault opening now shows different messages for permanent lock vs time-based cooldown
- Replaced `/tcp add` with `/tcp generate wand` in all documentation and examples
### Internal
- Database schema changes: None (backwards compatible)
- Config changes: Default cooldown values changed from 24/48 to -1
- Permission `tcp.bypass.cooldown` now properly documented as separate from `tcp.admin.*`
### Migration Notes
- Existing vaults opened with old cooldowns will now be permanently locked
- Run `/tcp reset <chamber>` to unlock all vaults in a chamber
- Admins: explicitly deny `tcp.bypass.cooldown` permission if you want to test locking behavior
[1.1.6]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.5...v1.1.6
release
TrialChamberPro 1.1.5
1.1.531 окт. 2025 г.86Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.5] - 2025-10-31
### Added
- Checking for Update from GitHub Releases with a short message, describing what has changed from the previous version.
- Particle Visualizer for the `/tcp paste <name>` command.
### Fixed
- Pasting a schematic with `/tcp paste <name>` now works as expected.`
- Correctly allowing WorldEdit `//undo` and `//redo` commands for pasted schematics.
### Changed
- The `/tcp paste <name>` command now visually represents the boundaries with particles before pasting. The user needs to confirm or cancel the paste in chat.
[1.1.5]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.4...v1.1.5
release
TrialChamberPro 1.1.4
1.1.428 окт. 2025 г.18Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.4] - 2025-10-28
### Added
- FastAsyncWorldEdit (and WorldEdit) soft-depend, [as requested](https://github.com/darkstarworks/TrialChamberPro/issues/2#issue-3554549276), along with FAWE/WE Detection.
- New Schematic Manager can be called with /tcp paste to paste one of the included Trial Chambers or /tcp schematics to view a list of available schematics.
- Without WorldEdit/FAWE, schematic features will be disabled gracefully.
### Fixed
- Newly generated Trial Chambers appear immediately in `/tcp menu` without requiring a server restart. The Overview now sorts chambers by creation time (newest first), ensuring fresh entries are shown on the first page.
- Cache refresh after updates: setting a chamber's exit location or snapshot file now refreshes the in-memory cache entry so the GUI reflects changes without delays.
- Other minor bugfixes and code cleanup.
### Internal
- `ChamberManager.getCachedChambers()` now returns chambers sorted by `createdAt` descending.
- Minor cache handling refinements when updating chamber fields.
[1.1.4]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.3...v1.1.4
release
TrialChamberPro 1.1.3
1.1.327 окт. 2025 г.31Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.3] - 2025-10-28
### Fixed
- Loot Editor controls render fully on first open (Save bottom-left, Discard bottom-right, Rolls, etc.) — no initial click needed.
- Right-click on an item opens the Amount editor on the first click; no more double-click behavior.
- UI now refreshes instantly after edits (toggle enabled, adjust weight, add from hand, tweak rolls), and the Save button lore reflects unsaved changes immediately.
### Changed
- Replaced the Back arrow with an explicit red Discard button at the bottom-right.
- Edits are applied to a cloned draft; pressing Discard returns without saving and the on-close handler will not persist the clone.
### Internal
- Reordered GUI build so panes are added before being populated and `gui.update()` is called at the end of the initial build to ensure a complete first render.
- Guard save-on-close with `discardRequested` to avoid persisting discarded edits.
- Rebuild controls after actions like Add-from-hand and Rolls adjustments to keep the UI state accurate.
[1.1.3]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.1.2...v1.1.3
release
TrialChamberPro 1.1.2
1.1.227 окт. 2025 г.22Minecraft: 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.1.2] - 2025-10-28
### Changed
- Replaced GlobalScope with a structured plugin coroutine scope for chamber resets in GUI. Resets now run on the plugin-managed scope and marshal results back to the main thread for messaging.
- Chambers Overview now uses a lightweight TTL cache for vault counts to avoid blocking the server thread. No more runBlocking; counts refresh asynchronously and are warmed when opening the overview.
### Fixed
- Made a typo, causing the GUI to be updated at the wrong moment, which caused individual items not being able to be managed when editing a loot table
### Notes
- The cache defaults to a 30s TTL and returns last-known values (or 0/0 initially) while refreshing in the background.
## [1.1.1] - 2025-10-27
### Added
- Chambers Overview: now shows vault counts (Normal/Ominous), players inside, time until next reset, and time since last reset with friendly formatting (weeks/months) that omits zero components.
### Fixed
- GUI wiring: aligned `LootTypeSelectView` with current APIs (reset now invoked via coroutine; exit location lookup via `Chamber.getExitLocation()`; world spawn fallback). Resolved drag/drop cancellation and improved tooltips.
- Chambers Overview time display: corrected units (ms) and added smarter humanization.
### Changed
- Minor UI text adjustments ("Click to Manage").
## [1.1.0] - 2025-10-27
### Added
- Admin GUI using InventoryFramework, open with `/tcp menu` (permission `tcp.admin.menu`).
- Chambers overview screen: shows each chamber as a block with details like world, bounds, players inside, and time until reset. Click to manage loot tables.
- Loot type selection: choose to edit Normal or Ominous loot tables.
- Loot editor: drag & drop and click variations to adjust items.
- Left click: +1 amount
- Right click: -1 amount
- Shift + Left click: +1 weight (weighted items only)
- Shift + Right click: -1 weight (weighted items only)
- Middle click: toggle enabled/disabled
- Green Save button (bottom-left) persists changes to loot.yml and updates chamber vaults to use the edited table names.
- Red Cancel button (bottom-right) returns without saving.
- Session persistence: if the GUI is closed, the last open window and unsaved draft are remembered per admin until `/tcp menu` is opened again.
- Loot items now support an optional `enabled` flag in `loot.yml` and the generator respects it.
### Changed
- Bumped version to 1.1.0 and updated changelog.
### Fixed
- Prevent crash `UninitializedPropertyAccessException: lateinit property menuService has not been initialized` when running `/tcp menu` during startup by guarding all `/tcp` subcommands until the plugin finishes asynchronous initialization and by setting a readiness flag after registrations complete.
[1.1.2]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.0.9...v1.1.2
release
TrialChamberPro 1.0.9
1.0.926 окт. 2025 г.17Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
various bugfixes and cleanup
release
TrialChamberPro 1.0.1
1.0.124 окт. 2025 г.16Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
## [1.0.1] - 2025-10-24
### Fixed
- Resolved plugin startup failure `NoClassDefFoundError: kotlinx/coroutines/Dispatchers` by stopping relocation of Kotlin stdlib and kotlinx-coroutines during shading. They are still shaded but keep original package names so Bukkit can load them at bootstrap.
### Internal
- Kept relocations for SQLite and HikariCP to avoid classpath conflicts.
## [1.0.0] - 2025-10-24
### Added
- Initial release of TrialChamberPro with:
- Snapshot system for chambers
- Per-player vaults and loot tables
- Automatic reset scheduler with warnings
- Protection listeners and optional integrations (WorldGuard, WorldEdit, PlaceholderAPI)
- Statistics tracking and leaderboards
[1.0.1]: https://github.com/darkstarworks/TrialChamberPro/compare/v1.0.0...v1.0.1
---
please visit the wiki: https://darkstarworks.gitbook.io/darkstarworks-docs
release
TrialChamberPro 1.0.0
1.0.024 окт. 2025 г.31Minecraft: 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10folia, paper, purpur
Что нового
no updates yet