关于作者

用户名:bhu
笔名:bhu
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:8
评论个数:1
留言条数:1




Powered by BlogDriver 2.1

bhu的博客

 

心血来潮我也申请了一个Blog,虽然很早就知道博客但以前只觉得这就像在小学里写日记一样(以前在我第一任语文老师的谆谆教导下我开始写日记,到后来就从日记变成周记再变成月记......之所以不写不是怕别人看我的日记,谁想看就看我无所谓,是因为我懒、嫌麻烦就不写了,一直到初中我的第(1、2、......)3任语文老师的强逼之下我又开始写周记了,到了初二第二学期她又说不要写了,但马上又说每周交一次摘抄一直到我初中毕业。到现在我又开始X记了["X"是因为我不知道这写的算日记还是周记、月记(有月记?)],我能坚持多久???......

--bhu记于华跃网吧142座用键盘砸出来的序(还是赤脚写的)

2005年4月9日15:58

文章

又是一个应用实例~~~

wowapi列表
http://www.wowwiki.com/World_of_Warcraft_API

lua语法
refman_5.0.pdf ( 463.69k ) 全英文的@_@

wow事件列表
http://www.wowwiki.com/Events


testroll.lua

CODE


function Roll_Testtext(text)
local bTest =false;
if gsub(text,"(%w+)%srolls%s(%d+)%s%((%d+)%-(%d+)%)","%1 %2 %3 %4",1)~=text then
bTest= true;
end
return bTest;
end

function Rolll_getvar(text,index)
local t={};
t["name"]="%1";
t["num"]="%2";
t["range"]="%3 %4";
return gsub(text,"(%w+)%srolls%s(%d+)%s%((%d+)%-(%d+)%)",t[index],1)
end

function Roll_OnLoad()
testroll:RegisterEvent("CHAT_MSG_SYSTEM");
end

function Roll_OnEvent(event)
if ( event== "CHAT_MSG_SYSTEM" ) then
if Roll_Testtext(arg1) then
SendChatMessage(Rolll_getvar(arg1,"name").."get a"..Rolll_getvar(arg1,"num").."roll");
end
end
end



稍微接触过点c/java的可能会觉得lua的语法非常熟悉
的确,lua给我的感觉就是简化版的c/java,只不过没有了类/指针等容易出问题的东西而已
CODE

function xxxxx(xx,xxx,xxxx)
return xx
end

就是lua里函数的基本形式了

不过lua有个特点,他有个叫表的dd
相当于其他语言里的变量组
不过lua强大的地方就是可以用字符串做小标
比如
local t={}; 定义一个新表
t["name"]="%1"; 给表里的name元素取"%1"

强大吧?

CODE

gsub(text,"(%w+)%srolls%s(%d+)%s%((%d+)%-(%d+)%)",t[index],1)


这段或许也有些同学看不懂

这就是lua的regexp表达式了,匹配特定字符串用的,还好我当年玩mud的时候接触了不少。
"(%w+)%srolls%s(%d+)%s%((%d+)%-(%d+)%)"就是匹配字符串
翻译成人类语言就是一个以上的字符空格rolls空格一个以上的数字空格(一个以上的数字-一个以上的数字)
红字依次为%1,%2,%3,%4

这段程序共有4个函数
Roll_Testtext:判断是否是roll信息
Rolll_getvar:得到roll中的特定信息
Roll_OnLoad:load时执行的程序
Roll_OnEvent(event):事件处理程序

其中onload的testroll:RegisterEvent("CHAT_MSG_SYSTEM"),是通知wow,如果有CHAT_MSG_SYSTEM这一类的事情发生,通知我一下。这样,每当有系统字符串出现时,xml文件里的on_event就会被调用

而SendChatMessage则是一个wow的api,就是程序与游戏的联系接口,作用是在游戏的当前频道里发出一段话


CODE



- 作者: bhu 2005年04月10日, 星期日 16:28  回复(1) |  引用(0) 加入博采

wow斜杠命令、表情命令、术语表
你可以键入"/a"然后紧跟着按下tab键,这将列出所有以"a"打头的命令。
你可以键入"/a"然后紧跟着按下tab键,这将列出所有以"a"打头的命令。


/tell <玩家> <信息> (或者 '/t') - 向玩家发送一条悄悄话。按下tab键可以在最近向你发送悄悄话的玩家姓名间滚动。
/w <玩家> <信息> - 向玩家发送一条悄悄话。按下tab键可以在最近向你发送悄悄话的玩家姓名间滚动。
/chathelp (或者 '/chat') - 列出交谈命令
/em <信息> (或者 '/me') - 创建一个表情
/exit - 退出游戏
/follow (或者 '/f') - 选定一个玩家然后输入这条命令,你将跟随这个玩家。
/ghelp - 列出公会命令。
/invite <玩家> (或者 '/inv') - 邀请玩家组队。
/logout - 登出游戏。
/party <信息> (或者 '/p') - 在队伍频道中发送信息。
/played - 给出当前人物的累计在线时间。
/pvp - 玩家在PvP战斗中可被其他玩家攻击。
/random [Y]: 产生一个介于X和Y之间的随机数,如果Y没有指定,则将产生一个位于1和X之间的数字。这在决定战利品掠夺权和资源的采集权时非常有用。
/r - 回复最后一条悄悄话。按下tab键可以在最近向你发送悄悄话的玩家姓名间滚动。
/say <信息> (或者 '/s') - 向周围的玩家发送信息。
/sit - 使得站立的玩家坐下。人物较站立时更快地恢复生命值。
/stand - 使得坐下的玩家站起。
/who - 列出在线玩家。
/yell <信息> (或者 '/y') - 向周围的区域大喊。许多玩家认为大喊是不礼貌的行为,所以小心使用。

/cast 允许通过法术名称施放法术。输入"/cast (法术名称)",例如"/cast Fireball (Rank 1)"。向宏中正确添加法术施放命令,可以通过手动敲入,或者按下shift键后鼠标左键点击法术书中的法术。

聊天命令

/#, /c, /csay - 发送文字到频道#(例如 /1 Hi!)
/announcements, /ann - 在一个频道里加入/离开公告
/afk, /dnd - 设置你的标志为"离开"或者"请勿打扰"
/ban, /unban - 在一个频道里禁止/取消禁止一个玩家
/chatlist, /chatwho, /chatinfo [频道] - 列出频道,或者频道成员
/cinvite, /chatinvite - 邀请一个玩家到一个频道去
/join, /channel, /chan - 加入一个频道
/kick - 将一个玩家从一个频道里踢出去
/leave, /chatleave, /chatexit [频道] - 离开一个频道(或者所有频道)
/mod, /moderator, /unmod, /unmoderator - 改变一个玩家的主持人状态
/moderate - 在一个频道里切换主持
/mute, /squelch, /unvoice, /unmute, /unsquelch, /voice - 改变一个玩家的权限
/password, /pass - 改变密码
公会命令

请参阅公会页面以查看公会命令。

语音(声音)

下面的命令将播放一段声音!每种命令都有两到三种语音。语音将根据你的角色而变化。
/v help(帮助)
/v inc - 怪物接近中。该命令用来警告队伍怪物正在接近。
/v charge(冲锋)
/v flee(逃跑)
/v attack(攻击)
/v oom - 法力不足。
/v fol - 跟随我
/v wait(等待)
/v heal(治疗)
/v cheer(欢呼)
/v fire(开火)
/v rasp - 发声时顶住舌头。


每个人都喜爱表情!表情是预设的说话和动作的集合,它只要求适当的代码(文字/名称)来激活。文字将随着你选择的人而改变。如果你没有选择任何目标人物(若想不选择任何人,请按"ESC"键),产生的是特定的,有时是非常好笑的句子。如果选择了指定的人(例如自己或者其他人),那么生成的句子往往会把玩家的名称放入文字中。这里是一个例子:
输入:"/thank" 结果-> "你向身边的每个人道谢"
输入:"/thank"(选择的某人) 结果->"你向张三道谢。"
在做表情之前,请先确定是否选择了正确的人。一些表情有动画,而一些没有。你可以创建你自己的表情,命令是"/em 文字"

为了实现一个表情,输入"/表情名称",下面的列表列出了一些你可以用的表情。这并不一定是完整的列表。

Agree Amaze Angry Apologize Applaud Applause
Beckon Beg Belch Bite Bleed Blink Blood Blow Blush Boggle Bonk Bored Bounce Bow BRB Burp Bye
Cackle Calm Cat Catty Cheer Chew Chicken Chuckle Clap Cold Comfort Commend Confused Congrats Congratulate Cough Cower Crack Cringe Cry Cuddle Curious Curt Curtsey
Dance Disappointed Doh Doom Drink Drool Duck
Eat Eye
Farewell Fart Fear Feast Fidget Flap Flex Food Frown
Gasp Gaze Giggle Glad Glare Gloat Goodbye Greet Greetings Grin Groan Grovel Guffaw
Hail Happy Hello Hi Hug Hungry
Impatient Insult Introduce
JK
Kiss Kneel Knuckles
Lavish Lay Laydown Lick Lie Liedown Listen
Mad Massage Moan Mock Moon Mourn
No Nod Nosepick
Panic Peer Peon Pest Pick Plead Point Poke Ponder Pounce Praise Pray Purr Puzzled
Question
Raise Rdy Ready Rear Roar Rude
Salute Scratch Sexy Shake Shimmy Shindig Shiv Shiver Shoo Shrug Shy Sigh Sit Slap Sleep Smell Smirk Snarl Snicker Sniff Snub Sob Soothe Sorry Spit Spoon Stare Stink Strong Strut Surprised Surrender
Talk TalkEx TalkQ Tap Taunt Tease Thank Thanks Thirsty Threat Tickle Threaten Tired TY
Veto Victory Volunteer
Wave Weep Welcome Whine Whistle Wicked Wickedly Work Wrath
Yawn Yay


Add - 一只额外的怪物加入到现有的战斗中。
AOE - Area Effect Damage,区域作用魔法。指的是一个可以伤害一个区域中的一群怪物的魔法,就像魔兽争霸三中的暴风雪魔法。
AE - Area Effect,区域作用伤害
AFK - Away from Keyboard,离开键盘。这意味着玩家离开了他的电脑。
Aggro - 这个词意味着怪物已经疯狂并且你已经将它们"激活"到开始攻击你的程度。它们现在开始会试图接近并攻击你。"鱼人被我Aggro了"或"如果你继续接近,鱼人将被Aggro"。
Aggro Radius - 怪物周围的区域,进入它意味着怪物会"苏醒"并攻击你。
Agi - Agility,敏捷
Avatar - 你的角色。
Buff - 施放于怪物或玩家身上的有益魔法。牧师的心火或撒满的嗜血术都是典型的Buff。
Carebear - 喜欢帮助其他玩家攻击怪物,而非在pvp中攻击其他玩家的玩家。
Caster - 非"坦克"型角色,如法师。
Cheese - 利用游戏的不平衡之处牟利。
Combat Pets - 被玩家控制的NPC,在战斗中帮助玩家及其队友。
CR - Corpse Retrevial,取回尸体
Creep - 怪物
Creep Jacking - 从魔兽争霸3引入的词语,当其他玩家与怪物战斗的时候趁机攻击该玩家。
Critters - 面对攻击不会反击的怪物,如小鹿和小兔子。
DD - Direct Damage,直接伤害。用来形容一个魔法所造成的伤害是一击生效而非持续产生伤害作用。
DMG - Damage,伤害。
DOT - Damage over time,在一段时间内不断对目标造成伤害。
DPS - Damage per second,每秒伤害。
De-Buff - 对一个单位施放一个具有负面效果的魔法使之战斗力降低。一个典型的"De-buff"就是减速。
FH - Full Health,生命值全满。
FM - Full Mana,法力全满。
Gank - PvP:当其他玩家与怪物战斗时趁机攻击该玩家。
GM - Game Master,游戏管理员。一些被暴雪娱乐雇佣以帮助、协助玩家的人。
Griefer - 试图骚扰或激怒其他玩家的人。
Grinding - 非常长时间呆在同一地点与同一类怪物战斗。
GS - Goldshire,闪金镇(地名)。
HP - Hit points/Health,伤害点数或生命值
IF - Ironforge,铁炉堡
Incoming (INC) - 意味着即将出现一次攻击。
Instancing - 在《魔兽世界》中有一类地下城,当你和你所在的队伍进入它的时候,你们会被载入到一个属于你们的这个地城的副本,只有你和你的队伍能够出现在这里,其他进入这一区域的队伍会自动进入他们自己的副本。
INT - Intelligence,智力。
Kiting - 玩家保持在敌人战斗范围以外的一种战术,从敌人身边跑开,同时对其造成伤害。
KOS - Killed on Sight,仇人见面。如果一名兽人走向一名人类守位,那么这名守位会在看的见它的情况下试图杀死他(激怒)。
KS - Kill Steal, 偷杀,试图杀死另一个人正在对付的怪物。
LFG - Looking for a group,寻找队伍以加入。
LFM - Looking for more,找寻更多的人组队。
LOL - Lots of Laugh/Laughing Out Loud,大笑。这个缩写意味着某些事的确十分好笑。但不幸的是,虽然这个词十分常用,但从很久以前开始它便容易引发一些不理智的行为(译者:毕竟有些人很容易被嘲笑激怒)。作为变通,你可以使用"呵呵呵呵"或"哈哈哈哈"来代替它,这两个词相对来说虽然不是最好的选择但更容易被接受。ROFL(笑到打滚)也是一个应该尽量避免使用的词。
LOM - Low on Mana,法力不足。
LOS - Line of Sight,视线。
LOOT - 从被杀死的怪物或宝箱里拿取财物。
LVL - Level,等级。
Mez - Mesmerize的缩写。意指例如催眠这类法术临时使目标丧失战斗能力。
MMO - Massively Multiplayer Online,大型多人在线。
MMOG - Massively Multiplayer Online Game,大型多人在线游戏。
MMORPG - Massive Multiplayer Online Role Playing Game,大型多玩家在线角色扮演游戏。
MOB - Mobile的缩写。指游戏中所有由电脑控制的角色。相类似的词有怪物等。
Nerf - 消弱。
Newbie - 菜鸟,有时用来形容新玩家的一个术语,但也用于指代那些技术不太好的玩家。
Newb - 新人的简称,见上。
Ninja - 没有经过其他玩家允许或趁别人没注意而拿走战利品。即没有经过允许拿走物品。
N00b - 一种用来称呼新人的不礼貌的说法。请不要使用。
NPC - Non-Player-Controlled Character,非玩家控制的角色。这种角色通常被服务器控制。也就是一名"电脑"角色。
OOM - Out of Mana,法力耗尽。人们通常用这句话提醒其他队员他已经没有法力不能再施放法术了,特别是治疗魔法。
PC - Player controlled character,玩家控制的角色。
Pet - 被玩家控制的非玩家生物,如一只狼或一只地狱犬等等。
PK - Player Kill或Player Killer,玩家在未经另一个玩家同意的情况下攻击并试图杀死他。
POP - Repopulation的缩写,指怪物刷新。
Proc - 激活。例如:一件具有特殊效果的武器将偶尔被"激活"。
PST - Please Send Tell,指说话的人想通过 /t(ell) 或 /w(hisper) 命令交流。
Puller - 负责吸引怪物的玩家。
Pulling - 队伍中的一名玩家负责吸引一只或几只怪物,并将他们带到队伍所在地,以便队伍中的其他玩家可以攻击这些怪物。这种方法可以避免一次被大群的怪物攻击。
PvE - Player vs. Environment, 玩家与电脑控制的对手之间的战斗。
PVP - Player vs. Player,玩家对玩家。也就是一名玩家攻击另一名玩家。
Raid - 由一群玩家在某一地区进行的大规模作战被称为Raid。
Res - Resurrect的缩写,复活。
Re-Spawn - 一只被杀死的怪物重新出生(被创建)。
Rest (state) - 人物劳累程度的指标,影响杀怪获得经验值的缩少。
Roll - 指你应该掷随机数字来决定物品的归属。
Root - 使用"定身"类法术困住目标,例如缠绕之根或催眠。
RR - Redridge Mountains,红脊山脉。
Small Pets - 跟随玩家的动物,不直接影响玩家或怪物,只是为了每矗乇鹗窍∩俚某栉铩
Spawns - 在游戏世界中,怪物被创建时所位于的地点或出现的过程。
SPI - Spirit,灵魂。
STA - Stamina,耐力。
Stack - 堆放在同一个格子中的同类物品的数量。
STR - Strength,力量。SW - Stormwind
Tank - 能够承受很多伤害的近战角色,如一名战士。
Tap - 对怪物造成伤害,标为你的猎物。一旦你对怪物造成了伤害,只有你才能得到经验值和掠夺战利品。显示灰色名字的怪物表示已被链接到其他玩家,你不能获得经验值和战利品。
Taunt - 与Aggro相关。将怪物的注意力从其他玩家身上吸引到自己身上的能力。
Threat - 与Aggro相关。玩家产生或吸引了怪物的仇恨。
Train - 把一群怪物引向另一名玩家。这种行为通常不受欢迎。
Twink - 高等级带练低等级玩家,通常通过给与该等级通常无法获得的强力盔甲和武器。
??ber - super的德语说法,原意指over;极其强力。
UC - Undercity
WF - Westfall,威斯特法(地名)。
Vendor Trash - 只有商人NPC才愿意购买的物品。
WoW - World of Warcraft
WTB - Wanting to buy,想要购买。
WTS - Wanting to sell,想要出售。
XP or Exp - 经验值
Zerg - 来自星际争霸,用人海战术攻击。

- 作者: bhu 2005年04月10日, 星期日 16:16  回复(0) |  引用(0) 加入博采

我个人觉得对MACRO、和UI解释的很清楚的网站

台湾对WOW中MACOR的定义

http://www.wowtw.game.tw/

WOW的核心开放给玩家使用的指令

http://www.wowwiki.com/World_of_Warcraft_API

牛哥发的文章~~

http://bbs.16t.cn/bbs/index.php?showtopic=32397

金山在线翻译,看到不认识的单词就找它了

http://cb.kingsoft.com:81


我又看了很多关于MACRO、UI,还找到了几个很有用的网站。其中很多指令都是有LUA+WOW核心指令组成的,涉及了MS的API接口,而且都是英文@_@。我看的很累但在中文解释下也算能看懂一点,至少程序里的都是简单的英文单词或者词组。至于官网的上的解释说明那个......

- 作者: bhu 2005年04月10日, 星期日 16:07  回复(0) |  引用(0) 加入博采

Script 实例

感谢牛哥孤单也是一种美


2005年4月2日 18:45
索引:

1.友好魔法
...1.A 对友好单位或自己施法
...1.B 只对自己使用
...1.C 对特定队员施法
...1.D 按目标的职业分别使用不同魔法
...1.E 按目标等级使用不同级别的魔法
2. 判断HP,MP,连击点量
...2.A 按HP消耗量不同使用不同治疗魔法
...2.B 根据目标HP量决定是使用灵魂抽取还是抽取生命
...2.C 根据敌人是否使用魔法来决定是使用结舌诅咒还是虚弱诅咒
...2.D 根据连击点的多寡和能量的多少来决定使用技能种类
3.绷带
...3.A 对友好单位或自己使用绷带
...3.B 只对自己使用
4.武器相关
...4.A 对武器使用砺石
...4.B 更换备用武器
...4.C 切换主手与副手武器
...4.D 双手武器 <-> (主手武器+副手物品)
...4.E(主手武器+副手物品)<-> (单手武器+副手物品)
...4.F 单主手武器或双手武器 <-> (主手武器+副手物品)
...4.G 更换备用主手武器
5.组队相关
...5.A 设置辅助目标+自动辅助
...5.B 变羊+信息提示
6.打开/关闭背包
7.宠物相关(猎人、术士)
...7.A 施放猎人印记的同时宠物攻击
...7.B 切换到宠物正在攻击的目标并施放毒蛇刺击
...7.C 召回宠物并使用散射
...7.D 选择目标,开始攻击
...7.E 喂食
8.判断目标身上是否有特定BUFF
...8.A 猴之守护+物理攻击
...8.B 鹰之守护+自动射击
...8.C 鹰之守护+瞄准射击
9.影遁相关(暗夜专用)
...9.A 藏身
...9.B 进食
10.切换技能栏
11.目标信息
12.任务接受页面相关
...12.A 增加文字浮现速度
...12.B 取消文字逐渐浮现效果
...12.C 直接接受当前窗口中的任务
13.切换全屏模式与窗口模式
14.设定"真实鼠标视野"
15.延迟宏(需要Cosmos)
...15.A 盗贼武器上毒并定时提示
...15.B 魔法效果消失提示
...15.C 使用闷棍并在不同时段内提示不同信息
...15.D 战士逃跑宏
16.数组宏的实际运用
17.通用变量的设置与使用
18.图腾破坏
19.自然之速(气定神闲)



1.友好魔法

1.A 对友好单位或自己施法
/cast 治疗术(等级1)
/script TargetUnit("player")


如果你当前选择的目标是可以对其使用此魔法的友好单位的话,则对其使用魔法。
如当前目标是不能接受此魔法的单位,或没有选择任何目标的话,则对自己使用魔法。
而且不会对当前目标进行切换,不会中断对当前敌人的攻击。

将 "治疗术(等级1)" 换成任何能对友好单位释放的魔法与技能。

如在最后再加上如下代码
/script if ( UnitName("target") ~=nil and UnitInParty("player","target") ) then SendChatMessage("<治疗 %T >", "PARTY"); end


则在治疗队友时,在party中发出相应的信息。

将<治疗 %T>换成任何你喜欢的信息,%T表示接受治疗的目标的名字。
将UnitInParty换成UnitIsFriend,则对任何友好单位施法时都发出信息。

将"PARTY"换为"EMOTE",则以自定义表情的方式发出信息。如SendChatMessage(" 将在3秒内治疗 %T", "EMOTE"),则别人在聊天窗口中看到:"汉客将在三秒内治疗小郎"

将"PARTY"换成"WHISPER", "COMMON", UnitName("target"),则采用密语形式对你施法的目标发送信息。"COMMON"表示密语所用的语言种类。下面是一个语言列表:

Common 人类语,联盟通用语
Orcish 兽人语,部落通用语
Dwarvish 矮人语
Gnomish 侏儒语
Darnassian 暗夜精灵语

还有其他的一些实现方法如:
/cast 治疗术(等级1)
/script if SpellIsTargeting() then TargetUnit("player")



/script if ( not UnitIsFriend("player", "target") ) then CastSpellByName("治疗术(等级1)"); end
/script if ( SpellIsTargeting() ) then SpellTargetUnit("player"); end



/script if (UnitName("target") ~=nil and UnitIsFriend("player","target")) then CastSpellByName("治疗术(等级1)") SendChatMessage("即将治疗 %T", "Party") else TargetUnit ("player") CastSpellByName("治疗术(等级1)") TargetLastEnemy(); end


并不值得推荐。而且后一个宏会切换当前目标,中断攻击。

1.B 只对自己使用
如果想在任何条件下都只对自己使用治疗的话,用如下的宏:
/target "player"
/cast 治疗术(等级1)
/script TargetLastEnemy()


但这个宏同样有切换当前目标,中断攻击的弊病。


1.C 对特定队员施法
下面的这个宏只对队伍中的第一名队员施法。party1,party2,party3,party4分别指代队伍中的其他4名成员。也可以结合组队相关中的目标设置宏来使用。
/script if (UnitName("party1") ~= nil) then CastSpellByName("治疗术(等级1)") SpellTargetUnit("party1") SendChatMessage("即将治疗 >>" .. UnitName("party1") .. "<< (3.5s)", "Party") TargetLastEnemy(); end



1.D 按目标的职业分别使用不同魔法
下面是圣骑士的一例。如果目标职业为盗贼或战士则使用力量祝福,否则使用智慧祝福。
/script class = UnitClass("target"); if ( ( class == "Rogue" ) or ( class == "Warrior" ) ) then
CastSpellByName("Blessing of Might(Rank 1)"); else CastSpellByName("Blessing of Wisdom(Rank 1)"); end



1.E 按目标等级使用不同级别的魔法
下面牧师的一例,对目标使用其所能接受的最高等级的"圣言术:韧"
/script P="Power Word: Fortitude(Rank " S={1,2,14,26,38} if (UnitLevel("target") ~= nil and UnitIsFriend("player","target")) then for j=5,1,-1 do if (UnitLevel("target") >= S[j]) then CastSpellByName(P..j..")") return end end end


下面是60级的牧师的实例,另外一种实现方法,语句书写略为不同,更为易读。
/script r=6;l={1,12,24,36,48,60};t=UnitLevel("target");if (t==0) then t=UnitLevel("player");end;if UnitIsFriend("player","target") then for j=r,1,-1 do if (t>=l[j]-10) then CastSpellByName("Power Word: Fortitude(Rank "..j..")");break;end;end;end


下面是60级德鲁依的一例,使用对方能接受的最高级野性印记。实现方法和上面2例略有不同:
/script r=7;l={1,10,20,30,40,50,60};if not UnitIsFriend("player","target")then TargetUnit("player");end;t=UnitLevel("target");for j=r,1,-1 do if (t>=l[j]-10) then CastSpellByName("Mark of The Wild(Rank "..j..")");break;end;end





2. 判断HP,MP,连击点量

2.A 按HP消耗量不同使用不同治疗魔法
在下面的例子中,宏会对玩家自己的HP消耗量进行判断,如小于200则不使用治疗,并在聊天窗口中提示:"health is good",如消耗两大于200小于400,使用3级的Flash of Light治疗,如大于400,则使用5级的Holy Light进行治疗。你也可以用当前的HP量进行判断。
/script x="player";d=UnitHealthMax(x)-UnitHealth(x);if (d>200) then if (d<400) then CastSpellByName("Flash of Light(Rank 3)") else CastSpellByName("Holy Light(Rank 5)") end;SpellTargetUnit(x);else DEFAULT_CHAT_FRAME:AddMessage("Health is good"); end;



2.B 根据目标HP量决定是使用灵魂抽取还是抽取生命
术士根据目标HP量决定是使用灵魂抽取还是抽取生命。大于20则使用抽取生命,否则使用灵魂抽取。
/script if (UnitHealth("target")>20) then CastSpellByName("Drain Life(Rank X)") else CastSpellByName("Drain Soul(Rank 2)"); end



2.C 根据敌人是否使用魔法来决定是使用结舌诅咒还是虚弱诅咒
下面这个是根据敌人是否使用魔法(使用魔法的敌人其MANA肯定大于0)来决定是使用结舌诅咒还是虚弱诅咒。
/script if (UnitMana("target")>0) then CastSpellByName("Curse of Tongues(Rank X)") else CastSpellByName("Curse of Weakness(Rank X)"); end



2.D 根据连击点的多寡和能量的多少来决定使用技能种类
下面是德鲁依猫形态(盗贼也是一样)根据连击点的多寡和能量的多少来决定是使用Rip还是Rake。如连击点大于等于3,则使用Rip,如连击点小于3并且能量有40点以上,则使用Rake。
/script if ( GetComboPoints() >= 3 ) then CastSpellByName("Rip(Rank 2)"); else if (UnitMana("player") >= 40 ) then CastSpellByName("Rake(Rank 1)"); end end




3.绷带

3.A 对友好单位或自己使用绷带
/script UseContainerItem(2,1)
/script TargetUnit("player")


如果你当前选择的目标是可以对其使用绷带的友好单位的话,则对其使用绷带。
如当前目标是不能被打绷带的单位,或没有选择任何目标的话,则对自己使用绷带。
而且不会对当前目标进行切换,不会中断对当前敌人的攻击。

使用此宏,你必须把你要用的绷带放在背包的特定位置中。UseContainerItem(2,1)中的2是背包的编号,1是格子的编号。(2,1)表示右数第3个包的第一个格子。把它们换成对应你绷带位置的编号。
5个背包按照排列位置编号如下:

[4][3][2][1][0]]

