COWMODSКаталог модов

hChat

The modern all-in-one chat plugin for Paper

Автор: hauchdev2234обновлён 27 сент. 2026 г.
ДекорУправлениеУтилиты

Описание

hChat — A modern and complete chat system for Paper 1.20+ servers.
Chat channels, direct messages, mentions, moderation (slowmode, chatlock, filters), AFK, staff chat, mail, replay, and more.

Version Stars License Build Paper PlaceholderAPI

Features • Quick Start • Commands • Permissions • Configuration • Localization • Placeholders • Dependencies • Building • Contributing


📋 Table of Contents

Servers & Players


✨ Features

💬 Direct Messages
Customizable format with hover tooltips and click-to-reply
🔔 @Mentions
Configurable sound, highlight color, and personal notification
👁️ Spy Mode
Monitor private messages with a dedicated permission
🚫 Ignore System
Persistent per-player block list that survives reloads
🌍 Multi-language
YAML localization, including per-player language selection
🔗 PlaceholderAPI
%hchat_spy_enabled%, %hchat_ignored%, DND, last seen…
🎨 MiniMessage + Hex
MiniMessage tags, &#RRGGBB hex and classic & codes
🖱️ Hover & Click
Tooltips and clickable actions on every chat line
📦 Broadcasts
Manual /bc plus auto-broadcast scheduler
🛡️ Moderation
Slowmode, chat lock and staff chat (/sc)
🔤 Filter Chain
Word filter + anti-caps, anti-unicode, anti-ad, anti-spam
📜 Chat Logger
Rotating daily logs with configurable retention
📡 Chat Channels
Per-world, per-permission, aliases, cooldowns
📬 Mail
Offline messages with /hchat mail read|clear|send
😴 AFK
Automatic inactivity detection + /afk [message]
📢 Mass Mentions
@everyone / @here with cooldown + sound
⏱️ Ping & Seen
/ping [player] and /seen <player>
🔄 Chat Replay
/hchat replay [player] on a ring buffer

⚡ Quick Start

📥 Installation

# 1. Download the latest JAR from Releases
wget https://github.com/hauchdev/hChat/releases/latest/download/hChat.jar

# 2. Drop it into your server's plugins folder
mv hChat.jar /your-server/plugins/

# 3. Make sure PlaceholderAPI is installed (required). LuckPerms is
#    recommended but no longer required

# 4. Restart or reload your server

hChat generates plugins/hChat/config.yml and plugins/hChat/lang/lang_en.yml on first start. Edit them, then run /hchat reload.


🎮 Commands

