FEATURES
[1] Team Tier Upgrade System. Teams start at tier 1 and spend bank funds to progress through 5 tiers unlocking larger max members (10→25), a bigger ender chest (3→6 rows), a PvP damage bonus (0→5%), and a home cooldown reduction (0→50%). Owner-only purchase. Every perk is hard capped (at the moment) in code so no config mistake can produce one-shot PvP or 500-player teams. Opens from the new nether star button in the team GUI
[2] Members can now use /team sethome when the owner explicitly grants them the permission via the permissions GUI. Previously this toggle only worked for Co-owners. Disabled by default
[3] Co-owners can promote Members to Co-owner when the owner grants them the new "Promote to Co-owner" permission. New toggle in the Co-owner permissions GUI, owner-only, disabled by default
[4] PvP toggle cooldown - configurable cooldown between PvP status changes per team. Bypass with justteams.bypass.pvp.cooldown permission. Configure with team_pvp.toggle_cooldown (default: 300 seconds, set to 0 to disable)
[5] Flight is disabled when entering PvP combat. Works for creative-mode fly and elytra. Configure with team_pvp.disable_fly_on_combat (default: false). Skips spectators and creative players who have joined legitimately
[6] New PAPI placeholder %justteams_pvp_toggle_cooldown% — returns remaining cooldown seconds with "s" suffix, or "Ready" when no cooldown is active
[7] FastStats anonymous metrics integration with optional error tracking for uncaught exceptions. Disable entirely with settings.faststats.enabled: false
[8] Configurable slot layouts for all dynamic GUI lists. Place member heads, warps, allies, invites, and blacklist entries on exact slot indices via a slots: list in gui.yml. Unused slots become free space for fillers and decorations
[9] Per-alias enable/disable toggles in commands.yml for /guild, /clan, /party, /guildmsg, /clanmsg, /partymsg.
[10] /party and /partymsg ship disabled by default to avoid conflicts with common network plugins
[11] In-game admin notification when PacketEvents is not installed. Shows a clickable Modrinth download link on join, toggleable via settings.notify-missing-packetevents
CRITICAL FIXES
[12] NoClassDefFoundError on startup when PacketEvents was not installed. GlowManager now only initializes when PacketEvents is present and all call sites are null-guarded so the plugin boots cleanly without it
[13] /guild, /clan, /guildmsg, /clanmsg were registering even when disabled in commands.yml because they were hardcoded in plugin.yml. Removed from plugin.yml, now registered dynamically by AliasManager only when enabled. No ghost commands
IMPROVEMENTS
[14] Leaderboard category GUI is now fully translatable. Title, item names (Top Kills, Top Balance, Top Members), and lore all read from messages.yml
[15] Leaderboard view GUI title now renders MiniMessage formatting correctly instead of showing raw gradient tags
[16] Startup banner shows PacketEvents status alongside Vault, PAPI, and PvPManager
CONFIGURATION
[17] New settings.faststats.enabled boolean (default: true)
[18] New settings.notify-missing-packetevents boolean (default: true)
[19] New command-aliases section in commands.yml with per-alias enabled flags
[20] New slots: list on every dynamic GUI section in gui.yml. Remove the list to fall back to the default slot range
[21] Version check endpoint updated from api.kotori.ink to api.deltura.net
[22] New team_pvp.toggle_cooldown integer - seconds between PvP toggle uses per team (default: 300, 0 to disable)
[1] Fixed team chat message duplication with some chat formatting plugins (AlonsoChat, etc.)
[2] Fixed leaderboard colored_tag and gradient_tag placeholders
[3] Fixed gradient display in TAB lists and scoreboards
[1] Fixed critical chat input bug - "cancel" and other input messages no longer appear in global chat when creating teams or using GUIs
[2] Fixed team chat bleeding into global chat - changed event priority from HIGHEST to LOWEST to process before other chat handlers
[3] Fixed ChatInputManager event priority - now properly intercepts internal messages before TeamChatListener processes them
[4] Fixed %justteams_display% placeholder - now correctly replaces angle-bracket tags instead of returning literal placeholder text
[5] Fixed Redis NumberFormatException - improved parsing logic to handle data fields containing pipe characters
[6] Fixed Redis TEAM_CREATED handler - added missing handler to prevent "Unknown Redis update type" warnings
[7] Added legacy color code support - /team setcolor now accepts &c, &a, &e (ampersand) and §c, §a, §e (section sign) formats
[8] Added gradient color support for all color placeholders - %justteams_color_tag%, %justteams_colored_tag%, and %justteams_gradient_tag% now support hex gradients
[9] Added silent mode for color placeholders - returns empty string when player has no team instead of showing placeholder text
[10] Added team name support for ally requests - /team ally accept and /team ally deny now use team names instead of internal team IDs
[11] Enhanced /team setcolor command - now supports four modes: named colors (RED, BLUE), legacy codes (&c, §c), hex colors (#FF0000), and gradients (#FF0000 #00FF00)
[12] Improved PlaceholderAPI compatibility - added onPlaceholderRequest(Player) method for plugins that specifically call Player-based placeholder methods
[1] Fixed critical chat input bug - "cancel" and other input messages no longer appear in global chat when creating teams or using GUIs
[2] Fixed team chat bleeding into global chat - changed event priority from HIGHEST to NORMAL to process after ChatInputManager
[3] Fixed ChatInputManager event priority - changed from LOWEST to HIGHEST to cancel events before other chat handlers process them
[4] Added gradient color support for team names - use/team setcolor #RRGGBB #RRGGBBto create beautiful gradient effects
[5] Added hex color validation - ensures proper #RRGGBB format before applying gradient colors
[6] Added database support for gradient colors - newgradient_startandgradient_endcolumns in donut_teams table
[7] Enhanced/team setcolorcommand - now supports three modes: named colors (RED, BLUE), hex gradients (#FF0000 #00FF00), and reset
[8] Added gradient color persistence - gradient colors are saved to database and loaded on server restart
[9] Improved color command usage messages - shows examples for both named colors and gradient hex colors
[10] Fixed team chat event handling - added proper cancelled event checks to prevent duplicate processing
[11] EternalCombat integration fixed
[1] Fixed EternalCombat integration initialization - increased API initialization delay from 1 second to 3 seconds to allow EternalCombat API to fully load
[2] Improved error handling in EternalCombat hook - better error messages distinguish between "not installed" vs "API not ready" scenarios
[3] Enhanced reflection based integration - clearer logging shows exactly which step failed during initialization
[4] Fixed "API classes not found" error appearing after "hook created" message - now it waits for API to be ready before attempting reflection
[5] Added error messages with indicators for integration status
[6] Improved initialization feedback
[1] Fixed critical teleport warmup bug - running/team homeor/team warptwice before warmup completes no longer orphans tasks and blocks future teleports
[2] Added proper task cancellation logic - existing warmup tasks are now cancelled before creating new ones, preventing task tracking corruption
[3] Fixed<team_color>placeholder in team chat - now outputs valid MiniMessage color tags (<dark_red>,<blue>, etc.) instead of plain text color names
[4] Converted ChatColor enum to MiniMessage format across all chat handlers - team colors now display correctly in chat messages
[5] Fixed team color display in TeamChatListener - local team chat now properly renders team colors set via/team setcolor
[6] Fixed team color display in TeamMessageCommand -/tmcommand now properly renders team colors in cross-server environments
[7] Fixed team color display in Redis cross-server chat - TeamMessageSubscriber now converts ChatColor to MiniMessage tags for Redis-based team chat
[8] Fixed team color display in MySQL cross-server chat - TeamManager now converts ChatColor to MiniMessage tags for MySQL-based team chat synchronization
[9] Enhanced warmup cancellation feedback - players now receive "teleport_cancelled" message when spamming teleport commands
[10] Applied teleport fix to all three warmup methods -initiateLocalTeleport(),startNamedWarpTeleportWarmup(), andstartWarpTeleportWarmup()all properly cancel existing tasks
[1] Fixed critical server watchdog timeout - removedCompletableFuture.join()blocking main thread ingetPlayerTeam()method
[2] Fixed player quit crashes -unloadPlayer()now fully asynchronous to prevent database overload during mass disconnects
[3] Eliminated console spam - backup snapshot messages reduced from INFO to FINE logging level (only visible with debug enabled)
[4] Optimized player disconnect handling - team cache cleanup now runs asynchronously to prevent server thread blocking
[5] Fixed race conditions during concurrent player quits - synchronized cache access prevents data corruption
[6] Added Team Alliances System - complete ally management with GUI, commands, and cross-server synchronization
[7] Added/team allycommand with 7 subcommands - add, remove, accept, deny, toggle, list, and GUI access
[8] Added Ally GUI - intuitive interface for managing alliances and viewing pending requests
[9] Added EternalCombat integration - prevents combat-tagged players from exploiting team commands via reflection-based hook
[10] Added configurable combat restrictions - 9 separate toggles for blocking actions during combat (teleport, leave, disband, etc.)
[11] Added combat tag messages - shows remaining combat time when actions are blocked
[12] Added database tables -donut_team_alliesanddonut_team_ally_requestswith automatic migration
[13] Added 27 new messages - 17 for ally system, 10 for combat integration
[14] Added full tab completion - ally commands with subcommand and team name suggestions
[15] Optimized database queries - indexed ally tables prevent performance degradation
[16] Fixed potential memory leaks - proper cleanup in async operations and hook shutdown
[17] Added validation-first approach - all ally operations validate before database writes
[18] Enhanced cross-server sync - ally changes propagate via Redis/MySQL to all servers
[19] Fixed team uncaching logic - prevents premature cache eviction when players quit
