Forge 1.16.5向服务器发送Minecraft原版数据包触发崩溃如何修复?
Minecraft原版数据包发送崩溃修复方案
核心崩溃原因
你创建的SimpleChannel是FML框架提供给Mod传输自定义数据包的专属网络通道,仅会处理你预先注册过的自定义数据包类型。直接将原版CPlayerPacket.RotationPacket通过该自定义通道发送时,服务端无法在该通道的消息注册表中找到对应的处理逻辑,因此抛出Invalid message报错导致崩溃。
修复方法
发送原版数据包不需要使用自定义的INSTANCE通道,直接调用玩家持有的原版网络连接实例发送即可:
把代码中崩溃的行:
INSTANCE.sendToServer(new CPlayerPacket.RotationPacket(1f, 1f, MC.player.isOnGround()));
替换为:
// 1.16及相近版本写法,高版本可根据实际映射调整为send()方法 MC.player.connection.sendPacket(new CPlayerPacket.RotationPacket(1f, 1f, MC.player.isOnGround()));
修改后即可合法发送原版旋转数据包,不会触发通道校验报错。
额外注意事项
- 你当前代码中直接在客户端执行
MC.player.world.setBlockState()的逻辑是无效的,Minecraft采用服务端权威机制,客户端修改的方块状态会在几秒后被服务端同步覆盖,需要将改方块逻辑迁移到服务端执行:可以自己注册一个自定义数据包,客户端触发事件后向服务端发自定义包,服务端校验权限后再执行方块修改操作。 - 如果你后续需要通过自定义
SimpleChannel传输Mod专属数据,需要提前为自定义数据包注册对应的编码器、解码器、服务端/客户端处理器,不能直接发送原版数据包到自定义通道。 - 示例中硬编码的1f旋转参数如果不是业务需要,建议替换为
MC.player.getYaw()、MC.player.getPitch()获取玩家当前实际的旋转角度,避免出现视角异常。
内容的提问来源于stack exchange,提问作者MrRedRhino
相关产品推荐
相关产品推荐

