[骑士刚强之道]关于骑士的'宏'汇总.

在老罗的秩序之源里面,我发现关于宏的部分太少.也许是NGA和猫扑的区别吧.刚玩骑士不久,这里尽我所能贴一些出来,希望斑竹能高亮,也希望老罗可以加入秩序之源里面.

[请问如果TBC带判断的宏会被取消,那插件呢?如果TBC依然保持插件的判断功能,判断宏就依然可以工作,宏的本质是LUA脚本.姑且认为不能工作了,那更可以通过我的目录里面的第3扩展来实现一切功能]

目录:
1,入门级宏介绍,很轻易的以这个格式举一反三.
2,进阶级宏介绍,希望大家可以从里面学到这里没有的东西.
3,LUA脚本级宏扩展(准备放在2楼),感兴趣,以及渴望以宏致胜的骑士继续..

一点小要求
请关闭WOW自带的以及任何整合插件带的自我施法.

一点要提前说明的
动作分为软动作(soft)和硬动作(hard),软动作我是指没有动作行为的,如选择目标,说话等.软动作可以由任何事件(event)触发,包括:密语,进入/脱离战斗,受到伤害,受到治疗,进出副本等等.硬动作就是必须要由一个硬件事件(hardware event)触发的动作,释法,移动等都是.硬件事件仅仅包括操作计算机的人的动作.例如可以通过注册一个密语事件,让别人米你,成为你的目标,但不能给予其祝福.无公共CD的硬动作是可以和其他硬动作同时被一个硬件事件触发的;反之,一个硬件事件只能触发一个有CD的硬动作.


{入门级宏}

1,法术的自我释放,有2种方法:
/script CastSpellByName("清洁术",1) [加1参数的释法命令]
/script TargetUnit("player");CastSpellByName("清洁术");TargetLastUnit() [先选择自己为目标再释法,再切换到上一个目标]

(第一种略过了目标的切换是很好的方法)

2,SpellStopCasting()打断释法函数的骑士用法.
/script CastSpellByName("神恩术");SpellStopCasting();CastSpellByName("神圣震击") [防止被取散的必暴震击]
/script SpellStopCasting();CastSpellByName("圣盾术") [保证按无敌时没有其他任何动作]

3,RAID中治疗保护队友的语言通知:
/script CastSpellByName("圣光术");SendChatMessage("你正处于危险之中,正在为你吟唱顶级圣光术!", "WHISPER",GetDefaultLanguage("player"),UnitName("target")) [治疗并密语队友]
/script CastSpellByName("保护祝福")
/RA %t <<<<已给保护祝福! [团队通知给某人保护祝福]


{进阶级宏}
BLZ所提供的UI,API非常强大,可以判断很多种情况.判断由机器完成,是简化操作的一种手段.

1,要水宏:
/script if(UnitIsFriend("target","player") and UnitClass("target")=="法师") then local tf_un=UnitName("target");SendChatMessage(tf_un.."朋友你好,给点水嘛.谢谢!", "WHISPER",GetDefaultLanguage("player"),tf_un);end
[这个宏含有目标友好与职业判断,点的不是法师是发不出去的,可以避免闹笑话]

2,RAID一些宏:
骑士版5秒回蓝刷血:
/script if(flt==nil) then flt=0;else local nowTime=GetTime();if(flt<=0) then CastSpellByName("圣光闪现");fst=nowTime;end;flt=1.5+5+0.1-(nowTime-fst);end
[里面1.5+5+0.1为 吟唱时间+5秒回蓝+网络延迟]

BWL3号致死刷血:(仅仅是蓝不够的情况才会用到吧?)
/script for i=1,16 do if(UnitDebuff("targettarget",i)) then if(string.find(UnitDebuff("targettarget",i),"SavageBlow")) then TargetUnit("targettarget");CastSpellByName("圣光闪现");TargetLastTarget();end;end;end
[选定BOSS,只有在BOSS目标身上有致死DEBUFF的时候,才开始吟唱.里面SavageBlow为致死的图表名]

防止误干涩:
/script if(UnitClass("target")=="牧师" or UnitClass("target")=="圣骑士" or UnitClass("target")=="德鲁依") then CastSpellByName("神圣干涉");end
[只有当目标为3治疗职业时,才予以干涉]

只有在危机时刻使用圣疗:
/script if(UnitHealth("target")<2000) then CastSpellByName("圣疗术");SendChatMessage("对[%t]使用圣聊!");end
[只有当目标生命在2000以下才使用圣疗,当然2000的具体数字可以修改]

