宏從入門到精通(盜賊專用)

一直看各種宏的教學,沒有一片足夠清晰嚴格的。

在這些教學里,函數的變量和作用都沒有說明,宏的語法也沒有說明,這樣對玩家自己改進宏十分不利。
那些寫宏教程的也很奇怪,難道都不屑于說明語法么?或者就是直接從國外網站照樣copy過來的?
恩,對大多數人可能不管黑貓白貓復制下來能用的宏就萬事ok了...但我個人不喜歡不求甚解的態度,
而且看見過的多數拿出來分享給別人用的宏,用計算機專業的標準衡量,代碼往往冗余,這就意味著
效率的損失,也就意味著片刻的延時,或許片刻就是生死的分界線....
這篇宏的經驗文章寫給那些想多了解一些宏的知識的玩家,
如果不想自己動手寫宏的玩家不用往下看。


1,宏的基本常識
宏是一個腳本,發送到服務器端執行。這個腳本由一組命令序列構成,長度不超過255個字符。
序列中的每一個命令,由一個/ 開頭,例如/say /script 等等。
/script 后面跟隨腳本特有的語句和函數。

你可以羅列多個/script命令在一個腳本里,也可以在一個/script命令中寫多個函數,這都可以。
因為宏就是依次執行所有的命令,所以不需要在宏的最后添加end 標記,或在命令之間加;
事實上,end標記 是if語句的組成部分,你在寫if語句時才用到end關鍵字。命令和命令之間用
換行或; 隔開都可以,我喜歡用換行..呵呵,省掉不必要的; 代碼也清楚些

常用的if語句語法如下:

/script if [條件表達式] then [命令序列] end
or
/script if [條件表達式] then [命令序列1] else [命令序列2] end

這里條件表達式不需要在外面套括號,和C,java的習慣不同,應該是為了減少不必要的字符數,
畢竟WOW宏有長度限制。

條件表達式 中 相等用 == , 否定用not, 不等于可以寫 not (A == B),
暴雪沒有提供!= 作為不等于,很奇怪。 例子:
if sword == GetInventoryItemLink("player", 16) then ....
if not (sword == GetInventoryItemLink("player", 16)) then ....

注1,這里的sword是全局變量。每一個全局變量的生命周期是一次登陸中從聲明變量到退出魔獸,
通常在每次登陸后額外運行一個設定宏來設定我們所需要的全局變量。

注2,GetInventoryItemLink()是一個取裝備link的函數,
GetInventoryItemLink("player", number)是從人物身上取裝備的link,number代表人物裝備畫面的不同槽, 頭部,頸部,依次遞增,于是16代表主手武器,17代表副手武器
GetInventoryItemLink("player", 16) 就代表了主手武器的link

2,盜賊專用宏的編制思路,
其實用宏就是為了切換武器,既不放棄匕首的背刺和伏擊,也能用高攻的單手劍,達成兩全其美的效果。

一般有兩種風格的切換宏,
1,主手劍副手匕首,用背刺,伏擊時把匕首換到主手。用其他技能時把劍換到主手。
2,主手劍副手劍,背包里放一把匕首,用背刺,伏擊時,把背包里的匕首換到主手。用其他技能時把劍換回來。

前一種方案的切換武器的宏如下:

PickupInventoryItem(16) PickupInventoryItem(17)

還記得吧,16代表主手武器,17代表副手武器。
PickupInventoryItem就是相當于打開人物裝備面板(Inventory, 按C)
做點擊數字對應位置的動作。這個宏很簡單,
就是先點擊主手武器,然后鼠標上應該有主手武器,然后點擊副手武器,
這時候兩把武器就會交換。瞬間執行的效果當然就是瞬間交換,但這個宏有能夠感覺得到的明顯延時,
因為PickupInventoryItem這個函數執行比較慢。推薦用下一個方案。

后一種方案的切換武器的宏如下:
PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1)

PickupContainerItem是從背包里取裝備,第一個參數指背包,第2個參數指背包里的槽位,
這里的約定是0代表主背囊,然后從右向左,依次是1,2,3,4
背包里槽位從上到下,從左往右排序,注意!從1開始。這和一般從0開始的習慣有點不同。

因此PickupContainerItem(0, 1) 就是點取我主背包上數第一排左數第一格的物品。
然后PickupInventoryItem(16) 放到主手位置,
然后把原先主手位置的物品PickupContainerItem(0, 1)放到背包里。完成一次武器交換。

這個切換動作明顯比前一個更快。推薦使用,而且副手因此可以保持用高DPS的劍,有助于提高攻擊效率么,當然,你愛在副手保持什么武器都可以,呵呵。

現在我們有了一個基本的切換宏,但每次用技能都手工切換很難忍,我們繼續實踐很多人想到過的,
為特定技能寫不同的宏,保證不同技能使用合適的武器。

基本思路是用全局變量記錄主手使用的劍,在用不同技能時判斷主手位武器是劍或否,看情況切換。

全局變量的設置宏:
/script setglobal("sword", GetInventoryItemLink("player", 16))
/script SendChatMessage("主手劍"..sword, "say", this.language,"")

第二句命令把你的主手武器說出來,讓自己能夠看見。如果碰巧是匕首在主手(例如上次斷線不巧等等),就切換一次,重新運行設置宏。保證sword變量對應自己的主手劍。

先用邪惡攻擊舉例:我們要保證每次邪惡攻擊都使用高攻擊的劍,所以先判斷主手武器,如果需要切換就切換,然后執行邪惡攻擊。

/script if not (sword == GetInventoryItemLink("player", 16)) then PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1) end
/script CastSpellByName("邪惡攻擊(等級 5)")

但類似寫背刺的宏會有問題,背刺的有效性判斷在宏執行之前,
這就使得流傳的一些背刺宏需要連按兩下,第一下只能完成切換,第二下才能背刺,這很是不方便。

因此,我的思路是在鑿擊之后直接切換武器,因為鑿擊通常接著就要背刺。這樣背刺就可以直接進行了。而且背刺后應該換回劍繼續,因為背刺的60能量開銷使得它在絕大多數情況不能連續進行,除了某些升主動天賦的賊...

鑿擊宏如下:
/script CastSpellByName("鑿擊(等級 3)")
/script if ( sword == GetInventoryItemLink("player", 16) ) then PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1) end

背刺宏如下:
/script CastSpellByName("背刺(等級 5)");
/script PickupContainerItem(0, 1) PickupInventoryItem(16) PickupContainerItem(0, 1)

如果敵人已經暈了,而我在他背后,例如偷襲之后,
那么這個宏連按兩下,也可以起到第一下切換,第二下背刺的效果。
通常偷襲后是連續邪惡攻擊攢點還是背刺傷害 要視情況而定,所以偷襲的宏后面我沒有加固定切換的
代碼。

大體上就是這樣,以上的宏解說希望對各位賊友有幫助,其他各個技能的宏如果覺得必要應該可以
自己寫出來了,呵呵,自己寫一寫就會徹底掌握了。當然不能就此精通,
題目的言過其實,就是搞笑而已。呵呵