开贴说明:本贴只做到抛砖引玉,希望大家能多多能够做到举一反三,学会的东西,才是自己,过分的依赖别人只会产生对自己的惰性。
本人已经重新编辑和改写了很多东西,希望大家重新学习。
最后说明:宏只是减少你的快捷键,并不能做到按一下,出3个或者更多的技能,那样的效果就不是宏,是外挂。
如果本贴的宏带有自动2字,请自觉忽视那2个字……因为自动是冒牌的,还是要大家自己按。
联系作者。
前言:
官方宏的要求,是玩家要能熟悉计算机基本语言,如果过了全国计算机考试二级的应该看懂没问题。
官方宏,如你在执行宏的期间,用了别的技能,就会打断你当前的宏,再次使用该宏时,将会从第一行重新开始执行。
本人是按最基础,比较规范的写法,如果嫌弃我的步骤繁琐,那么你是宏高手,本文直接略过。
警告:如果出现下列这样的写法,为错误的写法
/script for _, tBuff in pairs(tBuffList) do
if tBuff.dwID~=1674 then OnUseSkill(141,5)
end
end
用上面这中语句编写出来的,其中含有 tBuff.dwID~=1674 这样的表达式,估计会出现一些隐藏级别的错误,本文的每一个宏我都会实际测试。
鉴于本人只是水平有限 万一有错误,请您指出。
本人知识水平有限,尽力让各位理解,如果实在不能理解的,我也无能为力。
如果我有写出来的宏,会更新出来给大家看。
关于纯阳,万花,七秀方面的宏,我还可以帮助编辑下。
第一步:查找技能ID和技能等级
大家把鼠标移动你所需要找技能ID的技能上,按住CTRL键,技能描述里面红字部分为技能ID和技能等级,如下图所示
buff的ID与技能ID是不同的,但是找的方法是一样的,只需鼠标移动到人物buff上
第二步:if语句学习以及其他控制语句
基本语句:
if 条件then
语句
end ;
if就是如果的意思,真是true,假是false如果“条件” 为真则执行“语句” 如果条件为假,则直接结束 if 语句块
扩展格式:
if 条件 then
语句
else (if条件 then)
语句
end
if语句的具体用法,我会在后面给大家具体详细的说明,这里不举例了。
如果有多个条件可以用 and(并且)or(或者)连接
其他控制语句:
流程控制语句
while 表达式 do
语句块
end
如果表达式的结果为true,则执行语句块,到end后返回while再循环。如果表达式的结果为false,则跳过语句块执行end后的语句。
repeat
语句块
until 表达式
先执行语句块,再判断表达式是否为true,是则继续向下执行,否则返回repeat重复。
循环内可用break语句跳出包含该break的一层循环。
for 循环变量 = 初值, 终值 do
语句块
end
for 循环变量 = 初值, 终值,每次的增量 do
语句块
end
绝对不要在for语句块中修改循环变量。
函数
函数即可被重复调用的语句块。
function 函数名(参数列表)
语句块
end
参数列表为用逗号分隔的变量名列表,当执行到函数体内部时,他们就是函数体内的局部变量,并且已用调用时指定的实参赋值。参数列表可以为空。
函数可以返回值给调用者,使用
return 返回值
执行return之后将从函数返回调用者的下一条语句继续执行。
例:
function max(a, b)
if a > b then
return a
else
return b
end
local c = max(10, 20) -- c == 20
调用函数时使用
函数名(参数列表) 或 函数名()
注意括号必须加上,这样才表示函数调用,执行函数内的语句。
如果不加则表示一个函数类型的值。*
当需要返回多个值时,使用
return 返回值1,返回值2,...
调用时用多个变量接收返回值,例:
local v1, v2, v3
v1, v2, v3 = a_multi_return_value_funtion()
注意尽量不要使用多返回值,因为脚本解释器不检查变量的个数是否匹配,多则丢弃,少则置nil,容易倒致错误而不易发现
第三步:表达式
表达式就是算式概念的扩展。
数学表达式的运算符有 +, -, * (乘), / (除), ^ (指数),- (负号)
如果操作数是字符串类型,并可以被转换成数值,则将自动转换成数值
关系运算符返回布尔值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;
如果 冲阴阳冷却了,则释放冲阴阳
第七步:爆发宏实例
气纯终级大爆发宏:似乎韬光和两仪没公共cd,下面这个宏是瞬间爆发
5格两仪+韬光+两仪
/script N = GetClientPlayer();
/script A,B,C=N.GetSkillCDProgress(301,1);
/script A1,B1,C1=N.GetSkillCDProgress(313,1);
/script if (C==0 and N.nAccumulateValue==10) thenOnUseSkill(301,N.GetSkillLevel(301)) end;
/script if (C1==0) thenOnUseSkill(313,N.GetSkillLevel(313)) end;
/script if (C==0 and N.nAccumulateValue==10) thenOnUseSkill(301,N.GetSkillLevel(301)) end;
解说:
nAccumulateValue聚齐的个数 纯阳最大数是10对应5格气,和尚的未知,O(∩_∩)O谢谢
没有聚齐的职业,可以把 N.nAccumulateValue==10 删掉
其他的没什么号解说,看看上面2个例子就明了。
大家可以躲扩展下,剑纯的爆发,7x瞬间爆发,万花的双水月。都可以把这个宏稍微修改一下就OK。
第八步:万花自动春泥毫针宏:
/script N = GetClientPlayer()
/script t=GetTargetHandle(N.GetTarget())
/script if t==nil then SelectPlayer() end
/script function checkbuff(id)
for _, D in pairs(t.GetBuffList() or {}) do if D.dwID==id then
returntrue else return flase end end end
/script function sk(ss) OnUseSkill(ss,N.GetSkillLevel(ss)) end
/script A,B,C=N.GetSkillCDProgress(141,N.GetSkillLevel(141));
/script if C==0 then sk(141) end
/script if not checkbuff(1674) and not checkbuff(684)then sk(132) end
解说:
涓埃 万花春泥产生的debuffid:1674 春泥技能ID 132
附送:梦:1727 梦是释放给玩家天地低昂产生的负面 效果
毫针 141 buff 126
/script if t==nil then SelectPlayer() end
如果没有目标,则选择自己
/script T=GetTargetHandle(N.GetTarget());
是获得你的目标和 /script N = GetClientPlayer();意思差不多
如果玩家有涓埃的debuff则释放毫针,如果玩家身上没有涓埃没有天地低昂则释放 春泥
如果是七秀怎么改写这个宏呢??????
很简单 看下面
把下面这个宏里面的SS 改为春泥buff的ID X改为你风袖的技能ID即可。
/script N = GetClientPlayer();
/script T=GetTargetHandle(N.GetTarget());
/script function checkbuff(id)
for _, D in pairs(t.GetBuffList() or {}) do if D.dwID==id then
returntrue else return flase end end end
/script if (not checkbuff(1727) ) and (not checkbuff(SS) ) then OnUseSkill(X,N.GetSkillLevel(X)) end
自动无敌 附加喊话。
/script N = GetClientPlayer();
/script for i=1,3 do GetClientPlayer().Talk(PLAYER_TALK_CHANNEL.RAID, "", {{type = "text", text = "马上释放无敌,迅速向我靠拢…… 马上释放无敌,迅速向我靠拢…… "}}) end;
/script SelectPlayer();
/script a1,a2,a3=N.GetSkillCDProgress(371,1);
/script if a3<1 then OnUseSkill(371,1)elseOnUseSkill(167,1)end;
第二行附加了向团队喊话,瞬间喊话3次OnUseSkill(167,1)利用冲脉重置震山河…………
判断距离例子
/script N = GetClientPlayer()
/script t=GetTargetHandle(N.GetTarget())
/script function GetDistanceByTarget(target1, target2)
if not target1 or not target2 then return false end
if target1.nMapID ~= target2.nMapID then return false end
nX1= target1.nX
nX2 = target2.nX
nY1 = target1.nY
nY2 = target2.nY
strdis=(((nX1 - nX2) ^ 2 + (nY1 - nY2) ^ 2) ^ 0.5)/64
return strdis
end
/script m=GetDistanceByTarget(t,N)
/script OutputMessage("MSG_SYS",m)
最后的m就是距离 距离以黄色字输出在聊天栏里面,是带有很多位小数的
一键万花治疗
/script N = GetClientPlayer()
/script t=GetTargetHandle(N.GetTarget())
/script function checkbuff(id)
for _, D in pairs(t.GetBuffList() or {}) do if D.dwID==id then
returntrue else return flase end end end
/script tl=t.nCurrentLife/t.nMaxLife
/script A,B,C=N.GetSkillCDProgress(137,N.GetSkillLevel(137))
/script A1,B1,C1=N.GetSkillCDProgress(136,N.GetSkillLevel(136))
/script A2,B2,C2=N.GetSkillCDProgress(101,N.GetSkillLevel(101))
/script if tl>0.95 and not checkbuff(631) then OnUseSkill(101,N.GetSkillLevel(101)) end
/script if (checkbuff(722) or checkbuff(412) and tl<0.85) then OnUseSkill(142,N.GetSkillLevel(142)) end
/script if C==0 and not checkbuff(412) then OnUseSkill(137,N.GetSkillLevel(137)) end
/script if tl<0.6 and not checkbuff(722) then OnUseSkill(136,N.GetSkillLevel(136)) end;
黑色部分为握针,自原选择去掉。
解释:
目标无握针自动握针
逐流且目标生命低于85% 时自动长针
目标生命低于60%水月+长针
平时局针
/script tl=t.nCurrentLife/t.nMaxLife;
t.nCurrentLife 目标当前生命值
t.nMaxLife目标最大生命值
/script if a3<1 then OnUseSkill(371,1)elseOnUseSkill(167,1)end;
娱乐宏:依次,前跳,后跳,左跳,右跳
/script N = GetClientPlayer();
/script A,B,C=N.GetSkillCDProgress(9003,N.GetSkillLevel(9003));
/script A1,B1,C1=N.GetSkillCDProgress(9004,N.GetSkillLevel(9004));
/script A2,B2,C2=N.GetSkillCDProgress(9005,N.GetSkillLevel(9005));
/script A3,B3,C3=N.GetSkillCDProgress(9006,N.GetSkillLevel(9006));
/script if (C==0) then OnUseSkill(9003,N.GetSkillLevel(9003)) end;
/script if (C1==0 and C~=0) then OnUseSkill(9004,N.GetSkillLevel(9004)) end;
/script if (C2==0 and C1~=0 and C~=0) then OnUseSkill(9005,N.GetSkillLevel(9005)) end;
/script if (C3==0 and C2~=0 and C1~=0 and C~=0) then OnUseSkill(9006,N.GetSkillLevel(9006)) end;
/scriptif (C3~=0 and C2~=0 and C1~=0 and C~=0) thenfor i=1,3 do GetClientPlayer().Talk(PLAYER_TALK_CHANNEL.WORLD, "", {{type = "text", text = "我是大傻瓜+大冬瓜+大西瓜+大悲剧+大茶几,现在起家拍卖拉……………欲购从速,数量有限"}}) end