HomeJavaModsAdvancedChat-AC
AdvancedChat-AC
ModsJava

AdvancedChat-AC

AdvancedChatv2 gives every player control over what they see in chat. They can silence the entire public chat, block specific players, view who they have…

⬇ Download on Modrinth
AdvancedChat-AC — screenshot 1

AdvancedChat-AC

Version: 1.0.0  |  Author: Spy  |  API: Spigot / Paper 1.13 – 1.21+

logo

AdvancedChat-AC gives every player control over what they see in chat. They can silence the entire public chat, block specific players, view who they have ignored, and the server automatically stops advertising messages before they reach anyone — all with no lag, no database, and no extra setup.


How It Works — Quick Overview

All of this happens on an async thread — the main server tick is never touched during a chat event.


Installation

  1. Place AdvancedChatv2.jar inside your server's plugins/ folder.
  2. Start or restart the server.
  3. Three files are generated automatically:
    • plugins/AdvancedChatv2/config.yml — all player-facing messages
    • plugins/AdvancedChatv2/block.yml — ad filter word list and domain extensions
    • plugins/AdvancedChatv2/playerdata.json — created on first save, stores toggle and ignore state

No database. No extra plugins. No configuration required to get started.


Commands

/chattoggle

Field Value
Aliases /ctoggle, /tc
Permission advancedchat.toggle
Who can use All players by default

What it does: Toggles whether the player sees public chat.


/ignore <player>

Field Value
Aliases /unignore
Permission advancedchat.ignore
Who can use All players by default
Tab-complete Yes — suggests all currently online players

What it does: Hides or un-hides a specific player's chat messages from you. This is a personal toggle — it only affects what you see. The ignored player is never notified.


/ignorelist

Field Value
Aliases /ilist, /ignoredlist
Permission advancedchat.ignore
Who can use All players by default

What it does: Displays a formatted list of every player you are currently ignoring. Names are resolved from UUID to username using Bukkit's offline player cache — no extra lookups or delays. The list is sorted alphabetically.

If you are not ignoring anyone, a message tells you so and hints how to use /ignore.


Permissions

Permission node What it grants Who has it by default
advancedchat.toggle Use /chattoggle All players
advancedchat.ignore Use /ignore and /ignorelist All players
advancedchat.bypass.filter Send any message without ad-filter checks OPs only

Ad Filter

Every message sent in public chat is scanned before it reaches any player. The scan is done in-memory and adds no measurable overhead. There are three layers of detection:

1. Blocked Words (block.ymlblocked-words)

A list of plain text phrases. If any phrase appears anywhere inside the message (case-insensitive, substring match), the message is blocked.

Examples of what gets blocked with the defaults:

2. Blocked Domain Extensions (block.ymlblocked-extensions)

A list of domain endings. Any word in the message that ends with one of these is treated as a URL and the message is blocked.

Examples:

3. IP Address Detection (always on)

Any text matching the pattern of an IPv4 address (x.x.x.x) is automatically blocked regardless of the lists.

Examples:

What happens when blocked

The message is cancelled — no other player ever sees it. The sender receives the filter-blocked message. No one else is notified. Players with advancedchat.bypass.filter skip all three layers.


Configuration Files

config.yml — Messages

Every message the plugin sends to players. Use & colour codes.

messages:
  chat-disabled:      "&aChat has been &cdisabled&a. Use &f/chattoggle &ato re-enable."
  chat-enabled:       "&aChat has been &aenabled&a. You can now see public chat again."
  now-ignoring:       "&aYou are now ignoring &f{player}&a. Their messages will be hidden from you."
  no-longer-ignoring: "&aYou are no longer ignoring &f{player}&a. You can see their messages again."
  player-not-found:   "&cPlayer &f{player} &cwas not found or has never joined."
  ignore-self:        "&cYou cannot ignore yourself."
  ignore-usage:       "&eUsage: &f/ignore <player>"
  ignorelist-empty:   "&eYou are not ignoring anyone. Use &f/ignore <player> &eto ignore someone."
  ignorelist-header:  "&8&m----&r &eIgnored Players &7({size}) &8&m----"
  ignorelist-entry:   "&7- &f{player}"
  ignorelist-footer:  "&8&m----&r &7Use &f/ignore <player> &7to unignore &8&m----"
  filter-blocked:     "&cYour message was blocked — no advertising allowed."
  players-only:       "&cOnly players can use this command."
  no-permission:      "&cYou do not have permission to use this command."

Placeholders:

Placeholder Works in
{player} now-ignoring, no-longer-ignoring, player-not-found, ignorelist-entry
{size} ignorelist-header

Colour codes:

Code Colour Code Colour
&0 Black &8 Dark Gray
&1 Dark Blue &9 Blue
&2 Dark Green &a Green
&3 Dark Aqua &b Aqua
&4 Dark Red &c Red
&5 Dark Purple &d Light Purple
&6 Gold &e Yellow
&7 Gray &f White
&l Bold &o Italic
&m Strikethrough &n Underline
&r Reset &k Obfuscated

