Tags
Creators
Details
Licensed MIT
Published 3 months ago
Updated last month
All versions
1.3.0
Release
hChat 1.3.03 months ago 62
Compatibility
Minecraft: Java Edition
26.2
26.1.x
1.21.x
1.20.x
1.19.x
1.18.x
Platforms
Bukkit
Paper
Purpur
Spigot
Changes
[1.3.0] 2026-08-09
Added
🛡️ Moderation
/slowmode <seconds|off|status>— global per-player chat cooldown kept in memory (never rewritesconfig.yml, comments preserved), with configurable bypass permission (hchat.slowmode.bypass)./chatlock on|off|status— locks the whole chat; staff withhchat.chatlock.bypasskeep talking.- Staff chat
/sc— private staff channel with its own format and optional console logging (staff-chat.*). - Mass mentions
@everyone/@here— permission-gated (hchat.mention.everyone/hchat.mention.here) with per-token cooldown and sound;@hereonly reaches players in the same world. - Advanced filter chain (
filters:section, config v6): anti-caps (block/mask/lowercase), anti-unicode (zero-width spaces, direction overrides, tag characters, BOM), anti-advertisement (regex patterns + whitelist + fast-fail) and anti-spam (global per-player cooldown + sliding-window flood detection with Levenshtein similarity).WordFilternow runs inside the sameFilterChainpipeline.
💬 Chat & channels
- Per-world channels —
channels.<id>.per-worldstops messages from crossing worlds;{world}placeholder available in channel formats. - Default channel by permission —
channels.default-by-permissionjoins the first matching channel on entry without overriding a persisted choice. - Channel action-bar hints — 3-second action bar with the active
channel after switching (
channels.hint-on-switch) and on join (channels.hint-on-join). - Chat replay —
/hchat replay [player]reprints the last lines of chat (ring buffer,replay.capacity, default 50) and/hchat replay clear-bufferempties it. Channels with a see-permission are never buffered. - Mention highlight — bold highlight on top of the mention color
(
mentions.highlight). A real background color is not possible in vanilla chat (AdventureStylehas no background), so the highlight is bold text. - Click-to-reply on global chat — the previously unused
hover-text.formatnow renders the hover tooltip +/msgsuggestion on public chat.
🧑🤝🧑 Social & QoL
/dnd [on|off]— completes the DND feature: DMs to a DND player are blocked with a lang message;hchat.bypass.dndoverrides./ping [player]and/seen <player>./afk [message]— built-in AFK with automatic inactivity detection (afk.auto-timeout-seconds), activity-based unset (movement/chat/commands/interactions), chat announcement when returning (afk.notify-unset) and integration with the[afk]chat token (built-in state first, PAPI fallback)./hchat mail read|clear|send— offline messages now keep the sender + timestamp; joining shows a clickable summary (offline-messages-pending) instead of auto-delivering, and/hchat mail readlists them with a reply suggestion.- Silenced-DM action bar — when a DM is not delivered (receiver has
DND or ignores the sender), the sender sees the configurable
direct-messages.silenced-action-bar. /hchat aboutand/hchat ignore list(click to unignore).- Death messages — configurable, per-cause death messages
(
death-message.*), replacing the vanilla line.
🔌 API & developer
- Expanded public API —
HChatProvidernow exposeschannelManager(),dndManager(),messageHistory()andbroadcastService(), pluspublishToChannel(channel, message). - Premium extension API —
dev.hauch.hchat.api.premium(PremiumModule,PremiumChatEnhancer) lets a private Premium edition register commands/listeners/managers and hook chat processing (allowChat/transformMessage/transformFormat) without forking the free core. The free distribution never references it and keeps working without it.
🛠️ Build & tests
- Config v7 — new sections
slowmode,chat-lock,staff-chat,death-message,mentions.everyone-*+mentions.highlight,filters:*,replay,afk:*,channels.default-by-permission+channels.hint-*,direct-messages.silenced-action-bar. Automatic migration merges the new keys into existing configs and now backs up the old file once per source version (config-backup-v{n}.yml). - Unit tests — JUnit 5 suite in
core(26 tests) coveringOfflineMessageStore,ChatReplay,FilterAction,ChatChannelandMessageFormatter. CI now runs the tests on every build (removed-DskipTests). - New commands —
/slowmode,/chatlock,/sc,/dnd,/ping,/seen,/afk(plushchat.afkand the other permissions) inplugin.yml.
Fixed
- Mention colors now actually render — the renderer previously
ignored
event.message(), so the mention-color edit was invisible. The message is now built as aComponentwith styled mentions embedded into the rendered format. @everyoneXfalse positive — mass-mention tokens use a word-boundary check, so@everyoneXis no longer treated as@everyone.- Blocked messages no longer consume cooldowns — the mass-mention gate (and the chatlock/slowmode/channel checks) run before any cooldown is recorded.
/dnd on|offstate message — explicit on/off no longer showed the inverted state./slowmodeno longer destroysconfig.ymlcomments — the value is kept in memory, not written back to the file.
Changed
OfflineMessageStoreentries carry sender + timestamp and are only removed when read or cleared (/hchat mail); joining shows a summary.DynamicPlaceholderResolverprefers the built-in AFK state for[afk]; the PAPI placeholder remains the fallback.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:P0DczmuD:z57NTt4p"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:P0DczmuD:z57NTt4p"
}

