▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Плагины/TrialChamberPro
TrialChamberPro

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: 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)

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 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

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 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)

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

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

TrialChamberPro 1.2.19

release9 января 2026 г.

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

Совместимость

Minecraft: Java Edition

26.1.x1.21.x

Платформы

Поддерживаемые окружения

Сервер

Детали

Лицензия:CC-BY-NC-ND-4.0
Опубликован:5 месяцев назад
Обновлён:1 месяц назад
Главная