Please update your BungeeControl and VelocityControl too.
- Improve | Improved performance of proxy data sync by caching the
SyncTypevalues list- Improve | Improved chat formatting performance by caching the sender's name when evaluating receiver conditions and permissions
- Improve | Faster database reconnects by skipping the transitive Maven dependency resolver after the first library load
- Improve | LiteBans mute detection now performs a synchronous fallback lookup if the initial async lookup failed, so a brief LiteBans DB outage no longer lets muted players chat
- Fix | Solved "NullPointerException" when replying to a mail whose subject was empty
- Fix | Solved "NumberFormatException" on update check when the latest version on BuiltByBit contained non-numeric characters
- Fix | Suppressed the auto-crash report when the plugin's
.paper-remappedJAR is deleted while the server runs (antivirus quarantine, manual cleanup) and aborted the reload with an actionable message instead- Fix | Solved a JDBC driver hijack where another plugin's shaded driver could intercept the database connection, by connecting through the resolved driver directly
SPARK REPORTS NEEDED
I am rewriting ChatControl to be more performant, optimized and async. And I'd like to check how it performs on your server today to see where the biggest gaps are!
If you run a server of any size, can you please run a spark report and email the URL privately to mineacademy.org/contact?
No worries how big or slow if your server - the more reports I get the more I can optimize the plugin!
Your report will stay private.
Thanks,
Matej
(There's no new version in this update, the JAR is the same 11.8.10 as last time.)
- Improve | External chat mutes from
LiteBans,AdvancedBan,BanManager,EssentialsandCMIare now always enforced when a player tries to chat, even when ChatControl's own mute is disabled or the player haschatcontrol.bypass.mute. Previously the external mute check was skipped in those cases- Improve | Added
AdvancedBantosoftdependso its hook loads in the correct order- Fix | Solved
{player_unmute_time_remaining}showing nonsense (negative or wildly wrong) values when the mute came from an external plugin. The remaining time is now calculated as end-minus-now instead of inverted- Fix |
/mutestatus output now shows the correct remaining time for externally-muted players, matching the placeholder fix above- Fix | Solved "Cannot instantiate SerializedMap in mode YAML from (ArrayList)" auto-reporting as a crash when
formats/*.ymlhad itsParts:section written as a YAML list (e.g.- Part: ...) instead of a map of named parts. The file is now skipped with a clear console warning naming it and pointing to the docs (#3626)
Please update your BungeeControl and VelocityControl too.
- New | Added
{player_chat_gradient_open}and{player_chat_gradient_close}placeholders. They expand to/when the player has a chat gradient set, or to empty strings otherwise. Wrap any portion of a format line (name, message body, etc.) in them to paint that portion in the player's gradient only when one is configured, without breaking the format when it isn't- Improve | Default
formats/chat.ymlandformats/global-chat.ymlnow wrap{message}with{player_chat_gradient_open}/{player_chat_gradient_close}, with{player_chat_color}and{player_chat_decoration}placed outside the wrap so that per-character gradient colors render correctly when a plain chat color is also set- Improve | Hide the gradient button in the
/chc colormenu for players who have nochatcontrol.guigradient.*permissions- Fix | Solved a crash on player join/quit/kick when a
messages/*.rsfile contained a group with nomessages:entries (#3621). Misconfigured groups are now skipped with a console warning so operators can correct them- Misc | Removed the implicit
wrap around{message}that shipped in 11.8.7. Gradient control now lives entirely in format files, same as{player_chat_color}. If yourformats/chat.ymlwas regenerated under 11.8.7, delete it to pull the new default, or add{player_chat_gradient_open}{message}{player_chat_gradient_close}manually around the portion you want painted (#3619)
- New | Chat color and gradient can now be used together. Selecting a gradient no longer wipes your
{player_chat_color}, so format lines that use that variable for name colors or other parts keep working while the gradient paints only the{message}. Credits to for the suggestion (#3619)- New | Added three placeholders for custom formats:
{player_chat_gradient_from}(start hex, e.g.#FF5555),{player_chat_gradient_to}(end hex), and{player_chat_gradient_name}(preconfigured name likeSunsetornone)- Improve |
/chc color statusnow lists the chat color and the gradient side-by-side when both are set, instead of hiding the color behind the gradient- Improve | The glass "Reset chat color" button in
/chc color menunow only resets the solid color. Use the reset button inside the Gradients submenu to clear the gradient./chc color resetstill clears both, as before- Improve | IP filter rewrite in
rules/global.rs: now validates every octet is 0-255 before matching, so dates (2026-04-20-09), phone numbers and version strings no longer fire theadvertisementgroup. Added anignore stringfor chat framing words (coord,tp,pos,warp,build,version,buying,selling, etc.) that precede legitimate 4-number tuples- Improve | Domain filter now ignores English compounds and programming identifiers that look like domains (
log.in,sign.in,System.in,String.to,File.is), preventing false positives in tech discussions and casual phrases- Improve | Swear filter now catches compounds (
motherfucker,clusterfuck) in addition to base words and obfuscated variants- Fix | Solved rules with
ignore playersonly matching whole-message equality against one player name. The operator now strips every online player's name from the text before running the pattern, so a flood/spam rule no longer trips on messages that merely mention a player whose nickname contains the matching characters (e.g.Lexiiiiiiktripping a repeated-character filter). Credits to Lanya from the #3324 thread- Misc | Internal: ignore-players stripping now compiles a single alternation pattern per message (instead of one
Patternper online player) and sorts names longest-first so overlapping prefixes likeAbvsAbcdon't leave stray tails
- Improve |
/spy offand per-feature selections from/spy menuand/spy toggleno longer get wiped on every login for players with thechatcontrol.spy.autoenablepermission. Auto-enable now runs only on first login; after that the player's chosen sections (commands, mails, signs, books, anvil, private messages, channels) persist across rejoins.
Please update your BungeeControl and VelocityControl too.
- Fix | Solved LiteBans "Connection pool exhaustion detected" and "SQLTransientConnectionException: litebans-pool - Connection is not available" errors on servers running multiple MineAcademy plugins. The integration no longer polls the LiteBans database on a timer — mute changes now apply instantly via LiteBans' official event API, removing the per-plugin connection pressure that triggered the exhaustion.
Please update your BungeeControl and VelocityControl too.
- Fix | No longer crash with "FoException: Report: To enable global rules, remove import global from files in the rules/ folder." when
globalis listed underRules.Apply_Oninsettings.yml- we now print a one-line warning and strip it automatically, keeping your other rule types intact.- Improve | Reduced LiteBans mute polling from every 2 seconds to every 30 seconds to prevent "Connection pool exhaustion detected (open=100, max=100)" errors when multiple MineAcademy plugins run on the same server.
- Improve | Added a 5-minute back-off on LiteBans database failures instead of hammering the connection pool during an outage; cached mute data is preserved across failures.