6格包的格子编号如下:

_____[1][2]
[3][4][5][6]

16格包的格子编号如下:

[ 1][ 2][ 3][ 4]
[ 5][ 6][ 7][ 8]
[ 9][10][11][12]
[13][14][15][16]

其他格数以此类推。

将第一行换成/script UseAction(25,0,1),则不需将绷带放在背包特定位置,但必须将绷带拖入技能栏的特定位置。25表示技能栏的编号。第一排第一格编号为1,最后一格为12。第二排第一格编号为13,最后一格为24。以此类推。25表示第三排的第一格。

将第一行换成/use "Linen Bandage",则不需将绷带放在背包的特定位置,也不需将其拖入技能栏。将Linen Bandage换成你使用的绷带的名字。推荐尝试,但此宏没有经过测试。

此宏也还有如下的实现方法:
/script UseContainerItem(0,1)
/script if ( SpellIsTargeting() ) then TargetUnit("player"); end



3.B 如果想在任何条件下都只对自己使用绷带的话,用如下的宏:
/target "player"
/use "Linen Bandage"
/script TargetLastEnemy()


同样,这个宏会切换当前目标,中断攻击,盗贼的连击点也会被清空。

下面这个宏也只对自己使用绷带,但在使用后会切换回先前的目标(不管是敌对中立还是友好的)。
/script p="player";t="target";if(not UnitCanAttack(t, p))then ot=UnitName(t);TargetUnit(p);else ot=nil;end;
UseAction(ActionID);if(SpellIsTargeting()) then SpellTargetUnit(p); end if(ot) then TargetByName(ot);end





