▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Плагины/ChatControl
ChatControl

ChatControl

Take control of your chat. Toggle, filter, slowmode, hide spam, LuckPerms support & more! Formerly vChatUtils.

Оцените первым
1.1K
3
Все версииChatControl 1.2.3

ChatControl 1.2.3

Release16.08.2026

Список изменений

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.buildComponent legacy-serialized the message (emitting § codes) and then fed that string straight into MiniMessage.deserialize, which always throws ParsingExceptionImpl: 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 via toMiniMessage before re-deserializing.
  • Legacy-format lang files (copied from vChatUtils by the config migrator) crashed on load: raw § codes in messages-*.yml were deserialized directly. Lang strings are now passed through toMiniMessage at 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.admin early-return skipped it entirely — admins saw vanilla <name> message chat. 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.setFormat validates via String.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 threw UnknownFormatConversionException per message — format silently dropped, bugreport.txt spammed. All literal % are now escaped (%%) except the %1$s/%2$s username/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 reload lied 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 reload reports it. Deleted keys (e.g. chat-format:) are now restored from defaults on reload, not just at startup — this was your report: deleting chat-format: and reloading never re-added or validated it.
  • Broken config.yml wiped on next startup: A single YAML syntax error made fillMissingDefaults overwrite the user's file with pure defaults. Empty-but-non-empty files are now skipped with a warning, and config.yml.bak is backed up before any default-fill save.
  • Empty allowed-characters-regex blocked all chat silently: Pattern.compile("") matches nothing, so with enable-allowed-characters: true every message was cancelled. Empty/blank now falls back to the default whitelist with a warning.
  • Unvalidated numeric config: caps-filter-threshold: 1.5 never triggered, negative values always triggered, max-line-length: -5 blocked 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-threshold was 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/§k survived 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 <3 no longer get their angle-bracket content stripped for no-color players.
  • /r bypassed /togglepm and /ignore: delivery checks moved into the single sendPm chokepoint; admins now bypass ignores too. chatcontrol.ignore permission finally gates the ignore commands. PM messages now respect max-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 no CommandMap.unregister).
  • PM: true crashed the plugin on Spigot: getCommandMap() is Paper-only and threw NoSuchMethodError in onEnable, disabling the whole plugin. PM now degrades gracefully with a warning on Spigot.
  • EssentialsX ownership warnings were dead code: the load: STARTUP phase made the isPluginEnabled("Essentials") check always false, and getCommand(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: STARTUP enabled ChatControl before PAPI (POSTWORLD), so the %chatcontrol_*% placeholders never existed. A PluginEnableEvent listener registers the expansion the moment PlaceholderAPI enables.
  • %displayname% with § codes killed join/leave/advancement messages: MiniMessage.deserialize throws on §; display names and LP prefixes are now converted via toMiniMessage in join/leave/advancement messages and in ChatControlAPI.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/-f fake 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 /reload may leave stale PM command entries; hover/click tags inside chat-format are lost because chat output is legacy-only; config comment formatting on plain Spigot (non-Paper) is not preserved on saveConfig.
  • Chat crash on any literal % in the format: UnknownFormatConversionException: C on every chat message. Paper validates the format passed to setFormat by running it through String.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$s username/message specifiers are now escaped as %% before setFormat, so config text like 100% renders correctly and nothing crashes.

Файлы

ChatControl-1.2.3.jar(70.22 KiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

1.2.3

Загрузчики

Bukkit
Folia
Paper
Purpur
Spigot

Версии игры

1.21–26.2

Загрузок

78

Дата публикации

16.08.2026

Загрузил

ID версии

Главная