CommandAliasesDescriptionPermission
/message <player> <message>/msg, /tell, /w, /m, /whisperSend a private messagehchat.message
/reply <message>/rReply to the most recent private messagehchat.reply
/broadcast <message>/bcBroadcast a message to the whole serverhchat.broadcast
/ignore <player>—Toggle ignoring a specific playerhchat.ignore
/ignore list—List ignored players (click to unignore)hchat.ignore
/spy—Toggle spy mode (see all private messages)hchat.spy
/clear—Clear the chat of every playerhchat.clear
/channel [name]/chList or switch your active chat channelhchat.channel
/slowmode <seconds|off|status>—Global chat slowmode (in-memory, bypassable)hchat.slowmode
/chatlock <on|off|status>—Lock / unlock the whole chathchat.chatlock
/sc <message>—Staff-only chat channelhchat.sc
/dnd [on|off]—Toggle do-not-disturb (blocks incoming DMs)hchat.dnd
/ping [player]—Show your (or someone else's) latencyhchat.ping
/seen <player>—When the player last sent you a messagehchat.seen
/afk [message]—Toggle AFK (auto-detected after inactivity too)hchat.afk
/hchat reload—Reload config.yml and language fileshchat.reload
/hchat help—Show the in-game help menuhchat.help
/hchat lang <lang>—Switch your own player languagehchat.lang
/hchat about—Version, authors and feature overviewhchat.help
/hchat mail <read|clear|send>—Read / clear / send offline messageshchat.help
/hchat replay [player]—Reprint recent chat (optionally filtered by player)hchat.help
/hchat replay clear-buffer—Empty the replay bufferhchat.clear

⌨️ Tab completion — every command supports it where it makes sense: /hchat completes its subcommands (reload, help, lang, update, filtered by permission) and /hchat lang completes the language codes from lang/; /message and /ignore complete online player names (/message also suggests offline players, since it can deliver offline messages); /channel completes the configured channel ids.


🔒 Permissions

PermissionDefaultDescription
hchat.*opAccess to every hChat command and feature
hchat.messagetrueAllows /msg, /tell, /w, /m, /whisper
hchat.replytrueAllows /reply, /r
hchat.broadcastopAllows /broadcast, /bc
hchat.broadcast.coloropAllows color codes inside broadcast messages
hchat.ignoretrueAllows /ignore <player>
hchat.spyopAllows toggling /spy
hchat.spy.allopReceive every private message without exception
hchat.clearopAllows /clear
hchat.reloadopAllows /hchat reload
hchat.helptrueAllows /hchat help
hchat.langtrueAllows /hchat lang <lang>
hchat.channeltrueAllows /channel and channel switching
hchat.slowmodeopAllows /slowmode
hchat.slowmode.bypassopBypass the global chat slowmode
hchat.chatlockopAllows /chatlock
hchat.chatlock.bypassopKeep talking while the chat is locked
hchat.scopAllows /sc staff chat
hchat.dndtrueAllows /dnd
hchat.bypass.dndopSend DMs to players with DND enabled
hchat.pingtrueAllows /ping
hchat.ping.othersopAllows /ping <player>
hchat.seentrueAllows /seen
hchat.afktrueAllows /afk
hchat.mention.everyoneopAllows using @everyone
hchat.mention.hereopAllows using @here
hchat.monitor.filteropReceive warnings when the word filter trips on a player
hchat.bypass-logopSend private messages without writing them to the chat logger

⚙️ Configuration

config.yml is generated automatically on first start. The same file also controls every audio / visual cue the plugin emits.

📄 View full config.yml
# config-version is bumped automatically when new options are added;
# your settings are always kept (old file backed up as
# config-backup-v{n}.yml).
config-version: 10

lang: en
debug: false

update-checker:
  enabled: true
  notify-admins: true
  project: "hchat"

chat:
  default-format: "&7%luckperms_prefix% {player} %luckperms_suffix%&8: &f{message}"
  hex-colors: true
  formats:
    vip:
      permission: hchat.chat.format.vip
      format: "&6&lVIP &8» &e{prefix}{player}{suffix} &8: &f{message}"
    mvp:
      permission: hchat.chat.format.mvp
      format: "&b&lMVP &8» &b{prefix}{player}{suffix} &8: &7{message}"
    admin:
      permission: hchat.chat.format.admin
      format: "&c&lADMIN &8» &c{prefix}{player}{suffix} &8: &7{message}"

# Dynamic chat tokens: [ping] [item] [coords] [world] [afk]
placeholders:
  ping:
    enabled: true
    symbol: "▪"
    show-value: true
    value-suffix: "ms"
    good-max: 80
    medium-max: 150
    good-color: "&a"
    medium-color: "&e"
    bad-color: "&c"
    value-color: "&7"
  item:
    enabled: true
  coords:
    enabled: true
    format: "&7({x}, {y}, {z})"
  world:
    enabled: true
    format: "&7{world}"
  afk:
    enabled: true
    placeholder: "%essentials_afk%"
    afk-values: ["yes", "true"]
    format: "&c[AFK]&r "

welcome:
  enabled: true
  message: "&a&lWelcome &e{player} &a&lto the server!"
  hide-vanilla: true
  motd-on-join: false
  sound:
    enabled: true
    sound: "entity.player.levelup"
    volume: 0.6
    pitch: 1.0
  first-join:
    enabled: true
    message: "&6&l★ &e{player} &6just joined for the first time!"
    hide-vanilla: true

quit:
  enabled: true
  message: "&c{player} &7left the server."
  hide-vanilla: true

mentions:
  sound:
    enabled: true
    sound: "entity.experience_orb.pickup"
    volume: 1.0
    pitch: 1.0
  colors:
    enabled: true
    color: "&#54A3FF"
  # Bold highlight (a real background color is not possible in chat).
  highlight: true
  everyone-permission: hchat.mention.everyone
  here-permission: hchat.mention.here
  everyone-cooldown-seconds: 60
  everyone-sound:
    enabled: true
    sound: "entity.wither.spawn"
    volume: 1.0
    pitch: 1.0

direct-messages:
  sender:
    format: "&7[&eYou &7-> &e{receiver}&7] &7{message}"
    hover-text:
      enabled: false
  receiver:
    format: "&7[&e{sender} &7-> &eYou&7] &7{message}"
    hover-text:
      enabled: true
  clickable-actions:
    enabled: true
    reply-command: "/msg {sender}"
  silenced-action-bar:
    enabled: true
    text: "&e{receiver} is muted - the message was not delivered."

spy-format: "&e{sender} &7-> &e{target}&7: &7{message}"

hover-text:
  enabled: true
  format:
    - "&#54FF7F %player_name%"
    - "&7"
    - "&eClick to send a private message"

channels:
  default-by-permission:
    - permission: hchat.channel.default.vip
      channel: vip
  hint-on-switch: true
  hint-on-join: true
  global:
    range: -1
  local:
    format: "&8[Local] &7{player} &8» &f{message}"
    range: 80
    action-bar-hint: "&eThere are people talking near you"
    alias: "#l"
  staff:
    format: "&c[Staff] {player} &8» &f{message}"
    speak-permission: hchat.channel.staff
    see-permission: hchat.channel.staff.see
    alias: "#staff"
  vip:
    format: "&e[VIP] {player} &8» &f{message}"
    speak-permission: hchat.chat.format.vip
    alias: "#vip"
  trade:
    format: "&6[Trade] {player} &8» &f{message}"
    cooldown-ms: 5000
    alias: "#trade"
  world:
    format: "&7[{world}] {player} &8» &f{message}"
    range: -1
    per-world: true
    alias: "#world"

broadcast:
  enabled: true
  cooldown-ms: 0
  format:
    - ""
    - "&#2791F5Broadcast:"
    - "{message}"
  example1:
    enabled: true
    message: "&#F52727This broadcast sent every 10 minutes. Edit in /hChat/config.yml"
    interval: 600
    display-in-console: true

offline-messages:
  max-pending: 10
  sound:
    enabled: true
    sound: "entity.experience_orb.pickup"
    volume: 1.0
    pitch: 1.0

logging:
  private-messages:
    enabled: true
    path: logs
    retention-days: 30

word-filter:
  enabled: true
  words: ["blacklist1", "blacklist2"]
  action: "block"   # block | mask | warn

# Advanced filters (config v6): anti-caps, anti-unicode, anti-ad,
# anti-spam - see the "Filters" section below.
filters:
  anti-caps:
    enabled: true
    max-uppercase-percent: 70
    min-length: 8
    action: "mask"
  anti-unicode:
    enabled: true
    block-invisible: true
    action: "block"
  anti-ad:
    enabled: true
    patterns:
      - "(?<![a-zA-Z0-9])([a-z0-9-]+\\.)+(com|net|org|gg|io)"
      - "(discord\\.gg/|discordapp\\.com/invite/)"
    sensitivity: medium
    whitelist:
      - "tu-servidor.com"
      - "discord.gg/tuinvite"
    action: "warn"
  anti-spam:
    enabled: true
    global-cooldown-ms: 1500
    flood:
      max-messages: 5
      window-seconds: 3
      similarity-threshold: 0.8
    action: "block"

replay:
  capacity: 50

afk:
  enabled: true
  auto-timeout-seconds: 300
  check-interval-seconds: 30
  unset-on-activity: true
  notify-unset: true

slowmode:
  enabled: true
  seconds: 3
  bypass-permission: hchat.slowmode.bypass

chat-lock:
  enabled: true
  bypass-permission: hchat.chatlock.bypass

staff-chat:
  format: "&c[Staff] {player} &8» &f{message}"
  log-to-console: true

death-message:
  enabled: true
  format: "&c☠ &7{player} &fdied by {cause}"
  custom:
    FALL: "&c{player} learned to fly."
    LAVA: "&c{player} made friends with the magma."

🔁 Available placeholders

PlaceholderReplaced with
{sender}Sender's display name
{receiver}Recipient's display name
{target}Target name (spy view)
{message}The actual message body
{player}Player name (mentions, offline messages, etc.)
%player_name%Resolved by PlaceholderAPI for any hook registered on it

The renderer resolves every entry in two passes: first placeholders are substituted, then MessageFormatter parses the format. How formats are parsed is controlled by chat.format-mode:

ModeBehavior
legacyClassic & codes + &#RRGGBB hex (default, backwards compatible)
minimessageMiniMessage tags (<red>, <gradient:red:blue>, <#RRGGBB>, hover/click) — classic & codes and &#RRGGBB hex are still translated
autoLegacy when the format contains & codes, MiniMessage otherwise

Every channel can override the global mode with its own format-mode key, so a global channel in legacy and a staff channel in MiniMessage can coexist. Player-typed text is always escaped under MiniMessage modes: players can use & colors but cannot inject tags, click or hover events.

🎯 Dynamic chat tokens

hChat renders the following NoNChat-style tokens itself, inside every chat format (default format, chat.formats.* and channel formats):

TokenReplaced with
[ping]Colored latency indicator (green ≤ good-max, yellow ≤ medium-max, red above) with optional ms value
[item]Main-hand item; hover shows a tooltip with name, enchantments, durability bar and lore
[coords]Player position as x, y, z
[world]Current world name
[afk][AFK] prefix when the player is away (built-in /afk + inactivity detection, PAPI fallback)

Example format: "[ping] [afk]&7{player}&8: &f{message}". Each token can be enabled/disabled and tuned under the placeholders: section of config.yml (ping colors/thresholds, coords/world formats, the AFK placeholder and its afk-values). Tokens are resolved at the Component level after PAPI, so a literal [ping] typed by a player is never turned into an indicator.


📡 Chat Channels

Channels give every conversation its own format, visibility range, permissions and cooldown. Ship config includes global, local (distance-based), staff, vip, trade and world (per-world).

FeatureWhere
Channel format, range, cooldown, aliaseschannels.<id>.*
Per-channel MiniMessage overridechannels.<id>.format-mode
Speak / see permissionsspeak-permission, see-permission
Distance-based local chat + action-bar hintrange, action-bar-hint
Per-world channel (never crosses worlds)per-world: true + {world}
Auto-join by permission on entrydefault-by-permission
Action-bar hint on switch / joinhint-on-switch, hint-on-join
channels:
  local:
    format: "&8[Local] &7{player} &8» &f{message}"
    range: 80
    action-bar-hint: "&eThere are people talking near you"
    alias: "#l"
  staff:
    format: "&c[Staff] {player} &8» &f{message}"
    speak-permission: hchat.channel.staff
    see-permission: hchat.channel.staff.see
    alias: "#staff"

In game: /channel lists channels (click to switch), /channel <name> switches your active channel (remembered between sessions) and #staff hello sends to a channel from anywhere. The default channel (global) uses chat.default-format / the permission-based chat.formats (vip/mvp/admin).


🌐 Localization

Language files live in plugins/hChat/lang/. The plugin ships lang_en.yml and supports any number of additional files.

# lang_es.yml
no-permission: "&cYou do not have permission!"
player-only: "&cOnly players can use this command!"
player-offline: "&cPlayer is offline!"
mentioned: "&#ffffffYou were mentioned in chat by &#84FFB8{player}!"

Switch the server-wide language from config.yml:

lang: es

Each player can also override their own language with /hchat lang <lang> (stored in plugins/hChat/storage/player-lang.yml). At runtime, messages are looked up in the per-player file first and fall back to the server-wide lang setting from config.yml when the key is missing or the player has not chosen a language.


🔌 Placeholders

When PlaceholderAPI is installed, hChat registers the placeholders listed below.

PlaceholderDescription
%hchat_spy_enabled%Spy Mode: Enabled / Spy Mode: Disabled
%hchat_ignored%You are ignoring players / You are not ignoring anyone
%hchat_ignored_<name>%Per-player ignore check (true / false, case-insensitive)
%hchat_ignored_count%Number of players this player is currently ignoring
%hchat_dnd_enabled%DND: Enabled / DND: Disabled
%hchat_last_sender%Name of the player who most recently sent you a private message
%hchat_last_message_part%First 30 characters (with ellipsis) of the last private message you received
%hchat_last_seen%Received N minutes ago / No recent messages

Any placeholder that resolves against a player who is currently offline returns the safe (no-player) phrasing defined in lang_en.yml.


🛡️ Filters

Every chat message runs through a filter chain in this order: word-filter → anti-unicode → anti-caps → anti-ad → anti-spam. Each filter supports the same actions:

ActionBehavior
blockDrops the message and notifies the sender with message-filtered.
maskReplaces the offending part with *, then forwards the message.
warnLets the message through and pings every player with hchat.monitor.filter.
lowercaseTransforms the message to lowercase (anti-caps).

Word filter

word-filter:
  enabled: true
  words:
    - "blacklist1"
    - "blacklist2"
  action: "block"   # block | mask | warn

Anti-caps

Blocks / masks / lowercases messages that are mostly uppercase (max-uppercase-percent, min-length).

Anti-unicode

Blocks invisible characters used to bypass filters: zero-width spaces, direction overrides, BOM, tag characters (U+E0000+) and soft hyphens.

Anti-advertisement

Matches URLs and Discord invites with configurable regex patterns plus a whitelist (substring match) that always passes.

filters:
  anti-ad:
    enabled: true
    patterns:
      - "(?<![a-zA-Z0-9])([a-z0-9-]+\\.)+(com|net|org|gg|io)"
      - "(discord\\.gg/|discordapp\\.com/invite/)"
    whitelist:
      - "tu-servidor.com"
    action: "warn"

ℹ️ The default TLD list omits me on purpose — help.me would false-positive on normal prose.

Anti-spam

A global per-player cooldown (global-cooldown-ms) plus flood detection: more than max-messages within window-seconds, or a near-identical repeat (similarity-threshold), are blocked.

filters:
  anti-spam:
    enabled: true
    global-cooldown-ms: 1500
    flood:
      max-messages: 5
      window-seconds: 3
      similarity-threshold: 0.8
    action: "block"

📦 Broadcasts

/broadcast <message> (alias /bc) shows a configurable multi-line broadcast to every player on the server. The format is set under broadcast.format in config.yml and supports placeholders plus hex colors. Players with hchat.broadcast.color can use color codes inside the broadcast body.

For scheduled announcements, drop additional entries under broadcast.<id> with enabled, message, interval (in seconds) and display-in-console:

broadcast:
  example1:
    enabled: true
    message: "&#F52727This is a recurring broadcast every 10 minutes"
    interval: 600
    display-in-console: true

The scheduler is implemented in AutoBroadcastManager.

ℹ️ Discord bridge: when DiscordSRV is installed at startup, hChat logs a confirmation and reserves the integration for the upcoming chat bridge (see ROADMAP.md). No broadcast or /msg is currently relayed to Discord.


📨 Mail (Offline Messages)

If a player runs /msg Steve hola while Steve is offline, the message is stored with the sender name and timestamp in OfflineMessageStore (capped at offline-messages.max-pending per recipient). When Steve logs in he sees a clickable summary — &eYou have 3 pending messages. Click to read. — instead of automatic delivery:

CommandWhat it does
/hchat mail readLists every pending message (click to reply)
/hchat mail clearPurges your own pending messages
/hchat mail send <p> <msg>Shortcut for /msg

Messages are only removed when read or cleared, and a sound plays on join if offline-messages.sound.enabled: true. If the target has never joined the server (hasPlayedBefore() == false), /msg falls back to the standard player-not-found message.


😴 AFK

hChat has a built-in AFK system — no Essentials needed:

  • /afk toggles it; /afk <message> goes AFK with a reason.
  • After afk.auto-timeout-seconds (default 300) of inactivity, players are marked AFK automatically.
  • Any real activity (movement, chat, commands, interactions) removes the state (afk.unset-on-activity); returning players are announced in chat (afk.notify-unset).
  • The [afk] chat token uses this state (with a PAPI fallback when the built-in feature is disabled).

🔌 Developer API

HChatProvider is the public entry point for other plugins. Get the singleton, then use its accessors:

import dev.hauch.hchat.api.HChatProvider;
import dev.hauch.hchat.model.ChatChannel;

public class MyListener implements Listener {

    public void demo() {
        HChatProvider api = HChatProvider.get();

        // who is spying right now
        for (java.util.UUID uuid : api.spyManager().getSpies()) {
            // ...
        }

        // last private message received by a player
        api.messageHistory().getLastMessage(player.getUniqueId());

        // the player's active channel
        ChatChannel channel = api.channelManager().activeChannel(player);

        // broadcast through an existing channel (staff, vip, ...),
        // honoring its see-permission
        api.publishToChannel(api.channelManager().get("staff"),
                "Server restarting in 5 minutes!");

        // DND state
        api.dndManager().isDnd(player);
    }
}

ℹ️ HChatProvider.get() throws IllegalStateException before the plugin is fully initialized (first ticks). Access it from ServerLoadEvent or later. Other plugins depending on hChat should declare it as a softdepend (or depend) in their plugin.yml.


🌐 Proxy note (Velocity / BungeeCord)

hChat runs inside the backend servers, not on the proxy:

  • Player#getUniqueId and %player_name% keep working behind Velocity and BungeeCord — Paper forwards the real UUID and name to the backend.
  • Private messages, offline messages, ignore and DND state are per backend server. A player connected to server A cannot /msg a player on server B; for cross-server chat use a proxy-side solution or the DiscordSRV bridge.
  • {world} and [coords] placeholders resolve on the backend the player is currently on.
  • The update checker, faststats.dev metrics and the auto-broadcast scheduler run once per backend instance — disable auto-broadcast on all but one server if you run a network and do not want duplicated announcements.

🧩 Dependencies

✅ Required

PluginVersionPurpose
Paper1.20+Server API (Adventure, AsyncChatEvent)
PlaceholderAPI2.11+Placeholders, Vault/LuckPerms bridge

🟡 Optional (softdepend)

PluginPurpose
LuckPermsPermission management (recommended; no longer required)
VaultEconomy + chat formatting hook
DiscordSRVDetected at startup; full cross-chat bridge planned for a future release

If DiscordSRV is present at startup, hChat logs a confirmation so admins know the hook is registered. Forwarding of /msg and /broadcast to Discord is not implemented yet — see ROADMAP.md for the planned bridge.

📊 Metrics (faststats.dev)

hChat bundles faststats.dev for anonymous plugin statistics — no extra download needed and nothing to configure: metrics are always on. No player or chat data is ever collected, only anonymous plugin usage counters.


🛠️ Building from Source

Requirements: JDK 21 and Maven 3.5+.

# Clone the repository
git clone https://github.com/hauchdev/hChat.git
cd hChat

# Compile & package
mvn clean package

# The shaded JAR is at: plugin-dist/target/hChat-<version>.jar

ℹ️ Releases — the plugin version lives in one place: the <revision> property at the top of the root pom.xml. Change it there (or pass -Drevision=1.3.0 to Maven) and every module, the filtered plugin.yml version and the final jar name follow automatically. You never have to touch the other 13 POM files.

CI is wired through .github/workflows/build.yml: every push to dev runs mvn clean verify. Tagged v* builds additionally publish a GitHub Release with the packaged JAR.


🤝 Contributing

Pull requests and ideas are very welcome.

Report Bug Submit PR Discussion

Please follow Conventional Commits (Spanish or English both fine), update lang_en.yml / plugin.yml / README.md whenever you add a command, permission, or feature, and make sure mvn clean verify stays green. See ROADMAP.md for the larger picture and upcoming phases.


📄 License

Released under the MIT License.
License


Made with ❤️ by Hauchdev

Галерея

Последние версии

Все версии →
release

hChat 1.4.1

1.4.1
27 сент. 2026 г.114Minecraft: 1.18, 1.18.1, 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 26.1, 26.1.1, 26.1.2, 26.2, 26.3bukkit, paper, purpur, spigot
Скачать
Что нового
## [1.4.1] 2026-09-27 ### Fixed - **faststats.dev metrics failed to start** — the metrics context was created without any service attached, which the SDK rejects at startup ("Context created without any service attached, was this intentional?"). The metrics service is now attached during initialization and anonymous usage statistics are submitted correctly.
release

hChat 1.4.0

1.4.0
27 сент. 2026 г.6Minecraft: 1.18, 1.18.1, 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 26.1, 26.1.1, 26.1.2, 26.2, 26.3bukkit, paper, purpur, spigot
Скачать
Что нового
## [1.4.0] 2026-09-20 ### Added #### 🎨 Chat & formatting - **MiniMessage support** — new `chat.format-mode` global option with three parsing modes: - `legacy` — classic `&` codes + `&#RRGGBB` hex (default, fully backwards compatible). - `minimessage` — [MiniMessage](https://docs.advntr.dev/minimessage) tags (`<red>`, `<gradient:red:blue>`, `<#RRGGBB>`, hover/click, transitions…); classic `&` codes and `&#RRGGBB` hex are still translated so existing formats keep working. - `auto` — legacy when the string contains `&` codes, MiniMessage otherwise. - **Per-channel format-mode override** — every channel under `channels.<id>` can set its own `format-mode` (e.g. a legacy `global` and a MiniMessage `staff` channel can coexist). - **Injection-safe player messages** — under MiniMessage modes, player-typed text is escaped before rendering: players keep their `&` colors but can no longer inject MiniMessage tags, click or hover events into chat. #### ⚙️ Configuration - **Config v10** — new `chat.format-mode`, per-channel `channels.<id>.format-mode` and `update-checker.project` keys; the automatic migration merges them into existing configs and removes the obsolete `metrics` section (your other settings are always kept). ### Changed - **Update checker now uses Modrinth** — the startup and `/hchat update` checks query the Modrinth API instead of GitHub Releases. The project is configurable via the new `update-checker.project` key (a Modrinth slug or a full modrinth.com project URL; default `hchat`). Alpha and beta versions are skipped, so admins are only notified about stable releases. - **LuckPerms is now a soft dependency** — moved from `depend` to `softdepend` in `plugin.yml`. Detection happens at runtime and every feature degrades gracefully; servers using another permissions plugin can now run hChat. - **Metrics: bStats → faststats.dev** — anonymous usage metrics are now sent to [faststats.dev](https://faststats.dev). They are always on and need no configuration. The library is shaded and relocated (`dev.hauch.hchat.lib.faststats`) to avoid classpath collisions. ### Removed - **bStats** — the `org.bstats` dependency, `metrics.enabled` toggle wiring in the entry point and the bStats shading/relocation rules are gone.
release

hChat 1.3.0

1.3.0
9 авг. 2026 г.62Minecraft: 1.18, 1.18.1, 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 26.1, 26.1.1, 26.1.2, 26.2bukkit, paper, purpur, spigot
Скачать
Что нового
## [1.3.0] 2026-08-09 ### Added #### 🛡️ Moderation - **`/slowmode <seconds|off|status>`** — global per-player chat cooldown kept in memory (never rewrites `config.yml`, comments preserved), with configurable bypass permission (`hchat.slowmode.bypass`). - **`/chatlock on|off|status`** — locks the whole chat; staff with `hchat.chatlock.bypass` keep 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; `@here` only 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). `WordFilter` now runs inside the same `FilterChain` pipeline. #### 💬 Chat & channels - **Per-world channels** — `channels.<id>.per-world` stops messages from crossing worlds; `{world}` placeholder available in channel formats. - **Default channel by permission** — `channels.default-by-permission` joins 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-buffer` empties 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 (Adventure `Style` has no background), so the highlight is bold text. - **Click-to-reply on global chat** — the previously unused `hover-text.format` now renders the hover tooltip + `/msg` suggestion 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.dnd` overrides. - **`/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 read` lists 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 about`** and **`/hchat ignore list`** (click to unignore). - **Death messages** — configurable, per-cause death messages (`death-message.*`), replacing the vanilla line. #### 🔌 API & developer - **Expanded public API** — `HChatProvider` now exposes `channelManager()`, `dndManager()`, `messageHistory()` and `broadcastService()`, plus `publishToChannel(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) covering `OfflineMessageStore`, `ChatReplay`, `FilterAction`, `ChatChannel` and `MessageFormatter`. CI now runs the tests on every build (removed `-DskipTests`). - **New commands** — `/slowmode`, `/chatlock`, `/sc`, `/dnd`, `/ping`, `/seen`, `/afk` (plus `hchat.afk` and the other permissions) in `plugin.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 a `Component` with styled mentions embedded into the rendered format. - **`@everyoneX` false positive** — mass-mention tokens use a word-boundary check, so `@everyoneX` is 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|off` state message** — explicit on/off no longer showed the inverted state. - **`/slowmode` no longer destroys `config.yml` comments** — the value is kept in memory, not written back to the file. ### Changed - **`OfflineMessageStore`** entries carry sender + timestamp and are only removed when read or cleared (`/hchat mail`); joining shows a summary. - **`DynamicPlaceholderResolver`** prefers the built-in AFK state for `[afk]`; the PAPI placeholder remains the fallback.
release

hChat 1.2.6

1.2.6
8 авг. 2026 г.14Minecraft: 1.18, 1.18.1, 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.10, 1.21.11, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 26.1, 26.1.1, 26.1.2, 26.2bukkit, paper, purpur, spigot
Скачать
Что нового
## [1.2.6] 2026-08-08 ### Added - **Command tab completion** — `/hchat` now completes its subcommands (`reload`, `help`, `lang`, `update`, filtered by permission) and `/hchat lang` completes the available language codes; `/message` also suggests offline players (offline delivery is supported), joining the existing player-name completion of `/ignore` and channel completion of `/channel`.
release

hChat 1.2.3

1.2.3
25 июл. 2026 г.12Minecraft: 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6bukkit, paper, purpur, spigot
Скачать
release

hChat 1.1.2

1.1.2
19 июл. 2026 г.15Minecraft: 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6bukkit, paper, purpur, spigot
Скачать
Что нового
## [1.1.2] – 2026-07-19 > Items in this section map to commits `fix: some error in pom.xml`, > `fix: HChat.java` (×2) and `chore: implement new functions` on the > `dev` branch. Cross-check against `git log v1.1.0..v1.1.1` if you need > the exact diffs; this changelog only records entries that can be > confirmed against the source. ### Fixed - **Build:** corrected malformed dependency declaration in `pom.xml` that caused `mvn clean verify` to fail on JDK 17 + Maven 3.9 (`fix: some error in pom.xml`). - **LangManager:** `languageManager.reload()` now preserves the previously-selected language code after `/hchat reload`, instead of silently resetting to `en`. Confirmed by reading `LanguageManager#reload`, which now scans `loadedLanguages` for the current code before re-applying it. ### Changed - **Build:** bumped Maven Shade Plugin to `3.5.3` and Compiler Plugin to `3.13.0`; reproducible jar ordering is now deterministic across builds (`chore: implement new functions`). - **Docs:** CI status badge in `README.md` now matches the actual workflow name (`build.yml`). ### Deprecated - Nothing. ### Removed - Nothing. ### Security - Nothing.