Mute & Warning System
Overview
ChatControl provides a hierarchical mute system (player, channel, server, proxy) and a warning points system with configurable thresholds, triggers, and decay. Mutes and warns integrate with rules, spy, and proxy sync.
Mute Architecture
Mute Hierarchy (highest to lowest priority)
code
Proxy mute (all servers) ↓ Server mute (all channels on one server) ↓ Channel mute (one channel) ↓ Player mute (one player)
Key Classes
- •
Mute(model/Mute.java) — mute state management - •
CommandMute(command/CommandMute.java) —/mutecommand - •
CommandUnmute(command/CommandUnmute.java) —/unmutecommand - •
PlayerCache— stores mute state per player
Mute Types
| Scope | Description | Storage |
|---|---|---|
| Player mute | Individual player can't chat | PlayerCache.muteData |
| Channel mute | Entire channel silenced | Channel.mutedUntil |
| Server mute | All chat silenced | Global flag |
| Proxy mute | All servers silenced | Proxy broadcast |
Mute Data Structure
java
class MuteData {
UUID mutedBy; // Who muted
long mutedUntil; // Expiration timestamp (-1 = permanent)
String reason; // Mute reason
MuteType type; // PLAYER, CHANNEL, SERVER, PROXY
String channelName; // For channel mutes
boolean anonymous; // Hide muter identity
}
Common Issues & Solutions
"Muted player can still chat"
- •Check mute is active:
/chc points <player>or check logs - •Check
Mute.Prevent_Writing: true - •Check
Mute.Soft_Mute— if true, they see own messages - •Channel mute only affects that channel; player may chat elsewhere
- •Check
chatcontrol.bypass.mutepermission — bypasses mute
"Mute expires immediately"
- •Duration format:
30s,5m,2h,1d(s/m/h/d suffixes) - •No spaces:
30mnot30 m - •No duration = permanent (
-1timestamp)
"Warning points not accumulating"
- •Check
Warning_Points.Enabled: true - •Check rule uses
warn <setname>operator - •Set name must match a
Sets.<name>in config - •Check rule actually matches (test with
/chc rule test <message>)
"Trigger action not firing"
- •Check
Trigger_Amountthreshold reached - •Check action syntax (console/player/warn/kick)
- •Check
Reset_Points: true/false— if true, points reset after trigger - •Check command exists and works manually
"Proxy mute not syncing"
- •Proxy plugin must be installed on BungeeCord/Velocity
- •
proxy.ymlconfigured with sameServer_Name - •Mute must be
proxyscope (not just server/channel) - •SyncType.MUTE must be enabled in proxy config
"Points not decaying"
- •Check
Reset_Task.Enabled: true - •Check
Reset_Task.Periodisn't too long - •Player must be online for decay (offline players retain points)
Key File Paths
- •Mute:
chatcontrol-bukkit/src/main/java/org/mineacademy/chatcontrol/model/Mute.java - •CommandMute:
chatcontrol-bukkit/src/main/java/org/mineacademy/chatcontrol/command/CommandMute.java - •CommandUnmute:
chatcontrol-bukkit/src/main/java/org/mineacademy/chatcontrol/command/CommandUnmute.java - •Warning Points config:
chatcontrol-bukkit/src/main/resources/settings.yml(Warning_Points section) - •Rule operators:
chatcontrol-bukkit/src/main/java/org/mineacademy/chatcontrol/operator/RuleOperator.java
Reference
For configuration keys, default values, commands, permissions, and variables not covered above, read the source files directly using read_codebase_file. The key file paths above point to the most relevant files.