随着对山口山的不断深入,
对宏的认识也越来越多。
NGA 上虽说有不少很好的宏,
但骆驼鲜有直接照搬的,
一般都会根据自身的情况而进行修改。
这次发现的也是一个相当有趣的宏。
能够在阿拉希战场上守旗时候,
及时通告队友有多少敌人来偷袭。
该宏设计很精巧,
只需多次点击便可通告更多人数,
十秒归零,无需手动重置。
在战场上这样的消息算不上骚扰,
连续点击也不会过于影响操作。
最关键的一点,
该宏利用了 GetMinimapZoneText 函数,
从而无论在哪里守旗都自动通告。
相比按回车之后输入“t3”、“m2”、“k2”还要方便,
同时也一目了然,无需猜想。
但该宏也存在也许不足。
比如,解除警报则需另外一条宏;
仅能在战场上使用,
冬握湖、野外 pvp 则无法使用。
按照我个人的习惯,
会把相似的两个功能绑到同一个宏里,
然后通过鼠标左键或者右键点击去选择,
比如最基本的焦点宏:
/focus /clearfocus [button:2]
左键设定焦点,右键取消焦点。
想把这个战场遇敌通告宏整合起来,
我最初的想法是这样的:
/script 右键通告安全 /stopmacro [button:2] /script 左键通告遇敌
利用 stopmacro 功能,
将执行前一半的宏强行停止,
从而不会执行后一半。
但是与 cast 或者前面的 clearfocus 不同,
在 script 下是直接执行 lua 语句,
从而无法使用类似 [button:2] 这样的修改符。
而 IsMouseButtonDown 这样的判断,
也仅适用于按键绑定的情况。
最终采用了 GetMouseButtonClicked。
值得留意的是这个 API 返回的前三个键,
必须用完整写法而不能用数字替代。
然后结合 if then else 的判断,
成功将左右按键不同功能结合起来。
再通过改造 SendChatMessage,
将原本仅在战场使用的喊话,
扩展至 1 频道,即默认的本地,
如此一来在冬握湖或者野外也能顺利通报。
/run z=GetMinimapZoneText() y="channel"; if GetMouseButtonClicked()=="RightButton" then SendChatMessage(z..":安全",y,nil,1)else if not c or not l or GetTime()-l>10 then c=0;end;l=GetTime();c=c+1; SendChatMessage(z..":敌袭!x "..c,y,nil,1)end
这次也让我了解到 lua 中,
if 判断语句需要用 end 来完结。
比如在三选一坐骑宏中,左键随机坐骑并且不喊话,
右键出大象修理喊话,中键出乌龟过水喊话。
判断过程是 if then else if then else,
最后需要用两个 end 来完结。
/run h=GetMouseButtonClicked(); if h=="RightButton" then r="大地修理铺,你身边的五金店。" else if h=="MiddleButton" then r="大地之龟,水中霸者。" else r=""; end;end;SendChatMessage(r,"yell")
此外,游戏显示时中文虽然算一个字符,
但服务器后台保存实际需要占到两个字符。
因此当宏中存在过多中文则该宏不正常结束,
从而影响到其它宏并引起再登录时其它宏丢失的情况。
因此想尽办法缩写宏也是非常必要的一种手段,
比如用 run 代替 script,
用 @player 代替 target=player,
重复使用的部分则尽量用变量去替代。
(以上宏出于显示效果有分段,实际为一行)
【相关资料】
1、阿拉希遇敌通告原宏@nga
2、关于SendChatMessage()的研究@Dawnhawk
3、API SendChatMessage@wowwiki
4、API GetMouseButtonClicked@wowwiki
5、Shrinking a macro@wowwiki
6、中文过长引起宏丢失@nga