
ChatControl
Take control of your chat. Toggle, filter, slowmode, hide spam, LuckPerms support & more! Formerly vChatUtils.
Оцените первым
1.1K
3
Список изменений
1.2.3 - Bugfix pass: chat format for everyone, config safety
Bug Fixes
- Every player-facing message crashed (about page, chat toggle, status, PM): the PAPI round-trip in
MessageManager.buildComponentlegacy-serialized the message (emitting§codes) and then fed that string straight intoMiniMessage.deserialize, which always throwsParsingExceptionImpl: Legacy formatting codes have been detected. The message was replaced with a red error and bugreport.txt was spammed per message. The legacy string (plus PAPI output, also legacy-formatted) is now converted back to MiniMessage tags viatoMiniMessagebefore re-deserializing. - Legacy-format lang files (copied from vChatUtils by the config migrator) crashed on load: raw
§codes inmessages-*.ymlwere deserialized directly. Lang strings are now passed throughtoMiniMessageat every deserialize site, which is a no-op for the jar's pure-MiniMessage files. - Chat format not applied to admins/bypass holders: Formatting only ran at the end of the chat pipeline, so the
chatcontrol.adminearly-return skipped it entirely — admins saw vanilla<name> messagechat. The format is now applied at the top of the chat handler, before any permission or moderation check, so every player gets the configured format no matter what permissions they hold. - Stray
%in chat format killed every message:event.setFormatvalidates viaString.format, so an unresolved PAPI placeholder (%player_name%without PAPI installed), a LuckPerms prefix containing%(e.g.%vault_prefix%,50% off), or any literal%in the format threwUnknownFormatConversionExceptionper message — format silently dropped, bugreport.txt spammed. All literal%are now escaped (%%) except the%1$s/%2$susername/message specifiers. - PAPI resolved before
{prefix}/{suffix}substitution: LuckPerms prefixes containing PAPI placeholders (e.g.%vault_prefix%) rendered literally. PlaceholderAPI now runs on the final substituted string. /cc reloadlied about success: Config reload failures (broken YAML — Paper silently loads an empty config and logs SEVERE) were swallowed; the command always reported success while real settings were ignored.reload()now detects the broken-config case, keeps the old settings, returns failure, and/cc reloadreports it. Deleted keys (e.g.chat-format:) are now restored from defaults on reload, not just at startup — this was your report: deletingchat-format:and reloading never re-added or validated it.- Broken config.yml wiped on next startup: A single YAML syntax error made
fillMissingDefaultsoverwrite the user's file with pure defaults. Empty-but-non-empty files are now skipped with a warning, andconfig.yml.bakis backed up before any default-fill save. - Empty
allowed-characters-regexblocked all chat silently:Pattern.compile("")matches nothing, so withenable-allowed-characters: trueevery message was cancelled. Empty/blank now falls back to the default whitelist with a warning. - Unvalidated numeric config:
caps-filter-threshold: 1.5never triggered, negative values always triggered,max-line-length: -5blocked everything, wrong types were silently ignored. All numeric keys are now type-checked and range-clamped with warnings. - Invalid
chat-format(MiniMessage) validated at load: used to throw per message and silently kill formatting for everyone; now validated once at load/reload with a fallback to the default. - Anti-spam blocked the first similar message:
anti-spam-repeat-thresholdwas dead — the threshold only switched the message text; every similar message was cancelled. Similar messages now warn first and only the N-th repeat (per config, default 3) is blocked. History updates moved to the acceptance point, so filtered/cancelled messages no longer become the similarity baseline, and the slowmode cooldown is no longer consumed by messages that later get rejected. - §-code color bypasses: only
&-forms were stripped;§x§a§b§c§d§e§f/§ksurvived stripping for players without rgb/magic perms and Paper renders § identically to &. - Color permissions advertised features that couldn't render: permitted MiniMessage tags (
<color:#ff0000>,<gradient:...>,<bold>) reached the legacy-only chat parser as literal text. They are now converted to legacy § codes so they actually render;"2 < 3 > 1"and<3no longer get their angle-bracket content stripped for no-color players. /rbypassed/togglepmand/ignore: delivery checks moved into the singlesendPmchokepoint; admins now bypass ignores too.chatcontrol.ignorepermission finally gates the ignore commands. PM messages now respectmax-line-length.- PM config toggle did nothing on
/cc reload: enabling PM in config now registers the commands at runtime on reload; disabling warns that a restart is required (Paper 1.21.5+ has noCommandMap.unregister). - PM: true crashed the plugin on Spigot:
getCommandMap()is Paper-only and threwNoSuchMethodErrorinonEnable, disabling the whole plugin. PM now degrades gracefully with a warning on Spigot. - EssentialsX ownership warnings were dead code: the
load: STARTUPphase made theisPluginEnabled("Essentials")check always false, andgetCommand(name)always returned null for runtime-registered commands. The check now scans the actual command map 5 seconds after startup and names the owning plugin. - PlaceholderAPI expansion never registered:
load: STARTUPenabled ChatControl before PAPI (POSTWORLD), so the%chatcontrol_*%placeholders never existed. APluginEnableEventlistener registers the expansion the moment PlaceholderAPI enables. %displayname%with § codes killed join/leave/advancement messages:MiniMessage.deserializethrows on §; display names and LP prefixes are now converted viatoMiniMessagein join/leave/advancement messages and inChatControlAPI.sendFakeJoin/LeaveMessage(which previously crashed the calling plugin).- Reload raced async chat: the filter pattern list was published half-populated, letting the async chat thread iterate a mutating
ArrayList(ConcurrentModificationException). The list is now built locally and swapped in fully populated. - Lang files: missing keys showed red errors, no fallback: jar defaults are now merged into existing lang files;
get(Player, ...)runs PAPI after placeholder substitution (no more collisions with%player%-style expansions). Players now receive lang messages as Components so hover/click links (about page) survive;/cc reload --confirm/-ffake flags removed from tab completion. ChatControlChatEvent.setMessage(null)(API) no longer NPEs chat processing server-side.
Known limitations (documented, not fixed in this release)
- PM state (ignore list, togglepm, socialspy) is in-memory and resets on restart; Bukkit
/reloadmay leave stale PM command entries; hover/click tags insidechat-formatare lost because chat output is legacy-only; config comment formatting on plain Spigot (non-Paper) is not preserved onsaveConfig. - Chat crash on any literal
%in the format:UnknownFormatConversionException: Con every chat message. Paper validates the format passed tosetFormatby running it throughString.format(), and a literal%in the config (e.g."100%</gray> {username}", or a PAPI/LuckPerms value containing%) serializes into%§when it lands next to a legacy color code, which is not a valid format specifier. All literal%characters except the%1$s/%2$susername/message specifiers are now escaped as%%beforesetFormat, so config text like100%renders correctly and nothing crashes.
Файлы
ChatControl-1.2.3.jar(70.22 KiB)
ОсновнойМетаданные
Канал релиза
Release
Номер версии
1.2.3
Загрузчики
BukkitFoliaPaperPurpurSpigot
Версии игры
1.21–26.2
Загрузок
78
Дата публикации
16.08.2026
