[樂游網導讀]《魔獸世界》玩家都喜歡使用宏來完成一些動作,接下來我們將為小伙伴們介紹魔獸世界6.0德拉諾宏的寫法,希望能夠幫的上你!
《魔獸世界》玩家都喜歡使用宏來完成一些動作,接下來我們將為小伙伴們介紹魔獸世界6.0德拉諾宏的寫法,希望能夠幫的上你!
本文將著重探討宏的判斷機制這一最重要也是最難的部分,講解如何寫出優美合理的判斷語句,泛用于任何職業以及專精,對于文中之錯誤及疏漏望各位玩家指正。
但這不是一篇面向零基礎新手的宏命令完全教程,需要讀者大致了解宏的形式和基本判斷項(比如exists,help等),零基礎的讀者可以移步隔壁看基礎教學貼。
本帖基于6.0.3版本而寫,但由于宏在歷代版本改動都非常非常小,因而本帖可能不會隨著版本的推進而頻繁更新。
有用的外部鏈接
斜杠命令(Slash Command)列表?| 判斷項列表 | API列表 |
最近wowprogramming更新得不勤快,如有疑問也可去wowwiki。
6.0.2的改動以及存在的bug
*通用宏上限提高到120個,基本不可能用完了。
*切換目標時有可能出現判斷遲滯,導致動作條按鈕上的圖標錯誤。不過宏仍舊能夠正常運作,只是顯示錯誤而已。這可能是由于動作條按鈕本身的代碼造成的(待查證)。
事實上宏這種東西從2.1.0版本加入安全模板一來沒有發生過大的變動,只是偶爾加入新的簡寫或是判斷條件。
術語
判斷表達式,判斷式(Option Set):由若干判斷項組成,封閉在方括號[]中的真值表達式。繼承自安全模板,能在受保護環境下允許運作的唯一判斷形式。
術語
判斷表達式,判斷式(Option Set):由若干判斷項組成,封閉在方括號[]中的真值表達式。繼承自安全模板,能在受保護環境下允許運作的唯一判斷形式。
下面進入正題
一,寫宏的基本法則
宏最主要的應用是帶有判斷的施法,這也是下文主要應用的模型。一個典型的這種宏可以抽象成以下形式:
Code(c):
/cast [表達式1-1][表達式1-2]技能1;[表達式2]技能2;技能3
--宏的模型
[項1,項2,項3, ...]
--表達式的模型
--注:表達式中定義單位target=或@不是一種判斷條件,但它重新指定了后續所有涉及目標的判斷和最終技能施放的對象。比如指定了@mouseover后,后續的help/exists/dead之類的判斷都會基于鼠標懸停的單位。
在這個模型下,討論:
1. 邏輯及判斷順序(法則一,!極為重要)
涉及判斷就有真值,但是不要被這個帶有濃重編程和數學色彩的詞嚇倒。概括來說就兩句話:
<1>方括號內各分項之間是AND的關系,用逗號間隔,只有各個分項都為真整個方括號(表達式)才為真。方括號內各項之間沒有順序要求。
<2>各個方括號之間是OR的關系,判斷順序是從左至右,遇到第一個方括號為真時即結束判斷,而忽略其后的所有項目。
大部分宏出錯/不能用/判斷混亂的原因就是在此。寫宏的時候必須把條件強的(或者說優先級高的)判斷放到前面,弱的(泛用型的)判斷放到后面。舉個例子,昨天回答了問答區一個人的提問,他的宏
Code(c):
1:#showtooltip
2:/cast [nomod,spec:2]煉獄沖擊;[nomod,target=mouseover,exists,harm,spec:2]煉獄沖擊
無法對鼠標懸停目標放。究其原因就是,[nomod,spec:2]這一個表達式弱于后者[nomod,target=mouseover,exists,harm,spec:2],后者不僅需要無修飾鍵和第二專精,同時需要存在一個可攻擊的鼠標懸停目標才會為真,導致了后者為真時前者一定為真。按照上文的<2>,從左至右的順序將永遠是前者表達式率先為真,因而無法對懸停目標施放煉獄沖擊。修改的方法很簡單,把兩個判斷調換位置即可:
Code(c):
1:#showtooltip
2:/cast [nomod,target=mouseover,exists,harm,spec:2]煉獄沖擊;[nomod,spec:2]煉獄沖擊
3:--修改后的宏
當然我在回答中還給出了優化方案,后文會詳細介紹如何優化。
2. 技能整合(法則二)
對于把多個技能整合進一個/cast命令里,在不同的條件下自動判斷施放不同的技能,只有一條格式法則:不同技能之間用分號;間隔。具體可以參照本章開頭提出的宏模型。
要注意,一個/cast任何情況下至多只能施放一個技能,而且各個方括號之間仍舊遵循上文提出的<2>判斷順序法則。
3. 技能堆疊(法則三)
如果要做到一鍵同時放出兩個或更多的技能,必須有多行/cast命令,這就是技能堆疊。這種宏通常用于爆發技能,喝藥開飾品開技能需要同時完成。
其法則是:至多只能擁有一個產生/受到GCD影響的技能,幸運的是爆發類技能和藥水等物品幾乎都設計成不占用GCD。
Code(c):
1:#showtooltip
2:/cast 奧術強化
3:/use 13
4:/use 14
這樣的宏是可行的,因為飾品和[奧術強化]本身并不產生GCD,甚至再加兩行
Code(c):
/cast 氣定神閑
/cast 奧術沖擊
也是合法的。但是,形如以下的宏是非法的:
Code(c):
1:#showtooltip
2:/cast 驅邪術
3:/cast 審判
4:/cast 十字軍打擊
因為三者都產生GCD和/或被GCD影響,最終的效果是只相當于第一行[驅邪]有用。不要妄圖這種方法能實現按優先級施放技能。
4. 技能替代(法則四)
技能替代是一個十分有意思的機制,自CTM引進。這種機制允許某[基礎技能]在特殊情況下被另一個[替代技能]替代,而即便在替代的情況下,通過宏命令施放[基礎技能]時會自動定向到[替代技能],其最終的結果是正常施放[替代技能],宏的圖標也會隨之變化。
這種機制有兩種情況:
1)單向的替代,/cast [替代技能]不會施放出基礎技能,但是/cast [基礎技能]是任何情況下通用的。
舉例:神牧的[圣言術:罰]在黃輪和藍輪下轉換成[靜]和[佑],只要宏
Code(c):
1:#showtooltip
2:/cast 圣言術:罰
就能自動根據輪的顏色轉換技能,但因為這是[罰]被單向地替代,反過來如果宏里寫[靜]或[佑],在紅輪下就會放不出技能。
2)雙向的等價,[基礎技能]和[替代技能]是完全等價的,就如同一個技能,任何情況下用宏施放任意一個技能的結果都是放出當前激活的那一個。比如[腐蝕術]和[獻祭]兩者,SS玩家可以分別在不同天賦下試試。
這種機制對于寫宏非常有利,我們不需要為了技能被替換而另開一個宏。更深入的一點,以下兩個技能需要重點提及:
Code(c):
1:#showtooltip
2:/cast 秘法炸彈
3:--這個技能對應法師75級天賦中的[虛空風暴],[寒冰炸彈]和[活動炸彈]。[秘法炸彈]被單向替代。
Code(c):
1:#showtooltip
2:/cast 神圣爆發
3:--這個技能對應牧師90級天賦,也是單向替代。
如果其他職業也有類似的天賦基礎技能,請歡迎補充。
二,寫宏的靈魂:邏輯和優先級
和自己圈子里的很多人說過,寫宏其實和編程沒多大關系,需要的是一點數學的邏輯思維。尤其是那些技能整合宏,對在各種判斷條件下到底哪一個技能才是優先的必須心里有譜。實際上這是上文中法則一之<2>的推演,本質上仍舊是按照越優先越靠前的方式排列整個技能和判斷序列。正因如此,上文法則一才是宏最最重要的法則,而優先級正是寫宏的靈魂。
Code(c):
1:#showtooltip
2:/cast [help,dead][mod:shift,help][mod:shift,@player]Soulstone;[mod]Soul Link;Unending Resolve
3:/targetlasttarget [help,dead]
4:--比如這個術士宏,它的邏輯等價于:
5:--如果[目標死亡且可協助]或[按住shift并且目標可協助]或[其他按住shift的情況下對自己]施放[靈魂石]
6:--否則,如果[有按下其他任何修飾鍵]則施放靈魂鏈接
7:--否則任何其他情況下放盾墻
8:--此外,如果[目標死亡且可協助]還會順帶切換回之前的目標,目的是戰復后目標切回怪身上
有人可能會問,[help,dead][mod:shift,help][mod:shift,@player]這一串看不懂,為什么先來個shift修飾后面又來一個,這里就涉及到優先級的問題了。
首先[help,dead]指定了[目標死亡且可協助]的情況,它是優先級最高的,只要滿足這兩個條件,其他任何條件不管滿足不滿足都會戰復目標。
其次,[mod:shift,help]這一判斷代表[按住shift并且目標可協助],但是它還有個隱藏條件。因為要判斷到這一層,首先必須前者[help,dead]為假,也就是當[目標不可協助或者目標不死]的情況。所以其實這個判斷應該是[(目標不可協助或者目標不死)并且按住shift并且目標可協助],由于不可協助和可協助互斥,所以實際判斷的真值應該是[目標不死并且按住shift并且目標可協助],滿足這個條件,對目標放靈魂石。
再次,[mod:shift,@player],這里只用了一個判斷即shift修飾,上文說過@player不是判斷條件。但因為前一個判斷已經有一種按下shift的情況被取走了,那么這里的判斷表示[其他按住shift的情況下對自己]施放靈魂石。
然后,[mod]是個廣義的修飾鍵判斷,當alt/shift/ctrl中任何一個或多個被按下是都為true。當然shift在前面的判斷中被取走,那么這里表示的是[按下alt/ctrl中任何一個或兩個],他等同于[有按下其他任何修飾鍵]則施放靈魂鏈接。
最后,無盡決心沒有任何判斷,它是恒真的。也就是在其他任何條件下都會施放無盡決心。
上面這個例子有些復雜,下面會通過一個相對簡單的實例來闡述如何運用這種模式寫宏。
法師法術反制及焦點反制/懸停解詛咒整合宏
要求是:焦點可攻擊按住任何修飾鍵都是焦點反制,不按修飾鍵且敵對目標是對目標反制,鼠標懸停到友善目標是解詛咒,目標是友善目標是解詛咒,默認狀況下是對目標的反制。
首先就是厘清優先級。
*個人的習慣是修飾鍵優先級比懸停高,也就是按了修飾鍵應該嘗試對焦點放而不是對懸停解詛咒;而同時懸停的優先級應該比目標的優先級高。這個優先級可以根據自身需要調整。
那么整理之后的優先級就是:
第一優先級:焦點反制敵對目標,判斷式[mod,@focus,exists,harm]
第二優先級:懸停解可協助目標詛咒,判斷式[@mouseover,exists,help]
第三優先級:對友善目標解詛咒,判斷式[help]
第四優先級:敵對目標反制,判斷式[harm]
第五優先級:反制,無判斷式(恒真)
*要注意,harm和help有關系,但并不是help=noharm或者harm=nohelp。harm代表目標可攻擊,help代表目標可協助(能給他加血上buff等),此外還有一種既不能攻擊也不能協助的狀態,稱為"被動(Passive)"。
現在可以直接寫出宏了,那就是:
Code(c):
1:#showtooltip
2:/cast [mod,@focus,exists,harm]法術反制;[@mouseover,exists,help][help]解除詛咒;[harm]法術反制;法術反制
3:--第一行的#showtooltip不是命令行,它的作用是能在鼠標提示上顯示技能的有關信息
這個宏運作起來是符合要求的,但是可以繼續優化。從邏輯上而言,第四與第五優先級可以合并,而且exists沒必要與harm和help連用。因此最終的宏是:
Code(c):
1:#showtooltip
2:/cast [mod,@focus,harm]法術反制;[@mouseover,help][help]解除詛咒;法術反制
三,終極形態:宏的優化
宏有字數限制,每個漢字或是英文字母都占1字,最后還有個換行符占1字,總共加起來不能超過256個字符(不包括標題行)。因此在一些特殊的環境下,寫出來的宏會很長很長,那么優化有時候就有必要。
優化的目的是讓宏看起來更整潔優美,更精短同時兼顧功能,以方便日后修改等操作。
優化一:注意判斷之間的關系,去掉多余的判斷項。
Code(c):
1:#showtooltip
2:/cast [mod]技能1;[nomod]技能2
后面的nomod判斷就是多余的,可刪除。
優化二:去掉多余的exists。
當exists與harm,help,dead等本身就需要判斷"目標狀態"的項目在同一個方括號內連用時,exists多余。因為后者為真,exists一定為真;相反exists為假后者一定為假。
Code(c):
1:#showtooltip
2:/cast [@mouseover,exists,help][]快速治療
其中的exists可以刪除。
優化三:恒真判斷([])
它就是一個空的方括號,在任何條件下都返回true。當最后的收尾技能和前一個相同時,不需要使用分號重復寫技能名,只需要一個空括號即可。
比如還是上面的快速治療宏,其等同于:
Code(c):
1:#showtooltip
2:/cast [@mouseover,help]快速治療;快速治療
3:--可以簡并成
4:#showtooltip
5:/cast [@mouseover,help][]快速治療
優化四:靈活運用/stopmacro
它的作用是在這一行終止當前宏運行,可以加判斷式。
優化五:慎用nochannelling項
特別是暗牧!
Code(c):
1:#showtooltip
2:/cast [nochannelling:精神鞭笞]精神鞭笞
若你的延遲不是非常低,這宏會嚴重浪費輸出時間。原因是它需要本地客戶端停止引導才會允許施放,而此時服務器早就引導完了。正確的方法是用顯示即使延遲的施法條插件,比如Quartz,在引導進入紅區時施放下個鞭笞。
優化六:注釋符(--,兩個連寫的減號)
一種特殊命令,寫在一行的最開頭,作用是把一整個命令行全部注釋掉,讓其不產生任何效果。
實用性的例子如打斷施法+反制宏,當插了反制雕文的時候,打斷施法這一行就沒有必要了。這時候就可以把宏改寫成如下形式:
Code(c):
1:#showtooltip
2:--/stopcasting
3:/cast 法術反制
注意注釋符的用法。下次需要他有作用的時候,簡單地刪除注釋符即可。用它保存暫時不用的長段復雜代碼,需要時刪除以釋放,方便有效。
優化七:圖標選問號,#showtooltip后面留空
如果是整合技能宏,一般情況下圖標都選問號,這樣圖標就會跟隨技能變化。而#showtooltip這一行一般不需要后面附加技能。當在特殊情況下,例如寫一個氣定奧沖綁定宏,氣定在奧沖之前,但是非要把圖標成奧沖的時候,才寫成:
Code(c):
1:#showtooltip 奧術沖擊
2:/cast 氣定神閑
3:/cast 奧術沖擊
四,常用宏模板
1. 治療/傷害技能混合宏,附帶指向施法,或者用于解buff和攻擊性技能組合:
Code(c):
1:#showtooltip
2:/cast [@mouseover,help]治療技能;[harm]攻擊技能;治療技能
2. 治療指向宏,無指向對目標:
Code(c):
1:#showtooltip
2:/cast [@mouseover,help][]治療技能
3. 經典的修飾鍵整合宏:
Code(c):
1:#showtooltip
2:/cast [mod]技能1;技能2
或者更多的技能:
Code(c):
1:#showtooltip
2:/cast [mod:shift]技能1;[mod:ctrl]技能2;[mod]技能3;技能4
4. 翻頁宏:
Code(c):
1:#showtooltip
2:/cast 技能
3:/changeactionbar n
這個宏最近已經被玩壞了,n可取1-6。
5. 花式宏,雙修飾鍵/三修飾鍵判斷:
Code(c):
1:#showtooltip
2:/cast [mod:alt,mod:ctrl,mod:shift]技能
按照需要自己整合,就是這個套路。
6. 花式用法:
拆分1+alt和alt+1(按鍵順序)。
*1+alt指的是先按住1然后不放去按alt,保持alt松開1(此時放技能),最后松開alt。
這個用法需要關閉界面設置中的點擊施法選項。
按鍵綁定中綁定alt+1,在這個動作按鈕上放技能1
建立一個宏
Code(c):
1:#showtooltip
2:/cast [mod]技能2;技能3
把這個宏放到鍵1上。
其結果就是alt+1放出技能1,1+alt放出技能2,直接按1是技能3。
7. 智能坐騎宏
自帶的隨機坐騎真的有點,*咳咳*。
Code(c):
1:#showtooltip
2:/run local m=GetCurrentMapAreaID()if(m==610 or m==613 or m==614 or m==615) then CastSpellByName("深淵海馬") end
3:/cast [flyable]飛行坐騎
4:/cast [swimming]水生坐騎;陸地坐騎
這種帶判斷的上古宏對于坐騎還是可以用滴!用它能夠只在瓦斯琪爾召喚海馬。
結語
希望本文能稱為宏命令的普及做一份微薄的貢獻。內容雖然很長,但是囊括了大部分寫判斷的要素。如果各位看官今后寫此類遇到了什么問題,本文或許會提供答案。
熱門評論
最新評論
支持( 0 ) 蓋樓(回復)
發表評論 查看所有評論(0)