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!
- Stop your server
- Delete plugins/TrialChamberPro/database.db
- Update to v1.1.9
- Start your server (new database with updated schema will be created)
- Re-register all chambers with /tcp register or /tcp generate
- Scan all chambers with /tcp scan <chamber-name>
- 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.)