Skip to content

Snowbird Command Bridge (plugin)

Makes /msg, /tell and /w send ChatControl's cross-server private messages instead of vanilla's single-server ones. Players keep the commands they already know.

What it does

  • Takes over the /msg, /tell and /w commands and passes them straight to /chatcontrol:msg.
  • Passes tab complete to ChatControl too, so /msg <tab> lists players on every server, not just the one you are on.
  • Does nothing else. ChatControl does all the argument checks, permissions and delivery.

Why it is needed: /msg, /tell and /w are vanilla Minecraft commands. ChatControl adds its message command after the server starts, and Bukkit will not give it a name that is already taken. So without this plugin the plain names stay vanilla (this server only), and ChatControl's command is only reachable as /chatcontrol:msg. ChatControl's other names (/pm, /whisper, /message, /m, /t) are free and work without help.

How players use it

/msg Steve hi, want to trade?
/tell Steve hi
/w Steve hi

All three work the same, even if Steve is on another server. Reply with /r as usual.

Staff guide

There are no staff commands and no permission nodes of its own. Who can send messages is set by ChatControl's permissions and the CommandWhitelist.

Test as a non-op: /msg <tab> should list players from all servers. /msg <player> hello to someone on another server should arrive, and /r should reply.

Configuration

None. The plugin has no config file. A new jar goes live on a server restart.

Data and storage

None.

Troubleshooting

Symptom Cause Fix
/msg only reaches players on the same server This plugin is not loaded, so vanilla /msg answers Check the jar is in plugins/ and restart
/msg does nothing ChatControl is not installed or failed to load Fix ChatControl first. This plugin only forwards to it
/msg <tab> shows only local players ChatControl's Private_Messages.Allow_Cross_Server_Tab_Complete is off Turn it on in ChatControl's settings

Boot log lines:

[SnowbirdCommandBridge] Bridging /msg, /tell and /w to chatcontrol:msg.

If ChatControl is missing you also see ChatControl is not installed - /msg, /tell and /w will do nothing.

Maintainer notes

  • A command listed in plugin.yml is registered ahead of vanilla. That is how EssentialsX used to own /msg, and it is the trick this plugin uses.
  • commands.yml aliases cannot fix this. Bukkit's command map skips an alias whose name is taken, and it does not fall back to bukkit:msg either.
  • The full argument line is rebuilt word for word and sent with dispatchCommand as the same sender, so ChatControl sees the real player.
  • Tab complete is passed to ChatControl's own command. Without that, Bukkit's default completer would list only players on this server.
  • Shipped with the chat stack to all six backends (Paper hub and the Youer backends).

Building

This repo has no Gradle build. The jar was built by hand: compile the one class against a Paper or Spigot 1.21.1 API jar with Java 21, then package it with plugin.yml.

mkdir -p build/classes
javac --release 21 -cp /path/to/paper-api-1.21.1.jar -d build/classes \
  src/main/java/net/snowbird/cmdbridge/CommandBridge.java
cp src/main/resources/plugin.yml build/classes/
jar cf build/SnowbirdCommandBridge-1.0.0.jar -C build/classes .

Output: build/SnowbirdCommandBridge-1.0.0.jar (the build/ folder is not tracked in git).

Full command, permission and config tables: Reference.