Sponge Minecraft服务器注册MC|Brand通道报预留通道错误如何解决?
问题原因
org.spongepowered.api.network.ChannelRegistrationException: Reserved channels cannot be registered by plugins异常的核心原因是MC|Brand属于Minecraft官方预留的内置通道,Sponge框架默认禁止第三方插件手动注册这类系统预留通道,因此直接调用getOrCreateRaw方法注册该通道会触发校验失败。
修复方案
不需要手动注册MC|Brand通道,Sponge已经内置了对应事件可以直接监听该通道的消息,有两种可选实现方式:
方案1:监听封装好的ClientBrandEvent(推荐)
Sponge已经对MC|Brand通道的消息做了开箱即用的封装,直接监听ClientBrandEvent即可拿到解析完成的客户端品牌信息,无需自己处理原始字节:
import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.network.ClientBrandEvent; import org.spongepowered.api.entity.living.player.Player; @Listener public void onClientBrandReceive(ClientBrandEvent event) { Player targetPlayer = event.getTargetEntity(); String clientBrand = event.getBrand(); // 已解析好的客户端品牌,如vanilla、forge、liteloader等 // 你的业务逻辑 }
方案2:监听原始通道消息事件
如果你需要读取MC|Brand通道的原始字节数据做自定义处理,可以直接监听ChannelMessageEvent.Raw事件,过滤通道名即可,无需注册通道:
import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.network.ChannelMessageEvent; import org.spongepowered.api.network.ConnectionSide; import org.spongepowered.api.network.ChannelBuf; @Listener public void onRawBrandChannelMessage(ChannelMessageEvent.Raw event) { // 过滤只处理MC|Brand通道的客户端侧消息 if (!"MC|Brand".equals(event.getChannel().getName()) || event.getConnection().getSide() != ConnectionSide.CLIENT) { return; } ChannelBuf rawData = event.getData(); // MC|Brand通道数据格式为VarInt长度 + UTF-8编码的品牌字符串,可直接调用readString读取 String brand = rawData.readString(); // 你的业务逻辑 }
补充说明
不存在允许插件注册MC预留通道的方法,所有预留通道的消息都可以通过监听ChannelMessageEvent.Raw事件处理,其中常用的系统通道Sponge都封装了对应专用事件,直接使用即可。
内容的提问来源于stack exchange,提问作者Elikill58
相关产品推荐
相关产品推荐

