字号:

教你从零开始一步步做官方宏

时间:2010-03-16 09:33 作者:风雨潇潇梦无痕 手机订阅 参与评论(0) 【投稿】
文 章
摘 要
开贴说明:本贴只做到抛砖引玉,希望大家能多多能够做到举一反三,学会的东西,才是自己,过分的依赖别人只会产生对自己的惰性。本人已经重新编辑和改写了很多东西,希望大家重新学习。最后说明:宏只是减少你的快捷键,并不能做到按一下,出3个或者更多的技能,那样的效果就不是宏,是外挂。如果本贴

开贴说明:本贴只做到抛砖引玉,希望大家能多多能够做到举一反三,学会的东西,才是自己,过分的依赖别人只会产生对自己的惰性。

本人已经重新编辑和改写了很多东西,希望大家重新学习。

最后说明:宏只是减少你的快捷键,并不能做到按一下,出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;

如果 冲阴阳冷却了,则释放冲阴阳

第七步:爆发宏实例

气纯终级大爆发宏:似乎韬光和两仪没公**,下面这个宏是瞬间爆发

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

end;

加入17173玩家俱乐部,100%领《原神》月卡、《王者荣耀》888点券、《魔兽世界》T恤等周边好礼!
加入方式:微信关注“17173服务号”

最近更新

全球新闻