反正就,在研究之前冰师傅问我的,如何代码添加action的时候,从BHVT里找到了灵感,然后写出来之后感觉会是一个很有用的东西,所以封装了一下,做成了模块,给大家使用。
目前里面已经有一些方法供大家使用,由于本人技术有限,代码可能冗余度较高(指很多复用部分都是CTRL C V)如果可以帮助大家更快将想法变成现实并产出mod,我还是会很高兴的。
这些的操作流程和直接文件操作action没有什么区别,并且还减少了时间(模板添加一个action真的要跑的时间太久了)
然后里面的参数从哪里来,就要介绍一下我一直使用的BHVT了
不过为了方便大家理解,我先放出一个示例代码让大家看看
上图是一个简单的小mod,它的作用是可以让空中躲避派生空中躲避,而使用了toolkit之后,只用了一行代码就搞定了(会报错是因为没有检测状态,有时候玩家这个对象并不存在,但不是致命错误,一般不会影响脚本运行)
上图为效果图。
接下来我们来聊聊这个函数里的几个参数分别是什么
我这里统一回复一下,toolkits可以直接整合到你的mod里,连带文件夹一起粘贴进去都行,不需要拆开,不需要经过我同意。代码可以直接内嵌到你自己的代码里。null是因为某些情况下(比如我自己的编辑器)他会默认省略掉前面的第一个参数,所以null只是用来占位的。
找不到下文?看看左侧的目录?
首先根据最上面的函数图,第一个这个很长一串,是nodeID,如果你有BHVT,打开后就可以看到这个界面。
然后来说一下思路,首先做这个mod,我们既然是要让空中躲避衔接空中躲避,那我们就要去找空中躲避的id
可以看到我们在勇空中躲避时上面的activeNode时416
所以去上面的Search去寻找这个ID
敲下Enter之后点击Goto,来到这个地方
可以看见这里的NodeID和我上面代码中写的一样,因为我们就是想让空中躲避派生空中躲避。并且注意这个蓝色框框上面的466,这个是Node序号或者NodeIndex,或者也可以叫做StateIndex,anyway,反正这个Id等会要用,NodeID和NodeIndex都可以找到这个ID,而上面我们输入的466就是这个NodeIndex。
现在知道了Node,那么condition也就是派生条件,我们去哪里找呢?当然是选择去原本能够派生这个节点的地方去找,也就是我们拉丝的那个节点
可以看到我们起飞的时候ActiveNode为1186。按照刚才的办法用Search找
但是我们会发现这个地方的state里并没有466,怎么办?别急,这里大概率有一个节点会直接跳转到466,这个时候我们就可以用BHVT自带的调用动作功能,就是点击每一个条目旁边的run键,就可以看到这个是什么动作
然后当我们点击上面的512的时候发现,用出了空中回避,那么我们就可以直接找它对应的的条件(condition)了。
在BHVT的界面中,从上至下的派生目标(State)和下面的条件(Condition)是一一对应的,也就是说,在State中从上往下数,512State是第三个,那么其对应的Condition,在下面的TransitionConditions 里,也是第三个。
这个时候我们将其展开,就可以发现它的Condition ID是1950
至此,使用这个函数最后的一块拼图也补齐了,随后,我们将其放入
re.on_frame()按帧运行函数中,就实现了这个效果
目前,这个Toolkits里的函数调用的时候会覆盖文件,如果你想的话,你可以用这个东西覆写文件mod的GP长度,让它达到一个更长的GP判定,相关的函数我也放在了Toolkits里,但是由于我技术力有限,没能像bhvt一样可以直接拿到游戏生成的静态action,所以目前还是需要用钩子,我这里也放出我自己玩的mod的示例代码
上面两行函数一个是改变斩斧属性GP的判定,一个是改变片手GP的判定,而标准的需要传入的GP判定,是一个Table,示例如下
是武器table中有技能table,技能table里有StartFrame,EndFrame,ModifiedStartFrame,ModifiedEndFrame 四个帧数,实际上你在使用这个函数的时候可以丢掉StartFrame和EndFrame,因为前面两个变量是我留着用来恢复武器判定用的,但实际的AIO(在toolkits里叫做ModifyGPAIO,全称Modify Guard Point All In One)目前并不调用这两个值,后面等我的全武器功能脚本写出来之后这个应该也会更新,一边写mod一边添加新功能。
而weapontype可以用toolkits里自带的武器索引表
前面的damageReflexObject需要传入一个原生的args,如果用过钩子的人会对这个东西无比熟悉,我也放一张截图在这里
(其实这里勾start也可以)
至于这个方法是从哪里找到的,如何知道要勾这个函数,也是用BHVT找出来的,跟上面的步骤一样,我放一张截图
一般先hook一下,然后hook之后会出现一个小窗口,里面写了你Hook的方法
一般只要你hook住了之后再使用动作,这个call Count会跳一下,就证明这个方法可以用来hook,然后用lua进行hook,之后像上面一张图一样直接将args丢入这个toolkit的函数,并传入生效时候时的NodeID,weaponType,修改之后的table,这个函数就会自动帮你搞定这些事情。
这个模块的编写本身并不复杂,我写在这里第一是为了自己方便,第二也是希望能降低一下modding的门槛,帮助到更多的人。我做这个东西还有一个原因是,因为大版本更新武器fsm必然失效,而且需要推倒重来,而代码可能只需要往里面填一下最新的action就可以恢复如初,无论是维护还是做mod都比直接动文件要舒适一些。
如果想对这个toolkit进行改进或者有什么建议,也欢迎发布其他的版本,如果可以的话通知我一下是最好不过的了,虽然我平时也不怎么上论坛。
设置2点影响力作为门槛,一天能水到的程度,如果在rise的mod组内也可以直接群里面找我
那么就这样吧。
enjoy Modding
11.28更新:
更新了如下函数
现在更改GP判定可以通过Action直接修改Field而不是用钩子,你在脚本初始化结束的时候可以顺便执行掉这些东西,不用钩子可以减少性能消耗
11.30更新
修复:
修复了添加的conditionPair(派生对)无法添加Event的错误,现在如果你需要添加的派生对带一个默认的event,需要将最后一项参数设置为true
更新了如下函数
该版本已经内置了多个新建action、condition、node、event函数,但是尚未测试其稳定性
并且需要一个全局函数来控制其次数,这个次数不能受reset Script影响。会返回一个table,含两个元素,第一个是新建的东西的Object,第二个是新建的东西的Index
准备传gitbub了,不再收影响力
v1.12的示例代码是斩斧的
很遗憾,就做了一点微小的工作,版本号维持不变
2023.2.11更新
完成了动作值修改代码,并同时改进了查询工具
修正了condition_pair 和 addTransition无法添加或者对于列表的首个item无法读取的问题
示例代码已经打包进文件,注释写明白了每一条代码的作用
最终效果图
该工具基于dtlnor大佬的motionID显示工具添加而来,我个人并不太会画这个界面
2023.2.12更新
更新了复制函数(复制现有实例并生成一个新实例,返回其索引)
本次的示例代码是给片手的后撤步添加回避判定