Migrated primary API from Paper to Spigot for broader compatibility.
The plugin remains fully compatible with Paper, Purpur and Folia
through runtime detection and conditional code paths.
Build system:
- Replaced ktor fatJar with Shadow plugin (with HikariCP relocation)
- Replaced local JARs (PlaceholderAPI, Dynmap) with Maven dependencies
- Centralized all dependency versions in libs.versions.toml
- Updated CI workflow to gradle/actions/setup-gradle@v4
- Cleaned up unused plugins (application, paperweight)
- Updated Shadow plugin to 8.3.5 for Java 22 support
Bug fixes (GitHub issues):
- #90: Fixed BlueMap/Dynmap/Pl3xMap claims disappearing after reload/restart
- #86: Fixed NPE on /claim setname (null claim check)
- #85: Fixed Pl3xMap setLiveUpdate NoSuchMethodError (wrapped in try/catch)
- #77: Fixed elytra/piston bypass of enter protection (cancel event + disable gliding)
- #75: Fixed Folia PlayerPostRespawnEvent crash (use player scheduler directly)
- #74: Fixed HikariCP classpath conflict with LibertyBans (shadow relocation)
- #73: Added configurable opacity for Pl3xMap/Dynmap/BlueMap claim layers
- #67: Fixed wrong error message for unknown commands (show help instead)
- #58: Fixed mob spawning not blocked for Ghast, MagmaCube, Hoglin, etc.
- #57: Fixed wrong error message for ProtectedArea invalid characters
- #55: Fixed fly persisting after teleportation out of claim
- #48: Fixed player head names missing for Bedrock players (profile name fix)
- #47: Fixed MySQL TEXT column DEFAULT error
- #79: Added %description% placeholder to enter/leave messages
Performance & thread safety:
- Replaced all HashMap fields with ConcurrentHashMap where shared across threads
- Replaced 5 blocking .join() calls in event handlers with sync method
- Replaced 40+ stream().forEach() with direct forEach()
- Replaced parallelStream() on small collections with forEach()
- Fixed race condition in clearDataForPlayer (atomic remove pattern)
- Fixed resource leaks (HTTP connections, PreparedStatements)
- Added null checks on critical paths (CPlayer, Claim, API)
- Cached defaultValues lookups in claim loading loops
- Replaced Bukkit.getOfflinePlayer(name) with cached UUID lookups
API:
- Expanded SimpleClaimSystemAPI with 18 new methods
- Added async variants (CompletableFuture) for all blocking operations
- Added query methods: getPlayerClaimsCount, isClaimMember, isClaimBanned, etc.
- Added claim info methods: getClaimOwnerAt, getClaimNameAt, getAllChunksFromOwner
- Added validation methods: isAreaClaimFree, areChunksConnected, checkClaimPermission
Code quality:
- Added contextual logging to all catch blocks (no more bare printStackTrace)
- Removed all decorative comment blocks across 71 files
- Fixed incorrect javadocs (wrong param names, missing annotations)
- Updated .gitignore with IDE and OS file patterns
- Cleaned up Dockerfile (proper Adoptium URL, Ubuntu 24.04, temp cleanup)
- Modernized console startup banner with dynamic padding
- Updated LICENSE to standard MIT format
Config:
- Added dynmap-settings.claim-opacity (0.0-1.0)
- Added bluemap-settings.claim-opacity (hex alpha 00-FF)
- Added pl3xmap-settings.claim-opacity (0-255)
- Fixed explicit commit on claim insertion for DB safety