wow插件的構(gòu)成

今天來說一說wow插件是個(gè)什么鬼?

插件是魔獸世界開放的第三個(gè)接口,有朋友會(huì)問,什么是第三方?這個(gè)是軟件業(yè)的一個(gè)術(shù)語,簡(jiǎn)單的說,就是游戲當(dāng)中能讓我們自己來定制DIY的部分,比方說對(duì)話界面,還有一些數(shù)據(jù)顯示之類的功能。

wow的插件全部保存在World of Warcraft/Interface/AddOns目錄下,在這個(gè)目錄下會(huì)有一些暴雪自帶的功能插件,它們均是以Blizzard_開頭的,我們自己做的插件可以隨意命名,不同插件可以分別放在不同的文件夾下面(我們?cè)谧霾寮倪^程中,強(qiáng)烈建議用英文命名,避免因?yàn)橹形膶?dǎo)致插件無法被識(shí)別的問題)。http://www.townlong-yak.com/framexml/這個(gè)網(wǎng)址可以下載暴雪自帶插件。

說一下插件的構(gòu)成,打開插件目錄,你會(huì)發(fā)現(xiàn)大致會(huì)有三種類型文件,分別是toc文件,xml文件和lua文件。

toc文件

這個(gè)文件是一個(gè)必要文件,它的名字與你的插件文件夾名字同名,只不過帶了一個(gè)后綴toc,如果不同名的話,打開魔獸客戶端將會(huì)無法識(shí)別你的插件;

注意!!!這個(gè)文件的每行開頭不能有空格,每行僅作一個(gè)說明。

用文本工具打開toc文件,內(nèi)容說明分三種類型:

以##開頭的數(shù)據(jù)

用來進(jìn)行插件描述,一般會(huì)有插件名稱,作者名稱,功能描述等;它的基本格式是

## 標(biāo)簽名:標(biāo)簽值

標(biāo)簽的名字可以隨便寫,但是有一些wow自帶的標(biāo)簽名我們進(jìn)行一下解釋:

Interface:標(biāo)記插件可用在的wow游戲版本,當(dāng)該值小于低于當(dāng)前游戲版本插件不會(huì)被加載;
Title:插件名稱,這個(gè)會(huì)被顯示在游戲選擇人物的插件列表里;
Title-zhCN:插件的中文顯示,如果想要在其他語言中顯示,則修改-后面的就可以了;下面的Notes也是如此;
Notes:插件列表中,鼠標(biāo)移到插件名上時(shí)顯示的信息;
RequiredDeps, Dependencies, 或者任意以 "Dep" 開始的字符串:表示我們當(dāng)前的插件必須需要加載的其他插件;
OptionalDeps:與上面的對(duì)照,這里的插件是可選的;
LoadOnDemand:值為1時(shí),表示這個(gè)插件不會(huì)在游戲開始就加載,而是在需要的時(shí)候才加載;
LoadWith:如果上面的值為1時(shí),本條所描述的插件會(huì)隨著本插件一起加載;
LoadManagers:本條中所描述的插件如果都不存在的話,則會(huì)自動(dòng)加載本插件;如果有一個(gè)存在,則按LoadOnDemand值為1處理;
SavedVariables:一些以逗號(hào)分割的變量名稱,這些變量會(huì)被保存在硬盤上,下次加載時(shí)可以被讀取到;
SavedVariablesPerCharacter:與上面的標(biāo)簽是相同的作用,不過該標(biāo)簽只用于保存不同角色的不同配置;
DefaultState:本插件默認(rèn)開啟狀態(tài),值為disabled/enabled;
Author:作者名字
Version:插件的版本號(hào)

另外你可以定義自己的標(biāo)簽,以上中最重要的就是前兩個(gè),盡量不要出錯(cuò);

本插件需要加載的代碼文件

列出需要加載的代碼類文件,只支持lua和xml兩種格式,這里的文件需要給出以當(dāng)前目錄為根目錄的文件完整路徑,就是說如果你插件目錄下有一個(gè)myaddon.lua的文件則需要添加:

myaddon.lua

而如果你插件目錄下有一個(gè)子文件夾MyAddon,而該目錄下有一個(gè)myaddon2.lua的話,則需要添加:

MyAddon/myaddon2.lua

以#開頭的文件

這些是注釋文本,在toc中可以隨便添加,主要用作插件制作者自己記錄,這些不會(huì)被插件加載;

XML文件

xml文件主要用于插件的界面制作,以及事件綁定,事件綁定通俗的講就是你對(duì)插件做某些操作(按一個(gè)按鈕之類的)游戲中會(huì)出現(xiàn)的事件,這些事件會(huì)以一個(gè)方法的形式出現(xiàn)在lua文件中,你可以把你自己想做的事情寫在這個(gè)方法中,如果你學(xué)過些編程,應(yīng)該知道我們這里說的方法就是lua函數(shù);

