【标准教程】教你从零开始一步步做官方宏

社区服务
高级搜索
猴岛论坛综合游戏交流【标准教程】教你从零开始一步步做官方宏
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
5个回复

【标准教程】教你从零开始一步步做官方宏

楼层直达
ヘ苍凉君″

ZxID:15325869

等级: 少校
当你走上了管理,你代表的不是个人,而是整个团队!
举报 只看楼主 使用道具 楼主   发表于: 2011-07-09 0
  开贴说明:本贴只做到抛砖引玉,希望大家能多多能够做到举一反三,学会的东西,才是自己,过分的依赖别人只会产生对自己的惰性。

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

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

ZxID:1033743

等级: 中校
这家伙很懒,啥都没留下,别看了。
举报 只看该作者 沙发   发表于: 2011-09-05 0
好贴,先顶了复制下来慢慢看,不过楼主,官方好像和谐了宏的长度吧?
killerhom

ZxID:1033743

等级: 中校
这家伙很懒,啥都没留下,别看了。
举报 只看该作者 板凳   发表于: 2011-09-05 0
对于我来说,作为一个和尚我希望先用佛心诀再用无相诀避免被驱散,以及用擒龙决之前有豆的话先用金刚怒目,我自己研究一下咋写比较好
 绕.指.柔^^

ZxID:15276876

等级: 大元帅
๑۩۞۩๑FU^CK๑۩۞۩๑

举报 只看该作者 地板   发表于: 2011-12-15 0
看不懂
心悸:

ZxID:16114548

等级: 上将
配偶: 束缚:

举报 只看该作者 4楼  发表于: 2012-05-04 0
【标准教程】教你从零开始一步步做官方宏
真闲啊。。。

swj4365

ZxID:2784567

等级: 上将
luck
举报 只看该作者 5楼  发表于: 2012-05-20 0
路过!!!         
« 返回列表
发帖 回复