= 创作分享 =
技术讨论
解决Mcreator中geckolib实体攻击动画与攻击时间不匹配的 ...
C江秋

解决Mcreator中geckolib实体攻击动画与攻击时间不匹配的问题

C江秋 于 2024-2-8 21:59 ( 2月前 ) 发表在 [教程] 分类。 [复制链接] [只看楼主] [打印]
1014 12
本帖最后由 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,导入时请注意。)
最后,如果你有更好的方式来解决该问题,也欢迎在帖子下讨论

点评

一件事只要坚持下去就有意义  发表于 2024-2-10 21:58

评分

参与人数 2RF +10 Vis +4 收起 理由
QQ酱346143 + 5 + 2 给大佬递分
Zi_Min + 5 + 2 好活

查看全部评分

始终在征程上。
发表于 2024-2-8 21:59:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 13 条回复!
C江秋
本帖最后由 C、江秋菌 于 2024-2-18 20:58 编辑

更新了判断被攻击实体是否在攻击实体正面的部分
始终在征程上。
发表于 2024-2-8 22:29:32 | 只看该作者

回复 | 举报

lyxhaha
为什么你的Mcreator的字体那么清晰,而我的像狗屎一样
发表于 2024-2-10 20:03:53 | 只看该作者

回复 | 举报

化龙焚天
发表于 2024-2-10 21:56:57 | 只看该作者

回复 | 举报

C江秋
lyxhaha 发表于 2024-2-10 20:03
为什么你的Mcreator的字体那么清晰,而我的像狗屎一样

如果指可视化编辑器(就是搭积木的地方)里字体看不清的话,先放大试一下,再不济去设置里启用经典字体
始终在征程上。
发表于 2024-2-16 21:47:36 | 只看该作者

回复 | 举报

雾云开发组
为什么我制作出来的模型怪物并没有识别到动画呢,已经确定动画文件名字都没有如何错误
发表于 2024-2-29 00:20:50 | 只看该作者

回复 | 举报

C江秋
Jens_Hon 发表于 2024-2-29 00:20
为什么我制作出来的模型怪物并没有识别到动画呢,已经确定动画文件名字都没有如何错误 ...

github或者mcr工作区我康康
始终在征程上。
发表于 2024-2-29 13:03:47 | 只看该作者

回复 | 举报

C江秋
C、江秋菌 发表于 2024-2-8 22:29
更新了判断被攻击实体是否在攻击实体正面的部分

另外,有什么不懂的还可以加群讨论,我会尽力来解决
Q:959464995
始终在征程上。
发表于 2024-4-13 20:50:55 | 只看该作者

回复 | 举报

ExpCreeper
感谢大佬,这个计算直线距离公式帮了大忙了
话说为何不直接为生物新建一个自定义伤害类型,然后把对实体造成伤害的块里面的伤害源类型改成 由源实体造成的自定义伤害类型
的伤害源,再在取消事件前多加一个判断 非自定义伤害类型 的条件,
这样就不用再手搓一个盾牌效果了
发表于 2024-4-14 14:26:30 | 只看该作者

回复 | 举报

C江秋
QQ酱346143 发表于 2024-4-14 14:26
感谢大佬,这个计算直线距离公式帮了大忙了
话说为何不直接为生物新建一个自定义伤害类型,然后 ...

你的意思是想通过检测一个自定义伤害来决定是否取消伤害?这样子做也可以但是需要对代码进行更多的修改并且实际效果可能会出现在兼容性上不太好的问题,因为一开始的那个取消伤害的作用是立即取消由于原版的doHurt方法造成的伤害值,它不应当进行任何的判断,另外,其实也可以用纯mcr替代检测盾牌的方法,检测被攻击实体正在使用的物品是否为盾牌即可。我又重新想了想,补充了后面的纯mcr部分
始终在征程上。
发表于 2024-4-15 16:47:06 | 只看该作者

回复 | 举报

12下一页
百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表