4.武器相关

Bag:物品存放背包编号
Slot:物品存放格子编号
MainhandBag:备用主手武器存放背包编号
MainhandBagSlot:备用主手武器存放格子编号
OffhandBag:备用副手武器存放背包编号
OffhandBagSlot:备用副手武器存放格子编号
TwohandsBag:备用双手武器存放背包编号
TwohandsBagSlot:备用双手武器存放格子编号

4.A 对主手武器或双手武器使用砺石
/script UseContainerItem (Bag,Slot)
/script PickupInventoryItem (16)




4.B 更换备用主手武器或双手武器
/script UseContainerItem (Bag,Slot)
/script PickupInventoryItem (16)



副手的对应宏,将16换为17即可。

4.C 切换主手武器和副手武器

/script PickupInventoryItem(16);PickupInventoryItem(17)



盗贼可以用这个宏来互换手中的剑与匕首。

4.D 双手武器 -> (主手武器+副手物品)
/script PickupContainerItem(MainhandBag, MainhandBagSlot)
/script PickupInventoryItem(16)
/script PickupContainerItem(TwohandsBag, TwohandsBagSlot)
/script PickupContainerItem(OffhandBag, OffhandBagSlot)
/script PickupInventoryItem(17)



(主手武器+副手物品) -> 双手武器
/script PickupInventoryItem(17)
/script PickupContainerItem(OffhandBag, OffhandBagSlot)
/script PickupContainerItem(TwohandsBag, TwohandsBagSlot)
/script PickupInventoryItem(16)
/script PickupContainerItem(MainhandBag, MainhandBagSlot)



副手物品可以是盾牌、副手武器、副手装备品。注意以上几个宏使用之时,鼠标上不要拖有物品,否则会出错。如要避免,可以使用CursorHasItem()来进行预判断。参看下面的几个宏:

4.E(主手武器+副手物品)<-> (单手武器+副手物品)
/script if ( not CursorHasItem() ) then PickupContainerItem(mainhandBag, mainhandBagSlot); PickupInventoryItem(16); PickupContainerItem(mainhandBag, mainhandBagSlot); PickupContainerItem(offhandBag, offhandBagSlot); PickupInventoryItem(17); PickupContainerItem(offhandBag, offhandBagSlot); end



4.F 单主手武器或双手武器 -> (主手武器+副手物品)
/script if ( not CursorHasItem() ) then PickupContainerItem(mainhandBag, mainhandBagSlot); PickupInventoryItem(16); PickupContainerItem(mainhandBag, mainhandBagSlot); PickupContainerItem(offhandBag, offhandBagSlot); PickupInventoryItem(17); if ( CursorHasItem() ) then PickupContainerItem(offhandBag, offhandBagSlot); end end



(主手武器+副手物品)-> 单主手武器或双手武器
/script if ( not CursorHasItem() ) then PickupInventoryItem(17); if ( CursorHasItem() ) then PickupContainerItem(offhandBag, offhandBagSlot); end PickupContainerItem(mainhandBag, mainhandBagSlot); PickupInventoryItem(16); PickupContainerItem(mainhandBag, mainhandBagSlot); end



4.G 更换备用主手武器
/script if ( not CursorHasItem() ) then PickupContainerItem(mainhandBag, mainhandBagSlot); PickupInventoryItem(16); PickupContainerItem(mainhandBag, mainhandBagSlot); end




5.组队相关

5.A 设置辅助目标+自动辅助
下面是2个配合使用的宏。先在宏窗口第一个空位建立一个宏,选择一个图标,内容为空。
再另建一个宏如下:
/script if (UnitName("target") ~= nil) then EditMacro(1, "Assist "..UnitName("target"), nil, "/assist "..UnitName("target"), 1) end
/script SaveMacros()


对选择的队友使用第二个宏,则自动将第一个宏设置为辅助选择的目标。也就是用宏来更换自动协助的目标,不用手动编辑宏来更换。

5.B 变羊+信息提示
这是一个法师在组队的时候用的宏,在变羊的同时,在PARTY中说明变羊目标的等级名字。
/script if ( UnitExists("target") and UnitIsEnemy("player","target") ) then SendChatMessage("Sheeping Level " ..UnitLevel("target") .." " ..UnitName("target") ..". Don't Attack it!", "PARTY") CastSpellByName("Polymorph(Rank 1)"); if not PlayerFrame.inCombat then ClearTarget(); end end



超简化的一个版本,功能上差一点。
/p Sheeping >>> %t <<<
/cast Polymorph (Rank X)



6.打开/关闭背包

/script ToggleBag(0) 背囊
/script ToggleBag(1) 右数第二个包
/script ToggleBag(2) 右数第三个包
/script ToggleBag(3) 右数第四个包
/script ToggleBag(4) 右数第五个包

上面的几个是切换特定背包的状态,如果当前是打开着的则关闭。如果当前是关闭着的,则打开。
适当的组合可以让你设定只打开特定的几个背包。如猎人可以选择不打开箭筒或子弹袋。

/script OpenAllBags()打开所有背包


7.宠物相关(猎人、术士)

下面的一些宏虽是对应猎人,术士只需稍加改动就可以用了。

7.A 施放猎人印记的同时宠物攻击
/cast Hunter's Mark(Rank 1)
/script PetAttack()



7.B 切换到宠物正在攻击的目标并施放毒蛇刺击
/script TargetUnitsPet("Player")
/assist
/cast Serpent Sting(Rank 1)



7.C 召回宠物并使用散射
此宏是有散射技能的玩家所必需的。
/script PetFollow()
/Cast Scatter Shot()



7.D 选择目标,开始攻击
如果当前目标是友好目标,则协助目标。使用猎人印记,宠物攻击,如果没有在战斗状态,开始自动射击。如果目标是敌人的话,则直接使用技能。此宏在SOLO组队中都比较实用。
/script if (UnitIsFriend("player","target")) then AssistUnit("target"); end
/cast Hunter's Mark(Rank X)
/cast PetAttack()
/script if(not PlayerFrame.inCombat) then CastSpellByName("Auto Shot"); end



7.E 喂食

