Proximity Chat Bubble

Proximity Chat Bubble

Proximity text chat as speech bubbles above the player

15 downloads

Proximity Chat Bubble

Proximity text chat plugin for Folia and (probably) Paper servers chat messages appear as floating speech bubbles above the player's head, readable only by players nearby.

hello

Description

While the plugin is ON, regular chat no longer visible to server chat. Instead each message becomes a text bubble mounted above the speaker, visible to anyone within a configurable radius (default 24 blocks, same world only).

Features

  • True proximity — admission is server-authoritative: clients beyond the radius never receive the bubble entity, so a modified client cannot read distant chat. The client-side view range is only a render cull on top of that guarantee.
  • Anonymous by design — no sender name appears on any surface, and message content is never logged or written to disk. Bubbles are non-persistent display entities.
  • Fail-closed — every failure path ends in "no bubble", never in leaked, frozen, or truncated text.
  • Three modesON (bubbles replace chat), OFF (plugin inert, vanilla chat untouched), SUPPRESSED (chat swallowed, all bubbles cleared). Switch live in-game, from console, or from another plugin via the API.
  • Folia-native — fully region-thread-safe and declared folia-supported; built against the Folia scheduler APIs, which Paper also ships. (was built for folia event so compatibility for paper was not even tested)
  • Hardened input — Unicode NFC normalization; control, invisible, and bidi characters stripped; whitespace collapsed; a code-point length cap that rejects overlong messages instead of truncating them. Bubble text is rendered as a literal component, never parsed as markup.
  • Rate-limited — a per-player minimum interval between accepted messages keeps entity spawns and packet fan-out bounded.
  • Live config/proxchat reload applies every value immediately. Out-of-range values are clamped with a console warning; a config typo never blocks enabling.

Install

  1. Drop the jar into your server's plugins/ folder.
  2. Restart. The plugin starts OFF on first boot — enable it with /proxchat on. The mode persists across restarts.

Requires Folia or Paper 26.1.2 or newer (Java 25 runtime).

Commands

/proxchat <status|on|off|suppress|clear|reload> — permission proxchat.admin (default: op).

Subcommand Effect
status Current mode, live bubble counts, and a config summary
on / off / suppress Switch mode (leaving ON clears every live bubble)
clear Remove all live bubbles without changing the mode
reload Re-read config.yml in place; lists any clamped values

Configuration

Radius, bubble lifetime, stack depth, height, sneak-hide, max message length, rate-limit interval and more — every key is documented in the generated config.yml, applies live on /proxchat reload, and missing keys fall back to defaults so upgrades never require regenerating the file.

API for other plugins

ProxChat registers a ProxChatService with Bukkit's ServicesManager. Declare softdepend: [ProxChat] and look it up lazily:

ProxChatService prox = getServer().getServicesManager().load(ProxChatService.class);
if (prox != null) {
    prox.setMode(Mode.SUPPRESSED); // or enable() / suppress() / disable()
    prox.clearAll();               // remove every live bubble, mode untouched
}

Every method is callable from any thread; mode flips are atomic.

Known quirks (0.3.0)

  • You can't see your own bubble in first person when looking straight up (client rendering of self-passengers); F5 and other players are unaffected.
  • The speaker's vanilla nametag isn't drawn while a bubble is mounted (client behavior); it returns when the last bubble fades.
  • The "message too long" reply shown to the sender is currently French; localizable messages are planned.
  • Stopping the server while players are online can log one harmless Error occurred while disabling ProxChat. Fix planned for 0.4.0.