第三步:表达式
表达式就是算式概念的扩展。
数学表达式的运算符有 +, -, * (乘), / (除), ^ (指数),- (负号)
如果操作数是字符串类型,并可以被转换成数值,则将自动转换成数值
关系运算符返回布尔值true或false,有:== (等于),~= (不等于),< (小于),> (大于),<= (小于等于),>= (大于等于)
注意,对数值类型不要用==比较,应判断两数的差是否小于一个足够小的数,否则对有些数看起来相等却不相等。0 除外。
逻辑运算符包括:and (和,并且), or (或者),not (非,不)
逻辑运算的操作数一定要是布尔类型或nil,nil表示空,被当作false处理。使用其他类型的操作数不会报错,因为有其特定的功能,但坚决不推荐使用。
字符串连接运算符:.. (取得两个字符串连接后的字符串)
如果操作数是数值型,则自动转换为字符串
优先级,从底到高:
or
and
< > <= >= ~= ==
..
+ -
* /
not - (负号)
^
..和^是右结合,就是说 2^2^3 == 2^(2^3)。
例:
hp < 10 and not player.frozen -- hp小于10 并且 玩家没有被冰冻 时为真
第四步:写出你的第一个宏
宏解说:
纯阳的自动生太极,当自身无生太极是,对自己释放生太极
宏语句:
/script N = GetClientPlayer();
/script SelectPlayer()
/script for _, pB in pairs(N.GetBuffList()) do
if pB.dwID~=374 thenOnUseSkill(358,1) end
end;
第一句:/script N = GetClientPlayer();
申请一个变量 N,且获得当前客户端玩家,并赋值于N。简单说来,就相当于你出生的,你爸妈给你取的名字一样,只是个代号,随便你取什么。
第二句:
/script SelectPlayer()
这个语句的意思就是选择你自己,也就是把你自己作为当前目标。SelectPlayer() 这个函数,无可解说,是客户端的API,目前没有被和谐掉的选择人的函数,期待不要被和谐了
吧
第三句:
/script for _, pB in pairs(N.GetBuffList()) do
if pB.dwID~=374 thenOnUseSkill(358,1) end
end;
这里涉及到一句判断自身buff的语句(不是debuff):
/script for _, pB in pairs(GetClientPlayer().GetBuffList()) do
if pB.dwID == BUFF的ID then 执行语句 end
end;
格式套用而已
if pB.dwID == BUFF的ID then 执行语句 end
详细解说:
374为自己生太极buff的ID,358为生太极的技能ID,1是生太极等级
pB.dwID~=374 判断自身buff列表中是否有生太极buff,没有为真 ( ~= 不等于)
此为一个典型的if语句块。
这个宏有一定的错误,不知道大家发现没有,将会在下一步中指出
第五步: 建议添加的函数封装
说明:在本步骤中,所有的id都指的是 buff的id或者debuff的ID
/script N = GetClientPlayer()
/script t=GetTargetHandle(N.GetTarget())
/script function checkbuff(id)
for _, D in pairs(N.GetBuffList()) do if D.dwID==id then
returntrue else return flase end endend
/script function checknobuff(id) for _, D in pairs(N.GetBuffList()) do if D.dwID~=id then returntrue else return false end endend
/script N = GetClientPlayer()
/script t=GetTargetHandle(N.GetTarget())
这2句我不就解说了,相信仔细看过的人都知道。
/script function checkbuff(id)
for _, D in pairs(N.GetBuffList()) do if D.dwID==id then
returntrue else return flase end endend
这个函数是检查自己是否有buff 有则返回true 没有则返回false.
建议大家采用我这个步骤中给大家的编辑的函数来判断是否有无buff
如果要判断目标的buff呢? 则这样改:
/script function checkbuff(id)
for _, D in pairs(T.GetBuffList()) do if D.dwID==id then
returntrue else return flase end endend
如果要判断自身的debuff呢?则这样改:
/script function checkbuff(id)
for _, D in pairs(N.GetBuffList() or {}) do if D.dwID==id then
returntrue else return flase end endend
那么判断目标的debuff怎么改?请大家自己琢磨……
/script function checknobuff(id) for _, D in pairs(N.GetBuffList()) do if D.dwID~=id then returntrue else return false end endend
这个函数是检查自己是否有buff 没有则返回true 有则返回false.
而在lua中 not表示非
那么我们可以省略第四句
用not checkbuff(ID)可以表达和第四句一模一样的意思
这里大家如果觉得有难度,多看看,多用下就理解了
最后建议大家在写宏之前,添加的函数
/script N = GetClientPlayer()
/script t=GetTargetHandle(N.GetTarget() )
/script function checkbuff(id)
for _, D in pairs(N.GetBuffList() or {}) do if D.dwID==id then
returntrue else return flase end endend
这个是判断自身的buff和debuff,如果需要判断目标的buff和debuff,相信大家如果理解了,就会改
第六步:一键系列基本的写法:
下面介绍的是一个纯阳自动插剑:
一键插三剑:冲阴阳,化三清,破苍穹
/script N = GetClientPlayer();
/script A,B,C=N.GetSkillCDProgress(360,1);
/script a1,b1,c1=N.GetSkillCDProgress(357,1);
/script a3,b3,c3=N.GetSkillCDProgress(359,N.GetSkillLevel(359));
/script if (C==0) then OnUseSkill(360,1) end;
/script if (c1==0) then OnUseSkill(357,1) end;
/script if (c3==0) then OnUseSkill(359,N.GetSkillLevel(359)) end;
解说:
冲阴阳 ID:360
化三清 ID:357
破苍穹 ID:359
上面宏所用到的语法:
OnUseSkill(技能ID,N.GetSkillLevel(技能ID))
OnUseSkill(技能ID,技能等级)
这2个都是 释放技能的函数。
上面2个语句是一样的效果,第一个可以不用烦恼技能等级的提升。
/script PX1,PX2,PX3=N.GetSkillCDProgress(技能ID,N.GetSkillLevel(技能ID));
N.GetSkillLevel(技能ID)获取技能的等级
申请3个变量PX1,PX2,PX3,然后获得N(你)技能的冷却时间,第一个参数PX1我不清楚含义,第二个公共冷却所剩时间,第三个是技能冷却所剩时间
那么久可以很简单看透上面宏的用法:
if (C==0) then OnUseSkill(360,1) end;
如果 冲阴阳冷却了,则释放冲阴阳