Core Performance Improvements
- Optimized QueueManager with reverse lookup maps for instant queue access and player removal
- Improved queue operations from O
scans to O(1) lookups, reducing overhead during matchmaking
- Cached Arena kill, respawn, and bed-destroy messages to remove repeated YAML reads during gameplay
System Optimizations
- Implemented static countdown timing constants in DuelManager to reduce repeated object allocations
- Optimized PartyGameManager countdown handling by moving Component and Title creation outside player loops
- Replaced small dynamic lists with lightweight immutable lists for better memory efficiency
Configuration Improvements
- Added configurable messages in messages.yml:
- kit-auto-saved
- kit-reset
- Both messages are now cached through MessagesManager, improving performance and allowing full customization.
Scoreboard & Tablist Improvements
- Scoreboard line updates throttled to every 10 ticks, title updates remain every tick for smooth animations
- Tablist header/footer throttled — non-animated players update every 20 ticks
- Implemented thread-safe SwiftBoard handling (updateTitle, updateLines, delete)
Hot-Path Event Optimizations
- Cached block-decay configuration values used during PlayerMoveEvent
- Cached per-kit damage multiplier map used during combat events
- Cached spectator teleport distance for spectator movement checks
- Cached arena outbound kill/delay settings used in arena movement checks
- Cached FFA outbound settings used during FFA movement events
- Cached kill sounds and BedWars titles/sounds used during kills and bed breaks
- Cached KillMessageManager configuration and message lists used during kill events
Timer Loop Optimizations
- Cached TNT Tag actionbar formats (runs every second)
- Cached Flower Crown actionbar formats (runs every second)
- Optimized PartyGameManager with 19 cached values (sounds, titles, countdowns, team icons/colors, disabled kits, etc.)
- Cached FFA countdown titles and final-title lists used during player join countdowns
Redundant Config Read Fixes
- Fixed unused cached values in DuelManager (cachedSpectatorTime, cachedKitColoredArmor)
- Cached match.kit-colored-armor in ArenaListener (multiple usage points)
- Cached sign-queue.format in SignQueueManager
- Cached party countdown configuration in MatchFoundEffects
- Replaced Bukkit Scoreboard API with packet-based scoreboard system (PacketEvents)
- Removed heavy objective.displayName() and team.prefix() calls causing DFU CPU load
- Implemented pre-parsed tablist templates to eliminate runtime regex processing
- Added per-placeholder change detection to prevent unnecessary updates
- Introduced per-placeholder PAPI cache TTL (fast/normal/slow intervals)
- Cached tablist header/footer components to avoid redundant serialization
- Throttled PAPI cleanup tasks to every 5 seconds
- Reduced scoreboard animation refresh rate 20 → 10 updates/sec
- Reduced scoreboard animation refresh rate (20→10 updates/sec)
- Throttled PAPI cache cleanup to run every 5 seconds (instead of every tick)
- Optimized tablist header/footer updates — now only re-serializes changed components
- Eliminated redundant Adventure→NBT serialization
- Short-circuited expensive regex checks in MiniMessage detection
- Reduced unnecessary ConcurrentHashMap cleanup calls
- Fixed critical async preload bug — kit tier data now loads correctly (no more default/zero points issue)
- Added proper pendingLoads system to prevent duplicate loads
- Replaced per-event YAML saves with 5s batched flush system
- Reduced file write spam and async task overload
- Cached getStartingTier() config lookups (no more hot-path config traversal)
- Converted player unload saves to async (removed main-thread YAML I/O)
- Improved overall network stability and server consistency
we are not spaming update we are test on big server and finding issues
- Converted all sync DB reads to async preload system
- Implemented 5s batched stat saving (reduced async spam)
- Added immediate save on quit & safe shutdown flush
- Cached hot-path config values (scoreboard/placeholders)
- Reduced Netty congestion and network backpressure
- Improved overall server stability and consistency
- Previously, the ender pearl check was inverted and blocked pearls for everyone who was not in a match, which disabled pearls in lobby, spawn, and all non-arena worlds.
- Now the logic only applies to players who are in an active match and inside an arena.
- If a matched player tries to pearl outside the arena region, the teleport is cancelled to prevent abuse.
- Lobby, spawn, and any other worlds are untouched now – pearls work normally again.
- Pearl entities are still cleaned up on match end via the existing cancelThrownPearl() logic, so there are no leftover projectiles.
Quick Setup: Add to config.yml or delete config.yml to regenerate:
match:
match-found:
instant-queue: true # true = instant match, false = 3s delay
delay: 0 # 0 = instant start (no countdown)
What's Fixed:
Direct duels (/duel accept) unaffected — keep normal flow.
- Instant Queue — Skips both 3s delays (queue + match effects) when instant-queue: true
- Configurable Delay — Set delay: 0 for zero-delay matches
- Hex Colors — Placeholder values (like %kit%) now properly convert &#RRGGBB & MiniMessage codes
- Kit Editor — Uses messages.yml for "kit-saved" & "left-editor" instead of hardcoded text
Note: messages.yml — Remove hardcoded "Starting in 3 seconds..." if using instant mode.