在你插件的根目錄下會(huì)有一個(gè)叫做Bindings.xml的文件,這個(gè)文件會(huì)被游戲客戶端自動(dòng)讀取,不必寫在toc文件中;

我們來看一個(gè)該文件的例子:

<Bindings> 
    <Binding name="CUBE_CODE" header="CUBE"> 
      if IGAS.UIParent.Cube_Main then 
         IGAS.UIParent.Cube_Main.Visible = not IGAS.UIParent.Cube_Main.Visible 
      end 
    </Binding> 
    <Binding name="CUBE_DEBUG"> 
      if IGAS.UIParent.Cube_Debug then 
         IGAS.UIParent.Cube_Debug.Visible = not IGAS.UIParent.Cube_Debug.Visible 
      end 
    </Binding> 
</Bindings>

我們暫時(shí)先不要管這些代碼的意思,只需要知道這個(gè)文件設(shè)置了界面元素與游戲事件的綁定,而綁定的事件是由Lua文件完成的;Bindings.xml文件綁定了一個(gè)與插件名同名的lua文件,并且還將界面上的元素與該文件所描述的事件綁定在了一起:

-- Binding Text 
_G.BINDING_HEADER_CUBE = L["Cube"] 
_G.BINDING_NAME_CUBE_CODE = L["Simple Dev Tool"] 
_G.BINDING_NAME_CUBE_DEBUG = L["Simple Debug Tool"]

我們現(xiàn)在先不要管他們是怎么聯(lián)系起來的,具體我們?cè)谥蟮膶懘a過程中會(huì)慢慢講到,現(xiàn)在只要理解一點(diǎn),xml會(huì)定義我們的界面,并且還可以設(shè)置界面元素與事件的綁定,而綁定的事件會(huì)交由lua文件處理;

我們還可以加載其他的xml和lua文件,如下例:

<Ui xmlns="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"> 
   <!-- Init --> 
   <Script file = "IGAS_Toolkit.lua"/> 

   <!-- Modules --> 
   <Include file = "Modules\AutoRepair\AutoRepair.xml"/> 
   <Include file = "Modules\AutoSell\AutoSell.xml"/> 
</Ui>

其中< />這間的就是xml文件的標(biāo)簽,標(biāo)簽的類型會(huì)由<后面的名稱標(biāo)識(shí),如上Script這個(gè)標(biāo)簽用于加載lua文件,而Include用于加載其他的xml文件;

lua文件

Lua是wow插件邏輯的主要語言,做插件前需要先熟悉一下lua的語法,感興趣的不防去知乎下搜索一些學(xué)習(xí)的建議,找一些入門的資料,在我的公眾號(hào)給我留言,我們可以一起學(xué)習(xí)探討下;這里我們給一些簡(jiǎn)短的片斷,目的是了解一下它的作用;

假設(shè)我們現(xiàn)在做一個(gè)插件,名為DHAddon(想想DH是不是惡魔獵手的縮寫呀?Devil Hunter?),插件里有兩個(gè)Lua文件devil.lua hunter.lua;

wow加載它們的方式,類似下面的代碼:

-- Load DHAddon 
local DHAddon = {} 

f = loadfile("devil.lua") 
f( "DHAddon", DHAddon ) 

f = loadfile("hunter.lua") 
f( "DHAddon", DHAddon )

loadfile就是加載文件,文件名稱用字符串表示(lua語法“”表示字符串);加載的結(jié)果保存在f中;

devil.lua:

local addonName, addon = ... 

print(addonName .. " is loaded.") 

addon.DHAddon = 123

hunter.lua:

local addonName, addon = ... 

print( "DHAddon is " .. addon.DHAddon )

不出意外的話,運(yùn)行結(jié)果會(huì)是:

DHAddon is loaded.
DHAddon is 123

另外上面的兩個(gè)lua文件也可以下面這么寫,其中有好多l(xiāng)ua的內(nèi)容,暫不解釋原因,貼在這里之后了解到了再來回顧:

-- 插件第一個(gè)Lua文件使用,這行代碼確保以下的代碼以addon為環(huán)境,而不是以_G為環(huán)境, 
-- 并且在addon環(huán)境中可以訪問_G的任意變量,訪問的變量值也將存儲(chǔ)到addon中,便于下次直接訪問 
-- 下面的代碼定義的全局變量都將保存在addon表中,而非_G 
setfenv(1, setmetatable(select(2, ...), { __index = function(self,  key) local v = _G[key]; rawset(self, key, v); return v end })) 

function testA() 
    print("devil case A") 
end

-- 插件的其他lua文件僅需要設(shè)置運(yùn)行環(huán)境 
setfenv(1, select(2, ...)) 

-- devil.lua 中定義的函數(shù)可以被直接調(diào)用 
testA()

插件的構(gòu)成就說這么多,好多東西不是很懂,慢慢深入了解就好了;本篇就到這了,有興趣的可以關(guān)注公眾號(hào)“艾澤拉斯日常”,我們一同來探討...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容