啥叫职业高端玩家?最强打断施法提示宏
作者:亚伯拉罕
这个宏的作用在五人副本、大型RAID、战场和竞技场中发挥的作用都很显著,及时让大家知道法术被打断的信息。如果竞技场中自己队里的队友加血被反制了,其他人就能及时采取保护措施;如果敌方的治疗被反制了,那么你就能及时和队友加强DPS集中杀掉一个敌人。RAID中有了这个打断怪物施法的信息,一来可以让大家安心DPS,二来还可以省掉了其他人的反制技能。是居家旅行、杀人越货必备良宏。
宏1:为框架设置接收消息的类型
/run MSG_E={"SELF","PET","PARTY","FRIENDLYPLAYER","HOSTILEPLAYER","CREATURE_VS_SELF","CREATURE_VS_PARTY","CREATURE_VS_CREATURE"};for i=1,8 do MSG_E[i]="CHAT_MSG_SPELL_"..MSG_E[i].."_DAMAGE";end
宏2:处理战斗记录消息,并发送聊天信息
/run function EV_M(type) for a,b,c in string.gmatch(arg1,"(.+)打断了(.+)的(.+)") do SendChatMessage("["..string.gsub(a,"^你$",UnitName("player")).."] 打断了 ["..string.gsub(b,"^你$",UnitName("player")).."] 的 "..c,type);end end
宏3:创建接收消息的框架
/run if (not MSG_F) then CreateFrame("Frame","MSG_F",UIParent);end if (MSG_E) then for i=1,8 do MSG_F:RegisterEvent(MSG_E[i]);end end MSG_F:SetScript("OnEvent",function() if (EV_M) then EV_M("YELL");end end);
以上三个宏在进入游戏后按顺序执行过一遍就可以即时提示打断施法的消息。
比如某一时刻一个人打断了另一个人的施法,那么使用这套宏的人就会喊出提示来,效果如下:
[亚伯拉罕]喊道: [阳光美少男] 打断了 [西方必败] 的 恐惧术。
功能很强大吧,不仅玩家打断施法可以提示,就连怪物的打断都可以提示。
下面对以上三条宏分别解释一下功能,如果感觉这几段内容像天书的话可以跳过这几段看后面的:
第一条宏
/run MSG_E={ --初始化全局变量MSG_E设置为一个字符串数组,用来定义接收的消息类型
"SELF", --"CHAT_MSG_SPELL_SELF_DAMAGE"“你的伤害法术”,
"PET", --"CHAT_MSG_SPELL_PET_DAMAGE"“宠物的伤害法术”,
"PARTY", --"CHAT_MSG_SPELL_PARTY_DAMAGE"“队友的伤害法术”,
"FRIENDLYPLAYER", --"CHAT_MSG_SPELL_FRIENDLYPLAYER_DAMAGE"“友方玩家的伤害法术”,
"HOSTILEPLAYER", --"CHAT_MSG_SPELL_HOSTILEPLAYER_DAMAGE"“敌方玩家的伤害法术”,
"CREATURE_VS_SELF", --"CHAT_MSG_SPELL_CREATURE_VS_SELF_DAMAGE"“怪物对你的伤害性法术”,
"CREATURE_VS_PARTY", --"CHAT_MSG_SPELL_CREATURE_VS_PARTY_DAMAGE"“怪物对队友的伤害性法术”,
"CREATURE_VS_CREATURE"}; --"CHAT_MSG_SPELL_CREATURE_VS_CREATURE_DAMAGE"“怪物对其他人的伤害性法术”;
for i=1,8 do --循环8次
MSG_E[i]="CHAT_MSG_SPELL_"..MSG_E[i].."_DAMAGE"; --把原来的MSG_E[i]字符串两边加上固定的字符串;
end --for循环结束。
第二条宏
/run function EV_M(type) --定义函数EV_M(Event_Macro),用来从消息中匹配合适的字符串来发送聊天信息
for a,b,c in string.gmatch(arg1,"(.+)打断了(.+)的(.+)") do --根据正则表达式匹配消息中的字符串
SendChatMessage( --调用的这个方法用来发送这样的字符串“[xx] 打断了 [yy] 的 zz。”
"[" --为名字加上中括号以醒目
..string.gsub(a,"^你$",UnitName("player")) --匹配到的a字符串如果只有“你”字,就把它替换成玩家自
己的名字
.."] 打断了 [" --中间加上“打断了”
..string.gsub(b,"^你$",UnitName("player")) --匹配到的b字符串如果只有“你”字,就把它替换成玩家自己的名字
.."] 的 " --中间加上“的”
..c, --匹配到的c字符串,往往都是技能的名称,
type --SendChatMessage的第二个参数,值为EV_M函数的参数,是发送聊天信息的方式
); --匹配成功后,发送聊天信息
end --gmatch匹配结束
end --函数定义结束。
第三条宏
/run if (not MSG_F) then --判断一下MSG_F框架是否已经创建过了
CreateFrame("Frame","MSG_F",UIParent); --创建MSG_F框架用来接收消息
end --if语句结束
if (MSG_E) then --这里用if是为了防止弹出Lua错误消息,判断一下第一条宏是否用过了
for i=1,8 do --循环8次
MSG_F:RegisterEvent(MSG_E[i]); --为MSG_F框架注册接收的MSG_E[i]消息类型;
end --for循环结束
end --if语句结束
MSG_F:SetScript( --为MSG_F设置事件执行的脚本
"OnEvent", --指定为哪个MSG_F事件设置脚本,这里设置为“OnEvent”,
function() --函数定义开始
if (EV_M) then --这里用if是为了防止弹出Lua错误消息,判断一下第二条宏是否用过了
EV_M("YELL"); --调用EV_M函数匹配接收到的消息,以“YELL”(大喊)的方式发送聊天信息
end --if语句结束
end --函数定义结束
); --SetScript结束。
上面这几段内容分别解释一下三个宏的功能,下面的内容建议大家尝试一下,因为一些人可能对这个宏实现的效果不够满意。
● 有些人觉得喊出声来不如只显示在自己的聊天记录中,那么可以把第二个宏改成这样:
/run function EV_M(type) for a,b,c in string.gmatch(arg1,"(.+)打断了(.+)的(.+)") do
DEFAULT_CHAT_MESSAGE:AddMessage("["..a.."] 打断了 ["..b.."] 的 "..c);end end
● 有些人觉得这套宏不错,在竞技场中可以提醒大家谁打断了谁的施法,但是他却不希望竞技场中的敌人也看到这样的信息,怎么办呢?没关系,笔者在设计这套宏的时候早就考虑到了,把第三套宏改一下:
/run if (not MSG_F) then CreateFrame("Frame","MSG_F",UIParent);end if (MSG_E) then for i=1,8 do MSG_F:RegisterEvent(MSG_E[i]);end end MSG_F:SetScript("OnEvent",function() if (EV_M) then EV_M("RAID");end end);
和之前的第三条宏比较一下
/run if (not MSG_F) then CreateFrame("Frame","MSG_F",UIParent);end if (MSG_E) then for i=1,8 do MSG_F:RegisterEvent(MSG_E[i]);end end MSG_F:SetScript("OnEvent",function() if (EV_M) then EV_M("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”就可以了。



