大家好呀,距离上次的 超级新手小白的自制技能mod教程 已经过去了一个多星期
这一个多星期里,我偶尔有空就研究简单的mod,也多多少少研究出一点点东西
这不,发新帖的瘾就上来了
今天我就来用我研究这一个星期的成果中的一部分,写一个新的mod教程贴
感兴趣的、想自己做mod的小伙伴可以了解一下,期待你们做出自己的新mod~
下面话不多说,进入今天的正题?
一、开始
先来说一下今天的主题。上次的帖子我们接触了简单的progression.xml,学会了制作最简单的技能mod,并使用升级技能的方式给角色增加某些属性。
而今天,我们将会接触另一个常用文件,它也是我们制作各种游戏效果时最常用的文件——buffs.xml。并尝试用这个文件制作一个新的,不同于游戏内自带(如血量、体力)的能量体系【原力】,并让【原力】为我们的mod服务。
1、简单认识buffs.xml
首先,什么是buffs.xml呢?
buffs.xml其实就是记录游戏里所有与buff(状态)有关的设定与变量的文件。无论是游戏里失足摔下楼导致的扭伤、断腿,亦或是被僵尸咬伤抓伤导致的感染,又或者是吃东西后持续恢复饥饿值的状态……都属于buff。
这里注意,虽然显示在左下角的状态属于buff,但并不代表着buff一定会显示在左下角,因为buff的设置里是可以自由选择是否要显示的。
好了,关于buff的简单了解我们就说到这里,下面我们来正式开始【原力】mod的制作。
二、【原力】mod的制作步骤
1、新建你的mod文件
制作mod,第一步当然是要新建mod文件啦。跟上一篇教程一样,首先我们要建好mod的文件夹
ModInfo.xml文件跟上期一样不说了,我们打开Config文件夹,buff.xml文件就在里面。
如果是你自己建的话,可以新建文本文件再把文件名改成buff.xml,也可以复制别人的buff.xml再把里面的内容都删光。
2、正式开始编辑buff.xml
打开这个buff.xml文件,我们可以看到,里面除了<Configs>和它的结束语</Configs>之外什么也没有(当然这个<Configs>也是我刚写上去的,另外不懂啥是结束语的看上一个帖子)
别急,新文件是空的很正常,下面我们来正式开写。
首先,跟技能一样,在<Configs>和</Configs>中间给我们的buff写一个开头<append xpath=”/buffs”>,告诉游戏程序,这里写的是buff的东西。这点跟上一期的技能一样,不同的是技能的开头是<append xpath=”/progression/attributes”>。
当然,有开头必有结尾,所以这里我们记得把</append>也写上,如图。
3、【原力】的核心设定
开头和结尾准备好了之后,我们在它们的中间段落插入我们要写的buff,首先是【原力】的核心设定。
从这里开始可能有的小伙伴会懵逼~
你这写的是啥呀?
我看不懂啊!
没关系,我们一行一行来解释。
首先是第1行
<buff name=”【原力】” name_key=”原力值” hidden=”false” remove_on_death=”false”>
第1个(buff name=”【原力】”)的意思是,该buff的名字是【原力】
第2个(name_key=”原力值”)的意思是,当buff出现在左下角和人物状态栏里时,该buff显示的名字
第3个(hidden=”false”)的意思是,该buff是否会出现在左下角和人物状态栏里,false就是不隐藏,也就是显示,true就是隐藏
第4个(remove_on_death=”false”)的意思是,人物死亡时是否移除buff,false就是不移除,true就是移除
结合起来看,整行的意思就是,我新建了一个buff,该buff名叫【原力】,但显示在状态和左下角的名字叫“原力值”,它不会随着人物死亡而从身上移除。
好的,那么第一行的所有内容我们都搞懂了,下面来看第2行
<stack_type value=”ignore”/>
这个的意思是,当该buff存在于人物身上的时候,再次添加被添加到人物身上,会发生什么事。这里可以填4个内容,分别是:
①“duration”(持续时间增加,比如游戏里的断腿,跑跳的时候持续时间会变长)
②“effect”(效果增加,猜测是相比上面的时间增加,这个会增加里面设置的数值,我没用过)
③“replace”(buff重置,也就是类似游戏里的燃烧,着火的情况下再度着火持续时间不会堆叠)
④“ignore”(忽略新buff,即不对原buff状态做改变。类似游戏里的憋气,在水底憋气的倒计时是不会重置的)
了解这4点之后,我们看这段<stack_type value=”ignore”/>意思就很明显了,该buff不会因为被重复添加而变化。
继续,看第3行的内容
<duration value=”0″/>
这个代表的是该buff的持续时间,填1代表buff在人物身上存在1秒,填60代表1分钟,以此类推。至于填0,则表示该buff在人物身上存在时间无限,不会因为时间流逝而消失。
用游戏里的栗子,这个duration就是左下角“断腿”后面跟着的数字,29秒。
第4行的内容
<update_rate value=”0.1″/>
这个的意思是,该buff的更新周期,填1表示1秒钟更新1次,最快据说是二十分之一秒,但一般用不到那么快,通常最多填个0.1就够用了。
注意,这个更新周期是跟触发方式里的“onSelfBuffUpdate”搭配使用的,如果没有这个触发方式,或者对更新周期没有要求,那么这东西一般不用特地进行设置。
下面来到第5行
<display_value value=”当前原力值”/>
这是什么鬼呢?这是该buff显示在左下角和状态栏里的时候,调用的变量名称。(注意是调用的变量名称,而不是显示出来的名称,显示的名称是前面的 name_key=”原力值”)
这个我们稍后进行mod演示的时候给大家具体讲。
第6行
<display_value_key value=”{0}”/>
这个是跟上面第5行搭配使用的,表示该buff调用变量时,显示的变量数字。
同样,我们稍后演示的时候再跟大家讲。
这前面的6行基础设置讲完之后,我们看后面的<effect_group>部分。
这部分在上一篇帖子里有讲过,那时是用来写技能效果的,比如给人物加生命最大值、体力最大值之类的。
而在buff.xml文件里,它同样是用来放置关于buff的效果设定的,我们来看这个【原力】buff有什么效果。
第1行
<triggered_effect trigger=”onSelfBuffStart” action=”ModifyCVar” cvar=”最大原力值” operation=”set” value=”100″/>
看起来很复杂,没关系,我们同样进行一个个拆解。
①triggered_effect
这个表示该语句是“基于某个触发条件而执行的触发器”,是整段语句的类型设定。简单的说就是“携带该buff的单位,如果达到了某个指定的条件,就会执行这段设置好的触发”。
注意这段东西的写法:<triggered_effect 【这里面放触发器的具体内容】/>,前面用“<”开头,最后用“/>”结尾。如果忘记写结尾的“/”,就会报错。(别问我为什么知道 _(:зゝ∠)_
②trigger=”onSelfBuffStart”
这部分的意思是“触发条件”,引号里的“onSelfBuffStart”就是条件。这个条件的意思是“当该buff在人物身上开始的时候,执行相应动作”。
③action=”ModifyCVar”
这部分决定“该触发器执行的动作”。“ModifyCVar”的意思是“对自定义的变量的数值执行某个运算操作”。这个我们下面细讲。
④cvar=”最大原力值”
这部分是上面“ModifyCVar”的具体设置,意思是“你要执行运算的自定义变量叫什么名字”。
⑤operation=”set”
这部分是上面“ModifyCVar”的具体设置,意思是“你要执行什么运算”。加减乘除等于等等。
⑥value=”100″
这部分是上面“ModifyCVar”的具体设置,意思是“运算的数值”。
头有点大?
没问题,理解一个之后,其他的就好理解了。
我们先深呼吸冷静一下,然后结合我们整句话一起看,你就懂了。
<triggered_effect trigger=”onSelfBuffStart” action=”ModifyCVar” cvar=”最大原力值” operation=”set” value=”100″/>
这句话的完整意思是:
①当该buff(即【原力】)被放置到角色身上时(trigger=”onSelfBuffStart”),执行动作
②执行的动作是进行一个变量的运算(ModifyCVar)
③变量的名称为”最大原力值”(cvar=”最大原力值”)
④运算的类型为“set”(operation=”set”),即可以简单的理解为“等于”,或者说“赋值”,“把value里的值赋予给“最大原力值”这个变量。”
④赋予的值为100(value=”100″)
经过这句话的运算之后,我们自定义的变量“最大原力值”,它的值就等于100。
而进行这个触发的目的很简单,我们今天要做的mod叫【原力】,是一个新增能量体系的mod。既然是能量体系,那就当然有能量的数值,就如同体力值一样。我们经过这句话的触发,把这个能量体系的能量上限进行了设置,为100点。
而下面的两行,其实做的是同样的事情,都是给【原力】这个mod最基本的变量赋值(也就是给他们一个初始的值)。
第2行
<triggered_effect trigger=”onSelfBuffStart” action=”ModifyCVar” cvar=”当前原力值” operation=”set” value=”100″/>
是给“当前原力值”这个变量设定一个初始值,100点。
第3行
<triggered_effect trigger=”onSelfBuffStart” action=”ModifyCVar” cvar=”原力自然回复速度” operation=”set” value=”1″/>
是给“原力自然回复速度”这个变量设定一个初始值,1点。
可以看到它们的结构是完全一致的,只是变量名称和值有所不同。
为了让各位小伙伴更直观的看到我们这一步的效果,我们把这个buff赋予人物身上,然后进游戏看看效果。
如何把buff赋予人物呢?
在该buff的上面部分,另外插入一个
<append xpath=”/buffs/buff[@name='buffStatusCheck01']”>
这句话的意思是,这个插入的buff会加入到游戏自带的名为“buffStatusCheck01”的buff里,前面的“<append xpath=”部分跟之前的技能是一样的,都是表示该新增的内容插入游戏里的位置。
“buffStatusCheck01”则可以理解为游戏自带的进行游戏人物设置的buff,作为新手,把想要赋予人物的buff塞到这个里面就行了。
插入的内容为
<triggered_effect trigger=”onSelfEnteredGame” action=”AddBuff” target=”self” buff=”【原力】”/>
结合前面认识的“触发器”,我们能知道这也是一个触发
①触发条件是“onSelfEnteredGame”,也就是“每次进入游戏时触发”
②触发的动作是“AddBuff”,即给人物增加一个buff
③所增加的目标为“self”,即游戏角色
④增加的buff名称为“【原力】”,即我们所制作的新buff
好了,现在我们保存buff.xml文件,并打开游戏。
可以看到,左下角多了个状态,名叫“原力值”,它后面还跟着个数字“100”
很显然,我们的第一步已经成功了!给你自己鼓个掌!
当然,有的小伙伴可能会有疑问,状态名叫“原力值”可以理解,为什么后面的值“100”也会显示?前面好像没说?
别急,前面这部分我们提到过一嘴,没细讲,现在我就把对应的语句再拉出来。
回到【原力】buff设定的第5行
<display_value value=”当前原力值”/>
这是什么鬼呢?这是该buff显示在左下角和状态栏里的时候,调用的变量的名称。(注意是调用的变量名称,而不是显示出来的名称,显示的名称是前面的 name_key=”原力值”)
第6行
<display_value_key value=”{0}”/>
这个是跟上面第5行搭配使用的,表示该buff调用变量时,显示的变量值的格式。
“{0}”表示默认格式,没有修改,如果这里你用颜色格式进行修改,那么显示的数字也会对应变化。具体可以自己研究别人的mod是怎么改字体颜色的。
到这里我们就知道了,我们左下角显示的状态名称为(name_key=”原力值”),而它后面跟着的是调用的变量,这里我们调用的变量名称为“当前原力值”。它的值我们前面已经设定为100,所以游戏里显示的值是100。
4、让【原力】帮助我们跳的更高
前面我们成功在游戏里新增了一个类似“体力”和“血量”的变量——【原力】,但是这个变量有什么用呢?这就是本小节要说的内容。
首先明确的是,我们自己新增的变量,在游戏里原本是不存在的,所以它的用途,也是由我们自己去定义,去设置。比如下面,我将给我新增的【原力】增加一个用途:
当角色进行跳跃的时候,消耗一定的原力值,让我跳的更高。
下面开始操作:
①养成良好习惯,效果不要都堆在一个buff里,以免你的代码变成一堆屎山。所以我们下面新建一个buff,名字就叫【原力跳跃增强】,效果如下:
我们来翻译这个新buff的具体设置和效果
buff的基本设定:
<buff name=”【原力跳跃增强】” name_key=”” hidden=”true” remove_on_death=”false”>
该buff名叫“【原力跳跃增强】”
持续时间为无限,且不会随着人物死亡而移除,效果不会随着再次添加而改变
hidden=”true”表示该buff在状态栏不显示,因此不需要填name_key=””,不需要填“display_value value=”和“display_value_key value=”这些需要显示的时候才考虑填的东西
<effect_group>部分:
<requirement name=”HasBuff” buff=”【原力】”/>
<requirement name=”CVarCompare” cvar=”当前原力值” operation=”GTE” value=”10″/>
首先来认识“requirement”,这是一个判断语句,意思是这行的条件必须满足,这个<effect_group>内的触发和修改才会生效。
如果存在复数的“requirement”,则必须同时满足所有的“requirement”,该<effect_group>内的修改和触发才会生效。
所以可以看到,这里有两个条件:
条件①、<requirement name=”HasBuff” buff=”【原力】”/>
其中“HasBuff”的意思是“存在指定buff”
后面的 buff=”【原力】”,就是对这个buff的指定
也就是,第一个条件为,人物身上存在名为“【原力】”的buff
条件②、<requirement name=”CVarCompare” cvar=”当前原力值” operation=”GTE” value=”10″/>
“CVarCompare”的意思是“指定变量是否满足条件”
cvar=”当前原力值” 就是对这个条件的说明,即指定变量为名叫“当前原力值”的变量
operation=”GTE” ,这是个比较的操作,“GTE”意思为“大于等于”
value=”10″ 这就是比较的值了
全部结合起来也就是第二个条件为,“当前原力值”的值是否“大于等于”10点
很显然,根据我们的设置,两个条件都是满足的。
满足两个条件之后,下面的修改即可生效:
<passive_effect name=”JumpStrength” operation=”perc_add” value=”1″/>
passive_effect name=”JumpStrength” 这个意思是修改角色的跳跃高度
operation=”perc_add” 即按百分比增加
value=”1″ 增加的比例为100%
这句话的意思就是,增强角色的跳跃高度,增强方式为百分比增加,比例为100%
这段修改语句跟我们上一个技能教程里的如出一辙,看过上一个帖子的小伙伴应该能秒懂。
写完buff之后,我们进游戏看看效果:
②┗|`O′|┛ 嗷~~
看了视频的效果,我们发现mod失效了,为什么没有起作用呢?
原因很简单,原来我们忘记给角色添加新buff了
记住,任何对角色产生影响的buff,都必须要有添加的操作,否则是不会生效的
因此在前面添加buff的位置新建一行,给我们的主角添加上这个新的增强跳跃能力的buff
下面再进入游戏看看:
看到没?!完全生效了!
我们的小人跳起了200%的高度!
但是……
看着这个原力值,貌似有什么地方不对劲?
哦不!它怎么不动?!
始终是100点的话,我们要原力值何用?
直接像上次教程那样,改跳跃高度不就好了吗?
是的,盲僧,你发现了华点!
我们在前面的buff设置里,没有写入跳跃消耗原力值的代码
下面我们将补上这部分代码,让我们的原力值真的发挥应有的效用!
5、让【原力】产生消耗,以及回复,真正成为游戏内的新增变量
首先,让我们给原力增强跳跃高度这个buff添加一个消耗原力的效果
具体操作为,在效果的部分新增一个触发器,代码如下:
<triggered_effect trigger=”onSelfJump” action=”ModifyCVar” cvar=”当前原力值” operation=”subtract” value=”10″/>
让我们同样来逐个进行解析
①trigger=”onSelfJump”,意思是触发的条件为“角色跳跃时”
②action=”ModifyCVar”,意思跟前面一样,对指定的自定义变量进行运算操作
③cvar=”当前原力值”,指定的自定义变量名叫“当前原力值”
④operation=”subtract”,运算的类型为“减法”
⑤value=”10″,运算的值为10
所以整句话的意思就是:当角色进行跳跃的时候,“当前原力值”会下降10点。
OK,现在让我们保存文件,进入游戏看看效果:
完美!可以看到我们的角色每跳跃1次,左下角的原力值就下降10点。
同时,因为我们跳跃增强的条件判断里有一条是“当前原力值”的值是否“大于等于”10点。因此,当原力值归零之后,不再满足条件,角色就不再享受跳跃高度加成的效果了!
那么现在剩下的问题就是——原力值的恢复问题
怎么在原力值不满的时候恢复原力值呢?
其实也很简单!
不知道大家记不记得,一开始我们做“【原力】”buff的时候,一共给3个自定义变量赋了值,它们分别是“最大原力值”、“当前原力值”和“原力自然回复速度”
前面我们使用的一直都是“当前原力值”
现在,就到了启用其他两个的时候!
新建一个buff,名叫“【原力自然恢复】”具体代码如下:
前面的基础设定我们就略过了,直接看具体效果部分:
<requirement name=”HasBuff” buff=”【原力】”/>
这句话的意思是,判断角色身上是否存在名为“【原力】”的buff
<requirement name=”CVarCompare” cvar=”当前原力值” operation=”LT” value=”@最大原力值”/>
①requirement name=”CVarCompare”,判断指定的自定义变量是否满足条件
②cvar=”当前原力值”,指定的自定义变量名叫“当前原力值”
③operation=”LT”,这是个比较的操作,“LT”意思为“小于”
④value=”@最大原力值”,这是比较的值,“@最大原力值”的意思是“跟自定义变量“最大原力值”的值进行比较”。我们最开始的赋值操作里,“最大原力值”的值被设为100,所以这里可以理解为:
判断自定义变量“当前原力值”的值,是否小于,自定义变量“最大原力值”的值,在这里是100。
PS:我们这个mod比较简单,你直接在“value”的位置填100是可以的,但如果你做的是一个复杂的mod,那么最好填写变量名,这样方便升级之类的操作,比如你等级高了,“最大原力值”的值可能会变化,而你直接写100的话原力值回复到100点就不动了。
回到正题,在满足前面两个判断条件的前提下,我们看具体的触发:
<triggered_effect trigger=”onSelfBuffUpdate” action=”ModifyCVar” cvar=”当前原力值” operation=”add” value=”@原力自然回复速度”/>
①trigger=”onSelfBuffUpdate”,这个触发发动的条件,“onSelfBuffUpdate”的意思是每帧触发1次。这个触发次数跟上面讲的<update_rate value=”1″/>相关,在这里就是每秒1次。
②action=”ModifyCVar”,对自定义变量的值进行运算操作
③cvar=”当前原力值”,表示操作的自定义变量名叫“当前原力值”
④operation=”add”,表示运算的操作为加法
⑤value=”@原力自然回复速度”,运算的值为自定义变量“原力自然回复速度”的值,这个变量我们在前面赋值为1
综合起来意思就是,每秒自动回复1点原力值,直到“当前原力值”大于等于“最大原力值”为止
测试之前别忘记在上面给人物增加该buff
我们进游戏看看效果:
完美!可以看到左下角我们的原力值已经在自动回复了!
当它回复到10点之后,我们跳跃时又会满足跳跃高度增强的buff,跳的更高!
好了,那么到这里,我们今天的新增【原力】能量体系的mod教程就完毕了
这只是最简单的自定义变量mod框架,你可以在这个框架的基础上开发出各种各样的玩法
比如“原力增幅攻击力”
比如“原力增强防御力”
比如“原力吸血”
比如“原力回血回体力”
比如“原力附魔攻击”
比如“结合装备的F技能,达到消耗原力释放技能的效果”
等等等等……
至于具体能做到什么,那就全看你自己的想象力和简单的代码能力了!
最后是惯例的参考mod本身
我们下次再见~
卧槽,佬
66666666666牛逼
白天在工作,晚上在睡觉,有事可以留言,不一定能及时回复!
谢谢大佬,问一下大佬如果需要写制作东西的代码,怎么改
好东西!一直碰不了BUFF 有翻译没用。 我想问的是如何将官方直播互动BUFF 和 事件文件 赋予到某个玩家使用的物品。
一直对PVE模式 爆炸物过于无敌 耿耿于怀 尝试过文件修改 给手雷赋予 禁止爆炸 只能爆头 反转 黑白色 扭曲 等buff有效。 单做成MOD就无效了,现在想做成给手雷做负面buff池随机抽负面.