本帖最后由 C、江秋菌 于 2024-4-16 13:07 编辑
注:本教程基于Mcreator软件,当然,解决的思路也可以适用于其他自主使用IDE的MOD开发者,本教程含有轻量的需要一定编程经验才能理解的内容。
在使用geckolib为自己创建实体攻击动画时,Mcreator初学者们往往会发现对于一些较长的攻击动画,往往会出现攻击动画还没有播放完,实体已经完成攻击造成了伤害,这是因为在实体攻击其他实体时,将会调用doHurtTarget方法,这个方法将会立即计算伤害,对此,我们选择一个取巧的办法来使得我们的实体能在播放攻击动画时正确地造成伤害。 首先,默认你的Minecraft版本为1.20.1,API为Forge,并且已经在你的Mcreator中安装了以下插件:geckolib、attributes。同时,我也默认你已经完成了动画实体的初步创建,接下来,转到你的动画页面
将你的实体的攻击动画取消选中,接着保存。(在代码页面,它应该处于如下状态:
) 接下来创建一个流程,如:“(你的实体名字)Attack",之后就是轻松愉快的搭积木时间:
来讲解一下这里的思路吧:首先在我们的动画实体攻击时,我们先取消该事件,此时实体并不会产生攻击伤害,随后播放我们在Blockbench所定义的攻击动画,接下来,我们等待一段时间(根据你的想法,这里的时间也有所不同,例如我这里决定是播放到一半时造成伤害,具体的数值你可以根据自己的实体在游戏中的攻击方式以及表现来决定)。之后,我们来判断两个实体之间的距离以及攻击实体正面是否对着被攻击实体,使用简单的空间内直线距离计算[sqrt(x2-x1)2+(y2-y1)2+(z2-z1)2]即可完成对你实体的攻击距离的实现,这里的数值2可填你想要的攻击距离。之后在自定义代码中输入"!(entity instanceof LivingEntity && ((LivingEntity) entity).isUsingItem() && ((LivingEntity) entity).getUseItem().getItem().equals(Items.SHIELD))"这里的代码可能随着版本的更新而失效这里的自定义代码使得被攻击实体如果没拿着盾牌格挡时,我们后面的造成伤害的部分将会生效,而如果拿着盾牌,那么该伤害将不会生效,同时,将会模拟盾牌格挡伤害的效果。大体的思路讲解完了,如果你想更好的了解该方法,可查看我的github示例库(这个实际上是我的 史诗征程2mod的初步重铸版本的远程工作区), 上不了github的可以用百度网盘链接:https://pan.baidu.com/s/1s_gICoj9-2z-GL9Rqz-1iA提取码:5418 ,代码和Mcreator流程模板都已经放入教程文件夹。
【2024.4.15】在跟其他人讨论后,我决定再次更新一个更适合纯mcr的方法:
如图所示,这是在模拟攻击距离与是否面向的后面的部分的更新。我们可以直接检测被攻击实体是否持有盾牌(此方法只适用于原版盾牌)来决定是否造成伤害,然后不再读取攻击实体的攻击力属性值,而是直接读取攻击伤害量,同时更准确地模拟盾牌的格挡机制,会根据伤害量来对盾牌造成不同的耐久损害。(注:在百度网盘上的ptpl模版有两个,第一个geckolib_attack版本为2023.4,另外一个为2024.1,导入时请注意。)
最后,如果你有更好的方式来解决该问题,也欢迎在帖子下讨论 |