最近一直研究怎么编写nut搞一些花里胡哨的东西~所以开始看太初的nut也就是105装备的ap!看了一段时间发现其实光ap就可以实现很多功能和效果并且扩展性比装备的equ和apd效果多得多。于是就开始一点一点的看。我看作者应该是望越的帝落大佬!写了很多功能性的函数以至于后面写其他效果好方便就可以调用了~~前人种树后人乘凉废话不多说马上开始。
ap是nut里非常重要的一个附加物。用于目标或者对象的检测判断。nut里最难的其实是获取准确的对象和怎么精简高效的去执行代码的逻辑。所以一百个人写同一个效果会有一百种方式。其实效果是差不多的但是运行的路线逻辑可能完全不同。
找个nut的快捷栏装备为例子
挂载一个总函数sq_RunScript(“equipment/equipment_main.nut”);
再执行这个文件里的各个职业的函数
然后分到各个职业里需要调用的函数有三个分别是
function isUsableItem_职业名(obj, itemIndex) {
function drawMainCustomUI_Swordman(职业名)(obj) {
function procAppend_Swordman(职业名)(obj) {
需要他们运行的逻辑就是获取到用户界面物品栏里的物品id(放角色物品快捷栏的id)
ai跑出来加了注释的有需要可以看看
最后跳转到function procAppend_Swordman(职业名)(obj) {根据获取到的id执行对应的ap
实在不行可以ai跑一下加入注释大概都能看得懂。运行的逻辑大概就是这样~
找到pvf物品栏里对应的id道具
扩展说一句这个只是一个简单的附加ap的逻辑。其实还有很多附加ap的方式比如被动技能就是检测技能等级是否大于1.如果大于1就附加ap。这里的ap跟快捷栏的ap其实是一个东西。都是加人物的属性和一些其他花里胡哨的效果
又或者检测角色的技能174(基础精通)大于多少附加ap。。有很多很多附加ap的方式主要目的就是附加上就可以编写一些自己想要的效果这里主要讲ap内容可以怎么写不额外过多的讲怎么附加的逻辑了
下面开始重点讲一下ap里的东西
添加完之后上游戏看看具体效果~~
ap已经生效了并且拖动物品附加的ap会失效。证明整个逻辑是没有问题的!这一步算是完成准备工作
这个是ap里的内容
下面的ai加了注释的内容
onstart函数就是附加了ap就会执行很简单的理解为进图就会执行一次这个函数。
onend也很好理解结束的时候会执行的函数!
ap里可以注册很多官方写好的函数除了上面2个还有很多
appendage.sq_AddFunctionName(“onStartMap”, “onStartMap_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“isEnd”, “isEnd_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onVaildTimeEnd”, “onVaildTimeEnd_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“proc”, “proc_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onDamageParent”, “onDamageParent_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onAttackParent”, “onAttackParent_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onSetHp”, “onSetHp_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“getImmuneTypeDamageRate”, “getImmuneTypeDamageRate_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onSourceKeyFrameFlag”, “onSourceKeyFrameFlag_appendage_自定义函数名”);
appendage.sq_AddFunctionName(“onDestroyObject”, “onDestroyObject_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“isDrawAppend”, “isDrawAppend_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onChangeState”, “onChangeState_自定义函数名”);
appendage.sq_AddFunctionName(“onApplyHpDamage”, “onApplyHpDamage_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“prepareDraw”, “prepareDraw_appendage_自定义函数名”)
appendage.sq_AddFunctionName(“onEnd”, “onEnd_appendage_自定义函数名”)
每个函数运用的场景都不一样获取的对象和函数也不同具体效果要自己去测试或者说看别人是怎么编写的。这些就要看个人的理解和运用了
快捷栏只需要进图给角色附加属性/快捷栏失效是注销附加得属性就可以了(实现这些功能只要2个函数就行)
onStartMap:进图就会运行一次。给人物附加一次属性这个属性没有失效时间所以只要ap再就会一直生效当然还有时效性的写法!
onEnd:负责ap失效是注销附加的属性和运行的移动残影!
接下来讲讲怎么外置动态调试nut文件
找到ap文件把内容改成
记得要加dofile(“obj2.c”);后面的;符号
再用打开文本用于等会的编辑和修改这里可以用notepad++
最关键的一步来了。怎么能不用多次保存动态去触发这个文本里的内容
需要在
function procAppend_Swordman(obj) {
if (!obj) return 0;
这个循环触发的函数里执行这个文件
dofile(“obj2.c”);
这个只是鬼剑士职业其他职业也需要对应的添加进去才会一直触发
dofile就是执行外部文件的意思
procappend这个函数里的内容会一直循环触发所以每次修改完文本后只要角色还在就会循环触发一次达到动态运行的目的
逻辑是这样的:我们外置了ap里的内容-系统检测到角色有id为100000101的物品就会执行isAppend1 = CNSquirrelAppendage.sq_IsAppendAppendage(obj, “equipment/ap/ap_100000101.nut”);这个ap
然后这个ap内容已经被我们改成dofile(obj2.c)。系统就会执行我们本地客户端内名字为obj2.c的文件,里面的内容就是原本这个ap的东西
又因为我们已经添加到function procAppend_Swordman(obj) 这个函数名里,只要角色还在就会一直循环触发里面的内容所以每次更新保存后都会重新触发一次!
实际效果上游戏
现在已经是可以动态触发属性的、到这一步所有的准备工作都已经完成!
增加的属性还有很多有一个文本
— 改变状态类型定义
CHANGE_STATUS_TYPE_PHYSICAL_ATTACK = -0; — 力量
CHANGE_STATUS_TYPE_MAGICAL_ATTACK = -1; — 智力
CHANGE_STATUS_TYPE_MAGICAL_DEFENSE = -2; — 魔法防御
CHANGE_STATUS_TYPE_PHYSICAL_DEFENSE = -3; — 物理防御
CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK = -4; — 物理伤害
CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE = -5; — 魔法伤害
CHANGE_STATUS_TYPE_PHYSICAL_ATTACK_BONUS = -6; — 物理攻击加值
CHANGE_STATUS_TYPE_MAGICAL_ATTACK_BONUS = -7; — 魔法攻击奖励
CHANGE_STATUS_TYPE_JUMP_POWER = -8; — 跳跃力
CHANGE_STATUS_TYPE_JUMP_SPEED_RATE = -9; — 跳跃速度
CHANGE_STATUS_TYPE_ATTACK_SPEED = -10; — 攻击速度
CHANGE_STATUS_TYPE_MOVE_SPEED = -11; — 移动速度
CHANGE_STATUS_TYPE_CAST_SPEED = -12; — 施法速度
CHANGE_STATUS_TYPE_HP_MAX = -13; — 最大生命值
CHANGE_STATUS_TYPE_HP_REGEN_RATE = -14; — 生命值恢复率
CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE = -15; — 物理暴击率
CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE = -16; — 魔法暴击率
CHANGE_STATUS_TYPE_PHYSICAL_BACK_ATTACK_CRITICAL = -17; — 背击物理暴击率
CHANGE_STATUS_TYPE_MAGICAL_BACK_ATTACK_CRITICAL = -18; — 背击魔法暴击率
CHANGE_STATUS_TYPE_CRITICAL_TOLERANCE_RATE = -19; — 暴击抵抗率
CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_FIRE = -20; — 耐火性
CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_WATER = -21; — 耐水性
CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_DARK = -22; — 耐暗属性
CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_LIGHT = -23; — 耐光属性
CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_ALL = -24; — 全属性耐性
CHANGE_STATUS_TYPE_ELEMENT_TOLERANCE_ZERO = -25; — 无属性耐性
CHANGE_STATUS_TYPE_ACTIVESTATUS_TOLERANCE_ALL = -26; — 全状态耐性
CHANGE_STATUS_TYPE_ACTIVEPROPERTY_STUCK = -27; — 闪避率
CHANGE_STATUS_TYPE_BACK_ATTACK_STUCK_TOLERANCE = -28; — 背击闪避率
CHANGE_STATUS_TYPE_MP_REGEN_RATE = -29; — 最大魔法值
CHANGE_STATUS_TYPE_EXTRA_SPEED_RATE = -30; — 击中时的硬度
CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK = -31; — 装备魔法攻击
CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE = -32; — 装备魔法防御
CHANGE_STATUS_TYPE_STUCK = -33; — 命中率
CHANGE_STATUS_TYPE_HIT_RECOVERY = -34; — 硬直恢复
CHANGE_STATUS_TYPE_MELEE_HIT_DELAY = -35; — 近战攻击延迟
CHANGE_STATUS_TYPE_EQUIPMENT_ALL_STAT = -36; — 提升所有装备状态
CHANGE_STATUS_TYPE_CUSTOM = -37; — 自定义状态
CHANGE_STATUS_TYPE_EXP_DOUBLE = -38; — 经验值翻倍
CHANGE_STATUS_TYPE_EVIL_UP = -39; — 恶性上升
CHANGE_STATUS_TYPE_EVIL_DOWN = -40; — 恶性下降
CHANGE_STATUS_TYPE_RIGIDITY = -41; — 刚度
CHANGE_STATUS_TYPE_ELEMENT_ATTACK_FIRE = -42; — 火属性攻击
CHANGE_STATUS_TYPE_ELEMENT_ATTACK_WATER = -43; — 水属性攻击
CHANGE_STATUS_TYPE_ELEMENT_ATTACK_DARK = -44; — 暗属性攻击
CHANGE_STATUS_TYPE_ELEMENT_ATTACK_LIGHT = -45; — 光属性攻击
CHANGE_STATUS_TYPE_ELEMENT_ATTACK_ALL = -46; — 全属性攻击
CHANGE_STATUS_TYPE_DISEASE = -47; — 疾病
CHANGE_STATUS_TYPE_MP_MAX = -48; — 最大魔法值
CHANGE_STATUS_TYPE_COOLTIME_DECLINE = -49; — 技能冷却时间减少
CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_DAMAGE_RATE = -50; — 物理致命伤害率
CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_DAMAGE_RATE = -51; — 魔法致命伤害率
CHANGE_STATUS_TYPE_BLOODWAR_GROW_ABILITY = -52; — 血战成长能力
CHANGE_STATUS_TYPE_ADDITIONAL_PHYSICAL_GENUINE_ATTACK = -53; — 额外的物理真实攻击
CHANGE_STATUS_TYPE_ADDITIONAL_MAGICAL_GENUINE_ATTACK = -54; — 额外的魔法真实攻击
CHANGE_STATUS_TYPE_SUMMON_SKILL_POWER_BONUS_RATE = -55; — 召唤技能伤害加成
CHANGE_STATUS_TYPE_ANTIEVIL = -56; — 抗恶性
CHANGE_STATUS_TYPE_PHYSICAL_ABSOLUTE_DAMAGE = -57; — 物理绝对伤害
CHANGE_STATUS_GHOST_TRAIN_NO_BREATH_TIME = -58; — 幻影列车无呼吸时间
CHANGE_STATUS_CHARACTER_LINK = -59; — 角色链接
CHANGE_STATUS_GOLD_INCREASE = -60; — 金币增加
CHANGE_STATUS_TYPE_MAX = -61; — 状态类型最大值
具体效果可以自己测试。
local physicalAttack = 999;
local physicalDefense = 99;
local magicalAttack = 99;
local magicalDefense =99;
local stuck = -4;
local change_appendage = appendage.sq_getChangeStatus(“100000101”);
if (!change_appendage)
{
change_appendage = appendage.sq_AddChangeStatus(“100000101”, obj, obj, 0, 37, false, physicalAttack);
}
if (change_appendage)
{
change_appendage.clearParameter();
change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, false, physicalAttack.tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_DEFENSE, false, physicalDefense.tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_ATTACK, false, magicalAttack.tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_DEFENSE, false, magicalDefense.tofloat());
change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, stuck.tofloat());
参数解释如下CHANGE_STATUS_TYPE_PHYSICAL_ATTACK增加的属性0.CHANGE_STATUS_TYPE_PHYSICAL_ATTACK = -0; — 力量
1.false/为固定值(true则为百分比)
2.physicalAttack.tofloat());local physicalAttack = 999;自定义的属性值、这个physicalAttack这里代表为999后面的tofloat转为变量.tofloat();//转为浮点数变量.tointeger();//转为整数型
change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, false, physicalAttack.tofloat());
还有一个可以限制时间的属性增加方法上面这个是不会显示buff再人物栏里的
还有一个是可以设置时间和限制buff增益的
写法如下
local power = 100;
local change_appendage = appendage.sq_getChangeStatus(“100301495”);
if(!change_appendage){
change_appendage = appendage.sq_AddChangeStatus(“100301495”, obj, obj, 5000,
CHANGE_STATUS_TYPE_COOLTIME_DECLINE, true, -power);
}
添加了ai注释后的代码
进图人物的状态
该教程来自贴吧大佬:亂噬凡尘
重要限制:本站素材仅供单机学习交流,请在24小时内删除