Fabric 1.17.1客户端模组替换方块生成幽灵块问题求解
问题原因
Minecraft 全版本均采用服务端权威的世界状态管理机制,即便是单人游戏场景,也存在独立的内置集成服务端,世界的最终状态、交互逻辑判定、存档数据全部以服务端存储的内容为准。
你当前仅在客户端侧调用World#setBlockState修改的只是客户端本地的临时渲染状态,数据没有同步到服务端。当右键点击、区块重载、相邻方块更新等动作触发服务端向客户端同步方块状态时,服务端会将原本未修改的方块状态下发到客户端,就会出现方块变回原状态的回弹问题。Block.replace方法本质也是调用的内部setBlockState逻辑,仅在客户端执行同样会出现该问题。
修复方案
根据你的需求可以选择两种实现路径:
方案1:修改永久生效(存入世界存档)
这是绝大多数场景的推荐方案:
- 将方块修改逻辑放到服务端侧执行,不要直接在客户端的输入回调、渲染线程中执行方块修改代码
- 你可以通过Fabric的网络API自定义C2S(客户端发往服务端)的数据包,客户端需要修改方块时发送该数据包到服务端
- 服务端接收到数据包后,在服务端持有的
World实例上调用setBlockState方法,修改完成后服务端会自动将新的方块状态同步给所有加载对应区块的客户端,不会出现回弹问题
方案2:仅客户端临时视觉修改(不存入存档)
如果你的需求只是客户端本地临时显示替换后的方块,不需要保存到存档,也不需要其他玩家看到:
- 不要直接调用原生的
setBlockState方法,原生方法会触发方块更新校验,很容易被服务端的同步逻辑覆盖 - 改为通过自定义方块渲染器、客户端方块状态覆盖的方式实现,仅修改渲染层面的表现,不改动实际的世界状态数据,就不会被服务端同步覆盖。
内容的提问来源于stack exchange,提问作者Lucraft
相关产品推荐
相关产品推荐

