今天來說一說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)“艾澤拉斯日乘钌恚”奥务,我們一同來探討...