block.yml — Ad Filter Words

blocked-words:
  - "discord.gg"
  - "buy now"
  - "free ranks"
  - "join my server"
  - "youtube.com"
  # add your own entries here

blocked-extensions:
  - ".com"
  - ".net"
  - ".org"
  - ".fun"
  - ".gg"
  - ".xyz"
  - ".io"
  - ".me"
  - ".store"
  - ".online"
  - ".site"
  - ".club"
  - ".tk"
  - ".ml"
  # add more endings here

Changes take effect after a server restart or plugin reload.


Data & Persistence

Player data is saved in plugins/AdvancedChatv2/playerdata.json:

{
  "chatDisabled": [
    "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  ],
  "ignored": {
    "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb": [
      "cccccccc-cccc-cccc-cccc-cccccccccccc"
    ]
  }
}

When saves happen:

A serial counter ensures if multiple async saves queue up at the same time, only the newest snapshot is written. Old in-flight writes are discarded automatically.


RAM & CPU Usage

This section gives exact numbers for every operation the plugin performs so you know precisely what load it adds to your server.


Memory per player

What is stored Bytes per entry Notes
One UUID in chatDisabled ~64 bytes Only stored if player toggled chat OFF
One entry in ignored map (outer) ~64 bytes Only created when player ignores someone
One UUID in an ignore list (inner) ~64 bytes One per ignored player
Player with no toggles or ignores 0 bytes Nothing is stored for inactive players

Real totals by server size:

Players online 10% have chat disabled 5% have ignore lists (avg 5 ignored each) Total plugin RAM
100 players 10 × 64 B = 0.6 KB 5 × 5 × 64 B = 1.6 KB ~2.2 KB
500 players 50 × 64 B = 3.1 KB 25 × 5 × 64 B = 8 KB ~11 KB
1,000 players 100 × 64 B = 6.4 KB 50 × 5 × 64 B = 16 KB ~22 KB
10,000 players 1,000 × 64 B = 64 KB 500 × 5 × 64 B = 160 KB ~224 KB

At any realistic player count the plugin uses well under 1 MB of RAM. The server itself, chunk data, entities, and other plugins will use gigabytes — this plugin is invisible by comparison.


CPU per chat message

Every chat message triggers two operations on the async thread (not the main tick):

Step 1 — Ad filter check

The message is checked against your blocked-words list and domain patterns.

Operation Time per call Notes
One String.contains() word check ~20–50 ns Scans the message for one phrase
One regex domain pattern check ~500–1,000 ns Matches one domain extension
IP address regex check ~500 ns Always runs once
50 words + 20 extensions (typical config) ~30–50 µs total Entire filter check for one message

Step 2 — Recipient filtering

For each player who would receive the message, the plugin does two ConcurrentHashMap.get() lookups — one to check if they have chat disabled, one to check if they are ignoring the sender. Both are O(1) and take ~50–100 ns each.

Recipients online Lookups Time
50 players 100 lookups ~5–10 µs
200 players 400 lookups ~20–40 µs
500 players 1,000 lookups ~50–100 µs
1,000 players 2,000 lookups ~100–200 µs

Total per message (filter + recipient loop):

Players online Time per message Messages per second (10 players chatting) CPU load
100 ~60 µs 10 msg/s = 0.6 ms/s < 0.1% of one core
500 ~150 µs 10 msg/s = 1.5 ms/s < 0.2% of one core
1,000 ~250 µs 10 msg/s = 2.5 ms/s < 0.3% of one core

This entire workload runs on an async thread, isolated from the main server tick. Even if the filter takes longer than expected, TPS is completely unaffected.


Save operations

Operation Thread Time Frequency
Snapshot copy (before async write) Main or quit thread ~5–50 µs Per player quit or command
JSON write to disk Async thread ~1–5 ms Per player quit or command
Shutdown save Main thread ~1–5 ms Once, on /stop

The JSON file is small — even with 10,000 players who all have ignore lists it is unlikely to exceed a few hundred KB. Write time remains under 5 ms. Because writes are async, the main thread is never blocked.


Memory & CPU summary

Metric Value
Plugin RAM at 500 players ~11 KB
Plugin RAM at 1,000 players ~22 KB
CPU per chat message (500 players) ~150 µs, on async thread
Main thread impact during chat Zero
Main thread impact during save Zero (async)
Disk I/O during gameplay Zero
Performance compared to vanilla chat Indistinguishable

Folder Layout

plugins/
└── AdvancedChatv2/
    ├── config.yml          ← all player-facing messages
    ├── block.yml           ← ad filter words and domain extensions
    └── playerdata.json     ← auto-generated, do not edit manually
Verified by MCModsHub

These come from our own check of the pack file, not from the source page.

Explore more