[1] Team chat works again.
[2] Team chat shows your team color now instead of raw tags like <red> or <gradient:...>.
[3] Team chat stopped eating messages with "pass" in them (compass, passed, etc.). It only catches actual "password" now.
[4] Team PvP toggle sticks now. Turning it on could get reverted by a background sync a second later, so teammates still couldn't hit.
[5] Ender chest hardened against dupes. Two people can't open it at once, and it's now snapshotted right before saving so a mid-drag item can't land in two slots.
[6] Works on Paper 1.21.x and 26.1.2, Folia, Purpur and Spigot.
[1] Your team bank can't be duped anymore. If two people in the same team hit withdraw at the same moment, both withdrawals went through on the same balance, so the team walked away with more money than the bank ever held. It was easiest to pull off from the bank menu, since the amount you type goes through chat and that runs on its own thread, but two people clicking at once was enough. The bank now takes the money out in one step straight on the database, so the same balance can't be spent twice, even by two players on two different servers. Nothing to migrate, just drop it in.
[2] That same fix covers everywhere else money moves through the bank. Deposits, tier upgrades, quest money rewards and anything you pay for out of the bank all use the same safe deduction now, so none of them can lose or double money when they happen at the same time as something else.
[3] People who weren't in your team stopped showing up in it. If you accepted an invite or joined a public team while you were already in another team, the database correctly turned you down, but the member list added you anyway and left a ghost behind. It listens to the database now, so that can't happen.
[4] Members actually show up across the network now. A join, leave or kick on one server didn't always reach the others, so the same team could look different depending on which server you were standing on. Membership is pulled fresh from the database on every server now, on both Redis and MySQL-only setups.
[5] No more duplicate or leftover names in the member list. The list you see and the internal "who's in which team" lookup could quietly fall out of step with each other. They're rebuilt together from one source now, so no doubles and no stragglers.
[6] Turning off an alias like /party works on /team reload now. Before, switching it off in commands.yml did nothing until a full server restart because the command stayed registered the whole time. Now /team reload drops it on the spot, and brings back any you switch on, so the name is free for other plugins right away. If someone still sees it in their tab-complete, they just need to rejoin.
[7] Works on Paper 1.21.x, Purpur, Folia and Spigot, with cross-server over Redis or MySQL.
CRITICAL FIXES
[1] Team bank not syncing between servers when cross-server mode is enabled. The Redis subscriber had no handler for BANK_DEPOSIT or BANK_WITHDRAW so balance changes were silently dropped on receiving servers. Added handlers and reordered the publish to fire after the async DB write completes with the new balance in the payload.
[2] /team create rejected hex colors in team names. Bare #RRGGBB and Bukkit-style &#RRGGBB are now stripped before the alphanumeric name validator, so /team create #96DF86CoolClan works. Legacy &-codes, <#RRGGBB>, and gradients continue to work
[3] /team setcolor with a single hex argument rejected with invalid_color. Single hex is now accepted and stored as a same-start/same-end gradient. /team setcolor #FF0000 works. Two arg gradient and named colors are unchanged
[4] Team chat duplicating as a global message with AlonsoChat installed. Added a parallel guard on the legacy AsyncPlayerChatEvent (cancel, clear recipients, empty message, empty format) so chat formatters that listen with ignoreCancelled = true and broadcast manually no longer produce a duplicate.
FEATURES
[5] ENABLED / DISABLED labels in the Member Edit GUI permission lores are now translatable. New messages.yml keys status_enabled and status_disabled. Auto-migration adds them to existing installs
[6] Cost-message feature labels are now translatable. The <feature> placeholder in economy_charged, economy_charged_bank, economy_charged_split, and items_taken now resolves through a new feature_names section in messages.yml instead of returning the raw internal key.
CONFIGURATION
[7] New messages.yml keys status_enabled and status_disabled
[8] New messages.yml section feature_names with 14 default keys
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
