function HunterAssistant_init()
-- define slash command here
SlashCmdList["HA_HunterMarkI"] = HA_HunterMarkI;
SLASH_HA_HunterMarkI1 = "/HAHunterMarkI";
SLASH_HA_HunterMarkI2 = "/hahmi";
SlashCmdList["HA_HunterMarkII"] = HA_HunterMarkII;
SLASH_HA_HunterMarkII1 = "/HAHunterMarkII";
SLASH_HA_HunterMarkII2 = "/hahmii";
SlashCmdList["HA_AttackMelee"] = HA_AttackMelee;
SLASH_HA_AttackMelee1 = "/HAAttackMelee";
SLASH_HA_AttackMelee2 = "/haam";
SlashCmdList["HA_AttackRangeI"] = HA_AttackRangeI;
SLASH_HA_AttackRangeI1 = "/HAAttackRangeI";
SLASH_HA_AttackRangeI2 = "/haari";
SlashCmdList["HA_AttackRangeII"] = HA_AttackRangeII;
SLASH_HA_AttackRangeII1 = "/HAAttackRangeII";
SLASH_HA_AttackRangeII2 = "/haarii";
SlashCmdList["HA_StingSerpentI"] = HA_StingSerpentI;
SLASH_HA_StingSerpentI1 = "/HAStingSerpentI";
SLASH_HA_StingSerpentI2 = "/hasseri";
SlashCmdList["HA_StingSerpentII"] = HA_StingSerpentII;
SLASH_HA_StingSerpentII1 = "/HAStingSerpentII";
SLASH_HA_StingSerpentII2 = "/hasserii";
SlashCmdList["HA_StingSerpentIII"] = HA_StingSerpentIII;
SLASH_HA_StingSerpentII1 = "/HAStingSerpentIII";
SLASH_HA_StingSerpentII2 = "/hasseriii";
SlashCmdList["HunterTest"] = HunterTest_command;
SLASH_HunterTest1 = "/HunterTest";
SLASH_HunterTest2 = "/ht";
end
附注:HA_代表的意思是HunterAssistant的缩写.
其实这里没有什么特别的.这里只是帮模块设定一些简单的"/"指令.将来我们可以直接把这些指令?#092;用到游戏的MACRO中. 请注意的一点是,每一个指令都有一个FUNCTION相对应.另外,我每一个指令都一个全名指令,以及一个简写指令(方便使用).在指令命名设计上,我以看到指令名称就大概能猜到使用的结果是什么.还有就是每个指令前面加上HA_这样能有效的避免跟其它模块的指令冲突到.另外有几个指令后面有罗马数字,这些是代表了所使用到的猎人技能是有等级高低的.比如说HA_HunterMarkI使用的是等级1的Hunter's Mark,HA_HunterMarkII使用的是等级2的Hunter's Mark.
另外,我的指令排列是以英文顺序为主.这样方便我个人寻找BUG.
现在让我们继续往下看.
CODE
function HA_AttackMelee()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Attack");
x=1
found=false;
while (UnitBuff("player",x)) do
if(string.find(UnitBuff("player",x), "Monkey")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Monkey");
end;
end;
end
这一个function的主要目的是近距离攻击.首先第一行是AssistUnit("pet");这代表了什么?其实这是WOW的核心指令之一.AssistUnit()的意思是帮助某一个单位的意思.这个指令可以接受不同的变量,包括玩家单位,NPC友好单位,以及宠物单位.当执行了这个指令之后,你的敌人对象就会变成你所帮助的那个单位的敌人是同一个.在这里"pet"的意思就是主角单位的宠物.
我在这里会用AssistUnit("pet")开头的原因是,当你的宠物在攻击的时候敌人的时候,你跟你的宠物所选择的敌人不见得是同一个,所以我们要确定主角跟宠物攻击的对象是同一个.
(注意:目前我这样的设计好像有点逻辑上的问题.思考逻辑到底是主角该帮主宠物还是宠物帮助主角?游戏中的基本设定是主角受到攻击,宠物就会自动帮助第一个攻击主角的敌人,可是如果好几个人攻击主角,宠物还是会先专心的把第一个敌人解决掉.所以我一开始会这样设计,专心的先帮助宠物解决掉第一个敌人.可是当遇到我就是有特殊原因要先解决掉其它的敌人的时候(例如某些特殊任务),我这样的设计反而造成困扰,因为只要我一攻击,我的对象就就转换到宠物的敌人了.所以在未来的版本中,我可能会设定另一种攻击是,宠物永远帮助主角攻击同一个敌人,使用的指令是 PetAssistUnit("Player"). "Player"就是代表主角的意思.)
下一行, if(not UnitExists("target")) then
TargetNearestEnemy();
end;
这里的意思是检查执行帮忙的指令之后(AssistUnit())到底有没有敌人?如果主角的宠物没有在战斗状态,那么我们敌人的状态就是没有选择.UnitExists("target")) 就是检查我们有没有选择任何的目标.这个也是WOW的核心指令之一. 当然如果我们有选择目标,可是目标是有好单位呢?不用担心,WOW的设计本来就是无法攻击友好单位的.那么TargetNearestEnemy()又是什么意思呢?就是自动选择距离最近的非有好单位当作目标选项.所以这一段的意思就是,如果主角跟主角的宠物都没有目标的话,帮主角动挑一个最近的非有好单位当作目标.
在来
CODE
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Attack");
这里代表的是,如果有目标的话,宠物攻击,然后主角攻击.PetAttack()是宠物攻击的指令,CastSpellByName("Attack")的意思是主角施展技能,这个技能是攻击(Attack). 这些全都是WOW的核心指令喔,酷吧.
继续
CODE
x=1
found=false;
while (UnitBuff("player",x)) do
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Monkey");
end;
end;
end
这里我定义了一个变量X,以及一个变量FOUND(中文是找到的意思),这两个变量不是WOW的专有变量,而是LUA的语法喔.为什么需要这两个变量?因为当我们在近距离攻击的时候,我必须要确定主角是在于ASPECT OF MonKEY 之下,有了这些变量可以方便我来做检查.
while (UnitBuff("player",x))的意思就是如果在主角的身上可以找到Buff的话. UnitBuff("player",1)会在寻找主角身上第一个buff的数据,然后传回讯息.如果没找到,就会传回一个否定的讯息.UnitBuff("player",2)就是寻找第二个buff的数据.
if(string.find(UnitBuff("player",x), "Monkey"))
string.find是lua语言上的指令,不是WOW的核心指令.这个指令的目的是寻找一个讯息中的字符串是否有特殊的字符.所以这一整段的意思是找寻主角身上的buff的信息是否有MonKEY(猴子)的字符串.如果有的话,就把FOUND设定为TRUE.
if(not found) then
CastSpellByName("Aspect of the Monkey");
这一段就是如果从头到尾都没有找相关的buff的话,代表了主角没有施展"Aspect of the Monkey",所以我们就执行施展技能的指令CastSpellByName("Aspect of the Monkey").
写到这里,让我顺便提出一些要点.不晓得大家有没有发现到,在这个function里面,从头到尾只有一个指令需要冷却时间那就是CastSpellByName("Aspect of the Monkey").其它,比如说攻击,全部都不需要冷却时间.这也就是为什么这么多指令都可以转变成一个单一指令.但是因为CastSpellByName("Aspect of the Monkey")需要冷却时间,所以我把她摆在最后执行,避免错误.另外一点就是,很多人在找寻主角身上的buff数据的时候,喜欢直接用UnitBuff("player",1)却没有想到其实主角身上可能有很多的buff呢.
所以我这样的设计一定可以确保如果主角已经施展了Aspect of the Monkey,就绝对不会重复施展第二次(浪费mana喔).
-- define slash command here
SlashCmdList["HA_HunterMarkI"] = HA_HunterMarkI;
SLASH_HA_HunterMarkI1 = "/HAHunterMarkI";
SLASH_HA_HunterMarkI2 = "/hahmi";
SlashCmdList["HA_HunterMarkII"] = HA_HunterMarkII;
SLASH_HA_HunterMarkII1 = "/HAHunterMarkII";
SLASH_HA_HunterMarkII2 = "/hahmii";
SlashCmdList["HA_AttackMelee"] = HA_AttackMelee;
SLASH_HA_AttackMelee1 = "/HAAttackMelee";
SLASH_HA_AttackMelee2 = "/haam";
SlashCmdList["HA_AttackRangeI"] = HA_AttackRangeI;
SLASH_HA_AttackRangeI1 = "/HAAttackRangeI";
SLASH_HA_AttackRangeI2 = "/haari";
SlashCmdList["HA_AttackRangeII"] = HA_AttackRangeII;
SLASH_HA_AttackRangeII1 = "/HAAttackRangeII";
SLASH_HA_AttackRangeII2 = "/haarii";
SlashCmdList["HA_StingSerpentI"] = HA_StingSerpentI;
SLASH_HA_StingSerpentI1 = "/HAStingSerpentI";
SLASH_HA_StingSerpentI2 = "/hasseri";
SlashCmdList["HA_StingSerpentII"] = HA_StingSerpentII;
SLASH_HA_StingSerpentII1 = "/HAStingSerpentII";
SLASH_HA_StingSerpentII2 = "/hasserii";
SlashCmdList["HA_StingSerpentIII"] = HA_StingSerpentIII;
SLASH_HA_StingSerpentII1 = "/HAStingSerpentIII";
SLASH_HA_StingSerpentII2 = "/hasseriii";
SlashCmdList["HunterTest"] = HunterTest_command;
SLASH_HunterTest1 = "/HunterTest";
SLASH_HunterTest2 = "/ht";
end
附注:HA_代表的意思是HunterAssistant的缩写.
其实这里没有什么特别的.这里只是帮模块设定一些简单的"/"指令.将来我们可以直接把这些指令?#092;用到游戏的MACRO中. 请注意的一点是,每一个指令都有一个FUNCTION相对应.另外,我每一个指令都一个全名指令,以及一个简写指令(方便使用).在指令命名设计上,我以看到指令名称就大概能猜到使用的结果是什么.还有就是每个指令前面加上HA_这样能有效的避免跟其它模块的指令冲突到.另外有几个指令后面有罗马数字,这些是代表了所使用到的猎人技能是有等级高低的.比如说HA_HunterMarkI使用的是等级1的Hunter's Mark,HA_HunterMarkII使用的是等级2的Hunter's Mark.
另外,我的指令排列是以英文顺序为主.这样方便我个人寻找BUG.
现在让我们继续往下看.
CODE
function HA_AttackMelee()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Attack");
x=1
found=false;
while (UnitBuff("player",x)) do
if(string.find(UnitBuff("player",x), "Monkey")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Monkey");
end;
end;
end
这一个function的主要目的是近距离攻击.首先第一行是AssistUnit("pet");这代表了什么?其实这是WOW的核心指令之一.AssistUnit()的意思是帮助某一个单位的意思.这个指令可以接受不同的变量,包括玩家单位,NPC友好单位,以及宠物单位.当执行了这个指令之后,你的敌人对象就会变成你所帮助的那个单位的敌人是同一个.在这里"pet"的意思就是主角单位的宠物.
我在这里会用AssistUnit("pet")开头的原因是,当你的宠物在攻击的时候敌人的时候,你跟你的宠物所选择的敌人不见得是同一个,所以我们要确定主角跟宠物攻击的对象是同一个.
(注意:目前我这样的设计好像有点逻辑上的问题.思考逻辑到底是主角该帮主宠物还是宠物帮助主角?游戏中的基本设定是主角受到攻击,宠物就会自动帮助第一个攻击主角的敌人,可是如果好几个人攻击主角,宠物还是会先专心的把第一个敌人解决掉.所以我一开始会这样设计,专心的先帮助宠物解决掉第一个敌人.可是当遇到我就是有特殊原因要先解决掉其它的敌人的时候(例如某些特殊任务),我这样的设计反而造成困扰,因为只要我一攻击,我的对象就就转换到宠物的敌人了.所以在未来的版本中,我可能会设定另一种攻击是,宠物永远帮助主角攻击同一个敌人,使用的指令是 PetAssistUnit("Player"). "Player"就是代表主角的意思.)
下一行, if(not UnitExists("target")) then
TargetNearestEnemy();
end;
这里的意思是检查执行帮忙的指令之后(AssistUnit())到底有没有敌人?如果主角的宠物没有在战斗状态,那么我们敌人的状态就是没有选择.UnitExists("target")) 就是检查我们有没有选择任何的目标.这个也是WOW的核心指令之一. 当然如果我们有选择目标,可是目标是有好单位呢?不用担心,WOW的设计本来就是无法攻击友好单位的.那么TargetNearestEnemy()又是什么意思呢?就是自动选择距离最近的非有好单位当作目标选项.所以这一段的意思就是,如果主角跟主角的宠物都没有目标的话,帮主角动挑一个最近的非有好单位当作目标.
在来
CODE
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Attack");
这里代表的是,如果有目标的话,宠物攻击,然后主角攻击.PetAttack()是宠物攻击的指令,CastSpellByName("Attack")的意思是主角施展技能,这个技能是攻击(Attack). 这些全都是WOW的核心指令喔,酷吧.
继续
CODE
x=1
found=false;
while (UnitBuff("player",x)) do
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Monkey");
end;
end;
end
这里我定义了一个变量X,以及一个变量FOUND(中文是找到的意思),这两个变量不是WOW的专有变量,而是LUA的语法喔.为什么需要这两个变量?因为当我们在近距离攻击的时候,我必须要确定主角是在于ASPECT OF MonKEY 之下,有了这些变量可以方便我来做检查.
while (UnitBuff("player",x))的意思就是如果在主角的身上可以找到Buff的话. UnitBuff("player",1)会在寻找主角身上第一个buff的数据,然后传回讯息.如果没找到,就会传回一个否定的讯息.UnitBuff("player",2)就是寻找第二个buff的数据.
if(string.find(UnitBuff("player",x), "Monkey"))
string.find是lua语言上的指令,不是WOW的核心指令.这个指令的目的是寻找一个讯息中的字符串是否有特殊的字符.所以这一整段的意思是找寻主角身上的buff的信息是否有MonKEY(猴子)的字符串.如果有的话,就把FOUND设定为TRUE.
if(not found) then
CastSpellByName("Aspect of the Monkey");
这一段就是如果从头到尾都没有找相关的buff的话,代表了主角没有施展"Aspect of the Monkey",所以我们就执行施展技能的指令CastSpellByName("Aspect of the Monkey").
写到这里,让我顺便提出一些要点.不晓得大家有没有发现到,在这个function里面,从头到尾只有一个指令需要冷却时间那就是CastSpellByName("Aspect of the Monkey").其它,比如说攻击,全部都不需要冷却时间.这也就是为什么这么多指令都可以转变成一个单一指令.但是因为CastSpellByName("Aspect of the Monkey")需要冷却时间,所以我把她摆在最后执行,避免错误.另外一点就是,很多人在找寻主角身上的buff数据的时候,喜欢直接用UnitBuff("player",1)却没有想到其实主角身上可能有很多的buff呢.
所以我这样的设计一定可以确保如果主角已经施展了Aspect of the Monkey,就绝对不会重复施展第二次(浪费mana喔).
回复Comments
{commenttime}{commentauthor}
{CommentUrl}
{commentcontent}