最简单的一键喂食,把食物放入对应的背包格子中。
/cast Feed Pet
/script PickupContainerItem (Bag,Slot)




下面这个会先判断玩家是否处于战斗之中。如对应的格子中没有食物,则会打开相应的背包。
/script if (not PlayerFrame.inCombat) then if (not
GetContainerItemLink(Bag, Slot)) then OpenBag(Bag); else CastSpellByName("Feed Pet"); PickupContainerItem(Bag, Slot); end end




8.判断目标身上是否有特定BUFF

8.A 猴之守护+物理攻击
下面的宏会先判断玩家身上是否加有猴之守护,如果没有,使用猴之守护。如果玩家未在战斗状态,则开始物理攻击。也可以把Attack换为Raptor Strike。
/script if (not string.find(UnitBuff("player", 1), "Mon")) then CastSpellByName("Aspect of the Monkey"); end
/script if (not PlayerFrame.inCombat) then CastSpellByName("Attack"); end



8.B 鹰之守护+自动射击
]而这个则是先开始自动射击,再判断身上是否有鹰之守护的效果,没有的话,使用鹰之守护。
/cast Auto Shot
/script if (not string.find(UnitBuff("player", 1), "Raven")) then CastSpellByName("Aspect of the Hawk(Rank X)"); end



8.C 鹰之守护+瞄准射击
瞄准射击的版本
/script if (not string.find(UnitBuff("player", 1), "Raven")) then CastSpellByName("Aspect of the Hawk(Rank X)"); else CastSpellByName("Aimed Shot(Rank Y)"); end




9.影遁相关(暗夜专用)

9.A 藏身
影遁的同时躺下,藏身之用......
/cast Shadowmeld(Racial)
/laydown



9.B 进食
吃饭喝水的同时影遁,也是出于安全考虑......
/target "player"
/script UseContainerItem(FoodBag, FoodSlot);
/script UseContainerItem(DrinkBag, DrinkSlot);
/cast Shadowmeld(Racial)




10.切换技能栏

/script CURRENT_ACTIONBAR_PAGE = X
/script ChangeActionBarPage()



将3换成你想切换到的技能栏页数

此宏可以有这样的用法
/cast Aspect of the Monkey
/script CURRENT_ACTIONBAR_PAGE = 3
/script ChangeActionBarPage()


切换技能栏的同时使用猴之守护。

还可以加上前面的BUFF判断
/script if (not string.find(UnitBuff("player", 1), "Mon")) then CastSpellByName("Aspect of the Monkey"); end
/script CURRENT_ACTIONBAR_PAGE = 3
/script ChangeActionBarPage()



11.目标信息
/script if UnitClassification("target")=="elite" then SendChatMessage("".. UnitLevel("target") .. "+ " .. UnitName("target"), "party") else SendChatMessage("" .. UnitLevel("target") .. " " .. UnitName("target"), "party"); end



这个宏在PARTY频道中发出当前目标的一些相关信息。"+"代表精英。效果如下:
[Party]Hank:50 Stormwind Guard
[Party]Hank:43+ King Bangalash

下面是一个目标信息的相关函数列表:
UnitName 如"Coffiex","moonwell"
UnitLevel 如"42","60"
UnitClass 如"Warrior","Shaman"
UnitClassification 如"elite","worldboss"
UnitCreatureFamily 如"Wolf","Cat"
UnitCreatureType 如"Beast","Humanoid"
UnitRace 如"Nightelf","Orc"


12.任务接受页面相关

12.A 增加文字浮现速度
/script QUEST_DESCRIPTION_GRADIENT_CPS = 100



12.B 取消文字逐渐浮现效果
/script QUEST_FADING_ENABLE = nil



12.C 直接接受当前窗口中的任务
/script AcceptQuest()




13.切换全屏模式与窗口模式
/script SetCVar("gxWindow", 1 - GetCVar("gxWindow"))
/console gxRestart




14.设定"真实鼠标视野"
/script CameraOrSelectOrMoveStart(arg1)


15.延迟宏(需要Cosmos)

15.A 盗贼武器上毒并定时提示
给双手的武器都上毒,并在毒性还有一分钟就消退的时候在聊天窗口发出提示信息。
/script UseContainerItem(Bag,Slot); PickupInventoryItem(16); UseContainerItem(Bag,Slot); PickupInventoryItem(17);
/in 1740 /script DEFAULT_CHAT_FRAME:AddMessage("Poison wearing off in one minute.")



15.B 魔法效果消退提示
同样的,你也可以对持续性的魔法使用相似的宏。提示信息将在魔法使用X秒后出现,提示你还有Y秒魔法就将会失效。
/script T = UnitName("target");
/cast Spell(Rank 1);
/in X /script DEFAULT_CHAT_FRAME:AddMessage("Spell will wear off " ..T .." in Y seconds.")



也可以这样,X为魔法的持续时间(秒)。在魔法效果消退时提示信息。
/script T = UnitName("target");
/cast Spell(Rank 1);
/in X /script DEFAULT_CHAT_FRAME:AddMessage("Spell has worn off " ..T)



15.C 使用闷棍并在不同时段内提示不同信息
使用闷棍并在不同时段内在PARTY中提示不同信息。以下是3级的闷棍的例子
/script T = UnitLevel("target") .. " " .. UnitName("target");
/cast Sap(Rank 3);
/script SendChatMessage(T.." sapped.","party");
/in 30 /script SendChatMessage(T.." up in 15.","party");
/in 40 /script SendChatMessage(T.." up in 5.","party");
/in 45 /fire



15.D 战士逃跑宏
这是一个战士逃跑的时候使用的宏,首先使用包中的药水,换上盾牌(此例中其换武器的快捷位于技能栏第一页第11和12格)。使用Thunder Clap减低敌人速度,然后转身逃跑。
/script UseContainerItem(Bag, Slot);ActionButtonDown(11);ActionButtonUp(11);ActionButtonDown(12);ActionButtonUp(12)
/cast Thunder Clap(Rank 1)
/script TurnLeftStart(arg1)
/in 1 /script TurnLeftStop(arg1);ToggleAutoRun()




16.数组宏的实际运用

下面的宏让你只使用一个宏就可以循环地使用数个技能。此以圣骑士为例,第一次使用Seal of the Crusader,第二次使用Judgement,第三次使用Seal of Righeousness,第四次又回到使用Seal of the Crusader,如此循环。
新建宏如下:
/script AQ={};AQ.i=1;AQ.x=function() AQ[AQ.i]() end
/script AQ[1]=function() CastSpellByName("Seal of the Crusader(Rank 1)"); AQ.i=2 end
/script AQ[2]=function() CastSpellByName("Judgement"); AQ.i=3 end
/script AQ[3]=function() CastSpellByName("Seal of Righeousness(Rank 1)"); AQ.i=1 end


再新建一宏如下:
/script AQ.x()


在每次进入游戏之后使用一次第一个宏,然后利用第二个宏就可以实现技能的循环使用了。


17.通用变量的设置与使用

通用变量可以被你所有的宏所调用。
用下面的格式新建一个通用变量
/script setglobal("<variable name>","<string>");

获取通用变量的值

getglobal("<variable name>")

通用变量可以用来简化你的宏,以避免超过宏255的字符的最大限制。比如把技能名放到通用变量中。

通用变量每次进入游戏都必须重新设置。你可以用一个宏来设定你的通用变量。
如下面这样的一个宏:

/script setglobal("HT1","Healing Touch(Rank 3)"); setglobal("HT2","Healing Touch(Rank 4)"); setglobal("RJ","Rejuvenation(Rank 4)");




游戏中的使用实例

/script if (UnitName("target") ~=nil and UnitInParty("target")) then CastSpellByName(getglobal("RJ")) else TargetUnit("player") CastSpellByName(getglobal("RJ")) end; TargetLastEnemy();




18.图腾破坏

下面是德鲁依的一个例子,如果当前选择的目标是图腾则使用一级的月火,如果不是图腾则使用最高级的月火:
/script r=10; if (UnitName("target") ~=nil) and (string.find(UnitName("target"),"Totemf"))~=nil then CastSpellByName("Moonfire(Rank 1)") else CastSpellByName("Moonfire(Rank "..r..")"); end



下面是另一个用于破坏图腾的宏,它会搜寻附近的图腾并对其使用1级的月火
/target [图腾名的前5-10的字符]
/target [图腾名的前5-10的字符]
/target [图腾名的前5-10的字符]
/target [图腾名的前5-10的字符]
/target [图腾名的前5-10的字符]
/cast Moonfire(Rank 1)

下面是一个图腾名列表:
-- Air
"Nature Resistance Totem",
"Windwall Totem",
"Windfury Totem",
"Grace of Air Totem",
"Grounding Totem"

-- Earth
"Stoneclaw Totem",
"Earthbind Totem",
"Tremor Totem",
"Strength of Earth Totem",
"Stoneskin Totem"

-- Water
"Fire Resistance Totem",
"Poison Cleansing Totem",
"Disease Cleansing Totem",
"Healing Stream Totem",
"Mana Spring Totem"

-- Fire
"Frost Resistance Totem",
"Flametongue Totem",
"Magma Totem",
"Fire Nova Totem",
"Searing Totem"


19.自然之速(气定神闲)

下面是萨满自然之速接治疗波的一例:
/target "player"
/script CastAway("swift",10,"Nature's Swiftness","Healing Wave(Rank 9)")
/script TargetLastEnemy();
/script AttackTarget();


使用了自然之速之后马上就能跟上治疗波而不用按2次技能。法师可以将自然之速换为气定神闲,后面的治疗波也可以换成任何可搭配使用的魔法。


看了置顶帖子里面的武器更换宏的介绍,发现这是一个对任何职业用处都很大的宏.但是对于一个没有编程基础的新手来说!理解起来可能有点困难.所以只能拿来主义.中国有句话古话叫受之以鱼不如受之以渔.(大家不要丢我啊)所以在这里对这个宏进行特别的详解.如果你是一位UI老手.那么还请你多多指教本文出错的地方.如果你是一位新手.那你可以随时找我问问题.
--------------------------------------------下面演出就要开始了------------------------------------------

在进行说明之前我先解释两个宏的意思:PickupContainerItem(bag, slot) (bag 是从0到4,slot 是1到你包包的格子数(置顶帖子里面有排位说明)) and PickupInventoryItem(index) (16 代表主手, 17 是副手).那现在有人要问了,怎么都是 Pickup呢?英语里面Pickup不是拣取的意思吗?这里我来解释下..如果没有东西在焦点(焦点就是命令的对象.比如我写文章.那么文章就是我写的焦点.),则从目标内拿起物品.相反如果有东西在焦点.那么就是卸下物品.
如果你目前拿的是一把双手武器,那么你就不能在装配副手武器.因此当你要更换武器时,程序是这样的先卸下你的双手武器放到指定的包包位置.然后再装上你要的武器
如果你想单手武器换双手,那只要先卸下副手的武器,再装上单手武器.然后在把主手武器给放好.
有了这样的思维,编写你自己的UI就没什么问题了吧 下面我举2个例子来解释下上面说的
1H-武器 : 4号背包的第一格
副手武器 : 4号背包的第2格
2H-武器 : 4号背包的第3格

单手换双手
/script PickupContainerItem(4, 1);
/script -- 1H 武器现在获得焦点
/script PickupInventoryItem(16);
/script -- 单手武器被安装.同时双手武器获得焦点
/script PickupContainerItem(4, 3);
/script -- 双手武器被放置到包包里面.没有物品获得焦点
/script PickupContainerItem(4, 2);
/script --副手武器获得焦点
/script PickupInventoryItem(17);
/script -- 副手武器装配好.没有物品获得焦点

双手换单手
/script PickupInventoryItem(17);
/script -- 副手武器获得焦点
/script PickupContainerItem(4, 2);
/script -- 副手武器放到包包里面
/script PickupContainerItem(4, 3);
/script -- 双手武器获得焦点
/script PickupInventoryItem(16);
/script -- 主手武器获得焦点,同时双手武器装配好
/script PickupContainerItem(4, 1);
/script -- 主手武器放到包包里,没有物品获得焦点

