Per-cause statistics — Breakdown of all-time rejection counts by cause
Optional warning system — Log or warn when unsafe rejection rate exceeds a threshold
Periodic metrics export — Export rejection statistics to JSON
New /rtp unsafe-stats subcommand to view unsafe location statistics in-game
Configurable via plugins/EzRTP/unsafe-location-monitoring.yml
Improved Chunk Loading
Paper 1.21+ async API detection — Automatically use World.getChunkAtAsync() on qualifying servers, bypassing the legacy tick-based throttle queue entirely
Async/non-blocking chunks — When running on Paper/Folia 1.21+, chunk loads no longer compete for tick time
Backward compatible — Legacy throttle queue is still available for older servers or when explicitly configured
Smart auto-detection — Defaults to auto-detect mode, gracefully falls back to legacy queue if needed
Configurable via chunk-loading.use-paper-async-api in rtp.yml
Biome Filtering Enhancements
Master switch for biome system — New biomes.enabled setting disables the entire biome infrastructure (search, cache, rare biome tracking)
Master switch for include/exclude filters — New biome-filtering.enabled separate from the overall biome system
Automatic filter-aware performance budgets — When include/exclude biome filters are active but no explicit budget is configured, tighter limits are applied automatically (100ms wall-clock, 10 chunk-loads)
New performance-budget section — Cleaner configuration path for search budgets (biome-filtering.performance-budget)
Better timeout tracking — Biome filter timeouts are now monitored and reported in performance stats
Async-mode toggle — Serialize biome searches through a dedicated executor thread instead of the common fork-join pool when async-mode: false
Rare Biome Hotspot Persistence
MySQL-backed hotspot storage — Persist discovered rare-biome hotspots across restarts and share them between network nodes
HikariCP connection pool — Efficient, non-blocking database operations
Background loading — Hotspots are loaded asynchronously on startup
Configurable persistence backend — Switch between in-memory only (none) or MySQL (mysql)
Automatic table creation — Database schema is initialized automatically
Configuration Changes
New Configuration Files
plugins/EzRTP/performance.yml — Performance monitoring and warning settings
plugins/EzRTP/unsafe-location-monitoring.yml — Unsafe location rejection tracking and warnings
rtp.yml Changes
biomes.enabled (new) — Master switch for the entire biome system (default: true)
biome-filtering.enabled (new) — Separate toggle for include/exclude biome filters (default: true)
biome-filtering.performance-budget (new, preferred) — Search budget configuration moved here for clarity
search.* (legacy path still works) — Old budget location, now aliases to new path
chunk-loading.use-paper-async-api (new) — Auto-detect or explicitly enable/disable Paper async chunk loading (default: auto-detect)
chunk-loading.legacy-throttle (new) — Nested section for old throttle settings, replaces flat enabled/interval-ticks/max-chunks-per-tick
heatmap.enabled — Toggle heatmap feature per world (was implicit before)
safety.reject-liquid-above-nether (new, default: true) — Reject locations with lava above in the Nether
safety.reject-liquid-above-overworld (new, default: true) — Reject locations with water above in the Overworld
Network Configuration (network.yml)
Moved to plugins/EzRTP/network/ namespace for better organization
Dependency Updates
Bukkit/Paper actions — Updated from v4 to v6
Java compiler — Updated to 3.15.0
bstats — Updated from 3.0.2 to 3.2.1
WorldGuard — Updated from 7.0.9 to 7.0.16
PlaceholderAPI — Updated from 2.11.7 to 2.12.2
Adventure — Multiple library versions updated to 4.26.1
HikariCP 7.0.2 — New dependency for MySQL hotspot storage
JUnit & Mockito — Updated test dependencies
Bug Fixes & Improvements
GriefPrevention Compatibility
Fixed reflection fallback to handle multiple getClaimAt() method signatures across GriefPrevention versions