插件是一種遵循一定規範的應用程序接口編寫出來的程序。
由於一個大型軟件通常只由一家軟件公司開發,在開發過程中,由於人手和時間的限制,這就決定了軟件自身功能的局限性,而且軟件的更新速度也是較為緩慢的,也不能滿足所有的用戶需求。正是處於這樣的考慮,通常一些大型的軟件都提供了調用外部插件程序的接口。這樣一來,通過別人的插件使得自己的軟件在功能和更新速度上都大大得到改善,同時使用者可以根據自己的需求來製作一些更適用於自己使用環境的插件程序。
遊戲中的插件和外掛是兩個不同的概念,遊戲外掛通常是通過修改遊戲運行時的數據,包括網絡通信、本機內存等方式欺騙服務器,讓外掛使用者達到不勞而獲的目的。
而遊戲插件是遊戲開發者允許的,在一定限制下的改善遊戲內容,比如界面顯示、操作方式、或者為使用者提供方便功能,並不直接修改遊戲數據的程序。遊戲插件都只能運行在客戶端。
劍三中插件能做什麼
前面已經提到過,遊戲插件都是運行在客戶端的,也就是說我們通過客戶端可以做的事情,理論上通過插件都可以做到。為了不影響遊戲的正常運行,通常開發者都會對遊戲插件做出一些限制、下面整理一下劍三中,插件所被允許做的事情。
1、
改善用戶界面(UI)
例如常用的頭頂增強、戰鬥提示、氣條拖動、Buff、Debuff縮放、弧形血條等。
2、
改善遊戲操作
例如拾取助手、自動Roll取綠裝、自動販賣灰色物品等。
3、提供遊戲開發者允許,但又沒有提供的功能。
例如仇恨插件、任務指引、焦點目標、技能CD提示等。
3、
其他不影響遊戲數據的你能想到的任何東西。
例如小遊戲插件。
插件的安裝
在劍三的安裝目錄下的interface文件夾中放入你需要安裝的插件,登錄遊戲,在人物選擇界面右側點擊插件管理,勾選上你想加載的插件,這樣在你進入遊戲,遊戲程序就會去調用相應的插件程序了。
以我的電腦為例,安裝從多玩論壇下載的 弧形血條插件 我的劍三安裝在D:\ProgramFiles\Kingsoft\JX3\ 目錄下面。
進入D:\Program Files\Kingsoft\JX3\ 目錄,找到interface文件夾。如果沒有這個文件夾,直接新建文件夾並命名為interface即可。
解壓下載到的headEx.rar文件,得到一個HeadEx的文件夾,文件夾裡包含了HeadEx.lua 、info.ini、LEOConst_HeadEx.ini等文件,將HeadEx文件夾放入到interface文件夾中,進入遊戲,在任務選擇畫麵點擊插件管理,勾選弧形血條插件,進入遊戲後就可以看見插件了。
很多人在安裝插件時發現將插件文件放入了interface文件夾下,但在遊戲中的插件管理中看不到自己下載的插件,這樣的問題通常是因為在解壓插件文件的過程中,多產生了一級目錄。
例如弧形血條插件中包含info.ini文件,這個文件應該處於的位置是Interface\HeadEx\info.ini
而有的使用者在解壓時直接將HeadEx下的文件解壓到了interface中,或者在interface下的HeadEx文件夾中又創建的HeadEx文件夾,造成了如下的一些目錄情況,這些都是不能運行插件的。
Interface\info.ini
Interface\HeadEx\ HeadEx \info.ini
學習製作插件需要哪些基礎和工具
簡單Lua編程,包括lua基本語法,table的概念,函數的概念,面向對象的基礎概念。
工具上劍三客戶端當然是不能少啦,剩下就是lua語言的編輯環境,最簡單的就是txt文檔編輯器來,一般我們還是習慣使用一些特殊的編輯器,比如UEStidio,NotePad++,這些支持語法高亮的編輯器。
另外為了方便檢查腳本錯誤,還需要使用luaforwindows的可執行文件。可以到lua的官方網站去下載 (http://code.google.com/p/luaforwindows/)
劍三插件的組成
首先,劍三中的遊戲插件是一個程序,那麼我們肯定是需要一個文件來保存程序的代碼。其次,插件程序是不可以脫離遊戲獨立運行的,它必須依賴於遊戲程序,那麼我們需要一種方式來告訴遊戲程序,這個插件是幹什麼的,應該從哪開始執行這個插件程序,這個文件在劍三中就是info.ini文件。最後,由於在遊戲中通常會運行很多個插件,那麼這麼多info.ini就會十分的混亂,為了方便管理,降低每個插件與其他插件的耦合度,劍三有這樣一個規則,插件必須放在一個文件夾中,文件夾中必須有一個info.ini文件。並且ini文件中必須有一個Section名為文件夾名字。(一個Section就是INI文件中用中括號分割的一段區域,具體詳見Windows INI文件格式)
綜上,劍三插件的基本結構有以下5點:
1、需要一個文件夾、至少一個程序文件、一個info.ini文件。
2、info.ini文件必須在這個文件夾中。
3、info.ini文件中的Section名必須為這個文件夾的文字。
4、info.ini文件中必須指明需要運行的程序文件的路徑與名稱。
5、info.ini文件中所指明的程序文件不能直接放在interface目錄下,必須在其子目錄中
從上面這五點中可以得到這樣一些隱含信息:
info文件所指明的程序文件不必要和info在同一級目錄下。
Info中可以有多個Section,但由於Section名和文件夾名不相同,所以多餘的Section並不起作用,且不影響正常的Section工作。
Info文件中指明的程序文件可以有多個,隨其編號決定調用順序,編號越小越先調用。
info指明的程序文件不需要是lua的擴展名,只要是lua程序文件,可以是任意擴展名。
Info文件只能在interface目錄的直接子目錄下,比如 interface\HeadEx,不能是interface\a\b\info.ini
Info.ini文件中的註釋符號使用【#】,具體配置項如下所示:
代碼:
[Const_GettingStarted]
#插件名,和文件夾名相同
name=準備開始
#在插件管理欄顯示的插件名
desc=描述怎樣開始製作劍三插件。 --By 奶舟
#在插件管理欄名稱後面跟隨的插件描述
default=1
#是否默認加載插件
version=0.3
#插件對應的系統版本號
#=================下面是入口程序文件路徑====================
lua_0=Interface\Const_GettingStarted\Main.lua
lua_1=Interface\Const_GettingStarted\Data.dat
Info中的配置對應遊戲中的顯示界面:
當我們指定的系統插件版本號低於右上角顯示的系統版本號時,插件將變成灰色,這表示官方對插件的一些設置、開放的接口作出了調整,可能你所編寫的插件在該版本下不能正常使用,我們可以通過勾選下面的允許加載過期插件來強制運行它,但是不一定可以正常工作哦。
通常我們為了編寫和管理插件的方便,有這樣一些約定俗成的規矩。
1、為你的插件新建一個文件夾,文件夾的名字盡量做到見即知意。
2、 為了避免和別的插件衝突,在你的文件夾前加一個自己的前綴,比如Const_HeadEx。
3、將你的插件入口程序和info.ini文件放到同一目錄下。
4、在你的程序文件第一行首先定義一個table,這個table的名字是你插件的名字,用於存儲所有與你插件相關的信息。
5、所有的函數、屬性、都寫在自己定義的table中。
6、在程序文件的最後一行調用你的入口函數。
7、將界面配置文件和對應的程序文件取相同的文件名。
劍三插件的HelloWorld
下面開始我們進入劍三插件的Hello World程序,哈哈哈哈。
1、首先在劍三目錄下的interface中建立一個My_InterFaceTest文件夾
2、在Interface文件夾中建立一個info.ini文件和Main.lua文件。
3、在info.ini文件中輸入以下內容:
代碼:
[My_InterFaceTest]
name=我的HelloWorld
lua_0=Interface\My_InterFaceTest\Main.lua
4、在Main.Lua文件中輸入以下內容
代碼:
Output("Hello World")
5、進入遊戲,在插件管理界面勾選
6、進入遊戲就可以看到聊天框裡出現了這些文字。
到這裡我們的HelloWorld就完成了,下面將進一步介紹插件的製作,從這裡開始就需要程序基礎了。
劍三插件用到的部分對像簡介
Player對像
Player對象是玩家自己,是玩家所有屬性的一個集合,這裡有我們常用的一些屬性。我們可以通過全局函數GetClientPlayer()來獲得它。
szName |
名字 |
字符串 |
屬性 |
nGender |
性別 |
整型 |
屬性 |
nLevel |
等級 |
整型 |
屬性 |
nFaceDirection |
朝向 |
整型 |
屬性 |
nX |
X坐標 |
整型 |
屬性 |
nZ |
Z坐標 |
整型 |
屬性 |
nCurrentMana |
當前內力值 |
整型 |
屬性 |
nCurrentLife |
當前生命值 |
整型 |
屬性 |
nCamp |
陣營 |
整型 |
屬性 |
HideHat() |
隱藏帽子 |
無返回 |
參數1:【b】是否隱藏 |
GetTarget() |
獲取當前目標 |
返回1:目標類型 返回2:目標ID |
無參數 |
NPC對像 表示一個指定的NPC。可以使用全局函數GetNpc(dwID)來獲得它。 [table] |
|||
dwTemplateID |
NPC模板ID |
雙字 |
屬性 |
nLevel |
等級 |
整型 |
屬性 |
player相同。 |
劍三插件的基本接口介紹
GetClientPlayer()
獲取本機的player對象。
GetNpc(dw)
獲取npc對象,參數為NPCID。
GetPlayer(dw)
獲取一個player對象,參數為playerID。
GetDoodad(dw)
獲取一個Doodad對象,參數為doodad的ID
RegisterEvent(sz,function)
註冊一個客戶端事件,可以在Event()函數中響應它。參數為事件名,響應時間的函數。當它作為一個全局函數使用的時候,由於腳本程序是由上至下逐行解釋的,所以一定要把響應事件的函數定義在它的前面。
RegisterCustomData(sz)
註冊一個用戶數據,參數是數據名。
劍三插件的基本事件介紹
通常事件在響應時,會向相應的函數傳遞一些事件相關的信息,這些信息存在叫arg0~arg9的變量裡,我們可以直接在事件響應函數中訪問到它們。
1、插件本身的事件:
OnFrameCreate()
OnFrameBreathe()
上面這兩個事件實際上是兩個函數,當遇到插件創建事件時會調用OnFrameCreate()。一般在沒有特殊設置的情況下,當界面窗口可見時,會每秒調用16次OnFrameBreathe()函數。
2、客戶端相關事件:
UI_SCALED
當UI進行縮放的時候會激發這個事件。
CUSTOM_DATA_LOADED
當用戶數據讀取完畢的時候會激發這個事件。
3、遊戲角色相關事件:
BUFF_UPDATE
玩家角色Buff更新的時候會激發這個事件。
MONEY_UPDATE
玩家角色金錢變化時會激發這個事件。
SYNC_ROLE_DATA_END
玩家角色數據同步完成會激發這個事件。
BAG_ITEM_UPDATE
玩家角色背包裡的物品變化會激發這個事件。
EQUIP_ITEM_UPDATE
玩家角色裝備變化會激發這個事件。
PLAYER_STATE_UPDATE
玩家角色狀態變化會激發這個事件。
PLAYER_LEVEL_UPDATE
玩家角色等級變化會激發這個事件。
PARTY_SYNC_MEMBER_DATA
玩家角色數據同步時會激發這個事件。
FIGHT_HINT
角色受到攻擊時會激發這個事件。
PLAYER_ENTER_SCENE
玩家角色進入可視範圍內會激發這個事件。
PLAYER_DEATH
玩家角色死亡會激發這個事件。
PLAYER_LEAVE_SCENE
玩家角色離開可視範圍會激發這個事件。
PLAYER_REVIVE
玩家角色復活會激發這個事件。
SYNC_LOOT_LIST
玩家角色同步拾取列表後會激發這個事件。
4、NPC相關事件
NPC_STATE_UPDATE
NPC狀態變化會激發這個事件。
NPC_LEAVE_SCENE
NPC離開可視範圍會激發這個事件。
5、任務相關事件
QUEST_ACCEPTED
玩家角色接受任務會激發這個事件。
QUEST_FAILED
玩家角色任務失敗會激發這個事件。
QUEST_CANCELED
玩家角色放棄任務會激發這個事件。
QUEST_FINISHED
玩家角色完成任務會激發這個事件。
QUEST_SHARED
玩家角色共享任務會激發這個事件。
QUEST_DATA_UPDATE
玩家角色任務數據變化會激發這個事件。
劍三插件的簡單小實例
現在我需要這樣一個輔助功能,我想在每次我接到任務的時候,在我近聊頻道說這樣一句話「我接到一個任務,這個任務是[XXXXX]」,點擊這個任務名就可以調出相關的任務信息。
分析這個需求我們發現,這個插件需要在接受任務時調用,那麼我們就需要QUEST_ACCEPTED這個事件,當這個事件被激發,我們要讓玩家角色說一句話,那麼就需要用到player對象的Talk方法。獲取player對象就是使用GetClientPlayer()函數。
通過對arg0~arg9這些參數的輸出觀察,發現當響應QUEST_ACCEPTED事件時參數arg1的值是任務ID,這樣就得到了所有需要的內容。
還是使用上面My_InterFaceTest的例子,按照約定的規範來編寫這個插件,在Main.lua文件中輸入以下內容:
代碼:
My_InterFaceTest = {}
function My_InterFaceTest.OnAcceptedQuest()
local player = GetClientPlayer()
local tSay = {
{type = "text", text = "我接到一個任務,這個任務是"},
{type = "quest", questid = arg1},
}
player.Talk(1,"",tSay)
end
有料
淚奔
無聊
XD
掀桌
KUSO