
TrialChamberPro
Because Trial Chambers deserve better than being a "one and done" dungeon.
1.4K
14
TrialChamberPro 1.2.23
release14 февраля 2026 г.1.2.23 - 2026-02-14
Fixed
- Vanilla Vaults Broken: Unregistered/vanilla vaults now work correctly when plugin is installed
- Root cause:
VaultInteractListenerintercepted 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
- Root cause:
- 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
- Fix: Use synchronous cache lookup (
- Async Block Data Access:
saveVault()accessedblock.blockData.asStringon IO thread (unsafe Bukkit API access)- Fix: Block data string is now read on the main thread and passed as a parameter
runBlockingin Async Thread:UndoListenerusedrunBlockinginsiderunTaskAsync, blocking Bukkit's async thread pool- Fix: Replaced with
plugin.launchAsync {}coroutine pattern
- Fix: Replaced with
- JDBC Resource Leaks:
StatisticsManagerhad 5 methods withPreparedStatement/ResultSetnot wrapped in.use{}- Fix: All JDBC resources now use
.use{}for automatic cleanup
- Fix: All JDBC resources now use
loadingLocksMemory Leak: Per-player mutex map inStatisticsManagergrew without bound- Fix: Entries now cleaned up alongside cache invalidation
Improved
- Messages Performance:
getMessage()now caches the parsedmessages.ymlinstead of re-reading and re-parsing the file on every call; cache invalidated on/tcp reload - Shutdown Reliability:
PlayerMovementListener,PlayerDeathListener, andPasteConfirmListenercoroutine 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/TCPTabCompletercreation during async initialization (already registered at startup)
TrialChamberPro 1.2.22
release10 января 2026 г.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
isLeftClickandisRightClickparameters 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 acceptsleft: Boolean, right: Booleanparameters- Uses
whenexpression to differentiate click types - Existing messages
gui-teleport-to-center,gui-teleport-to-exit, andgui-no-exit-locationused
TrialChamberPro 1.2.21
release9 января 2026 г.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
PlayerInteractEventto handle loot ourselves, but this prevented vanilla from tracking the player in the vault'srewarded_playersNBT - Our database tracking was supposed to handle cooldowns, but wasn't being respected properly
- Fix: Now uses Paper's native
VaultTileState API for cooldown tracking:hasRewardedPlayer(UUID)to check if player already opened the vaultaddRewardedPlayer(UUID)to mark player as rewarded after giving lootupdate()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
- Root cause: We were cancelling the
Improved
- SpawnerWaveListener: Removed reflection-based ominous detection, now uses Paper's native
TrialSpawner.isOminousproperty directly - VaultInteractListener: Simplified trial key detection using direct
Material.OMINOUS_TRIAL_KEYenum instead of string comparison- Note: Vault ominous detection still uses block data string parsing as Paper's Vault TileState doesn't have
isOminousproperty (unlike TrialSpawner)
- Note: Vault ominous detection still uses block data string parsing as Paper's Vault TileState doesn't have
- 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)andVault.update()to clear native state - Fully Folia-compatible using
scheduler.runAtLocation()for block operations
Technical Details
VaultInteractListenernow importsorg.bukkit.block.VaultTileState- Cooldown check:
block.state as? VaultthenvaultState.hasRewardedPlayer(player.uniqueId) - After loot:
vaultState.addRewardedPlayer(player.uniqueId)thenvaultState.update()(CRITICAL: must call update!) - Database
recordOpenis 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-errormessage to messages.yml for edge cases where vault state can't be updated - Key detection:
Material.TRIAL_KEYandMaterial.OMINOUS_TRIAL_KEYdirect enum comparison - Spawner ominous check:
state.isOminousproperty (no reflection needed)
TrialChamberPro 1.2.20
release9 января 2026 г.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
- Root cause: The
Technical Details
- Updated
com.github.stefvanschie.inventoryframework:IFdependency from 0.11.5 to 0.11.6 VaultInteractListener: Removedfinally { 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
TrialChamberPro 1.2.19
release9 января 2026 г.1.2.19 - 2026-01-09
Added
- Plugin Info Command:
/tcp infonow 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.adminpermission /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:
setOnGlobalDragwas missing from all 17 GUI views - Players could drag items by holding click and moving, bypassing click handlers
- Now all views have both
setOnGlobalClickandsetOnGlobalDraghandlers
- Root cause:
- 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
Совместимость
Детали
Лицензия:CC-BY-NC-ND-4.0
Опубликован:5 месяцев назад
Обновлён:1 месяц назад