治疗OT自动给予保护:
/script if(UnitClass("targettarget")=="牧师" or UnitClass("targettarget")=="德鲁依") then TargetUnit("targettarget");SpellStopCasting();CastSpellByName("保护祝福");else CastSpellByName("圣光闪现");SpellTargetUnit("targettarget");end
[选定目标,治疗目标的目标,如果治疗OT则切换到治疗,释放保护]

根据目标职业给予力量/智慧祝福:
/script if(UnitClass("target")=="战士" or UnitClass("target")=="盗贼") then CastSpellByName("力量祝福");else CastSpellByName("智慧祝福");end

3,PVP相关(这里我将给予比较详细的介绍)

饰品和自我自由祝福:
/script if(HasFullControl()==nil) then UseInventoryItem(13);elseif(not IsShiftKeyDown()) then CastSpellByName("自由祝福",1);else CastSpellByName("自由祝福");end
[当无法自我控制的时候,使用上面一个饰品;可以自我控制的时候给自己自由祝福,按下SHIFT则仅仅给目标释放自由祝福]
HasFullControl()函数判断玩家是否可以自我控制,我的经验,只有恐惧和变形是标志为nil.这是一个可以把使用饰品和自我自由祝福结合起来的宏.

圣印和审判:
/script for i=1,16 do if(UnitBuff("player",i)) then if(string.find(UnitBuff("player",i),"ThunderBolt")) then CastSpellByName("审判");break;end;else CastSpellByName("正义圣印");break;end;end
[如果有正义圣印,则释放审判;如果没有则释放正义圣印]
搜索玩家人物的16个BUFF位,发现则审判,没有则添加圣印,跳出循环.其中ThunderBolt是正义圣印的图标名.其他几中图标名我列在下面.这是一个可以把圣印和审判结合到一个按键上的宏.
命令InnerRage
光明HealingAura
智慧RighteousnessAura
公正SealOfWrath
十字军HolySmite

自我清洁,可解才解:
/script for i=1,16 do if(UnitDebuff("player",i,1)) then CastSpellByName("清洁术",1);elseif(UnitDebuff("player",i)==nil) then CastSpellByName("清洁术");break;end;end
[当自己有可以驱散的DEBUFF,则自我清洁,如果没有,则仅仅释放清洁术]
也就是这个宏是自我优先清洁,当然可以把后面的清洁术改为其他动作.自我清洁设一个hotkey是很有必要的.

惩戒骑对抗MS/SM使用一级命令:
/script if(UnitClass("target")=="牧师" or UnitClass("target")=="萨满祭祀") then CastSpellByName("命令圣印(等级 1)");else CastSpellByName("命令圣印");end
这样被驱散了,不会心痛.当然这个也可以做到上面的圣印审判宏里面.

对应圣印更换武器:
/script CastSpellByName("命令圣印");SpellStopCasting();UseAction(twohand_slot,0,1)
[这里使用了UseAction()这个函数,twohand_slot那里填入动作条代码,也需要把双手武器的图标移到对应的动作条上]
/script CastSpellByName("公正圣印");SpellStopCasting();UseAction(onehand_slot,0,1);UseAction(shield_slot,0,1)
[同上]

单双手互换:
/script if(IsEquippedAction(twohand_slot)) then UseAction(onehand_slot,0,1);UseAction(shield_slot,0,1);else UseAction(twohand_slot,0,1);end
[先使用IsEquippedAction()判断双手,也就是处于动作条位置的那把双手武器优先,同样需要你自己填入动作条编号]
动作条编号如下:
25-36 bar on right-side of screen, far right (top to bottom)右边
37-48 bar on right-side of screen, in one column (top to bottom)右2
49-60 lower right bar (left to right)右下
61-72 lower left bar (left to right)左下


------------------------------------------------------------------以下为新加入部分
1,无目标或者敌对目标,为自己加祝福;友好目标则为目标添加:
/script if(UnitIsFriend("player","target")==nil) then CastSpellByName("光明祝福",1);else CastSpellByName("光明祝福");end
[以上以光明祝福做例]

