前言

  笔者开发环境为forge-1.12.2-14.23.5.2768,如果版本号不一样,笔者不能保证该指南的内容对你仍然准确。

  如果你发现指南中有错误、不足之处或其它任何问题,都可以发送邮件到minedreams_ed@outlook.com。

  我会尽量为指南中的问题进行分类,如果你无法从分类中找到你要的问题,请善用浏览器的搜索功能(ctrl + F)。如果指南中没有你的问题,日后如果你自行解决了问题,也欢迎发送邮件给我,帮助我完善指南,同时也帮助其他人开发模组。


JSON 相关

BlockStates

模型旋转问题

  笔者开发模组时一开始尝试使用"x": *, "y": *, "z": *表示模型的旋转角度,但是测试时却发现模型显示异常。后经过更细致的测试,发现blockstates中的json无法绕Z轴旋转模型,只可以通过X Y轴的旋转组合来旋转模型。开始时笔者怀疑是否是因为万向节死锁导致该问题的出现,但是事实证明只旋转Z轴任意角度(45/90/180/270)依然不会有任何效果,所以大概率无法旋转Z轴。

  另外,经测试,旋转模型时不论书写顺序如何,都会按照先X后Y的顺序旋转模型。所以笔者建议书写json文件时也按照先写X轴后写Y轴的顺序,防止错误的发生。

  为了方便开发,这里再说一下旋转轴的位置以及方向:

  • Y轴:Y轴再竖直方向上,从上向下看顺时针为正方向
  • X轴:X轴在东西方向上,从东看向西顺时针为正方向

双端问题

客户端IBlockState数据异常

  笔者在开发模组时遇到了一个特别奇怪的情况:在游戏执行一段时间后我的方块的IBlockState在客户端的数据就变成了默认值,从而导致获取选择框时返回值错误。经过检查,TileEntity和服务端数据均正常,后我又检查了我的所有代码,并在World#setBlockStateChunk#setBlcokState以及ExtendedBlockStorage#set中均打了断点,发现并没有代码触发这些方法。随后我检查了可能更改Chunk数据的位置,最终发现是Chunk#read方法将客户端数据错误的修改了。

  后来我又测试了其他方块有没有这种情况,发现我写的方块大部分都有这种情况。经过一番联想,我突然意识到这可能不是一个BUG,而是MC自身工作原理导致的。随即我又对原版方块进行了测试,发现部分原版方块也有该情况,同时还有一个规律,数据多的方块会有这种情况而数据少的不会。

  最后基本可以得出结论,如果一个方块没有使用meta存储方块数据,那么在Chunk进行数据同步时,客户端便无法获取到正确的IBlockState。所以如果自己写的方块没有使用meta, 那么客户端在进行处理时就不能直接使用方法(指Block类中的方法)传入的IBlockState对象,必须直接从TileEntity中读取所需数据。