独自摸索了宏将近2个来月,作为一个研究宏的应用但是却不用宏的人,我感觉鸭梨很大。好吧,我不是标题党,不很写很引人注目的标题。通常这类帖子沉得很快(详情请参考前面写的的两篇七秀攻略贴),我也不想弄什么回复可见。如果大家觉得好的话就回一个帖子,作为对我的一种支持。
如果喷,请不要人身攻击,虽然我很淡定,但是不想口水。自从第一篇攻略帖子开始,就习惯写些有的没有的前言,主要介绍下为什么会写这篇攻略,嗯,其实我的志向是当作者。
言归正传,很多朋友们都在论坛上发帖求宏,我都尽量去满足。我个人认为给你宏,不如给你方法,我想很多研究宏的,写宏的,钻研程序的都有这种感觉,就像他们说的受人之鱼不如受人之渔。很多人都喜欢不劳而获,这种现象是很不正确的,你有一个脑子不是用来控制你的口和手来索要,而是用来思考。
这篇帖子起到一个整合的作用,几乎包含了常用的宏,可以作为一个检索以及研究方向,欢迎广大研究人士参考学习指正,在此抛砖引玉。
什么是宏?
我相信很多朋友们都不知道什么是宏,老听别人说用宏用宏,自己却不知道是啥意思,特此在这里扫盲一下。在计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。简单来说,可以把他想像成一个小程序,按照特定的指令来执行命令。
例:
比如说气纯的爆发宏:两仪化形+韬光养晦+两仪化形+带脉光明+韬光养晦+两仪化形。
首先,是结合了按键,再来是简化了操作,从而起到在紧张时候不容易按错,最后,起到了缓和网络延迟的作用。这个就是最常见的一种宏,人们口中常说的一键爆发。
宏的入门
首先写宏必须知道宏语言以及命令格式,API等等,没有这些东西,是写不出来宏的。
API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。简单的说就是金山给我们写宏的基础语言,例如魔兽中的/cast。
因为金山的宏没有通过封装,所以不宜推广,这也是为什么很多人觉得困难的原因。但是如果了解了这些未封装的语言(其实只需要懂一点点英文)是什么意思,那么就可以进行套用,这也是一个学习宏的方法。根据先驱者们所发的宏跟作用解释,来推断每一行的意思,在进行验证,那么可以说是懂得了这个宏。
下面介绍一些常用的API
GetCientPlayer()
字面上的意思为获取客户端玩家,实际效果也是如此,以下同理
GetTarget()
获取目标
GetTargetHandle()
获取指定目标ID
GetKungfuMount()
获取当前装备内功
GetDistanceByTarget(target1,target2)
获取target1跟target2指间的距离
GetSkillPrepareState()
获取读条状态
GetSkillCDProgress()
PLAYER_TALK_CHANNEL
玩家说话频道
OnUseSkill()
使用技能
GetSkillLevel()
获取技能等级
StopCurrentAction()
停止当前动作
nCurrentLife
当前生命
nMaxLife
最大生命
nCurrentMana
当前内力
nMaxMana
最大内力
bFightState
战斗状态,true为战斗状态,false为非战斗状态
bOnHorse
是否在马上
nAccumulateValue
纯阳或和尚的气或豆的个数
纯阳为半个气为1,也就是0-10之间的数,比如7就是3个半气。和尚为0-3指间的数,一比一。
基本上常用的就是这些了,光是知道这些也是写不出来宏的,只有知道如何运用他们才能写出一个可用的宏来。
如何写宏
步骤1:
写宏最先要知道的就是技能的ID,将鼠标移到技能上面按住CTRL,会出现一个调试用信息,如下图
由于金山截图机制貌似有点改动,所以图片不是很清楚。
如图所示,有个ID的地方写着561,level9。
这就是技能的ID与等级,在写使用技能的宏时非常有用。
步骤2:
基本语句:
这是剑三宏里面最常用的语句,其他的语句类型由于不常用则不做另外介绍。
if条件then
语句
end;
if就是如果的意思,如果“条件”则执行“语句”如果达不到条件,则直接结束if语句块。
扩展格式:
else(if条件then)
end
如果“条件”则执行“语句”如果达不到条件,则执行ELSE的语句,然后结束if语句块。
for循环变量=初值,终值do
语句块
for循环变量=初值,终值,每次的增量do
函数封装:
function函数名(参数列表)
这是比较高级的运用,目的是为了简化宏,在判断同一类型条件的时候会用到,后面会详细介绍。
步骤3:
判断条件以及数值的表达式。
最常用的表达式为and,用于判断多个条件。其次是一些数值的判断例如:
<
>
<=
>=
=
==
~=
双等号是判断,单等号是赋值,最后一个是不等于,其他的,嗯,不多解释。
步骤4:
思考要做一个什么宏。
例如我想做一个减少键位的宏,将坐忘无我,回春妙手跟猛虎下山这三个技能合并为一个键上,属于装备猛虎下山秘籍后的PVP宏。
首先去寻找技能ID:
猛虎下山58,1
回春妙手52,2
坐忘无我312,X
这里由于坐忘没有满级,可能在战斗中提升等级,而导致宏不能用,那么在下面将提出解决方法。
步骤5:
写一个宏。
写宏的时候尤其要注意大小写的问题以及括号的问题,本人多次因为有一个字母本该小写却打成大写后导致运行不成功。
看以下例子:
/scriptN=GetClientPlayer()
/scripta,b,c=N.GetSkillCDProgress(312,N.GetSkillLevel(312))
/scriptd,e,f=N.GetSkil)
DProgress(58,1)
/scriptg,h,i=N.GetSkillCDProgress(52,2)
/scriptiff==0thenOnUseSkill(58,1)end
/scriptifc==0thenOnUseSkill(312,N.GetSkillLevel(312))end
/scriptifi==0thenOnUseSkill(52,2)end
第一行是宣告一个变量N作为GetClientPlayer()的代替,大致上就跟数学里的设X一样,属于一种简单的函数封装,为了简化下面的语句。
第二,三,四行为判断技能冷却的语句,由于这里并不是很多,所以不用通过FUNCTION来封装。
第二行有一个获取技能等级的是因为不确定技能等级为多少,如果错误的填一个数字进去,则整个宏作用失效。当然如果知道技能等级则可以像第三,四行一样简化。
这里每行设置的三个数,a到i,其中每行的第二个字母,为该技能的公共冷却,第三个字母为技能冷却。
第五行,如果技能猛虎下山(58)冷却为零,则使用猛虎下山
第六行,如果技能坐忘无我(312)冷却为零,则使用坐忘无我
第七行,如果技能回春妙手(52)冷却为零,则使用回春妙手
步骤6:
检查宏的效果,如果达到预期效果,那么这个宏就算做好了。
如果出错则要看看错误是在哪里,比如说,回春妙手用不出来,那么就检查第四跟七行是否有语句上的基本错误,如果没有再从第一行开始检查。
宏的基本运用
一键多技能
如上面得例子,将所有的技能合并到一个键上,通过各种条件判断技能释放前后。
例外:名动四方。这是判断公**跟技能CD,一般情况下只用判断技能CD,格式如下:
/scriptXX1,XX2,XX3=N.GetSkillCDProgress(XXX,X)
/scriptYY1,YY2,YY3=N.GetSkillCDProgress(YYY,Y)
/scriptZZ1,ZZ2,ZZ3=N.GetSkillCDProgress(ZZZ,Z)
/scriptifXX2==0andXX3==0thenOnUseSkill(XXX,X)end
/scriptifYY2==0andYY3==0thenOnUseSkill(YYY,Y)end
/scriptifZZ2==0andZZ3==0thenOnUseSkill(ZZZ,Z)end
这是一个简单的技能冷却一到就使用技能的宏,适合于练第二门派技能的时候。
如果技能多了,可以进行函数封装:
下面是技能冷却的封装,调用的时候作为一个条件来用,只用改变括号里的ID就行了。
/scrpitfunctioncd(id)A,B,C=N.GetSkillCDProgress(id,N.GetSkillLevel(id))returnCend
如果是判断坐忘无我的话就这样
/scriptifcd(312)==0thenOnUseSkill(312,N.GetSkillLevel(312))end
这个是一个判断技能冷却以及使用技能的封装,一般情况下只需要直接使用就好了。
/scriptfunctionuse(id)A,B,C=N.GetSkillCDProgress(id,N.GetSkillLevel(id))ifC==0thenOnUseSkill(id,N.GetSkillLevel(id))endend
/scriptuse(312)
buff判断封装
/scriptfunctionbuff(mb,id,lvl)for_,Dinpairs(mb.GetBuffList()or{})doifD.dwID==idand(lvl==nilorD.dwLevel==lvl)thenreturntrueendendreturnfalseend
可以判断自己或者敌人的BUFF跟DEBUFF,以及BUFF跟DEBUFF的等级,作为一个条件,下面有实例。
省事很多。
关于七秀的一键整合
由于名动四方这个特殊的BUFF,需要加入一个判断BUFF的判断。
下面就以一键爆发来说明
满堂势+繁音急节+冲脉关门+剑气长江+剑主天地+剑心通明。
剑舞BUFF(409)
名动四方(537,7)
满堂势(573,1)
繁音急节(568,4)
冲脉关门(168,1)
剑气长江(561,9)
剑主天地(562,10)
剑心通明(547,5)
有这么多技能就需要一些封装,不然写出来都是一大串。
/scriptifuse(547)
/scriptifnotbuff(N,409,35)thenuse(573)end
/scriptifnotbuff(N,409)thenuse(537)end
/scriptifnotbuff(N,568)thenuse(568)end
/scriptuse(168)
/scriptifbuff(N,409)thenuse(561)end
/scriptifbuff(N,409)thenuse(562)end
第一行是一个小封装,详细见上面。
第二行一个使用技能的封装,use(id)括号里的ID替代为技能ID。宣告ABC为获取技能冷却,如果技能CD等于0,则使用该技能。
第三行是一个判断BUFF的封装,buff(mb,id,lvl)括号里前面一个代表目标,后面一个是buffID,最后一个是判断BUFF等级,如果不填就不判断。这是一个判断目标BUFF跟DEBUFF的封装,只要需要判断BUFF就可以用到这个函数,我们这里目标是我们自己所以为N,剑舞BUFF为409。在这里是为了判断剑舞是不是达到满堂势剑舞的等级,满堂势剑舞等级为35,而满层剑舞等级为34。
第四行是使用剑心通明
第五行是如果没有剑舞则使用满堂势
第六行是如果没有剑舞则使用剑舞(怕有些时候满堂势被去掉)
第七行是如果没有繁音,则使用繁音
第八行是使用冲脉关门
第九行是如果有剑舞则使用剑气长江
第十行是如果有剑舞则使用剑主天地
喜欢研究的同学可以对照研究,喜欢照搬的同学可以直接搬走。其他的一键输出可以参考这一项,后面会给一些实际例子。
关于其他技能整合
除了一键输出,宏可以用来解决键位问题,主要用于辅助技能整理,两个门派技能键位整合。
/scriptP=N.nAccumulateValue
/scriptK=N.GetKungfuMount().dwSkillID
/scriptifK==10080orK==10081thenuse(544)end
/scriptifK==10014andP>0thenuse(303)end
第一二三四行为封装,不多解释。
第五行,如果内功为冰心或者云裳,则使用技能帝骖龙翔
第六行,如果内功为紫霞功(俗称气纯)以及气大于半格,则使用三才化生。
嗯,这是一个比较简单的不同门派内功绑定同一个键位的,由于这两种都是同一类型的技能,所以归类在一起。
内功的ID如下:
10002洗髓经
10003易筋经
10014紫霞功
10015太虚剑意
10021花间游
10026傲血战意
10028离经易道
10062铁牢律
10080云裳心经
10081冰心诀
判断其他内功的将那个数字替换就可以了,例如剑纯跟气纯的气场其实可以整合在一起。例如碎星辰+冲阴阳为一组等等,请自行组合。
喊话宏
/scriptfori=1,1doGetClientPlayer().Talk(PLAYER_TALK_CHANNEL.NEARBY,"密语对象",{{type="text",text="请输入内容"}})end;
简单明了,作用于循环喊话。
前面的fori=1,1是喊话一次,fori=1,2是喊话2次
另外一个比较简化的是一个封装,可以用作判断。
/scriptfunctionsay()N.Talk(PLAYER_TALK_CHANNEL.NEARBY,"密语对象",{{type="text",text="请输入内容"}})end;
其他频道喊话只需要把NEARBY更换掉就好了(全部为大写):
NEARBY近聊
SENCE地图
WORLD世界
TEAM队伍
RAID团队
BATTLE战场
TONG帮会
SCHOOL门派
CAMP阵营
FRIENDS好友
附带一个上马下马不同喊话的喊话宏:
/scriptfunctionsay1()N.Talk(PLAYER_TALK_CHANNEL.NEARBY,"",{{type="text",text="我有一头小毛驴,但我从来也不骑"}})end
/scriptfunctionsay2()N.Talk(PLAYER_TALK_CHANNEL.NEARBY,"",{{type="text",text="小毛驴累了"}})end;
/scriptOnUseSkill(605,1)
/scriptifbuff(N,244)thensay2()elsesay1()end
或者是
/scriptH=N.bOnHorse
/scriptifH==truethensay2()elsesay1()end
前者与后者的不同之处在于前者是判断骑马时的增益状态,后者是判断是否在马上。
关于智能判断
这里介绍下比较常用的几项判断:
1、增益与减益的判断(buff或者debuff,见上)
2、技能冷却判断(见上)
3、纯阳与和尚的集气判断(见上)
4、气血以及内力的值或者比的判断
5、读条状态
6、距离判断
7、其他
前四项可以在上面找到解释,这里只是重复解释一下。
1、增益于减益判断
建议使用函数封装,以下为原始语句:。
以下为自身增益的检测
/scriptfor_,Dinpairs(GetClientPlayer().GetBuffList())doifD.dwID==增益的IDthen执行语句endend;
以下为自身减益的检测
/scriptfor_,Dinpairs(GetClientPlayer().GetBuffList()or{})doifD.dwID==减益的IDthen执行语句endend;
那么进行一下封装,成一个比较灵活的检测目标增益减益以及等级的判断
如果前面加入了小封装,则N=自身,T等于敌对目标的话,在这里,MB=N就是判断自身状态,MB=T就是判断敌方状态。ID就是增益减益的ID,等级对应BUFF等级,有些BUFF有层数的,如剑舞。
2、技能冷却判断
同样建议使用函数封装,以下为原始语句
/scriptXX1,XX2,XX3=N.GetSkillCDProgress(技能ID,技能等级)
这XX1用不到,XX2是代表公共冷却,XX3则是代表技能冷却。
进行下简单的封装
如果要将技能冷却判断跟使用技能一起封装的话就这样
3、纯阳与和尚的集气判断
判断集气的API是
纯阳为半个气为1,也就是0-10之间的数,比如7就是3个半气
和尚为0-3指间的数,一比一
只能判断自身集气数,没有强大到判断敌方集气数。
使用方法如下
/scriptifGetClientPlayer.nAccumulateValue==10thenOnUseSkill(301,X)end
进行下封装
/scriptP=GetClientPlayer.nAccumulateValue
/scriptifP==10thenOnUseSkill(301,X)end
4、气血以及内力值或者比的判断
关于这类的判断会用到以下几个API
判断自身当前生命值
/scriptHP=GetClientPlayer.nCurrentLife
/scriptifHP=<5000thenOnUseSkill(XXX,X)end
判断内力值就把nCurrentLife换成nCurrentMana
判断自身生命比
/scriptHPR=GetClientPlayer.nCurrentLife/GetCLientPlayer.nMaxLife
/scriptifHPR<=0.5thenOnUseSkill(XXX,X)end
判断自身当前内力比就将nCurrentLife以及nMaxLife,换成对应的nCurrentMana跟nMaxMana
判断敌方当前生命值
/scriptT=GetTargetHandle(GetClientPlayer.GetTarget())
/scripttHP=T.nCurrentLife
/scriptiftHP<=5000thenOnUseSkill(XXX,X)end
判断敌方生命比
/scripttHPR=T.nCurrentLife/T.nMaxLife
/scriptiftHPR<=0.5thenOnUseSkill(XXX,X)end
判断自身读条状态
/scriptbPrePare,dwID,dwLevel,fP=N.GetSkillPrepareState()
/scriptifbPreParethenN.StopCurrentAction()end
如果自身处于读条状态,则打断读条。
判断敌方读条状态
/scriptt=GetTargetHandle(N.GetTarget())
/scriptbPrePare,dwID,dwLevel,fP=t.GetSkillPrepareState()
/scriptifbPreParethenOnUseSkill(547,5)end
如果对方读条,则使用剑心通明打断。
判断敌方读条技能
/scriptifbPrePareanddwID==367thenOnUseSkill(547,5)elseOnUseSkill(553,10)end
如果对方读条技能为四象轮回,则使用剑心通明打断,反之使用江海凝光。
有心的同学们可以发现这里这个判断释放什么技能的很强力,嗯,确实很强力,例如BOSS使用读条技能,可以作为一个判断BOSS技能的,例如镇龙头。
问题:如何得知BOSS技能ID?
有一种笨办法就是自己去收集,嗯,如何收集见下:
/scriptOutputMessage("MSG_SYS",dwID)
在BOSS读条的时候在聊天窗口返回一个数值,这个数值就是BOSS技能的ID,然后加入进判断条件里面就可以做到镇龙头开御,佛归西扶摇等。
嗯,关于距离判断的比较复杂,我尽量解释清楚。
第一种是:
/scriptfunctionGetDistanceByTarget(target1,target2)
ifnottarget1ornottarget2thenreturnfalseend
iftarget1.nMapID~=target2.nMapIDthenreturnfalseend
nX1=target1.nX
nX2=target2.nX
nY1=target1.nY
nY2=target2.nY
strdis=(((nX1-nX2)^2+(nY1-nY2)^2)^0.5)/64
returnstrdis
/scriptd=GetDistanceByTarget(t,N)
中间那个函数就是计算距离的,通过人工的方式来计算。
如果没有目标则返回FALSE
如果两个目标不在一个地图,则返回FALSE
NX1是目标1的X坐标
NX2是目标2的X坐标
NY1是目标1的Y坐标
NY2是目标2的Y坐标
直线距离等于((X1-X2)的平方加上(Y1-Y2)的平方)的0.5次方除以64
返回直线距离
另外一种比较简单的
/scriptN=GetClientPlayer();
/scripttT,tID=N.GetTarget();
/scriptt=GetTargetHandle(tT,tID);
/scriptm=GetCharacterDistance(N.dwID,tID);
这种判断在判断距离的时候要除以64,才是真正的距离
为了方便加入一个封装
/scriptd=m/64
调用距离的时候就使用d
附带一个例子:
判断距离如果目标距离小于6尺使用冲脉太乙加九转归一,如果目标距离大于6尺并且小于8尺则使用九转归一。
/scriptifd<=6thenOnUseSkill(169,1)end
/scriptifd<=6thenOnUseSkill(305,1)end
/scriptifd>6andd<8thenOnUseSkill(305,1)end
宏实例
1、一键后跳
/scriptOnUseSkill(9007,1)
2、一键打断自身读条
/scriptGetClientPlayer().StopCurrentAction()
3、延时宏
/delay1
下一行命令延时1S执行
4、剑纯DPS
/scriptPower=N.nAccumulateValue;
/scriptFight=N.bFightState;
/scriptMH1,MH2,MH3=N.GetSkillCDProgress(58,N.GetSkillLevel(58));
/scriptifMH2==0andMH3==0andFight==truethenOnUseSkill(58,N.GetSkillLevel(58))end;
/scriptTD1,TD2,TD3=N.GetSkillCDProgress(309,N.GetSkillLevel(309));
/scriptSH1,SH2,SH3=N.GetSkillCDProgress(364,N.GetSkillLevel(364));
/scriptifPower>7thenOnUseSkill(365,N.GetSkillLevel(365))end;
/scriptifPower<8andTD2==0andTD3==0thenOnUseSkill(309,N.GetSkillLevel(309))end;
/scriptifPower<8andSH2==0andSH3==0thenOnUseSkill(364,N.GetSkillLevel(364))end;
/scriptOnUseSkill(13,N.GetSkillLevel(13));
猛虎下山冷却好了就使用。
如果气大于3格半则使用无我无剑如果气小于4格,天地无极或者三环套月没有冷却,则释放天地无极跟三环套月,天地无极优先于三环套月释放。
5、离经无脑治疗
/scriptplayer=GetClientPlayer()
/scripttarget=GetTargetHandle(player.GetTarget())
/scriptCDA,CDB,CDC=player.GetSkillCDProgress(136,player.GetSkillLevel(136))
/scriptiftarget.nCurrentLife/target.nMaxLife<=0.3andCDC==0thenOnUseSkill(136,1)end
/scriptfor_,vinpairs(player.GetBuffList())doif(v.dwID==722orv.dwID==412)thenOnUseSkill(142,player.GetSkillLevel(142))endend
/scriptfor_,vinpairs(target.GetBuffList())doif(v.dwID==631)thenOnUseSkill(137,player.GetSkillLevel(137))endend
/scriptOnUseSkill(101,player.GetSkillLevel(101))
6、气纯无脑输出
/scriptp=N.nAccumulateValue
/scriptsx1,sx2,sx3=N.GetSkillCDProgress(367,N.GetSkillLevel(367));
/scriptly1,ly2,ly3=N.GetSkillCDProgress(301,N.GetSkillLevel(301));
/scriptifsx2>=1thenOnUseSkill(300,N.GetSkillLevel(300))end;
/scriptifp>=8thenOnUseSkill(301,N.GetSkillLevel(301))end;
/scriptifp<=7thenOnUseSkill(367,N.GetSkillLevel(367))end;
如果公共冷却大于等于1,则释放凝神聚气。
如果气大于等于4格,则释放两仪化形。
如果气小于或等于3格半,则释放四象轮回。
7、气纯无脑输出(回蓝版)
/scriptby1,by2,by3=N.GetSkillCDProgress(316,N.GetSkillLevel(316));
/scripta=0
/scriptm=N.nCurrentMana
/scriptifm<=7500andby2==0thena=1end;
/scriptifp<=9anda==1thenOnUseSkill(367,N.GetSkillLevel(367))end;
/scriptifp==10anda==1thenOnUseSkill(316,N.GetSkillLevel(316))end;
/scriptifp>=8anda==0thenOnUseSkill(301,N.GetSkillLevel(301))end;
/scriptifp<=7anda==0thenOnUseSkill(367,N.GetSkillLevel(367))end;
增加了一个判断是否需要回蓝的变量a,当蓝少于7500且抱元冷却时,判断a=1也就是进入需要回蓝状态,此时如果气不满则不停释放四象集气,一直到满气后释放抱元回蓝。(7500是参考数,可以自行调节)
8、上下马,一键后跳
/scriptHorse=N.bOnHorse;
/scriptifFight==falsethenOnUseSkill(605,N.GetSkillLevel(605))end;
/scriptifHorse==trueandFight==truethenOnUseSkill(605,N.GetSkillLevel(605))end;
/scriptifHorse==falseandFight==truethenOnUseSkill(9007,N.GetSkillLevel(9007))end;
不在战斗中,就是上下马的快捷键。
如果在战斗时,分两种情况,一种是在马上就是下马,一种是在马下,则为后跳。
备注:不在战斗中,是不会后跳的。
9、剑纯爆发宏
/scriptWW=0;
/scriptTG=0;
/scriptGM=0;
/scriptWQ=0;
/scriptWW1,WW2,WW3=N.GetSkillCDProgress(365,N.GetSkillLevel(365));
/scriptTG1,TG2,TG3=N.GetSkillCDProgress(313,N.GetSkillLevel(313));
/scriptGM1,GM2,GM3=N.GetSkillCDProgress(153,N.GetSkillLevel(153));
/scriptWQ1,WQ2,WQ3=N.GetSkillCDProgress(154,N.GetSkillLevel(154));
/scriptifWW3<1andWW==0andPower>2thenOnUseSkill(365,N.GetSkillLevel(365))end;
/scriptifTG3<1andTG==0andPower<3andFight==truethenOnUseSkill(313,N.GetSkillLevel(313))end;
/scriptifWQ3<1andWQ==0andPower>9andFight==truethenOnUseSkill(154,N.GetSkillLevel(154))end;
/scriptifTG3>1andGM==0andFight==truethenOnUseSkill(153,N.GetSkillLevel(153))end;
当韬光养晦,或是带脉·光明不处于冷却时,无我必须在1格气以上(不含1格气)时方可释放,否则无效。
带脉·外丘只有满豆时,会自动释放。
10、气纯爆发宏
/scriptLY=0;
/scriptCG=0;
/scriptLY1,LY2,LY3=N.GetSkillCDProgress(301,N.GetSkillLevel(301));
/scriptCG1,CG2,CG3=N.GetSkillCDProgress(168,N.GetSkillLevel(168));
/scriptifLY3<1andLY==0thenOnUseSkill(301,N.GetSkillLevel(301))end;
/scriptifTG3<1andTG==0andPower<2andFight==truethenOnUseSkill(313,N.GetSkillLevel(313))end;
/scriptifCG3<1andCG==0andPower>9andFight==truethenOnUseSkill(168,N.GetSkillLevel(168))end;
如果你有冲脉关门,带脉光明都点出来,这个宏足够支持你强大的爆发(3个两仪)。
如果你没有点带脉光明,这个宏也是可以使用的(只有2个两仪)。
不在战斗中光明,关门是不会释放的。
11、天策宏
/scriptA,B,C=N.GetSkillCDProgress(418,N.GetSkillLevel(418));
/scripta1,b1,c1=N.GetSkillCDProgress(482,N.GetSkillLevel(482));
/scripta2,b2,c2=N.GetSkillCDProgress(401,N.GetSkillLevel(401));
/scripta3,b3,c3=N.GetSkillCDProgress(402,N.GetSkillLevel(402));
/scripta4,b4,c4=N.GetSkillCDProgress(441,N.GetSkillLevel(441));
/scriptif(C==0)thenOnUseSkill(418,N.GetSkillLevel(418))end;
/scriptif(c1==0)thenOnUseSkill(482,N.GetSkillLevel(482))end;
/scriptif(c2==0)thenOnUseSkill(401,N.GetSkillLevel(401))end;
/scriptif(c3==0)thenOnUseSkill(402,N.GetSkillLevel(402))end;
/scriptif(c4==0)thenOnUseSkill(441,N.GetSkillLevel(441))end;
突+崩+破风+定军+穿
12、天策宏OT后补救
/scriptu=GetTargetHandle(t.GetTarget())
/scriptfunctionJuli(target1,target2)
ifnottarget1ornottarget2thenreturnflaseend
strdis=(((target1.nX-target2.nX)^2+(target1.nY-target2.nY)^2)^0.5)/64returnstrdisend
/scriptfunctioncheckbuff(id)
for_,Dinpairs(t.GetBuffList()or{})doifD.dwID==idthen
returntrueendendreturnfalseend
/scriptm=Juli(t,N)
/scriptA,B,C=N.GetSkillCDProgress(402,6)
/scriptfunctionot(sw)ifsw.dwSchoolID==2orsw.dwSchoolID==3orsw.dwSchoolID==4thenreturntrueelsereturnflaseendend
/scriptifot(u)andm<4.5thenOnUseSkill(402,6)end
/scriptifot(u)andm<4.5and(notcheckbuff(199))andC>0thenOnUseSkill(411,6)end
/scriptifm>8.5andm<25.5thenOnUseSkill(418,6)end
/scriptifnotot(u)andm<4.5thenOnUseSkill(401,10)end
/scriptifnotot(u)andm<4.5thenOnUseSkill(12,1)end
当前目标的目标是七秀或者万花或者纯阳,则释放定军。
当定军miss时,则释放火+定军。
当目标在8尺以外时则释放突。
当目标的目标不是七秀或者万花或者纯阳时,在4尺以内,则释放破风,梅花枪
此宏做完FB有人OT时的抢怪……勿用为野外开怪第一个突来用,否则会悲剧的
13、天策输出宏
/scriptfunctionchecktbuff(bp)
for_,Dinpairs(N.GetBuffList()or{})doifD.dwID==bpthen
/scriptA,B,C=N.GetSkillCDProgress(403,N.GetSkillLevel(403));
/scriptA1,B1,C1=N.GetSkillCDProgress(415,N.GetSkillLevel(415));
/scriptA2,B2,C2=N.GetSkillCDProgress(423,N.GetSkillLevel(423));
/scriptA3,B3,C3=N.GetSkillCDProgress(400,N.GetSkillLevel(400));
/scriptifchecktbuff(366)thenOnUseSkill(403,N.GetSkillLevel(403))end
/scriptifcheckbuff(540)thenOnUseSkill(415,N.GetSkillLevel(415))end
/scriptifnotcheckbuff(540)andnotcheckbuff(366)andC2==0thenOnUseSkill(423,N.GetSkillLevel(423))end
/scriptifnotcheckbuff(540)andnotcheckbuff(366)andC3==0andC2>0thenOnUseSkill(400,N.GetSkillLevel(400))end
当本身有克敌状态时,则释放龙吟
当目标有致残状态时,则释放龙牙
当目标无克敌或者致残时,则释放灭
当目标无克敌或者致残,且灭在CD时,则释放穿云
14、离经水月长针
/scriptA,B,C=N.GetSkillCDProgress(136,1);
/scripta,b,c=N.GetSkillCDProgress(167,1);
/scriptfor_,Dinpairs(N.GetBuffList())doif(D.dwID==722orD.dwID==412)thenOnUseSkill(142,6)endend;
/scriptif(C==0)thenOnUseSkill(136,1)end;
/scriptif(C>0andc==0)thenOnUseSkill(167,1)end;
首先判断是否有逐流BUFF,有就放长针没有就放水月+长针。
如果水月在CD中放“冲脉.幽门”+水月+长针
如果没有幽门,去掉第三行跟最后一行。
15、气纯一键四气场
/scriptA,B,C=N.GetSkillCDProgress(360,1);
/scripta1,b1,c1=N.GetSkillCDProgress(357,1);
/scripta2,b2,c2=N.GetSkillCDProgress(358,1);
/scripta3,b3,c3=N.GetSkillCDProgress(359,N.GetSkillLevel(359));
/scriptif(C==0)thenOnUseSkill(360,1)end;
/scriptif(c1==0)thenOnUseSkill(357,1)end;
/scriptif(c2==0)thenOnUseSkill(358,1)end;
顺序是:冲阴阳,化三清,生太极,破苍穹分别对应下面这个宏的最后四行
16、自动生太极
/scriptSelectPlayer()
/scriptfor_,pBinpairs(GetClientPlayer().GetBuffList())doifpB.dwID~=374thenOnUseSkill(358,1)endend;
/scriptif(c3==0)thenOnUseSkill(359,N.GetSkillLevel(359))end;
17、自动扶摇
/Delay1
/scriptOnUseSkill(9002,N.GetSkillLevel(9002))
/scriptJump()
打断当前读条延时1s,然后扶摇+起跳
18、万花春泥毫针宏:
/scriptift==nilthenSelectPlayer()end
/scriptfunctioncheckbuff(id)for_,Dinpairs(t.GetBuffList()or{})doifD.dwID==idthenreturntrueendendreturnfalseend
/scriptfunctionsk(ss)OnUseSkill(ss,N.GetSkillLevel(ss))end
/scriptA,B,C=N.GetSkillCDProgress(141,N.GetSkillLevel(141));
/scriptifC==0thensk(141)end
/scriptifnotcheckbuff(1674)andnotcheckbuff(684)thensk(132)end
如果目标没有则选择自己此时目标为自己
毫针冷却则放毫针
如果目标身上没有春泥的负面buff以及没有天地低昂时释放春泥
19、自动无敌附加喊话
/scriptfori=1,3doGetClientPlayer().Talk(PLAYER_TALK_CHANNEL.TEAM,"",{{type="text",text="马上释放无敌,迅速向我靠拢……马上释放无敌,迅速向我靠拢……"}})end;
/Delay2
/scriptSelectPlayer();
/scripta1,a2,a3=N.GetSkillCDProgress(371,1);
/scriptifa3<1thenOnUseSkill(371,1)elseOnUseSkill(167,1)end;
/Delay2这句是在延迟2s后才可以释放无敌,大家可以删去,也可以更改2这个数字,2在这里代表2秒请注意多按几次……避免喊话后,你没有再按,则无敌释放不出来……
20、气纯坐忘+吐纳故新
for_,Dinpairs(N.GetBuffList())doifD.dwID==idthen
/scriptifnotcheckbuff(136)thenOnUseSkill(314,N.GetSkillLevel(314))end
/scriptifnotcheckbuff(1376)thenOnUseSkill(312,N.GetSkillLevel(312))end
21、七秀逃命宏
帝骖龙翔+蝶弄足+鹊踏枝+邻里曲+天地低昂
/scriptA,B,C=N.GetSkillCDProgress(544,N.GetSkillLevel(544))
/scriptA1,B1,C1=N.GetSkillCDProgress(574,N.GetSkillLevel(574))
/scriptA2,B2,C2=N.GetSkillCDProgress(568,N.GetSkillLevel(568))
/scriptA3,B3,C3=N.GetSkillCDProgress(561,N.GetSkillLevel(561))
/scriptA4,B4,C4=N.GetSkillCDProgress(562,N.GetSkillLevel(562))
/scriptifC==0thenOnUseSkill(544,N.GetSkillLevel(544))end
/scriptifC2==0thenOnUseSkill(574,N.GetSkillLevel(574))end
/scriptifC3==0thenOnUseSkill(550,N.GetSkillLevel(550))end
/scriptifC4==0thenOnUseSkill(557,N.GetSkillLevel(557))end
22、离经一键治疗宏(节蓝版)
/scriptp=GetClientPlayer();
/scriptt=GetTargetHandle(p.GetTarget());
/scripttl=t.nCurrentLife/t.nMaxLife;
/scriptA,B,C=p.GetSkillCDProgress(136,1);
/scripta,b,c=p.GetSkillCDProgress(167,1);
/scriptD,E,F=p.GetSkillCDProgress(141,5);
/scriptfor_,vinpairs(p.GetBuffList())doif(v.dwID==722orv.dwID==412andtl>0.7)thenOnUseSkill(137,7)endend;
/scriptfor_,vinpairs(p.GetBuffList())doif(v.dwID==722orv.dwID==412andtl<=0.7andtl>0.5)thenOnUseSkill(138,8)endend;
/scriptfor_,vinpairs(p.GetBuffList())doif(v.dwID==722orv.dwID==412andtl<=0.5)thenOnUseSkill(142,6)endend;
/scriptif(tl<=0.3andC==0)thenOnUseSkill(136,1)end;
/scriptif(tl<=0.3andC>0andc==0)thenOnUseSkill(167,1)end;
/scriptfor_,vinpairs(t.GetBuffList())doif(v.dwID==631andF==0)thenOnUseSkill(141,5)endend;
/scriptfor_,vinpairs(t.GetBuffList())doif(v.dwID==631andF>0)thenOnUseSkill(137,7)endend;
/scriptOnUseSkill(101,9);
本宏作用:
特殊情况1:触发逐流BUFF。
目标血量大于70%局针
目标血量小于70%大于50%提针
目标血量小于50%长针
特殊情况2:目标血量低于30%,且没有逐流BUFF
水月不在CD中开水月+长针
水月CD了且冲脉幽门不在CD中,放幽门+水月+长针。没有点出冲脉幽门的请去掉宏命令中红色部分。
由于字符数的限制没有把冲脉关门做进去,同样是字符限制,只能在写宏的时候把详细的技能等级加上去,而不能用GetSkillLevel()函数,这样技能没有练满的童鞋需要根据自己实际情况改宏。
修改处1:p.GetSkillCDProgress(141,5)改成p.GetSkillCDProgress(141,x)x为你的毫针等级。
修改处2:OnUseSkill(137,7)改成OnUseSkill(137,x)x为你的局针等级。
修改处3:OnUseSkill(138,8)改成OnUseSkill(138,x)x为你的提针等级。
修改处4:OnUseSkill(142,6)改成OnUseSkill(142,x)x为你的长针等级。
修改处5:OnUseSkill(141,5)改成OnUseSkill(141,x)x为你的毫针等级。
修改处6:OnUseSkill(101,9)改成OnUseSkill(101,x)x为你的握针等级。
23、花间无限定身宏
/scriptt=GetTargetHandle(N.GetTarget());
/scriptA,B,C=N.GetSkillCDProgress(186,N.GetSkillLevel(186));
/scriptfor_,vinpairs(t.GetBuffList())doif(v.dwID==675)thenOnUseSkill(179,N.GetSkillLevel(179))endend;
/scriptif(C==0)thenOnUseSkill(186,N.GetSkillLevel(186))end;
/scriptif(C>0)thenOnUseSkill(181,N.GetSkillLevel(181))end;
/scriptif(C>0)thenOnUseSkill(228,N.GetSkillLevel(228))end;
本宏作用:芙蓉并蒂=>阳明指=>芙蓉并蒂=>阳明指。。。。。。。。。偏离了循环中断,就放少阳指减速,或者放太阴指拉开距离。重要:红色部分和橙色部分只能二选一。像我上面写的那样,橙色部分是不会起任何作用的。
目前缺陷:1、进入战斗状态后才有用2、芙蓉并蒂后第一个阳明指结束,目标还处于定身状态,所以会继续放第二个阳明指然后才芙蓉,所以实际上的循环是1-2-2-1-2-2……
24、花间一键打断宏
/scriptA,B,C=p.GetSkillCDProgress(183,1);
/scriptift.GetSkillPrepareState()andp.GetSkillPrepareState()thenp.StopCurrentAction()end;
/scriptifC==0andt.GetSkillPrepareState()thenOnUseSkill(183,1)end;
如果其他职业的打断技能就将183改成对应ID。
宏功能说明:
1、如果目标正在施法,且自己也在施法,则打断当前施法条。
2、如果目标正在施法,且厥阴指不在CD中,则释放厥阴指。
如果你正在读条,那么要连点2下才能打断目标的施法。
25、智能春泥宏
/scriptfor_,vinpairs(t.GetBuffList())doif(v.dwID==684)thenOnUseSkill(141,5)endend;
/scriptOnUseSkill(132,7);
26、传说中的万花一键PK天策宏
/scriptP=GetClientPlayer()
/scripttT,tID=P.GetTarget()
/scriptT=GetTargetHandle(P.GetTarget())
/scripttBuff=T.GetBuffList()
/scriptpBuff=P.GetBuffList()
/scriptJL=GetCharacterDistance(P.dwID,tID)
/scriptAA,BB,CC=P.GetSkillCDProgress(228,P.GetSkillLevel(228))
/scriptDD,EE,FF=P.GetSkillCDProgress(181,P.GetSkillLevel(181))
/scriptmount=0
/scriptifpBuff~=nilthenfor_,vinpairs(pBuff)doif(v.dwID==994)thenOnUseSkill(100,1)endendend
/scriptiftBuff~=nilthenfor_,vinpairs(tBuff)doif(v.dwID==244)thenmount=1endendend
/scriptifmount==1andJL<=8*64andCC==0thenOnUseSkill(228,P.GetSkillLevel(228))end
/scriptifmount==0andJL<=12*64andEE==0thenOnUseSkill(181,P.GetSkillLevel(181))end
/scriptGetClientPlayer().OpenVenation(dwID)
奇穴·任脉·气端40
奇穴·督脉·腰眼41
奇穴·督脉·抬肩42
奇穴·督脉·睛中43
奇穴·带脉·曲泉44
奇穴·带脉·龙玄45
奇穴·冲脉·极泉46
奇穴·冲脉·合阳170
奇穴·任脉·下极俞9
奇穴·任脉·崇骨1206
延时是有作用的,嗯,属于机密。
28、少林宏
/scriptP=N.nAccumulateValue;
/scripttarget=GetTargetHandle(N.GetTarget());
/scripthp=target.nCurrentLife/target.nMaxLife;
/scriptifhp<0.3andP>2thenOnUseSkill(243,1)elseifP>2thenOnUseSkill(233,1)endend;
以上就是必须3豆才能打出韦陀,以及血量低于30%同样必须3豆才能打出拿云的宏
如果想要2豆就出韦陀,只需要把ifP>2thenOnUseSkill(233,1)endend;里面的P>2改成P>1就成)
29、抱残+守缺
/scriptBC1,BC2,BC3=N.GetSkillCDProgress(239,N.GetSkillLevel(239));
/scriptSQ1,SQ2,SQ3=N.GetSkillCDProgress(241,N.GetSkillLevel(241));
/scriptifBC3==0thenOnUseSkill(239,1)end;
/scriptifSQ3==0thenOnUseSkill(241,1)end;
30、五蕴+抢珠
/scriptWY1,WY2,WY3=N.GetSkillCDProgress(249,N.GetSkillLevel(249));
/scriptQZ1,QZ2,QZ3=N.GetSkillCDProgress(240,N.GetSkillLevel(240));
/scriptifWY3==0thenOnUseSkill(249,1)end;
/scriptifQZ3==0thenOnUseSkill(240,1)end;
五蕴加抢珠的宏,经过测试,可能是因为相应速度太快,经常会发生对方身上有五蕴,但是还能到处跑的情况,相比单纯手工点击反而这种情况发生几率会小很多,请慎用。
31、抱残后抢珠
/scriptT,ID=N.GetTarget();
/scriptt=GetTargetHandle(T,ID);
/scripttBUFF=t.GetBuffList();
/scriptiftBUFF~=nilthenfor_,pBinpairs(tBUFF)doifpB.dwID==563thenOnUseSkill(240,1)endendend;
以上是判断对方状态的一个宏,我这边设置的是如果对方身上有抱残的效果(pB.dwID==563),那么就释放抢珠OnUseSkill(240,1)
已经过测试,可用。
就这么多吧,其实还有更BT的宏,但是个人觉得如果拿出来了可能影响平衡。嗯,少林跟天策的宏有点少,将就一下吧。
另,以上宏为两个月内收集做来研究的,宏的创作以及功能解说属于原作者,我只是稍微修改。
后记
看了上面的一些东西可能大家觉得宏有点影响平衡,我却不这么认为。
作为一个研究宏而不使用宏的人来说,我认为宏的缺陷很大,而这缺陷不是简单的通过更多判断条件能弥补的。
我相信人的操作就是一个很强力的宏,而且很灵活。如果说作为一个一键输出宏,幽门关门CD好了就用,那么在BOSS战的时候就不能最大化输出。
我想如果通过人工判断是可以避免这种情况的,在离BOSS还有2分钟的时候就不去动这两个先天穴。
另外一个缺陷就是人的反应,我个人感觉按不同的两个键要比一直按一个键要速度,大家可以去试试。
至于为什么一键爆发在PVP中被鄙视就是因为他的死板,死板所以不论什么情况都会执行这些命令。
而人在PVP的时候是会有心情波动的,所以不一定是完美的执行出来。
我不用宏的原因就是不想产生对宏的依赖,没宏走遍天下,有宏只能局限于自己的电脑上,久而久之形成一种无脑玩游戏的状态,那么游戏也随之无聊。
国际惯例。ID:云莎枫雪,帮会:冰恋倾城,服务器:杨宁。