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í)別你的插件;

注意<醚住4铡!這個(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袜硫,隨后出現(xiàn)的幾起案子氯葬,更是在濱河造成了極大的恐慌,老刑警劉巖婉陷,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帚称,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秽澳,警方通過查閱死者的電腦和手機(jī)闯睹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來担神,“玉大人楼吃,你說我怎么就攤上這事。” “怎么了孩锡?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵酷宵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我躬窜,道長(zhǎng)忧吟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任斩披,我火速辦了婚禮溜族,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垦沉。我一直安慰自己煌抒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布厕倍。 她就那樣靜靜地躺著寡壮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讹弯。 梳的紋絲不亂的頭發(fā)上况既,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音组民,去河邊找鬼棒仍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛臭胜,可吹牛的內(nèi)容都是我干的莫其。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼耸三,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乱陡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仪壮,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤憨颠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后积锅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽彤,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年乏沸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淫茵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹬跃,死狀恐怖匙瘪,靈堂內(nèi)的尸體忽然破棺而出铆铆,到底是詐尸還是另有隱情,我是刑警寧澤丹喻,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布薄货,位于F島的核電站,受9級(jí)特大地震影響碍论,放射性物質(zhì)發(fā)生泄漏谅猾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一鳍悠、第九天 我趴在偏房一處隱蔽的房頂上張望税娜。 院中可真熱鬧,春花似錦藏研、人聲如沸敬矩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弧岳。三九已至,卻和暖如春业踏,著一層夾襖步出監(jiān)牢的瞬間禽炬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工勤家, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腹尖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓却紧,卻偏偏與公主長(zhǎng)得像桐臊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晓殊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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