好了看到这里是不是明白了许些!希望对大家有所帮助!~~下次再见~88

- 作者: bhu 2005年04月10日, 星期日 12:29  回复(0) |  引用(0) 加入博采

一些编写宏的命令集合

表情与动作命令全集

/console 执行控制台命令
/script 执行LUA脚本语言命令



可用于编写宏的命令集合:

/assist [name] - Assist your target or the named unit if specified
/cast name - Cast the named spell, which may include the rank in parenthesis
/afk [message] - Toggle yourself as "away from keyboard"
/dnd [message] - Toggle yourself as "do not disturb"
/duel [name] - Request a duel with your target, or the named unit if specified
/yield - Surrender to your opponent in a duel
/emote message - Emote the message (e.g. /emote picks his nose -> [slouken] picks his nose)
/follow - Automatically move to follow your current target
/guild message - Send the message to your guild chat
/ignore name - Toggle ignoring the named unit
/inspect - Inspect your target
/invite [name] - Invite your target or the named unit to your group
/join name - Join (or create) the named chat channel
/leave name - Leave the named chat channel
/logout - Sit down and logout
/ffa - Set "free for all" loot policy
/master name - Set the named unit to be the master looter
/roundrobin - Set "round robin" loot policy
/party message - Send the message to your party chat
/played - Show how much time your character has been online
/pvp - Enable PvP for the next 5 minutes
/raid message - Send the message to your raid chat
/random num - Roll a random number between 1 and num
/reply message - Send the message to the last player to whisper to you
/say message - Send the message to people around you
/target name - Target the named unit
/time - Show the current game time
/trade - Initiate a trade with your target
/uninvite name - Remove the named unit from your group
/whisper name message - Whisper the message to the named unit
/who - List the players around your level in the current zone

可用于编写宏的表情与动作命令全集:
/agree
/amaze
/angry
/apologize
/applaud
/bark
/bashful
/beckon
/beg
/bite
/bleed
/blink
/blush
/boggle
/bonk
/bored
/bounce
/bow
/brb
/burp
/bye
/cackle
/calm
/cheer
/chicken
/chuckle
/clap
/cold
/comfort
/commend
/confused
/congratulate
/cough
/cower
/crack
/cringe
/cry
/cuddle
/curious
/curtsey
/dance
/drink
/drool
/duck
/eat
/eye
/fart
/fidget
/flex
/flop
/frown
/gasp
/gaze
/giggle
/glare
/gloat
/greet
/grin
/groan
/grovel
/growl
/guffaw
/hail
/happy
/hello
/hug
/hungry
/insult
/introduce
/jk
/kiss
/kneel
/laugh
/laydown
/lick
/listen
/lost
/love
/massage
/moan
/mock
/moo
/moon
/mourn
/no
/nod
/nosepick
/panic
/peer
/pity
/plead
/point
/poke
/ponder
/pounce
/praise
/pray
/purr
/puzzle
/raise
/rasp
/ready
/roar
/rofl
/rude
/salute
/scared
/scratch
/sexy
/shake
/shimmy
/shiver
/shoo
/shout
/shrug
/shy
/sigh
/sit
/slap
/sleep
/smile
/smirk
/snarl
/snicker
/sniff
/snub
/soothe
/spit
/stand
/stare
/stink
/surprised
/surrender
/talk
/talkex
/talkq
/tap
/taunt
/tease
/thank
/thirsty
/threaten
/tickle
/tired
/train
/unused
/veto
/victory
/violin
/wave
/welcome
/whine
/whistle
/work
/yawn

- 作者: bhu 2005年04月10日, 星期日 12:04  回复(0) |  引用(0) 加入博采

MOD、SCRIPT、MACROC……

介绍一些基本概念:

1 Slash Commands / 命令
2 Macros 宏
3 Scripts 脚本
4 User Interface Mods and AddOns 用户界面 MOD与AddOn插件
5 Cosmos, Gypsy, CT_Mod 等常用的插件
6 独立与绿色的插件



介绍一些基本概念:

1 Slash Commands / 命令
2 Macros 宏
3 Scripts 脚本
4 User Interface Mods and AddOns 用户界面 MOD与AddOn插件
5 Cosmos, Gypsy, CT_Mod 等常用的插件
6 独立与绿色的插件

/命令
WOW像其它网游一样,用大家熟悉的"/命令"的格式,如选定目标后,在对话框中输入"/follow",就会跟随目标,"/help"是求助。WOW中文版支持中文与英文两种命令的格式。与我们定制开发有关的命令列表我会发在跟贴中。
命令有好几种,有些用于做指定的动作,如/follow, /assist, /cast,有些用于交流,如/yell, /chatlist,有些用于显示信息,如:/who,有些用于表达表情(/laugh, /bow)。
有一个特殊的命令:"/script",用于执行脚本程序,我们在下文中细解。

Macros 宏
宏用于建立一些简单的定制动作或任务,宏利用现成的游戏中的动作。一个宏是一系列 /命令 组成,按顺序执行。要建立一个宏,可以用命令:/macro来建立一个宏,可以给宏指定一个名称,一个图标。建立好的宏也可以通过快捷按钮栏调用。
宏:
/cast Fireball(Rank 1)
/yell "放火烤它!"
这个宏放一个火球,然后大叫一声:)
宏有一些局限,它只能用于执行非常简单的任务。最主要的一个局限是你不能用宏来施展多个魔法。这些限制了你不能用宏做很多自动化的事。就像其它一些命令不能超过256个字符,很不爽的!

脚本Scripts

我们知道,许多软件中都支持脚M$ Office、Internet Exploler等。脚本通常是一些小程序,用一些非常简单的语言来写(脚本语言)。脚本用来做一些自动化的事,也有用脚本语言来控制其它程序。

魔兽世界内置了一个强大的编程语言:LUA语言。WOW可以执行用LUA写的小程序。但WOW不是一个程序开发环境,不是我们简单地输入程序然后执行它。WOW在不同的地方调用脚本:
- /script 命令:用/script命令可以直接运行LUA语言,在/script后输入LUA语句,每个语句之间用分号;分开。
- 宏:脚本可以作为宏的一部分,在宏中可以嵌入多个/script命令。
- 用户界面定制与插件:WOW的用户界面定制与插件都用了LUA脚本语言(还用XML)

脚本能做什么呢?我会用专门的贴子给大家介绍LUA这个强大的脚本语言。LUA脚本强的一点是它能够比"/命令"执行更多的游戏动作。脚本语言可以WOW为脚本语言提供的大量函数(API应用编程接口)。(API清单我在整理中)

让我们看一看这个简单的脚本:
if (IsPartyLeader()) then
CastSpellByName("Fireball(Rank 1)");
end
这个脚本在执行时,先判定你是否是队长,是的话,则放一个火球术。这个脚本也可以用"/script"来执行:

/script if (IsPartyLeader()) then CastSpellByName("Fireball(Rank 1)"); end

你可以直接在对话栏中输入这个命令,当然,你也可以将它写在一个宏中。

总结一下:脚本是WOW中用LUA语言写的一段小程序,能够与游戏交互执行游戏动作。你可将脚本用于游戏的不同部分,如宏中、"/script"命令中,以及用户界面定制与插件中。

用户界面修改Mod与插件AddOn

在开发WOW时,暴雪有一个重要的决定,就是,其用户界面完全可以定制、修改与扩展。用户界面修改UI Mod与插件AddOn实际上是同一个东东,它们的不同之处只在于名字,通常来说,Mod指的是一些对已有用户界面的功能作一些修改的小东西,而AddOn是扩展的一些功能。为了简化,在以后我们统称两者为"插件",或者它的英文名AddOn。

AddOn是用LUR脚本语言编写的,并用了XML技术。插件不仅仅能在屏幕中加一些有趣的按钮与窗口,还可以做许多功能强大的事情,我们在以后将详细给大家讲解如何开发插件。

