Fixed a bug where saving player kit layouts failed when armor trims were applied, because the validation system usedisSimilar()and treated trimmed armor as different due toArmorTrimmetadata. Added a trim‑aware comparison that ignores ArmorTrim data during validation, so trimmed armor is now correctly recognized as the same kit item.
• Added volatile fields for primitive stats and replaced HashMap with ConcurrentHashMap for safe async reads.
• Implemented atomic DB merge (putAll → retainAll) to avoid temporary empty-map states.
• Added loaded flag with isLoaded() to track when PlayerStats is fully loaded from DB.
• Replaced Ostat increment loops with O(1) setters (setFfaKills / setFfaDeaths).
• Fixed cache race condition by merging DB-loaded data into existing PlayerStats objects instead of replacing them.
Async Handling
• Database operations use Bukkit.getScheduler().runTaskAsynchronously().
• Added shutdown() method for clean plugin disable and safe stat flushing.
Result
• Prevents stale stat reads on async scoreboard threads.
• Eliminates race conditions during async stat loading.
• Improves stat loading performance and async safety.
read docs
https://limestudio.netlify.app/lime
REST API Added
Introduced a REST API for external integrations and web-based services.
Endpoints:
- GET /api/player/{uuid_or_name}
- GET /api/leaderboard/global
- GET /api/leaderboard/kit/{kitName}
- GET /api/leaderboard/kills
- GET /api/leaderboard/wins
- GET /api/server/info
Supports API key authentication, rate limiting, and CORS for web applications.
• Fixed an issue where a new party owner received party hotbar items even while in a party game. Now the system checks if the player is in a party game, so they keep their kit and no extra items are given.
• Reverted the previous fix and implemented the correct solution for party leave handling.
Changes:
- /spec leave now only stops spectating and sends the player to lobby while keeping them in the party.
- /party leave now marks the player with a pending party leave instead of force-removing them from the game.
- endGame() now skips players marked as pending leave, preventing unwanted teleports.
Result:
- /spec leave → player returns next round if still in party.
- /spec leave + /party leave → player leaves completely and won't return next round.
- Players who leave the party during a match are properly skipped at game end.
- Added team glow highlighting during Party game fights.
- Players receive team-colored glow when the round starts (Blue team / Red team).
- Glow is automatically removed when a player dies, quits, or when the round/game ends.
- Fully integrated with the existing tablist team system with no conflicts.
- Works safely with spectators and resets correctly between rounds.
![]()
- Fixed an issue where player stats and kit tier points could reset or not update correctly when a player left a match.
- The problem was caused by player data unloading before match results were fully processed.
- Adjusted the quit handling order so match cleanup and stat updates complete before player data is saved and unloaded.
Gameplay Fixes
- FFA Queue Bug Fix — resolved an issue where ranked queue players could join FFA due to separate queue tracking
- Added additional RankedManager queue validation to ensure players already in ranked matchmaking cannot join FFA
Smart Kit Rule Filtering
Kit rules now execute only for players using kits that require them
- Lobby players are fully excluded from rule processing
- Ended matches automatically ignored, preventing unnecessary event handling
- Implemented EnumSet bitmask caching for fast O(1) rule checks per player
Event System Optimization
- Added early-exit guards across all handlers, skipping logic when the rule is not relevant to the player’s kit
- Removed redundant rule checks in multiple handlers
- Improved fall damage handling by resetting fall distance to prevent recalculations
- Streamlined hunger and gameplay event processing
Spawn Items Performance Improvements
- Added placeholder detection for spawn items so static items bypass cloning and placeholder parsing
- Static spawn items now return a cached ItemStack reference (zero-copy) instead of running regex and MiniMessage parsing
- Cached PlaceholderAPI availability at startup to remove repeated plugin manager checks
- Cached lobby auto-give settings (give-on-lobby-world-join, auto-give-delay) to eliminate repeated YAML reads
- Removed disk reads in SpawnItemsListener by using the already-loaded configuration instance
