BungeeCord User Control — whitelisting, banning and proxy-wide broadcasts, as a Velocity plugin.
| Proxy | Velocity 4.2.0 (built against com.velocitypowered:velocity-api:4.2.0) |
| Java | 25 — velocity-api 4.2.0 ships Java 25 class files, so an older JRE cannot load it |
| Build | Gradle wrapper (9.7.1), ./gradlew build |
Artifacts land in build/libs/buc-<version>-velocity.jar.
The command alias defaults to buc and is configurable via buc_command in config.toml.
| Command | Permission | Description |
|---|---|---|
/buc help |
— | Show the command list |
/buc whitelist <on/off> |
buc.whitelist.toggle |
Toggle the whitelist |
/buc whitelist add <playername> |
buc.whitelist.add |
Add a player to the whitelist |
/buc whitelist remove <playername> |
buc.whitelist.remove |
Remove a player from the whitelist |
/buc whitelist reload |
buc.whitelist.reload |
Reload whitelist.json from disk |
/buc ban <playername> [reason] |
buc.ban |
Ban a player permanently |
/buc tempban <playername> <time> [reason] |
buc.tempban |
Ban a player for a while (1d2h3m4s) |
/buc unban <playername> |
buc.unban |
Lift a ban |
/buc broadcast <message...> |
buc.broadcast |
Announce a message to every player on this proxy |
/buc reload |
buc.reload |
Reload the configuration |
All permissions default to deny for players: Velocity grants nothing unless a permission plugin
says so. The console is exempt, as it is for every other BUC command — Velocity's console source
answers true to every permission check.
/buc broadcast <message...>
Delivers one chat message to every player connected to this proxy, no matter which backend server they are currently on, and exactly once each. Players who are attached to the proxy but not yet handed off to a backend receive it too.
- Scope is this proxy only. The player set is
ProxyServer#getAllPlayers(). BUC does not federate the announcement to sibling proxies — if you run several Velocity instances in front of one network, each one broadcasts only to its own players. There is no Redis/plugin-messaging fan-out. - The message is literal. It is never parsed as MiniMessage and never colour-translated, so
<red>,<click:run_command:...>and&ctyped by a sender are displayed as the characters they are and can never turn into a clickable action. Unicode, emoji and runs of interior spaces survive verbatim. Only the configurable prefix around the message carries colour. - The sender is not double-sent. An online sender receives the announcement once, as one of the players, plus a separate acknowledgement line reporting how many players it reached.
- Empty input does nothing.
/buc broadcastwith no text, or with only whitespace, prints the usage line and sends no announcement at all. - An empty network is fine. With nobody online the command reports
0 player(s)and sends nothing. - Every broadcast is written to the proxy log with the sender, the recipient count and the verbatim text.
Example console output with nobody online:
[buc] [CONSOLE] broadcast to 0 player(s): scheduled restart in 5 minutes
messages.toml is copied into the plugin data folder on first start and is never overwritten. Keys
missing from your copy — including everything under [messages.broadcast], command.help.broadcast
and log.broadcast — fall back to the defaults bundled in the jar, so a messages.toml carried over
from an older BUC keeps working without edits.
The broadcast keys are:
[log]
broadcast = "%s broadcast to %s player(s): %s" # sender, count, message
[command]
[command.help]
broadcast = "&3/%s broadcast <message...> &6- &bBroadcast a message to every player on this proxy"
[messages]
[messages.broadcast]
format = "&6[Broadcast] &f%s" # %s is replaced by the sender's text, literally
usage = "&cUsage: /%s broadcast <message...>"
sent = "&aBroadcast delivered to %s player(s)"& is translated to the section sign in the pattern only, never in the broadcast text itself.
Set haproxy to true and add all your HAProxy server IP to the list. Only IPs in this list will enable PROXY protocol support, traffic from other IPs is treated as normal TCP traffic.
Example of HAProxy configuration file:
global
ulimit-n 4096
defaults
log global
mode tcp
option dontlognull
timeout connect 1000
timeout client 150000
timeout server 150000
frontend mc-in
bind *:25565
default_backend mc-out
backend mc-out
server mcbackend1 backend1:25565 send-proxy-v2
server mcbackend2 backend2:25565 send-proxy-v2
source 1.2.3.4 # your haproxy public ip address