BungeeCord插件实现权限绑定聊天前缀 无需子服安装Spigot插件
问题核心原因
你现有代码无法生效的两个核心问题:
- 直接修改
ChatEvent的消息内容无效:BungeeCord默认仅做消息透传,子服会自行处理公屏聊天格式,会覆盖代理端修改的内容 - 没有取消原事件的默认转发逻辑,修改后的内容会和原消息冲突
修改后的完整实现代码
// 未引入对应依赖的话先补全包引用 import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventPriority; public class ChatFormatListener implements Listener { // 设为最高优先级,避免其他代理端插件篡改处理结果 @EventHandler(priority = EventPriority.HIGHEST) public void onPublicChat(ChatEvent e) { // 过滤非玩家发送的消息,避免控制台触发类型转换错误 if (!(e.getSender() instanceof ProxiedPlayer)) { return; } // 过滤指令,仅处理公屏聊天 if (e.getMessage().startsWith("/")) { return; } ProxiedPlayer sender = (ProxiedPlayer) e.getSender(); String rawMsg = e.getMessage(); String rankTag = ""; ChatColor tagColor = ChatColor.WHITE; // 按权限匹配等级标识,可按需扩展更多权限分支 if (sender.hasPermission("VelocityPerm.Founder")) { rankTag = "[FOUNDER]"; tagColor = ChatColor.DARK_RED; } else if (sender.hasPermission("VelocityPerm.Legend")) { rankTag = "[LEGEND]"; tagColor = ChatColor.GOLD; } // 拼装要求的格式:玩家名 [等级标识] 玩家输入内容 TextComponent finalMsg = new TextComponent(sender.getName() + " "); if (!rankTag.isEmpty()) { TextComponent tagComponent = new TextComponent(rankTag + " "); tagComponent.setColor(tagColor); finalMsg.addExtra(tagComponent); } TextComponent msgComponent = new TextComponent(rawMsg); msgComponent.setColor(ChatColor.WHITE); finalMsg.addExtra(msgComponent); // 取消原事件默认转发,避免子服重复处理 e.setCancelled(true); // 同子服内广播:仅发给当前玩家所在子服的所有在线玩家 for (ProxiedPlayer onlinePlayer : sender.getServer().getInfo().getPlayers()) { onlinePlayer.sendMessage(finalMsg); } // 如需跨子服全代理广播,把上面的遍历替换为遍历ProxyServer.getInstance().getPlayers()即可 } }
注意说明
- 所有逻辑完全在代理端实现,无需子服安装任何额外插件
- 若有其他代理端聊天类插件冲突,可自行调整
EventPriority的优先级等级,保证当前逻辑最后执行
内容的提问来源于stack exchange,提问作者Codexis
相关产品推荐
相关产品推荐

