Minecraft Forge 1.7.10自定义TNT实体服务端生成后客户端不渲染问题咨询
问题原因
你遇到的实体不同步问题是1.7.10 Forge版本实体注册的常见踩坑点,核心诱因是重复注册实体导致的全局ID映射冲突:
EntityRegistry.registerModEntity()方法本身已经会自动为mod实体分配合法的全局唯一ID,不需要你提前手动调用EntityRegistry.registerGlobalEntityID()- 手动调用
registerGlobalEntityID()后再调用registerModEntity()相当于为同一个实体类注册了两次ID,导致FML的实体映射表混乱,服务端发送的实体同步数据包携带的ID客户端无法识别,自然不会生成对应的客户端实体。
你删掉if(world.isRemote) return;后能临时显示,是因为此时客户端本地直接生成了实体,不需要依赖服务端同步,和你的测试结果完全吻合。而原版EntityTNTPrimed可以正常工作,是因为原版实体已经在游戏启动时完成了合法注册,不会被重复注册逻辑影响。
修复方案
1. 修改实体注册逻辑
直接移除registerTnt方法中手动调用EntityRegistry.registerGlobalEntityID()的代码即可,修改后的注册逻辑如下:
private static void registerTnt(final Class primed, String name, final int id) { proxy.registerTntRenderer(primed, registerBlock(new BlockTNT(primed), name.toLowerCase()+"_tnt")); // 移除手动注册全局ID的代码 EntityRegistry.registerModEntity(primed, "PrimedTnt"+name, id, instance, 160, 10, true); }
2. 确认实体无参构造权限
额外确认所有自定义TNT实体子类的无参构造为public修饰,FML在客户端反射生成实体实例时如果无权限访问构造函数会静默失败,不会抛出明确错误日志。
修改完成后重新测试,服务端生成的实体会自动同步到客户端,渲染和/summon指令生成的实体显示问题都会同步解决。
内容的提问来源于stack exchange,提问作者user17512883
相关产品推荐
相关产品推荐

