You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:57:03