魔獸世界lua筆記(二、編寫一個打斷喊話插件)

前面咱們介紹了lua的一些基本用法編程

然而一切的一切,仍是爲了可以搞魔獸插件,今天終於步入正題,來搞一個簡單的魔獸插件服務器

1、插件的結構

先來看看插件的結構吧,首先,插件是在World of WarcraftInterfaceAddOns目錄下的,相信你已經知道了。測試

目錄下面有不少文件夾,我截圖了一部分。lua

clipboard.png
這裏面每個文件夾都是一個插件,這些插件有的是完成一個獨立的工做,有的只是一個子模塊。通常來講,你實現的功能不太複雜,那用一個文件夾就能夠了,若是你搞了一個巨複雜的插件,例如DBM,一般來講你就要規劃你的模塊。spa

魔獸的插件能夠作不少事情,blz自己就是插件的最大用戶,魔獸的登陸界面、服務器選擇、人物選擇界面、遊戲裏面的UI等等,都是用插件來實現的(默認alt+z快捷鍵能夠隱藏的部分,都是插件實現的),固然blz的有些插件有一些並沒在Addons裏面,而是隱藏到了客戶端裏面。插件

上圖裏面,Blizzard開頭的是blz公司本身的插件,dbm開頭的是dbm的插件,其餘的是一些單體插件。3d

下面咱們從這裏面找了一個文件結構最簡單的BuffMaster(增益大師)來講:日誌

clipboard.png

這裏面只有兩個文件BuffMaster.toc和BuffMaster.lua,下面咱們來介紹一下blog

2、toc文件簡介

核心是BuffMaster.toc文件,這是插件的聲明文件,每一個插件都必須有這麼一個文件,他的文件名跟插件的目錄名同樣,做用是用來告訴wow客戶端,你的插件的文件都放在哪裏,固然也還有一些別的做用,這個也不用太深究,隨着功力的提高慢慢了解就好。排序

下圖就是toc文件的內容,我大概介紹一下:

clipboard.png

  • 第一行是插件的適用版本,70100表明這個插件適用於7.1.x版本,老胡寫這篇文章的額時候已是7.2.5,因此若是運行這個插件就會提示已過時,改成70200就ok了。——不少人問插件過時了怎麼改,就是這麼簡單
  • 後面好多行,都是插件的名字,英文的,簡體中文的,繁體中文的,等等
  • Dependencies,依賴哪一個插件,這裏寫的是依賴BigFoot,因此若是玩家勾選了這個插件,可是沒勾選BigFoot,就會提示「依賴沒有啓用」(忘了是否是這麼提示的了),致使你的插件不能運行。但實際上這個插件跟大腳沒有任何關係,即不是大腳開發的,也不須要依賴大腳,就是大腳的一個流氓行爲,因此徹底能夠刪了這一行。不少人問怎麼把一些插件分離成單體——這裏已經告訴你答案了。可是,有些確實須要依賴的,若是要分離就要改代碼了。
  • LoadOnDemand,意思是須要的時候才加載,目的是用不到這個插件的時候就不用佔用內存了
  • 最後一行,是關鍵,這裏指定了咱們插件中文件的路徑BuffMaster.lua,這個文件名不須要跟插件名一致。

咱們再來看一下DBM-Core的

clipboard.png

看看toc文件,上面大同小異,下面是這個插件引用的文件資源

clipboard.png

3、編寫一個魔獸插件

好了,咱們來動手搞一個簡單的插件,插件的目的是打斷的時候說一句話,這樣你就不用再作打斷喊話宏啦。

首先咱們照貓畫虎在Addons下面新建一個文件夾,我起名叫_InterruptWarning,前面有個下劃線是爲了排序的時候在前面,避免混到一堆插件中找不到,是否是好機智,哈哈。

clipboard.png

而後分別編寫兩個文件的內容,先來toc的,這個就不重複介紹了

clipboard.png

再來lua的

clipboard.png

這個得好好介紹一下了,由於這個插件雖然代碼很少,可是涉及的知識還很多。請看好左邊的行號,老胡下面一行一行介紹:

  • line1: 定義一個變量interuptFrame,同時給他賦值,用魔獸的CreateFrame方法建立了一個frame,後面咱們將爲這個frame加特技
  • line2: 加第一個特技,註冊一個事件,COMBAT_LOG_EVENT_UNFILTERED,也就是當戰鬥日誌產生以後觸發,點擊連接能夠查看詳細介紹
  • 跳到line11: 家第二個特技,這裏定義了檔事件觸發的時候,通知interruptEvent這個方法,也就是3-10行這個方法
  • line4: 判斷是否是戰鬥日誌事件
  • line5: 獲取事件觸發的參數,咱們須要的是eventType和sourceName這兩個,含義分別是時間類型和事件來源
  • line6: 判斷,若是事件類型是技能被打斷,而且事件來源的名字是玩家的名字,這說明當前玩家成功打斷了一個技能
  • line7: 說一句話:interrupt >> [xx技能]
    一個簡單的事件觸發機制。

有點編程基礎的人可能懂了,沒基礎的小白通常還懵逼着,由於老胡這個例子自己就有難度。由於老胡也不想搞個print(1)之類的,而後就告訴你插件作好了。。

那小白怎麼才能懂呢,一句話,猛練天然強,練習題來了,請參照老胡的例子實現一個場景,薩墓裏面主母這個boss,中了[吞噬之飢]這個debuff以後,會持續掉血,可是又不明顯,因此不少人看不到,每次都要團長提醒,做爲團長,如今請你實現一個功能,中了debuff的時候,就說三聲「我中了[吞噬之飢],等下踩[雷霆震擊]消debuff」,作好了能夠qq老胡交流376665005。

有自信的能夠作一個更好的例子。不但本身中了提醒,團裏的其餘人中了,還能夠私密提醒他。

最後,上面例子的源碼,聲明一下,老胡並未測試,若是不能用,純屬正常。

怎麼樣,這個技能你get了嗎?

相關文章
相關標籤/搜索