我曾经发表过一篇关于打断施法提示宏的文章,发表之后各大网站争相登载。由于魔兽世界版本的更新,曾经风光一时的那套打断施法提示宏,只好被迫下岗。不少认识我的人曾经问我:你写的打断施法提示宏怎么不能用了?我只好告诉他们:2.4更新了,这套宏已经过时,我正在写一套新的打断施法提示宏,很快就能和大家见面了。
2.4版本的打断施法提示宏终于“诞生”了,如果你还不知道这套宏,那我只好重新讲一遍这套宏的作用了。不管你在五人副本、大型RAID、战场、竞技场还是野外,都可以使用这套宏,及时让大家知道法术被打断的信息。比如竞技场中自己队里的队友加血被反制了,其他人就能及时采取保护措施;如果敌方的治疗被反制了,那么你就能及时和队友加强DPS集中杀掉一个敌人;在PVE时有了这个打断怪物施法的信息,一来可以让大家安心DPS,二来还可以省掉了其他人的反制技能。下面我就把宏展示给大家看:
宏1:生成打断施法的提示,并发送聊天信息
/run function SIS_M(a,b,c,d,e,f,g,type) SendChatMessage("["..date("%H:%M:%S",a).."] ["..b.."] 的 \124cff71d5ff\124Hspell:"..d.."\124h["..e.."]\124h\124r 打断了 ["..c.."] 的 \124cff71d5ff\124Hspell:"..f.."\124h["..g.."]\124h\124r。",type);end
宏2:过滤掉其他的战斗记录,只留下打断施法的战斗记录
/run function EV_M(...) local a,v,_,b,_,_,c,_,d,e,_,f,g=...;if (v=="SPELL_INTERRUPT" and SIS_M) then SIS_M(a,b,c,d,e,f,g,"YELL");end end
宏3:创建接收消息的框架
/run if (not MSG_F) then CreateFrame("Frame","MSG_F",UIParent);end MSG_F:RegisterEvent("COMBAT_LOG_EVENT");MSG_F:SetScript("OnEvent",function(_,_,...) if (EV_M) then EV_M(...);end end);
以上三个宏在进入游戏后按顺序执行过一遍就可以即时提示打断施法的消息。
比如某一时刻一个人打断了另一个人的施法,那么使用这套宏的人就会喊出提示来,效果如下:
[亚伯拉罕]喊道:[19:42:25] [冰封火舞] 的 [反制] 打断了 [西方必败] 的 [恐惧术]。
功能很强大吧,凡是有打断施法并且在一段时间内不能施放同系法术的打断都可以提示,并且要比旧版打断施法提示宏要强得多,如果你尝试使用这个宏,就会发现它不仅能显示打断的时间,而且技能也会以链接的形式显示,用鼠标点击就可以查看技能信息。
下面还是要对以上三条宏分别解释一下功能,这几段内容被很多人誉为“天书”,看不懂的话可以跳过这几段看后面的:
第一条宏
/run function SIS_M(a,b,c,d,e,f,g,type) --定义函数SIS_M,用来发送聊天信息
SendChatMessage( --调用的这个方法用来发送这样的字符串“[HH:mm:ss] [AA] 的 [BB] 打断了 [CC] 的 [DD]。”
"[" --为时间戳加上中括号
..date("%H:%M:%S",a) --格式化时间戳,参数a存放着当前所取得消息的十六进制时间
.."] [" -- 时间戳和消息之间留一个空格
..b --参数b存放着玩家1的名字
.."] 的 \124cff71d5ff\124Hspell:" --给玩家1施放的技能加上链接码
..d --参数d存放着玩家1施放的技能的ID值
.."\124h[" --给玩家1施放的技能的名称加上中括号
..e --参数e存放着玩家1施放的技能的名称
.."]\124h\124r 打断了 [" --中间加上“打断了”
..c --参数c存放着玩家2的名字
.."] 的 \124cff71d5ff\124Hspell:" --给玩家2施放的技能加上链接码
..f --参数f存放着玩家2施放的技能的ID值
.."\124h[" --给玩家2施放的技能的名称加上中括号
..g --参数g存放着玩家2施放的技能的名称
.."]\124h\124r。", --最后加上一个句号,
type --SendChatMessage的第二个参数,指定了发送聊天信息的方式
); --组合字符串,然后发送聊天信息;
end --函数定义结束。
第二条宏
/run function EV_M(...) --定义函数EV_M,用来过滤战斗记录,只留下打断施法的战斗记录。EV_M函数的参数为“...”,这是LUA语言的特殊定义方式,表示参数的个数不确定
local a,v,_,b,_,_,c,_,d,e,_,f,g=...; --定义一些临时变量来按顺序从战斗记录中取得数据“_”变量为LUA保留变量,一般用作临时变量来多次赋值
if (v=="SPELL_INTERRUPT" and SIS_M) then --判断当临时变量v取得的消息类型为"SPELL_INTERRUPT"且SIS_M函数已经定义的情况下执行if内的语句
SIS_M(a,b,c,d,e,f,g,"YELL"); --调用SIS_M组合打断施法提示的信息字符串,以“YELL”(大喊)的方式发送。
end --if语句结束
end --函数定义结束。
第三条宏
/run if (not MSG_F) then --判断一下MSG_F框架是否已经创建过了
CreateFrame("Frame","MSG_F",UIParent); --创建MSG_F框架用来接收消息;
end --if语句结束
MSG_F:RegisterEvent("COMBAT_LOG_EVENT"); --为MSG_F框架注册接收的消息类型为“COMBAT_LOG_EVENT”;
MSG_F:SetScript( --为MSG_F设置事件执行的脚本
"OnEvent", --指定为哪个MSG_F事件设置脚本,这里设置为“OnEvent”,
function(_,_,...) --函数定义开始,参数1和2用不到,被LUA保留变量接收
if (EV_M) then --这里用if是为了防止弹出Lua错误消息,判断一下第二条宏是否用过了
EV_M(...); --调用EV_M函数匹配接收到的消息,以“YELL”(大喊)的方式发送聊天信息;
end --if语句结束
end --函数定义结束
); --SetScript结束。
上面这几段内容分别解释了这三个宏的功能,当然我还是要建议大家尝试一下下面的内容,因为一些人可能对这个宏实现的效果不够满意。
● 有些人觉得喊出声来不如只显示在自己的聊天记录中,那么可以把第一个宏改成这样:
/run function SIS_M(a,b,c,d,e,f,g,_) DEFAULT_CHAT_MESSAGE:AddMessage("["..date("%H:%M:%S",a).."] ["..b.."] 的 \124cff71d5ff\124Hspell:"..d.."\124h["..e.."]\124h\124r 打断了 ["..c.."] 的 \124cff71d5ff\124Hspell:"..f.."\124h["..g.."]\124h\124r。");end
● 有些人觉得这套宏不错,在竞技场中可以提醒大家谁打断了谁的施法,但是他却不希望竞技场中的敌人也看到这样的信息,怎么办呢?没关系,把第二个宏改一下(注意,旧版的打断施法提示宏是改第三个宏):
/run function EV_M(...) local a,v,_,b,_,_,c,_,d,e,_,f,g=...;if (v=="SPELL_INTERRUPT" and SIS_M) then SIS_M(a,b,c,d,e,f,g,"RAID");end end
和之前的第二个宏比较一下
/run function EV_M(...) local a,v,_,b,_,_,c,_,d,e,_,f,g=...;if (v=="SPELL_INTERRUPT" and SIS_M) then SIS_M(a,b,c,d,e,f,g,"YELL");end end
可以看出改动也只是把最后的“YELL”换成了“RAID”,为什么这样换呢,我们都知道WOW有多种聊天方式,有“说”、“大喊”、“小队”、“团队”、“公会”、“战场”等,在这里就可以规定用什么聊天方式发送。下面列举出这套宏所有可以用的聊天方式:
SAY 说(/s)
EMOTE 表情(/e)
PARTY 小队(/p)
BATTLEGROUND 战场(/bg)
GUILD 公会(/g)
OFFICER 官员(/o)
YELL 大喊(/y)
RAID 团队(/ra)
RAID_WARNING 团队警报(/rw)
这套宏依然不支持悄悄话和频道功能,我还是的确非常不希望大家用这个宏扰乱综合交易频道!
● 还有人说,我用了这套宏了,功能也不错,但我由于某些原因想关掉它的功能,怎么办呢?很简单,和以前版本一样还是有三种方法可以用:
一,下线再上线后,所有的插件都重新加载了,上次使用过的所有宏的功能全部解除掉了。
二,使用/console reloadui,这条命令是让插件重新加载,使用过后你会看到进入游戏的画面,不过你放心,你的号不会掉线也不会退出副本和战场,只是插件重新加载了一下,当然使用过的宏的功能也全部解除掉了。
三,有人说他不想下线也不想重新加载插件。没关系,还有更简单的方法,不用下线,也不会重新加载插件,更不会清除聊天记录,只要使用“/run EV_M=nil”就可以了。
这套宏是供大家学习交流之用,如果你不想使用同类功能的插件,可以把这套宏存放在游戏的宏窗口中,然后把宏的图标拖到空闲技能栏(比如2号技能条,按Shift+2可以切换出来),每次上线之后按一遍这些宏就可以了。毕竟装了插件是要占资源的,用了这些宏仅占用了极小的内存空间,想想还是很划算的。