最近在进行Minecraft mod开发过程中,遇到了客户端实体不渲染的问题,详细内容如下。
开发mod版本:Minecraft 1.16.5 Forge
遇到的问题
我要写的实体是一个投掷物,继承原版ProjectileItemEntity
类,这是一个需要实现IRendersAsItem
接口的抽象类,所以这个投掷物应该以物品形式渲染。
我遇到的问题是:该物品在服务端能正常运作(被该投掷物击中的生物会受到伤害),但是客户端并不显示该实体,甚至按 F3+B 也不显示碰撞箱。在已确认实现了渲染器 Renderer 以及试图修改ResourceLocation
后,仍未解决问题。(这说明与ResourceLocation
毫无关系)
解决办法
实体在服务端正常运作而在客户端不显示,这是由于服务端和客户端的通信问题。解决方法是在实现的类中加入以下代码(该内容在 Boson 1.16 Mod 教程中有提到,不过被我忽略了):
@Override
public IPacket<?> createSpawnPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
还有一点需要注意的是,不同版本的函数名称可能有一定差别,需要参考实际使用的 Minecraft 反编译源码中的函数名,直接复制粘贴其他模组的代码会出问题。
参考资料
- Boson 1.16 Mod 教程:从零构建一个实体和数据同步 - Boson 1.16 Modding Tutorial (v2mcdev.com)
- 解决本人问题的帖子:[Solved] [1.14.3] Entity Renderer not rendering - Page 2 - Modder Support - Forge Forums (minecraftforge.net)
- 原版
ProjectileItemEntity
的信息:ProjectileItemEntity (forge 1.16.5-36.2.39) (nekoyue.github.io) - 此外,我在开发过程中有参考暮色森林的代码,并查看了该模组中的投掷物 SlimeProjectileEntity
的实现(参考了该类,但是没有参考它的父类 TFThrowableEntity,父类中就实现了createSpawnPacket()
,不然也不至于 debug 用了一晚上)