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.
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), plusventurechat.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
messagesmay 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
/msgand/tellcrash 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.