从用户的角度来看,你只要知道插件是一些文本文集件,以".xml" 或".lua"扩展名为结尾。
这些文件应该放在WOW的Interface或者它的子目录下。通常情况下,AddOn以ZIP压缩文件方式发布,而你只需以解压缩方式安装到WOW的目录下。(当你在你的机器上没有看到Interface目录,不用担心,WOW这个目录在缺省情况下是没有的,你想使用插件时,你建一个就成了。

注意:当你下载一个插件,而它是EXE文件时,千万要小心。因为EXE是可执行文件,它可以在你的机器上干任何的事,一个EXE文件中可能含了病毒与木马。WOW的插件应该写成XML或LUA文件,所有人都可以检查这些文件,并且没法加入恶意的程序,因为AddOn仅能做一些WoW中的操作,它无法执行其它程序,破坏你的电脑。

说到这里,实际上有不少插件的作者以可执行文件EXE的形式发布插件。这些程序可能简单地自动解压缩文件到WOW安装目录。有些发布版能自动下载最新版本的插件,或者上载一些插件收集到的数据。

卸载:要卸载插件非常简单,只需将Interface目录整个删掉就成!

Cosmos, Gypsy, CT_Mod 等著名插件包

网上找一找WOW的插件,你会看到Cosmos、Gypsy、CT_Mod等等,这些都是一些著名的插件包,它们包启了大量插件。这些插件的作者(工作组)是WOW社区中值得尊敬的玩家,他们的努力为我们提供了许多非常有用的插件(虽然当中有一些插件不怎么样),并且整理与汇总这些插件打成包。

大家可以放心地使用这些包,这些插件是合法的,也是暴雪认可的。但是官方不会对这些插件有任何技术支持。你可以下载试一下,选择你喜欢的插件。

注意:这些流行的插件有不少是互相冲突的,所以你可能不能将它们混在一起用。

独立,绿色的插件,

你会在网上看到一些插件标榜自已是"独立的"或者"绿色的"。通常情况下,插件会修改一些标准的核心用户界面文件(官方发布版的文件)以调整界面功能,当不同的插件做同样的修改时就会导致冲突。一个绿色的插件不修改任何已有文件,它仅仅加入自已的文件。这就保证了这些插件能互相兼容,共同使用。

此外,有许多插件依赖于其它插件的功能。举例来说,Cosmos包中的大部分插件是不能单独使用的,它必需与整个包一起用。一个"独立的"插件意味着它是完整的,可以单独使遥的,不需要其它插件的。

说到这儿,从插件开发者的角度看,你会发现许多插件做的事情很类似。通过修改已有插件的功能,或者利用现成的公共的"库"可以很快地开发出新的插件。所以为什么有些插件库都依赖于一些公共的组件,如SEA函数库等。这些组件松成了一些核心插件,如果你下载的插件需要这些组件时,你可以去下载这些核心插件,并安装到WOW的目录下。

就象现在有许多游戏都依赖于PC上的DirectX。通过利用DirectX的功能,可以比较方便地开发游戏。因此,我们在运行游戏时需要DirectX。同样,在我们用一些插件时,也可能需要这些公共的核心插件。

- 作者: bhu 2005年04月10日, 星期日 12:02  回复(0) |  引用(0) 加入博采

WOW中的UI、宏命令

感谢那位叫光之荣耀的牛哥~~提供了这么好的一篇文章让我学习



Chapter One

玩了WOW有一段时间了,除了游戏本身所提供的基本功能之外,其它WOW的功能我都尽量的尝试.在这里我提供一下我个人的心得.

相信很多的玩家都知道,WOW有所谓的合法外挂(COSMOS),但是WOW又非常的严格的抓所谓的非法外挂,那么合法的外挂与非法的外挂差别在哪?

其实所谓的合法外挂,只是在于一些有心的玩家利用了WOW所提供的功能,以及指令,另外在WOW的游戏核心上,另外写了一些辅助性质的SCRIPT来帮助游戏接口的简易操作.至于非法外挂,就是利用任合游戏本身所没提供的功能来增加自身的利益(包括了所谓第三者程序third party program).

既然WOW本身有提供这样的功能,身为玩家的我们为什么不尽量的利用这些好处呢?有鉴于台湾玩家在获得这些信息上的困难(因为有关于这方面的讨论,大部分都是英文),我在这里提出讨论,或许能带给台湾的玩家另外一种的游戏体验.

暴风雪在WOW的官方网站上有很明确的提到,UI的修改是玩家对于游戏整体体验中的一部分.但是什么是UI?UI修改又是什么?

UI是USER INTERFACE(使用者接口),在WOW中,所有的UI都是模块化的,每一个按钮,每一个窗口都是属于某一个模块的定义.玩家在玩游戏的时候,并不是直接的对于游戏核心下达游戏指令,而是先在UI上面的动作,然后在藉由UI的模块上下达游戏核心指令.例如我们按下游戏中攻击的按钮,WOW会先检查这个按钮的定义是什么,然后才执行这个定义下的指令.

那么修改UI的好处又是什么呢?这样说好了.WOW本身所提供的UI,其背后的定义都是最基本的,最简化的.比如说快捷键按钮的设计,以及每个指令动作.在按钮以及窗口的设计上,使以简单容易上手为主要目的.但是对于进阶玩家而言,又会觉得WOW所提供的快捷键按钮不够用,所以自己在UI上面加以修改,这样就不但可以自行决定快捷键按钮的数目,也可以把这些按钮摆在自己最喜欢的地方.

另外关于指令动作上(键盘与老鼠在UI上面的指令),WOW基本的UI设定都是一个指令一个动作.我们按一个按钮,WOW做一个动作.但是我们可以自行设定UI,达到玩家的下达一个指令,WOW同时做很多动作.

比如说,WOW给玩家在攻击上的选择是,按TAB会帮玩家找出画面上距离最近的敌人(原始设定是20码的距离范围内),然后玩家必须按攻击的按钮或是T,在这样的情况下才会攻击.玩家下达了两个指令,做了两个动作.但是在UI的修改上,我们不但可以修改画面上距离最近的敌人的距离范围(适合远距离攻击的玩家),我们还可以设定按下TAB按键,不但会自动定位距离最近的敌人,还会自动开始攻击.

在这个讨论串当中,我主要是针对指令UI上的设定提出讨论,因为关于画面上的设定已经有很多现成的选择(COSMOS).因此我将针对CLASS上面辅助型的UI设定.在藉由讨论上,让台湾的玩家们也有机会自行设计出最方便,最有效率的攻击,法术施展,以及宠物控制.

当然我绝对欢迎玩家针对任何的UI设定提出讨论,但是我不见得有能力回答.毕竟我个人比较不喜欢去研究画面的排列,所以这方面花的功夫也比较少.




Chapter Two

上一篇文章介绍了UI修改的最基本观念,在这篇文章中我将提供UI修改上的最基本的动作,工具以及数据来源.


在我们要对UI做任何的修改或是制作模块之前,我们必须先了结WOW的UI基本结构.在WOW的数据夹里面,我们可以找的一个DATA的子目录.在这个子目录里面,包括了所有WOW会使用到的档案,包括了模块,图形,字型等等.这些都压缩在所谓的MPQ档案里面.拿我个人的档案来做例子,我的MPQ檔在C:Program FilesWorld of WarcraftData下面.而所有UI可以使用到的档案都压缩在interface.mpq档里.

要检查MPQ档案里面有些什么,我个人建议WinMPQ这个程序.为了避免大家担心我放病毒,在这里我建议大家自行上GOOGLE查哪里可以下载WinMPQ.

因为游戏的UI的基本设定都在interface.mpq,所以我不建议大家直接对于interface.mpq里面的档案直接修改.大家可以把所需要的档案解压出来.只要做完修改后不存回interface.mpq里面,在这样的情况下,都不会影响到基本设定.

那么大家会问修改完之后的档案该存在哪呢?首先到WOW的目录里面,然后开一个先的子目录叫做interface.以我个人的例子是C:Program FilesWorld of Warcraftinterface.然后大家可以把修改好或是制作好的档案存在这个数据夹下面.当WOW加载游戏数据的时候,WOW会自动到这个数据夹里面检查哪些模块蛟撦d入.

虽然UI修改可以使用到WOW现有的档案,但是为了方便教学,我在这里提出的例子将不会用到WOW现有的档案.事实上,除了要做游戏画面上的设定,大部分的情况下,我们不见得要用到WOW现有的UI档案,只要我们制作模块用的都是WOW所提供的核心指令就可以了.

在制作模块之前,我先介绍一下每一个模块所需要的最基本的档案.每个模块都需要一个介绍档,toc檔.定义档,xml,以及核心檔,lua檔.这三种档案都可以用笔记本或是任何的文书处理程序来做修改.

为了方便介绍,我举出一个简单的例子来解释这三个档案.现在让我们设计个 Hi 模块.这个模块当你执行的时候,他会在你的游戏画面上出现一个 Hi 的信息.

因为我们这个模块叫做Hi,所以我们需要三个档案

hi.toc
hi.xml
hi.lua
(模块的名称最好与档案的名称相对应)

现在让我介绍一下hi.toc的格式:

## Interface: 4150
## Title: Hi
## Notes: just want to say hi
## OptionalDeps:
## Dependencies:
hi.xml

在## Interface:后面的数字代表了目前WOW的版本.制作模块的作者有义务维持模块支持最新版的WOW,所以每当WOW做出更新的时候,模块的制作人得检查模块是否还能工作,当确定还能工作的时候,就可以更新射个数字.更新这个数字有两个意义:第一,WOW会检查每个模块的这个数字,如果与WOW版本相辅合,那么就会加载,不然就会档掉.第二,玩家可以确定这个模块的版本是可以使用的版本.

我在这里不建议除了模块的制作人修改这个数字.因为有时候模块的设计可能很复杂,在不是制作人的情况下,很可能不知道到底没有更新的模块是否还跟最新版的WOW兼容.如果玩家自行更改这个数字让它跟WOW的版本数字一样的话,WOW就会自动加载这个模块.如果模块不兼容的情况下,很可能会造成游戏上的困扰.

写到这里,玩家可能会问要去哪里找WOW最新的版本数字.当执行WOW游戏的时候,在登入的画面上的最左下方,可以找到这个信息.以目前我写这个教学的时间而言,WOW最新版所提供的信息是Version 1.2.1 (4150).大家要用的是4150这个数字,而不是1.2.1这个数字.

在## Title:后面,模块制作人打的字符就是这个模块的名称.

在## Notes:后面,模块制作人打的字符就是这个模块的简介

## OptionalDeps:后面, 模块制作人标示出这个模块是否有其它的额外的模块可以支持这个模块.当这个地方有标示其它的模块的时候,并不代表玩家们也必须要有这个额外模块,只是有了这个额外的模块,可以让这个么模块的功能更加完整.

## Dependencies:后面, 模块制作人得标示出这个模块必须要使用的的档案(包括了必须使用到其它模块的档案,请注意,上面选择性模块的档案并不需要在这里标示).

因为这个教学模块并不需要用到其它的模块,所以只需要标示出模块定义文件 hi.xml.

hi.xml的介绍:

基本上XML可以当做网页设计档案(HTML)来看,可是严格的来说,XML是拿来作为定义上或是数据传输上所使用的.如果玩家对于XML的语法以及如何使用有兴趣,可以到http://www.w3.org/XML/查询更详细的数据

现在我只介绍XML在WOW模块设计上该如何使用。

 CODE
 
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<script file="hi.lua"/>

<Frame name="hi_core">
<scripts>
<OnLoad>
this:RegisterEvent("VARIABLES_LOADED");
</OnLoad>
<OnEvent>
if (event == "VARIABLES_LOADED") then
hi_initialize();
end
</OnEvent>
</Scripts>
</Frame>
</Ui>

大家可以忽略前面几行<Ui xmlns ......... />.基本上每一个WOW模块XML文件都必须要有这几行.

重要的是 <script file="hi.lua"/> 在这里大家得定义出模块的核心档案是什么.以我们目前的例子,核心档案是hi.lua.

在 <Frame name="hi_core"> 这里定义出模块在游戏画面中要使用的的子画面的名称.这个名称必须是独一无二的,避免与其它的模块画面冲突到.

在上面的例子中我们可以看到<OnLoad>和<OnEvent>的标示,基本上<OnLoad>的意思是当WOW在加载游戏接口的时候,因该要做出什么动作.以我们的例子,我们要在WOW游戏里注册一个变量叫做"VARIABLES_LOADED".
<OnEvent>的意思是,如果发生了什么事件,那么该做出什么动作来反应.以我们的例子,如果注册"VARIABLES_LOADED"成功的话,我们就执行hi_initialize(). 当然,如果没有注册成功,也就不会有事件发生,这代表了我们的模块没有加载到游戏里面,所以我们也就没有后续动作.

hi.lua的介绍:
lua 是一个script语言.WOW所有的UI模块都是建立在这个语言之上.对于lua想要更深入的了解,请到官方网站:http://www.lua.org/manual/5.0/ 在这里可以查到所有关于lua的语法以及使用方式.

现在让我介绍我们目前的例子:

 CODE

function hi_initialize()
SlashCmdList["HIHI"] = hi_command;
SLASH_HIHI1 = "/hihi";
SLASH_HIHI2 = "/您好";
end

function hi_command(msg)
message(msg);
end

大家可以看到我们写两个小function 一个叫hi_initialize 一个叫 hi_command. 在hi.xml里面,如果模块顺利在入的话hi_initialize是第一个被呼叫的.在这里我们自行设定了一些"/"指令.我想大家因该对于游戏里面的一些"/"指令并不陌生.

同样的我们也可以帮我们的模块设定这些"/"指令.
SlashCmdList["HIHI"] = hi_command; 代表的意思是如果我们么组的"/"指令被呼叫的话,我们因该执行hi_command这一个function.
SLASH_HIHI1 = "/hihi";
SLASH_HIHI2 = "/您好";
这里是帮我们的"/"指令定出名称,目前我还不确定我们是否可以自行自做出中文指令,但是我想只要可以在WOW输入中文,上面的设计就因该没问题.(所以还请可以在WOW输入中文的玩家测试一下.
这里要稍微注意的一点是SlashCmdList["HIHI"]里面的HIHI必须要和SLASH_HIHI1和SLASH_HIHI2 的HIHI依样.如果我们把HIHI改成NIHAO 那么就会变成SlashCmdList["NIHAO"], SLASH_NIHAO1, 以及SLASH_NIHAO2. 至于HIHI 或是 NIHAO 后面的 1 和 2 只是变量,代表了同样的指令,有哪些变种的指令.

当我们打入了"/hihi"或是"/您好" 就会执行下面的function
function hi_command(msg)
message(msg);
end
基本上只是在游戏画面上出现一个窗口,然后窗口上面显示我们在指令后面打入的讯息.

例如我们输入"/hihi 测试"

那么出现的窗口就会显示 "测试" 在那上面.

好了,我们写好这三个档案了.现在我们要告诉WOW加载我们的HI模块.
首先,到"C:Program FilesWorld of Warcraftinterface"这个子目录里面.如果还没有这个子目录的话,自行开一个新的.然后在这个目录里面开一个新的目录叫做"AddOns"所有玩家设计的模块都因该摆在这个目录里面.然后在"AddOns"这个目录里面在开一个目录叫做"HI".最后把我们做好的三个档案存到这个目录里面.
"C:Program FilesWorld of WarcraftinterfaceAddOnsHI"

现在我们可以测试这个模块了喔.

稍微介绍一下WOW简易管理模块的方式.如果当玩家有安装自行设计的模块的话(比如说COSMOS),在进入角色选单的时候,我们可以看到画面的左下方有一个Addons的按钮.大家可以在者里自行选择所希望开启的模块.在模块名子前面打勾,表示选择角色之后,游戏就会开始加载模块.没打勾就代表不会加载. 请注意,WOW有模块加载的上限.所果所有加载的模块用到的资源超过32MB,游戏会自动关闭.这时候就需要去管理接口关掉一些模块喔.

下一篇文章,我将教大家如何在lua档案里面使用WOW的核心指令,以及如何只使用3个档案,就可以写出很有帮助的SCRIPT.


Chapter Three

在来一系列的文章,我要教猎人的玩家如何利用模块设计,有效率的执行远距离,近距离,以及宠物攻击. 顺便介绍一些WOW的核心指令.


我想玩过网络游戏的玩家,多多少少都因该听过外挂.什么是外挂?其实就是能自动的帮助玩家执行一些指令.基本上很类似MACRO(没听过MACRO的人,因该有听过EZSCRIPT吧)

WOW本身就有提供MACRO这样的功能.只要我们在游戏中输入"MACRO"之后,我们就可以开始设计我们自己的辅助指令.但是WOW的MACRO有很多限制.第一,WOW的MACRO是半自动的,意思就是说,你一定要按下某一个键盘按键,或是老鼠按键,才能执行你所设定的MACRO.第二,游戏中的MACRO有字数上的限制.最多只能输入255个英文字符.第三,WOW的MACRO无法设定时间上面的间隔.在MACRO里面的所有的指令会被一次执行.第四,如果你所执行的很多指令中有很多都有指令冷却时间(例如魔法的COOLDOWM),那么MACRO只会执行第一个可以执行的指令.

同样的,当我们设计模块的时候,我们也同样受限于这样的限制,但是却没有255个英文字符的限定,在这样的情况下,我们可以自做更复杂的指令方式.

今天我要教大家的模块是猎人辅助模块.

WOW的猎人是属于远距离攻击的单位,最需要控制的是如何有要的利用各式的ASPECT以及宠物攻击.当近距离攻击的时候,猎人需要用到ASPECT OF MONKEY,当远距离攻击的时候,需要用到ASPECT OF HAWK. 但是我想很多人因该都会遇到,同时指示宠物攻击,玩家攻击,以及转换ASPECT的时候,会手忙脚乱.现在我们的目标是如何设计一个模块可以让我们在操作上更顺畅.

猎人辅助模块设计目标:
1:玩家主动攻击的时候,宠物也会主动攻击(WOW的基本模式是,玩家按攻击,然后还要按宠物攻击).

2:玩家与宠物永远是攻击同一个目标,以最快最有效率的方式来减少战斗画面上的危机.避免宠物与玩家通时攻击不同的敌人,造成最后的结果是玩家与宠物同时阵亡.

3:有效的辨识玩家的攻击方式,然后执行最有效率的ASPECT.例如玩家近距离攻击的时候不是在ASPECT OF HAWK的状况下.

4:有效的?#092;用远距离攻击技能(包括了节省MANA,快速选择敌人目标等等)

好了,有了以上的目标,现在开始让我们来设计.首先,来制作模块所需要的最基本的三个档案.因为我替我的模块设计的名称叫做HunterAssistant(猎人辅助),所以我的三个基本档案叫做:
HunterAssistant.toc
HunterAssistant.xml
HunterAssistant.lua

 

 CODE

HunterAssistant.toc:
## Interface: 4150
## Title: Hunter Assistant V0.1
## Notes: Macro scripts for assisting Hunter
## OptionalDeps:
## Dependencies:
HunterAssistant.xml

HunterAssistant.xml:
<?xml version="1.0" encoding="utf-8" ?>
<Ui xmlns="http://www.blizzard.com/wow/ui/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/">
<script file="HunterAssistant.lua"/>

<Frame name="HunterAssistantFrame">
<scripts>
<OnLoad>
this:RegisterEvent("VARIABLES_LOADED");
</OnLoad>
<OnEvent>
if (event == "VARIABLES_LOADED") then
HunterAssistant_init();
end
</OnEvent>
</Scripts>
</Frame>
</Ui>

我将不在第这两个档案多做解释.有疑问的,请参考上一篇文章.毕竟我只使用的最简单的设计.

现在的重点LUA核心檔.我先把档案内容列出来,然后在以另外的文章详细的解释每个指令.

HunterAssistant.lua:

CODE
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

 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

 

 CODE
 function HA_AttackRangeI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Auto Shot");
x=1
found=false;
while (UnitBuff("player",x)) do
if(string.find(UnitBuff("player",x), "Raven")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Hawk(Rank 1)");
end;
end;
end

CODE 
 
function HA_AttackRangeII()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Auto Shot");
x=1
found=false;
while (UnitBuff("player",x)) do
if(string.find(UnitBuff("player",x), "Raven")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Hawk(Rank 2)");
end;
end;
end

CODE 

function HA_HunterMarkI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Hunter's Mark(Rank 1)");
end;
end

CODE 

function HA_HunterMarkII()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Hunter's Mark(Rank 2)");
end;
end

 CODE

function HA_StingSerpentI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
x=1
found=false;
while (UnitDebuff("target",x)) do
if(string.find(UnitDebuff("target",x), "Quickshot")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Serpent Sting(Rank 1)");
end;
end;
end

CODE 

function HA_StingSerpentII()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
x=1
found=false;
while (UnitDebuff("target",x)) do
if(string.find(UnitDebuff("target",x), "Quickshot")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Serpent Sting(Rank 2)");
end;
end;
end

Chapter Four


首先我要说声抱歉,因为我没注意到基地的文章发表没有办法显示"TAB"的空格.这样在查看程序代码,一定会造成困扰.如果大家在看程序代码会眼睛痛的时候,还请见谅.

现在,让我们研究一下HunterAssistant.lua第一段:

首先我要说声抱歉,因为我没注意到基地的文章发表没有办法显示"TAB"的空格.这样在查看程序代码,一定会造成困扰.如果大家在看程序代码会眼睛痛的时候,还请见谅.

现在,让我们研究一下HunterAssistant.lua第一段:

CODE 

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 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喔).


至于这个function 里面的一些IF, WHILE, NOT等等的?#092;用以及正确的语法,就请大家到LUA的官方网站去看.我就不多解释了.

在来是猎人的普通远距离攻击

 CODE
 
function HA_AttackRangeI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Auto Shot");
x=1
found=false;
while (UnitBuff("player",x)) do
if(string.find(UnitBuff("player",x), "Raven")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Hawk(Rank 1)");
end;
end;
end

这一段其实跟近距离的普通攻击是同样的逻辑,但是CastSpellByName("Auto Shot") 这个是猎人专有的远距离自动攻击的指令.同样的这个指令可以跟其它需要冷却时间的指令同时使用.另外CastSpellByName("Aspect of the Hawk(Rank 1)") 这是执行第一级的ASPECT OF THE HAWK. 在我们模块function HA_AttackRangeII()里面就会执行第二级的ASPECT OF THE HAWK, CastSpellByName("Aspect of the Hawk(Rank 2)")

CODE
function HA_HunterMarkI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Hunter's Mark(Rank 1)");
end;
end
function HA_HunterMarkI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
CastSpellByName("Hunter's Mark(Rank 1)");
end;
end

这一段没有什么特别的,唯一的好处就是当主角开始使用MARK的技能的时候,就开始命令宠物攻击.我们不需要按两个动作.另外,Hunter's Mark 也是有等级之分的,所以我写了其它相对应的等级指令
注意:(这个FUNCTION我还没有完全的完成,因为我没有检查是否敌人已经被MARK过了,也就是说这个指令允许重复MARK敌人,浪费MANA)

这一段没有什么特别的,唯一的好处就是当主角开始使用MARK的技能的时候,就开始命令宠物攻击.我们不需要按两个动作.另外,Hunter's Mark 也是有等级之分的,所以我写了其它相对应的等级指令
注意:(这个FUNCTION我还没有完全的完成,因为我没有检查是否敌人已经被MARK过了,也就是说这个指令允许重复MARK敌人,浪费MANA)


 CODE

function HA_StingSerpentI()
AssistUnit("pet");
if(not UnitExists("target")) then
TargetNearestEnemy();
end;
if(UnitExists("target")) then
PetAttack();
x=1
found=false;
while (UnitDebuff("target",x)) do
if(string.find(UnitDebuff("target",x), "Quickshot")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Serpent Sting(Rank 1)");
end;
end;
end


这一个跟普通远距离攻击的指令很像,但是并不是使用普通的AUTO SHOT,而是使用了Serpent Sting.另外这一个指令不会检查主角本身是否施展了ASPECT OF HAWK.因为Serpent Sting跟aspect of the hawk都要冷却时间,两个写在一起,只会执行其中的一个,那么就一点意义都没有了.既然这样,为什么要写这一个指令?其实这个指令会检查敌人身上是否已经被施展了Serpent Sting,毕竟Serpent Sting没有加成效过,所以我们要避免重复施展Serpent Sting.而WOW的基本Serpent Sting指令是不会做这样的检查的,所以我们还得一直盯着敌人的信息看着,避免浪费MANA.可是设计了另外的这个指令,玩家根本不用担心浪费MANA,只要想到了就执行一下,反证会自动检查,也不会中断AOTU SHOT的动作,更不会浪费MANA.另外,这个指令也有设计其它不同等级的相对应指令.

最后


 CODE

 function HunterTest_command()
x=1
found=false;
while(UnitBuff("player",x)) do
if(string.find(UnitBuff("player",x), "Raven")) then
found=true;
end;
x=x+1;
end;
if(not found) then
CastSpellByName("Aspect of the Hawk(Rank 1)");
end;
if(found) then
CastSpellByName("Aspect of the Monkey");
end;
end
 

这个指令只是我设计好玩拿来测试用的,当执行这个指令的时候,主角会交互的使用ASPECT OF MONKEY 或者 ASPECT OF HAWK.

模块的核心指令介绍到这里,下一篇文章将教玩家如何在游戏里?#092;用这些指令.

目前我们的模块有了最基本的三个档案了.现在让我们把这三个档案放入C:Program FilesWorld of WarcraftInterfaceAddOnsHunterAssistant这个数据夹里面.然后执行游戏.

现在让我解释一下WOW上面所谓的斜线指令("/指令")该如何?#092;用.

大家因该都清楚如何的?#092;用感情指令,或是交谈指令.这些都是斜线指令.但是WOW还有一些斜线指令是无法直接的输入, 比如说"/attack". 基本上这是WOW官方设计的攻击指令,其背后只是很简单的呼叫了CastSpellByName("Attack"). 但是为什么我们无法直接使用这些指令呢?因为暴风雪为了避免玩家利用其它的程序来设计非法的MACRO.

怎么说呢?因为WOW的MACRO没有时间间隔设计,避免玩家设计机器人,那么玩家设计机器人就必须利用其它的程序.如果,设计机器人,机器人程序就可以直接的仿真键盘输入指令,而不会影响到玩家对于鼠标的操做.所以WOW把很多的斜线指令的操作设定成只有在WOW的MACRO下才能使用.你设计一个MACRO以及MACRO图像按钮,你要执行这个MACRO,你就必须对这个按钮按一下,WOW才会执行这个动作.

当然,还是有其它的办法摆脱暴风雪这样的设计,但是我不会对类似这样的问题做出任和解说.因为暴风雪尽力的维护游戏免于外挂的侵入,身为玩家的我也有义务要帮助暴风雪.

有这样的限制的斜线指令包括了所有的会使用到执行特殊技能的指令.所以当我们设计的模块有用到执行特殊技能的时候,我们的斜线指令也只能在WOW下面的MACRO才能执行.(当然,我们的猎人辅助模块还是?#092;用在MACRO下面比较好,毕竟在战斗的时候谁还有时间慢慢的的用键盘输入指令,我们又不是机器人)

要使用WOW的MACRO很简单,只要在游戏中输入"/macro"或是按下Esc 然后选择macro的选项

在macor的画面,我们必须帮macro选择一个图像按钮,替macro命名,然后输入我们想要给macro的指令.

现在让我列出猎人辅助模块的简易斜线指令:
Hunter's Mark 包括了不同的等级
/hahmi/hahmii

Melee Attack(近距离攻击)
/haam"

Range Attack (远距离攻击)包括了不同的等级
/haari
/haarii

Serpent Sting(远距离特技)包括了不同的等级
/hasseri
/hasserii
/hasseriii

现在我们只要把macro的图像按钮选择好,然后给个名子,最后在底下输入指令的地方,挑一个你想要执行的辅助指令输入就好了. 注意喔,一个macro只能使用模块的一个指令喔,因为就算你输入了很多个,在执行macro的时候,游戏也只会执行情中的一个而已.(冷却时间的考虑)

当你设定好了macro之后,WALA~~~,你就可以把这个图形按钮抓到快捷工具栏上面使用了~~~就像是使用任何其它的基本图形按钮依样喔.好处是,你按一次按钮,却等于其它没有用辅助模块人按好几次按钮依样喔.还会自动帮你做一些额外的检查呢.有效率了多吧.


下一次,我将教大家如何设计辅助模块可以帮大家在半自动的施展BUFF,对象也会半自动的选择队友,宠物,或是自己.


附注1:因为我个人玩了10角色,包括了联盟的每一个CLASS,在未来的日子里,我将会不定期的替自己写模块.如此同时,我也会拿上来与大家分享.但是我将不会再花这么多的时间详细解释每一个指令.除非有网友提出问题,那时我会在尽力回答.

附注2:有关WOW的核心开放给玩家使用的指令,大家可以到这个网页找到.但是这里不是完整的列表,说明也不是很清楚,不过大家将就的用噜.
http://www.wowwiki.com/World_of_Warcraft_API

附注3:最有效率的研究模块的方式,就是到官网的UI Customization的论坛参与讨论喔.也许大家会找到一些意想不到,但是又很有帮助的模块喔.我个人就已经发现有人设计了一个挖矿采要的模块,这个模块会把你最到过的挖矿以及采药的地点纪录下来,然后显示在地图上.怎么样,很有用吧.
http://forums.worldofwarcraft.com/board.as...e-customization

Chapter Five
或许我在模块解释以及使用教学方面,因该采用更简单的例子来让大家能更容易上手.所以我决定不要直接的把我个人写好的模块拿上来,而是先的教大家如何使用WOW的MACRO,以及呼叫一些WOW的指令.

首先让我重新的介绍一下WOW的MACOR
(基本资料来源 魔兽台湾:http://www.wowtw.game.tw/)

在"魔兽台湾"的网页里,我们可以找到很清楚的MACOR中文定义以及解释:

宏[Macro]使你能够创建自己独创且非常酷的命令集,你可以通过点击一个按钮便完成一系列的命令。宏拥有许多用法。

宏的创建

输入"/macro"或者点击谈话[talk]按钮并且选择宏[Macro]选项,将会弹出一个对话框,里面记录着你现有的宏。在开始的时候里面应该没有任何宏。
点击对话框底部的"new"按钮,将会弹出另外一个对话框,其中要求你输入宏的名称并且为这个宏选择一个图标。
给你的宏命名,选择一个容易记忆的名字。例如,输入"assist[协助]"。
选择一个图标。这里我们选择的是一把剑。
点击"Okay"按钮。你现在能够在你的宏对话框里看到这个宏的名称(assist),在名称的旁边有你刚才选择的图标(剑)。
现在在assist[协助]图标上点鼠标左键加亮它。除了"new"按钮外,同时也有一个按钮用来改变你的宏的名称和图标,以便你以后想改变它的名称或者选择一个不同的图标。
一旦你的"assist"图标是加亮状态,你就可以向下移动你的鼠标指针进入"enter macro commands[输入宏命令]的区域。在这里你可以输入你想让这个宏按钮实现的命令。
输入"/assist Nebu[协助Nebu]"。
现在移动你的鼠标指针回到剑的图标(assist[协助]宏),在这个图标上压下鼠标的左键不松开。
现在拖动图标到你的动作条的空槽里去。
当你要使用这个新的宏的时候,键入这个动作按钮对应的数字或者直接右键点击按钮本身。
现在你拥有了一个宏按钮,它将在其它玩家(Nebu)攻击的时候协助他。无论何时,当Nebu攻击目标的时候,点击这个按钮后你的目标将会变为他正在攻击的目标。

以上是"魔兽台湾"给予MACRO的中文解释,以及一个很简单的例子.

现在让我们稍微加强一下上面的例子.

上面的例子里面,我们看到了MACRO的内容只有一行

/assist Nebu

现在我们来加强一下,让这个MACRO不但会协助,还会马上攻击.改过的MACRO会像底下这样.

/assist Nebu
/attack

好了,现在我们的MACRO有两行了.这个MACRO的目的是,协助Nebu(指定Nebu的敌人),然后攻击.

那么现在让我们写一个很简单以及实用的MACRO.加设Nebu是一个牧师,我们要帮Nebu写一个自动帮自己使用基本治疗的MACRO.

/target Nebu
/cast Lesser Heal(Rank 1)

以上的MACRO在执行的时候,每次都会选择Nebu作为治疗的对象.其中,/target Nebu 是选择Nebu为对象,/cast Lesser Heal(Rank 1)是对于对象施展Lesser Heal第一级的法术.

我想以上的例子因该已经很清楚的解释了基本的MACRO该如何使用.可是在在"魔兽台湾"的网页里也有提到:

宏的限制
宏是有长度限制的,如果你的信息太长了,就缩减一些!(显然)

这一点是没有错的,因为WOW的MACRO有255个英文字符的限制.我们该如何突破这个限制呢?

首先让我们先了解一下WOW的官方斜线指令.

上面那些MACRO里所用到的斜线指令,其实背后都有呼叫一些核心指令.例如:

/assist Nebu 呼叫了 AssistUnit("Nebu")
/attack 呼叫了 Attack("Target")
/target Nebu 呼叫了 TargetByName("Nebu")
/cast Lesser Heal(Rank 1) 呼叫了 CastSpellByName("Lesser Heal(Rank 1)")

这些核心指令除了可以使用官方的斜线指令来呼叫之外,我们还有其它几种方式来使用这些核心指令.

第一种方式,直接在MACRO里使用这些核心指令.要直接使用这些核心指令,我们必须用到一个斜线指令叫做/Script.

以下是把上面的MACRO例子改成使用核心指令的方式.
第一个MACRO 帮助Nebu攻击敌人
/Script AssistUnit("Nebu");
/Script Attack("Target");
第二个MACRO选择Nebu作为治疗的对象
/Script TargetByName("Nebu");
/Script CastSpellByName("Lesser Heal(Rank 1)");


要注意的一点是,当使用了/Script的时候,MACRO的每一行指令都要有";"作为结尾.

直接使用核心指令的好处是什么?因为WOW并没有帮每一个核心指令写对应的斜线指令,而很多的核心指令的功能却是非常强大的.

核心指令除了能直接利用在MACRO之外,另一个用途就是可以使用在模块里面使用.关于使用上的例子,大家可以参考我前几篇文章所提供的猎人辅助模块.在这里我们就可以利用模块所提供的斜线指令来变相的突破了MACRO上面的字符限制了.

希望这一篇文章能更容易的让大家了解斜线指令,核心指令,MACRO,以及模块的用途.

>※littlethe(东周小星星)提到:
>我是个programmer,
>macro在程序中是指宏指令,
>若我没有弄错的话,
>这个macro是不是用于制定"连续动作"用的?
>
>按个键,
>人物就会做出连续预设动作,
>
>若是这样,
>那wow可还真特别,
>开放玩家编写macro,
>
>等我拿到wow时,
>要好好的来玩看看

恩~没有错喔

可是WOW本身的MACRO有很多的限制.可是如果玩家使用非游戏本身的MACRO来玩WOW,暴风雪就可以砍此玩家的账号.

WOW本身的MACRO先天上就没有时间的设计.也就是说,MACRO里面所有的动作指令,通通当作及时指令(当然,非常严格的来说还是会有先后顺序上的差别,可是时间上的差别只有不到0.1秒.)这样的设计是避免玩家制作机器人.

另外,WOW很多的技能有冷却时间,如果把多个有冷却时间的技能写入MACRO,那么MACRO只会执行第一个达到条件的技能,其它有冷却时间的技能都会被忽略.
>※littlethe(东周小星星)提到:
>虾米??
>那这样的话,
>那岂不就不能使用连续法术了?
>法术也有cast time不是么?
>还是wow的法术都是direct的?
>哇累...
>本来想说能不能来个先闪电再插补血丈后嗜血之类的


WOW的技能大约能分为三种,实时的,有冷却时间的,需要施展时间的.

实时的就是可以一直连续使用.

有冷却时间的就是在使用过后,有一个时间限制是不能使用同一招.另外,使用这种技能之后,还会有大约不到一秒的时间无法使用任何其它的技能.

需要施展时间的,当使用的时候,在技能完全施展之前,无法使用任何其它的技能,除非先取消掉.

所以只要是有被时间限制上的技能,在MACRO里,就只有一个可以被驱动,而且最好是摆在MACRO的最后一行.如果摆在太前面,那么很可能就会使得后面的实时技能被挡掉.

>※willllee(balmung)提到:
>那可以用macro来配合其它程序吗?


使用任何不是魔兽纪元本身所提供的功能来执行游戏,都违反了魔兽纪元的使用条约.所以我无法在这里回答您所提出的其它的相关问题.


但是有一点可以确定的是,魔兽纪元所提供的核心指令,已经可以做出广大的环境判断了.包括判定血量多少,队友以及其宠物的状态,敌人的状态,等等.

目前官方论坛上已经有很多的模块能提供类似的功能.包括当自身血量低于某百分比,执行动作的时候,会先帮自己补血(魔法或是对象,取决于是否在战斗中),以及根据队友的血量百分比来决定宠物会先帮助哪个队友攻击.

如果有兴趣的网友,甚至可以写出根据敌人的状态做出不同的攻击或是反应的模块.

基本上,这些都可以只用到核心指令来达到的.

 

- 作者: bhu 2005年04月9日, 星期六 16:36  回复(0) |  引用(0) 加入博采

开山辟斧

      心血来潮我也申请了一个Blog,虽然很早就知道博客但以前只觉得这就像在小学里写日记一样(以前在我第一任语文老师的谆谆教导下我开始写日记,到后来就从日记变成周记再变成月记......之所以不写不是怕别人看我的日记,谁想看就看我无所谓,是因为我懒、嫌麻烦就不写了,一直到初中我的第(1、2、......)3任语文老师的强逼之下我又开始写周记了,到了初二第二学期她又说不要写了,但马上又说每周交一次摘抄一直到我初中毕业。到现在我又开始X记了["X"是因为我不知道这写的算日记还是周记、月记(有月记?)],我能坚持多久???......

--bhu记于华跃网吧142座用键盘砸出来的序(还是赤脚写的)

2005年4月9日15:58


      听说WOW允许使用插件所以上Google查找UI、宏命令的简介,在查看了N篇文章后我总算有点眉目了。里面用了XML,这东西的格式很像以前自学过的HTML,不过也只是一知半解,毕竟这是2个程序指令。宏命令中大量的使用了"/script"。2个程序语言都有"IF"语句也就是说WOW有判断功能,想必在PK的时候一定很有用能够腾出更多的空闲来操作其它东西(听说WOW很讲究微操,我连TFT 1vs1 Easy Computer都有困难......),还有一个阻碍我成为这方面的天才、砖家(吐吧~!吐吧~!把肚子里的都吐光了看你下次还能吐什么 ^_^~~)的内容是这2个都是老外发明的语言,它们的官网全是映个利息(我连PET都没过呢,听说PET和CET要取消了,我以后考什么托福、雅思???)不过还好有其它中文教程,虽然没官网的详细,但也无所谓,谁让我是未来的天才呢

咋还没吐光啊~!

- 作者: bhu 2005年04月9日, 星期六 16:21  回复(0) |  引用(0) 加入博采