终结宏教程
都是经常出现的问题
由于WOW 2.0即将来临,宏的写法也将发生巨大变化,由于CastSpellByName()和UseAction()两个核心函数的禁用,到时这里很多宏将需要新的写法,甚至失效.基础知识
1. 关于一键xx宏
公共CD是WOW中的基本法律,你平时要遵守,用宏仍然要遵守,所以那些需要按一下就能“变羊气定炎爆火冲冰锥”的可以离开了,我们无能为力,这里所说的一键xx是指:同一个宏,你每按一下做一个动作,同一个宏反复使用可以智能做出一系列反应,两次按键之间清自己留出公共CD时间
2. 动作条编号
下面的宏经常会要求你自己填某技能在动作条上的编号,这是因为技能/物品的冷却时间,射程等信息只能这样得到
动作条共有6个,每条包括12个按钮,共72个,通过菜单->界面设置 可以全部显示出来
图上动作条上红色数字是每条第一个按钮和最后一个按钮的编号
实际上暴雪提供了120个按钮,不过后面73-120不显示的,通过Flexbar等插件可以全部看到
3. 技能书编号
上边动作条编号大部分时间可以用技能在法术书中的编号代替,这样可以有效减少动作条的使用
但并不是都能代替,因为使用法术书中的编号只能得到技能的冷却信息,射程等其他信息无法得到
得到技能在法术书中编号请使用这个宏
技能名不要加等级,比如 多重射击复制内容到剪贴板代码:
/script local s,i,n="你要查的技能名",1;while 1 do n=GetSpellName(i,"spell");ifn then if strfind(n,s) thenChatFrame1:AddMessage(i);break;end;i=i 1;else break;end;end;自己定制自己的宏,自己做自己的插件!
开篇前的说明
宏是个很灵活的工具,能用好这个工具,就能省下很多功夫。插件提供更加丰富多采的功能,和各种人性化设置。但插件的缺陷,就是缺乏个性化。每个人战斗的模式都不同,而插件作者不可能为每一个用户定制一些功能。这时候,宏就华丽登场了。WOW本身提供了简单容易上手的宏编辑,但简单的代价就是缺乏功能,而且 256字符的长度限制了大部分玩家的智慧。
准备工作
1.SuperMacro插件:超级宏,能突破256字符的限制,还提供了一些简单的函数。最主要的,是他提供了LUA支持。
2.DiscordMacroFunctions插件:这个插件的知名度比较少,但他同系列的DUF/DART/DAB相信很多人都用过。D系列延续了他一贯的高效实用的特性,DMF提供了很多的基础函数。
3.了解一些LUA的知识,了解一些WOW的API函数。
高级宏命令第一贴
第一贴,选择敌对目标。
这个宏,会先判断是否有目标,目标是否可以攻击,目标是否可以援助,目标的目标是否可以被攻击。
综合以上信息后,选择最佳的目标。实在没有目标了,才会选中最近的敌人。
另外,如果处于团队状态,是不会自动选中最近敌人的,避免在大FB里面ADD
function AssistTarget ()
if (UnitExists("target")) then
if (UnitCanAttack("player", "target")) then
return true;
elseif (UnitCanAssist("player", "target") and UnitExists("targettarget")) then
if (UnitCanAttack("player", "targettarget")) then
AssistUnit("target");
elseif (UnitCanAssist("player", "targettarget")) then
AssistUnit("targettarget");
return false;
else
ClearTarget();
end
else
ClearTarget();
end
end
if (not UnitExists("target") and GetNumRaidMembers() == 0) then
TargetNearestEnemy();
end
return (UnitExists("target") and UnitCanAttack("player", "target"));
end
这个宏的知识点:
1.UnitExists("target")意思是是否有目标。target代表目标,targettarget代表目标的目标,pet代表自己的宠物,player代表自己。
2.UnitCanAttack("player", "target")意思是,第一个单位是否可以攻击第二个单位。
3.UnitCanAssist("player", "target")同上,判断能否援助。
4.AssistUnit("target")援助指定的人物。
5.ClearTarget()清除当前目标
6.GetNumRaidMembers()取得团队人数,需要DMF支持,如果GetNumRaidMembers()=0则代表不在团队
高级宏命令第二贴
第二贴,宠物的技能控制
这个宏的用处:
如果自己在Solo
当目标是玩家时,取消低吼/狂怒之嚎的自动施放,启动突进/俯冲的自动施放。
当目标是怪物是,执行和上面相反的动作,并在宠物攻击前施放一次突进/俯冲。
如果自己在团队中
会自动执行各种宠物技能的状态改变,但宠物不会出击。如果宠物是狼还会吼BUFF。
需要注意的是,这个宏就开始定制功能了
["俯冲"] = {1, 2}
代表一个技能的状态,{}里的第一个数字代表目标是怪物,第二个数字代表目标是玩家。0代表不自动施放,1代表施放一次,2代表自动施放。以俯冲来说明,对怪物只放一次,对玩家就一直自动施放
HunterPetSpellConfig = {
["狂怒之嚎"] = {0, 0},
["俯冲"] = {1, 2},
["突进"] = {1, 2},
["撕咬"] = {2, 2},
["爪击"] = {2, 2},
["尖啸"] = {2, 2},
["低吼"] = {2, 0},
["冲锋"] = {0, 2},
}
function PetSmartAttack ()
if (not AssistTarget()) then
return false;
else
if (not UnitExists("pet")) then
return false;
end
local index, isPlayer;
if (UnitIsPlayer("target")) then
isPlayer = 2;
else
isPlayer = 1;
end
for index = 4, 7, 1 do
local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(index);
if (HunterPetSpellConfig[name]) then
if (HunterPetSpellConfig[name][isPlayer] == 2) then
if (not autoCastEnabled) then
TogglePetAutocast(index);
end
else
if (autoCastEnabled) then
TogglePetAutocast(index);
end
if (HunterPetSpellConfig[name][isPlayer] == 1 and not UnitAffectingCombat("pet") and GetNumRaidMembers() == 0 or GetNumPartyMembers() == 0) then
CastPetAction(index);
end
end
end
end
if (isPlayer == 1) then
if (GetNumRaidMembers() > 0 or GetNumPartyMembers() > 0) then
if (UnitCreatureFamily("pet") == "狼") then
CastSpellByName("狂怒之嚎");
end
else
PetAttack();
end
end
return ture;
end
end
这个宏的知识点:
1.UnitIsPlayer("target")判断目标是否是玩家
2.GetPetActionInfo(数字1-10)取得指定宠物技能栏的技能详细信息
3.TogglePetAutocast(数字1-10)启动/取消宠物技能的自动施放功能
4.PetAttack()宠物进攻
5.UnitCreatureFamily("pet")取得目标的种族,pet代表自己的宠物
高级宏命令第三贴
第三贴,多重射击,瞄准射击,十秒轮射
这个宏,是配合上面两个宏用的。
10秒轮射的实用性不在这个帖子的讨论范围,但我个人觉得,根据前人总结的经验,这是一个很好的输出模式。
宏先判断目标是否是玩家,如果是玩家就顶级多重。
如果是怪物,就判断自己是否在团队中,进入十秒轮射。用这个宏最好的地方就是,一定能保证你使用技能的时间非常紧凑,如果你带的是狼,还会给你叫一下,小怪是顶级多重,BOSS是一级多重。SOLO的时候用的是一级多重。
function MultiShot ()
if (not AssistTarget()) then
return false;
else
PetSmartAttack();
if (UnitIsPlayer("target")) then
CastSpellByName("多重射击");
elseif (GetNumRaidMembers() > 0) then
if (CooldownRemaining(7) == 0 and CooldownRemaining(80) < 4) then
CastSpellByName("瞄准射击");
elseif (UnitClassification("target") == "worldboss") then
CastSpellByName("多重射击(等级 1)");
else
CastSpellByName("多重射击");
end
else
CastSpellByName("多重射击(等级 1)");
end
return true;
end
end
知识点:
1.CastSpellByName("多重射击");根据技能的名字施放技能。
2.CooldownRemaining(7)取得第七个技能栏的技能冷却时间,如果是0就是冷却完毕
3.UnitClassification("target")取得目标的设定等级,比如世界级BOSS,精英,银英之类的
高级宏命令第四贴
第四贴,猎人的钉刺,宁神
这个宏我不做详细说明,仔细看过前面几个帖子的人,应该能看懂这一个宏了
根据目标的职业,身上的DEBUFF,是否需要宁神来决定使用什么技能
当然,什么时候使用技能还是需要猎人自己判断的。比如,对骑士应该在他加血的时候才使用蝰蛇钉刺
function HunterSting ()
if (not AssistTarget()) then
return false;
else
PetSmartAttack();
if (UnitIsPlayer("target")) then
if ((UnitClass("target") == "战士" or UnitClass("target") == "盗贼" or UnitClass("target") == "德鲁伊") and not CheckForDebuff("毒蝎钉刺", "target")) then
CastSpellByName("毒蝎钉刺");
elseif (not CheckForDebuff("蝰蛇钉刺", "target")) then
CastSpellByName("蝰蛇钉刺");
else
CastSpellByName("奥术射击");
end
return true;
else
if (UnitName("target") == "克洛玛古斯" or UnitName("target") == "弗莱格尔" or UnitName("target") == "玛格曼达" or UnitName("target") == "哈霍兰公主" or UnitName("target") == "格拉斯") then
CastSpellByName("宁神射击");
elseif (UnitCreatureType("target") == "元素生物") then
elseif (GetNumRaidMembers() ~= 0) then
CastSpellByName("毒蛇钉刺");
elseif (not CheckForDebuff("毒蛇钉刺", "target")) then
CastSpellByName("毒蛇钉刺");
end
return true;
end
end
end
知识点
1.CheckForDebuff("毒蝎钉刺", "target")检查目标身上是否有钉刺效果。需要DMF支持
2.UnitClass("target")取得目标的职业,比如战士,牧师。
3.UnitName("target")取得目标的名字。比如克洛玛古斯
高级宏命令第五贴
上面说了这么多,那我应该怎么使用这些宏呢?
使用方法:
1.安装了超级宏插件。
2.用超级宏插件建立一个宏。
3.在右下角的“输入LUA扩展”输入你要的宏并保存。
比如,将第三贴的function MultiShot () ... end复制到扩展窗口
4.在“输入宏命令”窗口输入/script MultiShot()
关于SuperMacro和DiscordMacroFunctions,请大家到插件网站下载。
下面贴的是我完整的猎人宏文件
function HunterFeignDeath (spell)
SpellStopCasting();
if (UnitIsPlayer("target")) then
PetFollow();
else
PetWait();
end
if(UnitAffectingCombat("player")) then
CastSpellByName("假死");
else
CastSpellByName(spell);
end
return;
end
HunterPetSpellConfig = {
["狂怒之嚎"] = {0, 0},
["俯冲"] = {1, 2},
["突进"] = {1, 2},
["撕咬"] = {2, 2},
["爪击"] = {2, 2},
["尖啸"] = {2, 2},
["低吼"] = {2, 0},
["冲锋"] = {0, 2},
}
function PetSmartAttack ()
if (not AssistTarget()) then
return false;
else
if (not UnitExists("pet")) then
return false;
end
local index, isPlayer;
if (UnitIsPlayer("target")) then
isPlayer = 2;
else
isPlayer = 1;
end
for index = 4, 7, 1 do
local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(index);
if (HunterPetSpellConfig[name]) then
if (HunterPetSpellConfig[name][isPlayer] == 2) then
if (not autoCastEnabled) then
TogglePetAutocast(index);
end
else
if (autoCastEnabled) then
TogglePetAutocast(index);
end
if (HunterPetSpellConfig[name][isPlayer] == 1 and not UnitAffectingCombat("pet") and GetNumRaidMembers() == 0 or GetNumPartyMembers() == 0) then
CastPetAction(index);
end
end
end
end
if (isPlayer == 1) then
if (GetNumRaidMembers() > 0 or GetNumPartyMembers() > 0) then
if (UnitCreatureFamily("pet") == "狼") then
CastSpellByName("狂怒之嚎");
end
else
PetAttack();
end
end
return ture;
end
end
function HunterShotAttack ()
if (not AssistTarget()) then
return false;
end
PetSmartAttack();
CastSpellByName("自动射击");
if (not CheckForDebuff("猎人印记", "target")) then
if (GetNumRaidMembers() == 0 or UnitIsPlayer("target")) then
CastSpellByName("猎人印记")
end;
end
return true;
end
function HunterStrikeAttack ()
if (not AssistTarget()) then
return false;
else
PetSmartAttack();
if (UnitIsPlayer("target") and (UnitClass("target") ~= "法师" or UnitClass("target") ~= "牧师" or UnitClass("target") ~= "术士")) then
if (not CheckForBuff("灵猴守护", "player")) then
CastSpellByName("灵猴守护");
end
if (not CheckForBuff("威慑", "player")) then
CastSpellByName("威慑");
end
end
CastSpellByName("反击");
CastSpellByName("猫鼬撕咬");
if (not CheckForDebuff("强化摔绊", "target") and not CheckForDebuff("反击", "target")) then
CastSpellByName("摔绊");
end
CastSpellByName("猛禽一击")
CastSpellByName("攻击");
return true;
end
end
function HunterSting ()
if (not AssistTarget()) then
return false;
else
PetSmartAttack();
if (UnitIsPlayer("target")) then
if ((UnitClass("target") == "战士" or UnitClass("target") == "盗贼" or UnitClass("target") == "德鲁伊") and not CheckForDebuff("毒蝎钉刺", "target")) then
CastSpellByName("毒蝎钉刺");
elseif (not CheckForDebuff("蝰蛇钉刺", "target")) then
CastSpellByName("蝰蛇钉刺");
else
CastSpellByName("奥术射击");
end
return true;
else
if (UnitName("target") == "克洛玛古斯" or UnitName("target") == "弗莱格尔" or UnitName("target") == "玛格曼达" or UnitName("target") == "哈霍兰公主" or UnitName("target") == "格拉斯") then
CastSpellByName("宁神射击");
elseif (UnitCreatureType("target") == "元素生物") then
elseif (GetNumRaidMembers() ~= 0) then
CastSpellByName("毒蛇钉刺");
elseif (not CheckForDebuff("毒蛇钉刺", "target")) then
CastSpellByName("毒蛇钉刺");
end
return true;
end
end
end
function AssistTarget ()
if (UnitExists("target")) then
if (UnitCanAttack("player", "target")) then
return true;
elseif (UnitCanAssist("player", "target") and UnitExists("targettarget")) then
if (UnitCanAttack("player", "targettarget")) then
AssistUnit("target");
elseif (UnitCanAssist("player", "targettarget")) then
AssistUnit("targettarget");
return false;
else
ClearTarget();
end
else
ClearTarget();
end
end
if (not UnitExists("target") and GetNumRaidMembers() == 0) then
TargetNearestEnemy();
end
return (UnitExists("target") and UnitCanAttack("player", "target"));
end
function MultiShot ()
if (not AssistTarget()) then
return false;
else
PetSmartAttack();
if (UnitIsPlayer("target")) then
CastSpellByName("多重射击");
elseif (GetNumRaidMembers() > 0) then
if (CooldownRemaining(7) == 0 and CooldownRemaining(80) < 4) then
CastSpellByName("瞄准射击");
elseif (UnitClassification("target") == "worldboss") then
CastSpellByName("多重射击(等级 1)");
else
CastSpellByName("多重射击");
end
else
CastSpellByName("多重射击(等级 1)");
end
return true;
end
end
/script HunterStrikeAttack() 近战技能
/script HunterFeignDeath("冰冻陷阱") 装死陷阱,如果不在战斗状态就直接陷阱
/script HunterFeignDeath("爆炸陷阱") 同理
想了解一些LUA的知识,了解一些WOW的API函数 要啥有啥
http://www.wowwiki.com/Main_Page什么东西..一堆乱七八糟的...宏这种东西上网找下就ok了...制裁审判宏完成OY
这里不是网吗?楼上猪头.不过上面我都是CTRL C来的..好像有几个试了下都不能用.还是自己弄点实用的算了.
好多...~~~~~~~~~~~~~~