// Send to all serversBungeeUtil.sendPluginMessage(MyMessages.BROADCAST, "Hello from " + Remain.getServerName());// Multiple parametersBungeeUtil.sendPluginMessage(MyMessages.COIN_UPDATE, player.getName(), 1000);
// Connect player to another serverBungeeUtil.connect(player, "lobby");// Send raw BungeeCord messageBungeeUtil.sendBungeeMessage(player, "GetServer");
// On server A - Player earns coinspublic void addCoins(Player player, int amount) { PlayerData data = PlayerData.from(player); data.addCoins(amount); // Sync to all servers BungeeUtil.sendPluginMessage(MyMessages.COIN_UPDATE, player.getName(), data.getCoins());}// On server B - Listener receives update@Overrideprotected void onMessageReceived(Player player, String serverName, BungeeMessageType action, ByteArrayDataInput data) { if (action == MyMessages.COIN_UPDATE) { String playerName = data.readUTF(); int coins = data.readInt(); Player p = Bukkit.getPlayer(playerName); if (p != null) { PlayerData.from(p).setCoins(coins); } }}
Always define message types as enums implementing BungeeMessageType:
public enum MyMessages implements BungeeMessageType { MESSAGE_TYPE(String.class, Integer.class); // ...}
2
Validate data
Always check if data exists before reading:
if (action == MyMessages.UPDATE) { if (data.available() > 0) { String value = data.readUTF(); }}
3
Handle player offline
Players might not be online when messages arrive:
String playerName = data.readUTF();Player player = Bukkit.getPlayer(playerName);if (player != null && player.isOnline()) { // Process message} else { // Queue for later or ignore}
4
Use @AutoRegister
Always annotate your listener:
@AutoRegisterpublic final class MyListener extends BungeeListener { // ...}
Plugin messages are sent through a random online player. If no players are online, the message won’t be sent.
Messages larger than ~32KB will be rejected! Keep your data small or split into multiple messages.