第9章 外掛程式解析
外掛程式其實就是一堆檔案的集合。這些檔案被放在用戶端,並在用戶端被載入運行。現在可用的魔獸世界自訂外掛程式已經非常豐富,這一章重點介紹外掛程式是如何組成的,並對各部分進行解釋。
9.1 開發屬於您自己的外掛程式檔案夾
想要讓遊戲載入和應用一個外掛程式,你需要把它放在魔獸世界指定的檔案夾中,如果您已經運行過魔獸世界,那在魔獸世界遊戲的目錄下面就會有一個interface檔案夾,這個檔案夾裡還有一個AddOns檔案夾,而外掛程式就要放在AddOns檔案夾裡。
9.1.1 暴雪的外掛程式
在預設情況下,暴雪就使用了許多的外掛程式來完成使用者介面的設計,這些外掛程式只在用戶端有需求時才會載入。
每個暴雪外掛程式在它的目錄裡都有一個以.pub為副檔名的檔案。它是遊戲標識外掛程式可信度的一種方案。暴雪外掛程式被認為是安全外掛程式,第17章會詳細介紹相關知識。
1.9.2 自訂外掛程式
自訂外掛程式與暴雪的外掛程式都放在AddOns檔案夾下面,不過它們遵循不同的外掛程式組織形式,有不同種類的檔案和不同的命名方式。
9.2 外掛程式組件和檔案
每個外掛程式包含的檔案都有不同的地方,但每個外掛程式總有一些部分是相同的,下面將介紹外掛程式可能包含的各種檔案。
9.2.1 內容表格檔案(.toc)
TOC檔案是每個外掛程式必須包含的檔案,它們必須以外掛程式的檔案夾命名。例如檔案夾的名字是MyAddOns,它的TOC檔案名稱就是MyAddOns.toc。TOC檔案主要提供一些重要訊息(如標題、描述以及作者資訊等等)來協助載入特定的外掛程式檔案。下面是一個樣本:
##Interface:20300
##Title:My Addon Name
##Notes:This is mysample addon
MyAddon.xml
MyAddon.lua
在toc文檔有許多以##開頭的標籤,每個標籤佔用一行。冒號之前是標籤的名稱,冒號之後是標籤的值。在標籤之後是外掛程式將要負載檔案的一個列表
1.##Interface:
這個標籤為使用者在外掛程式選擇視窗提供了一個版本號碼,以便魔獸世界用戶端識別你的外掛程式是否與之相容。如果不相容會顯示以下兩種錯誤:
l 外掛程式到期——這是由於你的##Interface版本與遊戲用戶端版本不同導致。這僅僅是一個警告,你可以通過選擇“載入到期外掛程式”來解決這個問題,通常外掛程式載入後就會正常工作。
l 不相容——這是由於遊戲用戶端的API有了較大的改變,這個外掛程式已經不能載入。為了能夠正確運行,需要修改你的外掛程式。
外掛程式被列為“到期”並不意味著有顯著的錯誤,可能只是.toc檔案中的Interface標籤沒有更新到最新的介面號。這種情況提醒了您需要把外掛程式更新到最新的版本。它可以協助您得到最新的bug修複和功能。最新的版本可以得到外掛程式作者更好的支援人員。
Interface後面的版本號碼一般是由魔獸世界用戶端的版本號碼確立的,例如,2.3.0的Interface版本號碼就是20300,這個號碼可以通過查詢其他可用外掛程式的.toc檔案獲得(默然說話:個人覺得這是最簡單的方式了。)
在魔獸世界遊戲的角色選擇視窗的左下角你可以看到一個“外掛程式管理”的按鈕,點擊此按鈕會彈出一個外掛程式管理的對話方塊,你就可以看到上面所說到的“到期”或“不相容”的提示了。
2.##Title
這是你在魔獸世界裡看到的外掛程式的名稱。通常這個名稱會與外掛程式的檔案夾名稱相同,當然,如果你不想讓玩家輕易認出你的外掛程式所存放的位置,你也可以取一個與外掛程式檔案夾名稱毫無關係的名稱。
這個名稱是可以本地化的,你只需要在##Title的後面加上國家地區碼就可以了。例如:
## Title-zhCN: 治療助手 Grid
這就是簡體中文裡會顯示的外掛程式名稱。又如:
## Title-zhTW: 治療助手 Grid
這就是繁體中文裡會顯示的外掛程式名稱。
3.##Notes
這是一個對外掛程式進行詳細介紹的標籤。你可以在這裡提供給玩家更多關於外掛程式的有用的協助資訊,它也可以如Title標籤一樣進行本地化(在後面加國家地區碼,以顯示對應國家所使用的語言),例如:
## Notes: A modular,lightweight and screen-estate saving grid of party/raid unit frames
## Notes-zhCN: 小巧的輕量級模組化隊伍架構
## Notes-zhTW: 精簡的團隊架構功能
4.##Dependencies和##RequiredDeps
兩個所實現的效果相同,它們都是說明外掛程式必須依賴的別的外掛程式的列表,如果此列表中的外掛程式被禁用,或者因為某種原因無法載入,那麼它本身也無法載入。在外掛程式管理器中會看到“依賴外掛程式被禁用”的提示字樣。寫法如下:
## RequiredDeps:DBM-Core
上面是我們常用的“首領預警”中一個外掛程式的TOC代碼,首領預警是一個由多個外掛程式組成的外掛程式組,而幾乎所有的分外掛程式都依賴於DBM-Core這個核心外掛程式。所以,你可以在所有分外掛程式的TOC檔案中找到上面的這句標籤。
這個標籤還能帶來一個附加的功能:決定外掛程式的載入順序(默然說話:被依賴的外掛程式一定會先被載入,所以如果你的外掛程式載入有一些衝突問題與他們的載入順序有關,你可以主動修它們的TOC給它們加上依賴關係)。
5.##OptionalDeps
OptionalDeps標籤一般為可供某些外掛程式調用的擴充函數庫或外掛程式。當擴充函數庫存在時,外掛程式所調用的功能即可實現;但即使擴充函數庫不存在,外掛程式也應能正常工作。這些外掛程式亦需提供不依賴上述函數庫而實現主要功能的方法,以保證外掛程式的正常工作。
6.##LoadOnDemand
從1.7版本開始,外掛程式可以在需要時,而不是在玩家第一次進入遊戲時載入。若此項被啟用,該外掛程式只能在稍後由其他外掛程式載入。此項標籤可避免在進入遊戲時載入某些特殊功能的外掛程式,從而有效地節約記憶體。
該標籤的值只能是1或0。1表示按需要載入。
7.##LoadsWith
自1.9版本後,結合LoadOnDemand標籤,此項標籤可在某一外掛程式(通常為Blizzard的UI模組,如Blizzard_AuctionUI)載入後再自動載入您的外掛程式。
8.##DefaultState
DefaultState標籤用於確定外掛程式在安裝時預設是否被啟用。若該值被設為disabled,則玩家需在人物選擇介面手動啟用該外掛程式。若此標籤未設定則預設值為enabled。
9.##SavedVariables
從外掛程式版本2150開始,SavedVariables已成為目前進程之間儲存資料的最佳方式。外掛程式要儲存資訊只能通過定義一個Lua變數,並在TOC檔案的##SavedVariables標籤中列出變數的名字。當關閉遊戲的時候,系統就會將變數的內容儲存到一個外面的檔案中。當遊戲重啟時,又會讀取該變數。變數類型可以是字串、數字或者表格。
10.##SavedVariablesPerCharacter
SavedVariablesPerCharacter標籤的工作方式與SavedVariables基本相同,區別在於前者所儲存的變數僅在某一人物角色名稱下。此標籤原僅使用人物姓名以區分不同角色,但現在可使用伺服器名加人物名以區分(現在版本下(3.2.2),該標籤所儲存的變數檔案位於World of Warcraft\WTF\Account\使用者ID\伺服器名\人物名\下)。
9.2.2 Lua指令檔
TOC檔案可以列出每個Lua檔案(包括子目錄中的檔案)。這些檔案都按照TOC檔案中列出的次序由遊戲用戶端進行載入、解析和執行。
Lua檔案通常都用於定義外掛程式的行為,當然也可以使用它來動態地建立視窗(16章)
9.2.3 XML檔案
在單個外掛程式之內(或在FrameXML 之內),檔案載入是按照 .toc 檔案中定義的順序線性進行的。toc 中定義的第一個檔案最先被解析執行,之後是第二個,然後是第三個,依此類推。對於 XML 檔案,每當執行到其中包含的 <Script file="X"/> 元素,就會去解析和執行引用的檔案 X,處理完後才會接著處理後面的元素。
9.2.4 媒體檔案
遊戲用戶端外掛程式也可以包含自訂的圖形、聲音和字型等,從而為您提供不同的視聽風格。這些檔案包含在外掛程式自己的檔案夾裡,在使用時必須使用完整的路徑名來標明地址。
1.音樂
魔獸世界用戶端可以識別MP3和WAV的檔案。
如果你有一個音效檔叫mysound.mp3,並且它放在了Interface\Addons\MySound\mysound.mp3下,那你可以在遊戲中運行如下命令來播放這個音頻檔案:
/run PlaySoundFile(“Interface\\Addons\\MySound\\mysound.mp3”)
2.圖形
魔獸世界支援兩種不同的圖形格式——BLP和TGA,另外它們還要滿足以下要求:
l 檔案的高度和寬度要大於等於2像素,同時小於512像素。
l 檔案的高度和寬度要是2的整數倍,但寬度和高度可以不一樣(即圖形可以是正方形的,也可以是長方形的)
20章將重點介紹如何建立自訂圖形檔案。
9.3 本地化您的外掛程式
9.3.1 可用的本地語言
表9-2可用的用戶端本地語言
本地語言代碼 |
對應的語言 |
deDE |
德語 |
enUS |
美國英語 |
enGB |
英國英語 |
esES |
西班牙語 |
frFR |
法語 |
koKR |
朝鮮語 |
zhCN |
簡體中文 |
zhTW |
繁體中文 |
9.3.2 本地化的原因
當玩家玩遊戲的時候,如果自訂外掛程式的語言和他自己的語言相同,則他會很容易做出瞬間的反應。如果不是他自己的語言,即使玩家的閱讀能力很高也很難在短時間做出語言的轉換。
另外,大多數的玩家都願意並有能力協助作者進行本地化。如果外掛程式的設計好,那麼外掛程式的本地化更新也會變得很容易。
9.3.3 鼓勵玩家建議
玩家常常會向作者提出一些本地化檔案的方案,下面是一些讓作者更便於本地化的方法:
l 提供一個常數集,或者一個便於尋找翻譯的列表,而不要僅使用字串。
l 把外掛程式的本地化資訊寫入readme.txt檔案中,或者寫在自己的官方網站上。
l 提供一些注釋標明相關資訊的含義以便使用者能夠方便地進行翻譯。
9.3.4 實現本地化
這裡介紹一種推薦的執行方案,它可以方便您更新本地化檔案。
1.為每個地方語言添加一個檔案
為您翻譯的地方語言添加一個新的本地化檔案。若沒有什麼翻譯,就在您開發的外掛程式中為基本的地方語言建立一個檔案。例如Localization.zhCN.lua,並把這個檔案添加到.toc檔案中檔案清單部分的第一行,以保證它能在第一時間被載入。
2.建立一個包含所有輸出字串的全域表
如果我們建立的外掛程式叫MyAddOns,那麼我們就在Localization.zhCN.lua中建立一個叫MyAddOnsLocalization的全域表。
MyAddOnsLocalization={};
MyAddOnsLocalization[“Frames_Locked”]=”架構已經鎖定”
MyAddOnsLocalization[“Frames_UnLocked”]=”架構已經解鎖”
3.添加新的地方語言
您可以再建立一個新的檔案(例如Localization.enUS.lua)來添加新的語言。這些檔案應該出現在.toc檔案的檔案表中,緊跟Localization.zhCN.lua檔案的後面。
if GetLocale()==”enUS”then
if not MyAddonLocalization then
MyAddonLocalization={}
end
MyAddOnsLocalization[“Frames_Locked”]=”Frameshave been locked”
MyAddOnsLocalization[“Frames_UnLocked”]=”Frames have been unlocked”
end
第一個if用來保證只有使用者的地方語言是英語時才重新填寫所有的輸出字串為英文,第二個if用來保證即使在出現意外的情況下仍然能建立出全域表。
現在,在一個美國的用戶端上顯示的資訊將會是英語而不是簡體中文。
9.4 建立外掛程式架構
第10~11章將介紹一系列使用XML的例子,為了後面的兩章,這裡教大家一個基本的外掛程式架構,從而不必為每個例子都重複做一些事情。
9.4.1 為外掛程式命名(建立目錄)
請建立一個名為WowXMLExample的檔案夾,它的位置應該位於你的魔獸世界的檔案夾中的如下目錄:
Worldof Warcraft\Interface\AddOns\WowXMLExample
接下來的兩章會教您建立所有的新東西。
9.4.2 建立.toc檔案
若沒有一個TOC檔案,外掛程式將不起作用,因此先使用下面的代碼建立一個TOC檔案(檔案名稱:WowXMLExample.toc):
##Interface:30200
##Title:WowXMLExample
##Title-zhCN:XML樣本外掛程式
##Description:Exampleaddon for World of Warcraft Programming
WowXMLExample.xml
默然說話:上面的版本號碼已經被我改為最新的版本號碼了,不過不保證以後《大災變》等版本出來還可以用。
9.4.3 建立.xml檔案
使用下面的代碼在外掛程式的目錄中建立WowXMLExample.xml檔案:
<Uixmlns="http://www.blizzard.com/wow/ui/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
</Ui>
上面的代碼一個符號都不能敲錯(區分大小寫。另外注意斷行符號的位置),請認真核對。後面我們將在<Ui>標籤中編寫我們需要的代碼。
9.5 使用外部庫
推薦大家先學習如何使用魔獸世界API以及XML來寫一些基本的外掛程式。附錄E包含了一個列表,列出了主要的庫和架構,以及它們的詳細資料。(默然說話:你也可以在http://www.wowwiki.com/World_of_Warcraft_API找到詳細的說明,只是看上去好象這些資料有些過時,不過它們絕大部分都還可用)
9.6 小結
本章介紹了包含在一個外掛程式中的基本組件,包括內容檔案表格、XML定義以及Lua指令碼。此外,外掛程式還可以包含並使用特定類型的媒體檔案。