2,战场用保护或者无敌来解除自己DEBUFF,再点则一键消除无敌/保护祝福:
无敌
/script local i for i = 0,15 do if(UnitBuff("player",i)) then if ( GetPlayerBuffTexture(i)== "Interface\\Icons\\Spell_Holy_DivineIntervention") then CancelPlayerBuff(i);break;end;else CastSpellByName("圣盾术");break;end;end
保护
/script local i for i = 0,15 do if(UnitBuff("player",i)) then if ( GetPlayerBuffTexture(i) == "Interface\\Icons\\Spell_Holy_SealOfProtection") then CancelPlayerBuff(i);break;end;else CastSpellByName("保护祝福",1);break;end;end


暂时就写以上这么多,有不对的地方或者想得不周到的地方请大家指正.2楼我将于近期贴出关于通过UI来写LUA脚本,达到扩展自己宏的方法例子等.尽请关注...

{LUA脚本级宏扩展}

WOW的UI(用户接口user interface)也就是interface/Addons/目录下的插件.这些插件基本由3类文件构成:

.toc 这个是说明注释

.xml 这个是WOW所用的网页框架格式的文件,窗口,按钮,界面等都是在这个文件里面完成的

.lua 这个是脚本文件,脚本代码就在这里面,也是我下面将要说的,我们所利用的文件

扩展思路:

WOW里面的MACRO最多只能有255个字符,所以我们编辑比较大型的功能比较丰富的宏是不太现实的,但我们可以做到插件的.lua脚本里面去.写成一个函数.并在WOW里面直接调用这个函数,完成对宏的扩展.

例如:上述单双手武器互换的宏,我们可以做成这样一函数:

function change_weapon(twohand_slot,onehand_slot,shield_slot)

if(IsEquippedAction(twohand_slot)) then

UseAction(onehand_slot,0,1);

UseAction(shield_slot,0,1);

else

UseAction(twohand_slot,0,1);

end

end

把这个函数贴进,插件目录下面,某个插件的某个lua文件里面.我们就可以在WOW里面建一宏:

/script change_weapon(twohand_slot,onehand_slot,shield_slot)

来直接调用这个函数,在宏中填入相应的动作条代码,就可以实现同样的功能.

当然我们还是更愿意,自己做.toc和.xml文件来做一个我们自己的LUA函数库:

例如:我们分别建立这些文件(可以复制其他插件的文件,再予以更名,用记事本打开)

mymacro.toc

## Interface: 11200 --------------------------版本号

## Title:mymacro --------------------------名字

## Notes:我的功能函数库 ------------------注释,随便添加

mymacro.xml ----------------包含的XML文件的名字

mymacro.lua

这里可以放入任何你编好的函数,并在进入游戏时加载,便可以在宏中进行调用.

这里限于篇幅只举一个例子:

十字军+审判+命令:

function seal_combo_cross_comm()

local pb_cr=seal_is_some_buff("player","HolySmite");

local pb_co=seal_is_some_buff("player","InnerRage");

local tdb=seal_is_some_debuff("target","HolySmite");

if(not tdb) then

if(not pb_cr) then

CastSpellByName("十字军圣印");

else

if(target_ok()) then

CastSpellByName("审判");

else

SendChatMessage("No Target!");

end

end

else

if(not pb_co) then

CastSpellByName("命令圣印");

else

if(target_ok()) then

CastSpellByName("审判");

else

SendChatMessage("No Target!");

end

end

end

end

这个函数里面包含几个子函数:--判断目标身上是否有某一BUFF!111

function seal_is_some_buff(TargetOrPlayer,BuffTexture)

local buff_f=nil;

for buff_slot=1,16 do --通过BUFF标志,判断是否有对应BUFF!

if(UnitBuff(TargetOrPlayer,buff_slot)~=nil) then

if(string.find(UnitBuff(TargetOrPlayer,buff_slot),BuffTexture)) then

buff_f=1;break;

end

else

break;--无BUFF!

end

end

return buff_f;

end

--判断目标身上是否有某一DeBUFF!111

function seal_is_some_debuff(TargetOrPlayer,BuffTexture)

local buff_f=nil;

for buff_slot=1,16 do --通过BUFF标志,判断是否有对应BUFF!

if(UnitDebuff(TargetOrPlayer,buff_slot)~=nil) then

if(string.find(UnitDebuff(TargetOrPlayer,buff_slot),BuffTexture)) then

buff_f=1;break;

end

else

break;--无BUFF!

end

end

return buff_f;

end

--判断是否有可以被攻击的目标!104

function target_ok()

if(UnitExists("target") and (not UnitIsFriend("player","target"))) then

local un=UnitName("target")

return un;

else

return nil;

end

end

在WOW中只要调用主函数seal_combo_cross_comm()就可以实现.

------------------------------------------------------------