一、導(dǎo)讀
在第一篇文章(Spigot插件開(kāi)發(fā)筆記——第一個(gè)插件與事前準(zhǔn)備)中习勤,我詳細(xì)的講述了編寫(xiě)一個(gè)最簡(jiǎn)單的插件的方法,但其中只講述了方法,沒(méi)有講述概念,為了幫助理解强窖,我將學(xué)習(xí)插件開(kāi)發(fā)以來(lái)的筆記和日志修改成該文章分享出來(lái),本文描述了我在學(xué)習(xí)過(guò)程中對(duì)插件各部件的看法削祈,如有錯(cuò)誤之處還請(qǐng)各位指出翅溺,我會(huì)立刻糾正。
二岩瘦、概述
在我看來(lái)未巫,在插件開(kāi)發(fā)過(guò)程中,不計(jì)外部引入的包與實(shí)例启昧,也不計(jì)自行封裝的工具或方法叙凡,最重要的組成部分有七個(gè):主線程
,支線程
密末,執(zhí)行器
握爷,補(bǔ)全器
,監(jiān)聽(tīng)器
严里,存儲(chǔ)器
新啼,配置文件
。
下面我簡(jiǎn)單概述一下這七個(gè)部件刹碾。
主線程 — JavaPlugin
一個(gè)插件可以沒(méi)有其他部件燥撞,但必不可少的兩個(gè)部件之一,即為主線程JavaPlugin迷帜。
這是一個(gè)插件的主體物舒,加載配置、綁定指令戏锹、注冊(cè)監(jiān)聽(tīng)器等等一系列操作都需要在這里進(jìn)行冠胯。
這并不是絕對(duì)的,比如說(shuō)锦针,你也可以在生成執(zhí)行器對(duì)象時(shí)荠察,在執(zhí)行器的構(gòu)造函數(shù)中對(duì)自身進(jìn)行指令綁定,但是不建議把這些東西分布到其他文件中奈搜,因?yàn)槟菢邮植焕诰庉嬇c管理
支線程 — BukkitRunnable
一些需要延時(shí)進(jìn)行的操作悉盆,比如傳送前搖、定期清理掉落物馋吗、輪播公告等功能焕盟,都需要用到支線程BukkitRunnable。
支線程可以在任何地方啟用耗美,除了處理定時(shí)任務(wù)京髓、延時(shí)任務(wù)以外,極少數(shù)處理速度較慢商架,會(huì)造成長(zhǎng)時(shí)間等待的功能堰怨,也建議放到支線程中執(zhí)行,這樣可以指令執(zhí)行所導(dǎo)致的服務(wù)器延遲與卡頓蛇摸。
執(zhí)行器 — CommandExecutor
我有時(shí)候也叫它解析器备图。
在綁定了一條指令與其對(duì)應(yīng)的執(zhí)行器后,玩家在服務(wù)器中輸入該指令時(shí)赶袄,內(nèi)容便會(huì)全部傳入執(zhí)行器的部件揽涮,交由執(zhí)行器CommandExecutor來(lái)解析與處理。
你可以給多條指令綁定同一個(gè)執(zhí)行器饿肺,以實(shí)現(xiàn)使用不同指令來(lái)實(shí)現(xiàn)同一功能的目的蒋困,但一定要記得,千萬(wàn)不要給一條指令綁定多個(gè)執(zhí)行器敬辣,而且指令頭必須在配置中注冊(cè)雪标。
比如,我想要使插件讀取并識(shí)別/demo test Delamer
這條指令溉跃,則必須把指令頭demo
寫(xiě)入配置文件plugin.yml
中以注冊(cè)該指令村刨,否則服務(wù)端就不知道該把哪條指令交給你來(lái)執(zhí)行了,而指令頭以外的內(nèi)容撰茎,則全部會(huì)被劃分到參數(shù)
的范疇嵌牺,交給執(zhí)行器自己去解析處理。
補(bǔ)全器 — TabCompleter
除了指令頭以外(指令頭在配置文件中注冊(cè)后會(huì)自動(dòng)寫(xiě)入補(bǔ)全器)龄糊,玩家使用指令時(shí)逆粹,可以使用Tab鍵自動(dòng)補(bǔ)全指令或是后續(xù)參數(shù),這便是補(bǔ)全器TabCompleter的用處绎签。
補(bǔ)全器可以很大程度上優(yōu)化插件的使用體驗(yàn)枯饿,這一點(diǎn)在新版中尤為明顯(1.13開(kāi)始補(bǔ)全功能被大幅度優(yōu)化),玩家可以不用手動(dòng)輸入繁瑣冗長(zhǎng)的指令诡必,只需要輸入少許指令的開(kāi)頭奢方,再敲擊Tab鍵,即可自動(dòng)補(bǔ)全后續(xù)指令爸舒,這使得補(bǔ)全器的作用大大提升蟋字。
監(jiān)聽(tīng)器 — Listener
在游戲過(guò)程中,玩家會(huì)執(zhí)行很多操作扭勉,觸發(fā)各種各樣的事件鹊奖,如上線、下線涂炎、受傷忠聚、放置/破壞方塊设哗、死亡等等,要在玩家觸發(fā)這些事件時(shí)進(jìn)行一系列操作两蟀,就需要用到監(jiān)聽(tīng)器Listener了网梢。
監(jiān)聽(tīng)器在經(jīng)過(guò)注冊(cè)后,會(huì)在玩家觸發(fā)指定事件時(shí)自動(dòng)執(zhí)行你所寫(xiě)下的代碼赂毯,比如战虏,在玩家造成傷害時(shí),向玩家發(fā)送傷害信息党涕,又比如烦感,在玩家破壞鉆石方塊時(shí),如果方塊高度不高于60膛堤,那么就否決掉這個(gè)破壞動(dòng)作手趣。
所有可監(jiān)聽(tīng)的事件在Spigot-API中皆已列出,可以隨時(shí)翻閱骑祟。
存儲(chǔ)器
有些時(shí)候回懦,指令的效果不是實(shí)時(shí)的,而是存儲(chǔ)一些數(shù)據(jù)以便日后使用次企,如:死亡時(shí)記錄坐標(biāo)以便使用back指令回到死亡地點(diǎn)怯晕;使用sethome指令設(shè)置家后,使用home指令回到之前所設(shè)置的家缸棵;標(biāo)記一個(gè)方塊舟茶,使這個(gè)方塊受保護(hù),Op以外的玩家無(wú)法破壞……諸如此類(lèi)的場(chǎng)景堵第,你需要一個(gè)存儲(chǔ)數(shù)據(jù)的手段吧凉。
存儲(chǔ)數(shù)據(jù)的手段相當(dāng)"豐富",數(shù)據(jù)庫(kù)踏志,Redis阀捅,IO流讀取文本文件,或是直接使用游戲內(nèi)部標(biāo)簽與計(jì)分板等等针余,方法過(guò)多饲鄙,所以無(wú)法一一介紹與列舉,就不再贅述了圆雁。
配置文件
配置文件實(shí)際上分為兩種忍级,一種是插件必要的組成部分plugin.yml,沒(méi)有這一部分伪朽,插件則不會(huì)被識(shí)別為插件轴咱。另一種,是為了供玩家動(dòng)態(tài)調(diào)整插件內(nèi)使用參數(shù)而使用的配置文件,FileConfiguration朴肺。
前者的必要性毋庸置疑窖剑,在上面所提到的必不可少的兩個(gè)部件之一
,很大程度上指的就是plugin.yml
這一部分戈稿。但后者的作用也不小苛吱,它可以讓玩家或服主自定義插件內(nèi)使用的數(shù)據(jù)數(shù)值,從而提升插件使用的靈活度器瘪,使插件可以在不需要重新編譯源碼的情況下,適用于更多的玩家绘雁、更多的場(chǎng)景橡疼。
三、附錄
插件的重要組成部分就介紹到這里了庐舟,這里僅代表個(gè)人的看法與見(jiàn)解欣除,所附的中文名稱也只是依照我對(duì)這個(gè)部件的理解而擅自命名,并非官方解釋?zhuān)膊皇怯h直譯挪略,更多細(xì)節(jié)與權(quán)威說(shuō)法請(qǐng)參考SpigotAPI與更多大佬留下文章進(jìn)行對(duì)照历帚,或者自行嘗試過(guò)實(shí)現(xiàn)以后,自己去理解杠娱,這樣才能看得更加透徹挽牢。
后續(xù)有機(jī)會(huì)的話,會(huì)對(duì)這些部件一一進(jìn)行詳細(xì)介紹與教學(xué)摊求,若有疏漏請(qǐng)大佬指正禽拔,我會(huì)盡快修改。