minecraft-server/docs/CHAT-PLUGIN-VENTURECHAT-RESEARCH.md
s8n d25b3d2e0d docs: chat plugin research (ChatChat + VentureChat)
Carbon viewer-context bug: <luckperms_prefix> resolves against viewer
not sender. Researched two open-source alternatives.

Both fix the bug. ChatChat (HelpChat fork) renders per-recipient with
PlaceholderAPI.setPlaceholders(sender, ...) + Kyorifier converts legacy
& codes to MM. VentureChat resolves PAPI once vs sender, splits packets
via ProtocolLib.

Concerns:
- ChatChat: 0 GitHub releases, last commit 2025-04-02, apiVersion 1.21.4,
  uses deprecated AsyncPlayerChatEvent
- VentureChat: built for 1.21.8, open issues #154/#156/#157 report
  1.21.10+ breakage with no maintainer response 4+ months

Both verdicts: cautious recommend. Operator decision pending player
input + migration plan synthesis.
2026-05-07 18:53:13 +01:00

6.3 KiB

VentureChat Research — Replacement for Carbon 3.0.0-beta.36

Date: 2026-05-07 Target: racked.ru (Purpur 1.21.11, single server, no Velocity) Repo: github.com/Aust1n46/VentureChat Verdict (one line): Cautious recommend — architecture fixes the viewer-context bug, but maintainer is slow and 1.21.10/.11 has open bug reports unresolved since Jan 2026.


1. Project Health

Signal Value
Latest release v3.8.0 (2025-08-20) — built for 1.21.8
Last commit on master 2025-08-20 (b9e19e2 — 1.21.8 update)
Previous commit gap 6 months (2025-02 → 2025-08)
Open issues 71 (incl. #157 "update for 1.21.10!!!", #154 sound fix, #155 /msg crashes server, #146 /tell crashes 1.21.4)
Stars 48
License GPL-3.0
API version declared 1.13 (means it should load on 1.21.x but no native Paper API use)

Status: maintained but slow. One active maintainer (Aust1n46). Long gaps between updates. Multiple users requesting 1.21.10+ updates with no response yet. Risky for a 1.21.11 server today — v3.8.0 was tested against 1.21.8.


2. Architecture — Does it fix the viewer-context bug?

Yes, by design. Evidence from src/main/java/mineverse/Aust1n46/chat/utilities/Format.java and listeners/ChatListener.java:

// Format is built ONCE, against the SENDER (icp = MineverseChatPlayer sender):
PlaceholderAPI.setBracketPlaceholders(icp.getPlayer(), placeholder)
format = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), ...));

// Then dispatched per-recipient as a pre-rendered packet — placeholders NOT re-resolved per viewer:
for (Player p : recipients) {
    String json = Format.formatModerationGUI(globalJSON, p, mcp.getName(), channel.getName(), hash);
    PacketContainer packet = Format.createPacketPlayOutChat(json);
    Format.sendPacketPlayOutChat(p, packet);
}

This is the pre-1.19 chat model — VentureChat hooks the legacy AsyncPlayerChatEvent and ships rendered JSON packets via ProtocolLib. It does not implement Paper's AsyncChatEvent ChatRenderer (which is what causes Carbon to re-render the format per viewer and resolve <luckperms_prefix> against each viewer instead of the sender).

Plugin → player sendMessage interception: Not intercepted. VentureChat only acts on the chat event; Player.sendMessage() and Audience.sendMessage() bypass it entirely. Good for plugins that send system messages directly.


3. Feature Parity vs Carbon (only diffs that matter)

Feature Carbon VentureChat
Format syntax MiniMessage Legacy & codes only (no MM, no Adventure Component)
Channels yes yes (alias, distance, perm, color, format, filter, mutable, autojoin, cooldown)
Channel cmd / focus /ch <name> per-channel alias (e.g. /g) + /channel
Mute / ignore yes yes (per-channel mute, time-based mutes 10m/1h/1d)
Mentions / pings yes yes (configurable sound + format)
Profanity filter swap yes yes (regex pattern,replacement)
DiscordSRV yes yes — first-class hook, channel-link config
PAPI yes yes ({vault_prefix}, {player_displayname}, {venturechat_channel_prefix}, sender_*/receiver_*)
MiniPlaceholders yes NO native support — only PAPI bracket placeholders
Vault group prefix via PAPI via Vault directly + {vault_prefix}
Hover/click events MM tags Per-group hover_text / click_action / click_text lists in config
1.19+ signed chat preview-aware Cancels & reships as packets — preview not used
Bungee/Velocity yes yes (irrelevant for racked.ru)

Material gaps: No MiniMessage, no MiniPlaceholders. LP Expansion via PAPI bracket placeholders works (it's just {luckperms_prefix} etc.).


4. Migration Cost: Medium

Concrete breakage list:

  • Format rewrite: every Carbon MM format string <luckperms_prefix><sender_displayname> <gray>»</gray> <message> becomes legacy & form: {luckperms_prefix}{player_displayname} &7» &f{message}. Hover/click move from MM tags to per-group YAML.
  • MiniPlaceholders dropped. If anything in current chat-format uses MM-only tags or MiniPlaceholders-exclusive resolvers, those need PAPI equivalents.
  • Permission rename: carbon.*venturechat.<channel> (e.g. venturechat.global), plus venturechat.mute, venturechat.staffchannel, etc. LuckPerms group nodes need a one-pass rewrite.
  • User data: mute/ignore lists not migratable from Carbon — players re-mute fresh.
  • DiscordSRV config: channels block needs the VentureChat channel name, not Carbon's. Format templates in DiscordSRV messages may need adjustment if they referenced Carbon-specific placeholders.
  • partychat: delete the channel block in config.yml; remove the LP perm grant.

LP &-coded prefixes are already legacy, so they render natively — no Carbon-style <reset> wrapping needed. This is the biggest migration win.


5. Specific Bug Check

Bug Carbon VentureChat
<luckperms_prefix> resolves to viewer's prefix YES (per-viewer ChatRenderer) NO — resolves once against sender (verified in source)
Plugin → player sendMessage silently dropped Possibly intercepted by ChatRenderer Not intercepted — no AsyncChatEvent hook, no Audience interception

6. Performance / Maturity

  • Long-running plugin (originally MineverseChat, ~10 years old, #1 chat plugin on Spigot historically).
  • Memory footprint expected low — no Adventure Component graph, just string ops + JSON.
  • ProtocolLib dependency adds a small overhead per chat packet but is already on the server.
  • No specific 1000+ player evidence found; reviews indicate widespread use on mid-size networks.
  • Risk: open /msg and /tell crash issues on 1.21.4/1.21.5 (#146, #155) — must verify these are fixed in v3.8.0 or test before going live.

Verdict

Cautious recommend. Architecture is the right shape to fix the viewer-context bug — placeholders resolved once against sender, no Paper ChatRenderer pipeline, plugin sendMessage untouched. But v3.8.0 targets 1.21.8 (not .11), maintainer turnaround is months not days, and there are unresolved crash reports on close-by versions. Stage in a test instance against 1.21.11 first.