上回書說道開發(fā)環(huán)境的搭建哆键,那么我們已經(jīng)擁有工具啦~
現(xiàn)在要做的就是編寫第一個(gè)插件症革,實(shí)現(xiàn)最最簡(jiǎn)單的功能QvQ此衅。
一個(gè)Bukkit插件基本構(gòu)成
一個(gè)完整功能bukkit插件是由三大文件組成的:
1.1误褪、plugin.yml——記錄插件以及命令信息春叫;
1.2肩钠、config.yml——加載插件配置文件供用戶更改泣港;
1.3、class文件——emmm价匠,這個(gè)就是用來實(shí)現(xiàn)功能的当纱;
其中1.3項(xiàng)又分為:
2.1、主類
2.2踩窖、功能類
2.3坡氯、命令類
2.4、監(jiān)聽器類
看似很復(fù)雜對(duì)吧qwq洋腮,但注意箫柳,要被bukkit所能讀取的插件,也就是最簡(jiǎn)單的插件啥供,只要包含plugin.yml悯恍,主類就行,那么我們這節(jié)的主題是helloworld伙狐,就從最簡(jiǎn)單的開始叭~
創(chuàng)建Eclispe工程
如圖呢是Eclipse去掉welcome頁(yè)面的樣子qwq:
編寫插件呢我們只要?jiǎng)?chuàng)建一個(gè)普通的java工程文件就行啦
然后next涮毫,注意不要直接finish,因?yàn)槲覀儗懙氖莃ukkit插件贷屎,所以要用bukkit的庫(kù)罢防,即添加依賴
然后這里我們選擇教材中的api(可能名字不一樣不要介意qwq)
這樣就會(huì)發(fā)現(xiàn)左側(cè)工程欄內(nèi)出現(xiàn)了剛剛創(chuàng)建好的工程~
然后呢,咱們先緩一步豫尽,說說java
眾所周知java是面向?qū)ο缶幊陶Z(yǔ)言篙梢,所以其每一個(gè)程序,哪怕只有一個(gè)main方法美旧,他也必須放在一個(gè)類里渤滞,所以,創(chuàng)建一個(gè)java程序的步驟如下:
新建工程文件->創(chuàng)建一個(gè)包->創(chuàng)建一個(gè)類->在類中寫代碼->編譯導(dǎo)出
那么我們目前完成了第一項(xiàng)榴嗅,現(xiàn)在直接跳過第二項(xiàng)妄呕!直接創(chuàng)建類。
為什喵嗽测,這就是集成開發(fā)環(huán)境的妙處之一了呀~
按照箭頭走就行qwq~
org.bukkit.plugin.java.JavaPlugin
這里說一下包名绪励,在java中,包的作用是用來存放類唠粥,并且防止沖突的疏魏,什喵叫沖突呢,就拿bukkit為例晤愧,我編寫了一個(gè)插件大莫,用我的域名休雌,你編寫了一個(gè)插件也用我的域名纳账,那么我倆的插件加載到同一個(gè)服務(wù)端時(shí)就(可能)引發(fā)沖突,使bukkit
在用到這個(gè)插件時(shí)無所適從孙技,因?yàn)闆]有指定相關(guān)的import代碼胚宦。
(所以各位行行好不要用我的域名QwQ,萬一哪天真碰上了呢qwq)
咱們繼續(xù)回到包忍饰,為了解決這種沖突問題卡辰,業(yè)內(nèi)有一條不成文的規(guī)矩蛆橡,在包名前面加上自己的域名反過來,比如我的域名“dayflowers.work”赋元,把他反過來就變成了“work.dayflowers”忘蟹,就像圖片中第一行那樣紙。
哎不是說你沒有域名就不能寫们陆,你可以隨便編一個(gè)寒瓦,比如“pig.sheep”,反正編譯器不會(huì)報(bào)錯(cuò)就行~
開始敲代碼
好噠在一切都創(chuàng)建好之后坪仇,就可以finish啦,會(huì)出現(xiàn)如下界面
可以看見右側(cè)代碼框里出現(xiàn)了幾行代碼垃你,這是IDE(集成開發(fā)環(huán)境椅文,以下全以此簡(jiǎn)稱)自動(dòng)為我們添加的,那么就要提到Superclass那行里的東西惜颇,學(xué)過java都知道有一個(gè)父類和子類的概念皆刺,子類繼承父類的屬性。
根據(jù)最后一個(gè)單詞我們可以大體上猜出意思凌摄,JavaPlugin羡蛾,用java寫的插件,這是所有bukkit插件的父類锨亏,具有訪問服務(wù)端的權(quán)限痴怨,并且可以被bukkit加載
參考dalao的插件(BedWars、ViaVersion):
主類均以繼承JavaPlugin開始(請(qǐng)不要被代碼嚇到器予,人家是大佬qwq)浪藻。
因此我們得出結(jié)論,bukkit是由繼承JavaPlugin的方式來聲明一個(gè)主類的
既然這樣我們效法他們乾翔,做出了一個(gè)主類
package work.dayflowers;
import org.bukkit.plugin.java.JavaPlugin;
public class main extends JavaPlugin {}
但是這樣子的一個(gè)插件沒有辦法被bukkit加載爱葵,除了前面所說的plugin.yml這樣的信息存儲(chǔ)文件,還缺少兩個(gè)方法用于bukkit初始化和卸載插件反浓,這兩個(gè)方法是:
他們的描述是“當(dāng)這個(gè)插件被關(guān)閉時(shí)調(diào)用.”和“啟用此插件時(shí)調(diào)用.”萌丈,因此這兩個(gè)插件被用于加載和卸載,注意這也是唯一兩個(gè)必不可少的方法雷则,換而言之辆雾,一個(gè)合格的插件(至少)必須要有onEnable()和onDisable()方法qwq
但是在我們的父類JavaPlugin里邊已經(jīng)有了這個(gè)方法,我們只要重寫這倆方法就行巧婶,為了IDE能夠檢查我們的錯(cuò)誤乾颁,在方法前面加上注解@Override(不知道喵是注解的去看Java的書或者問度娘QwQ)
像醬紫:
@Override
public void onEnable() {}
@Override
public void onDisable() {}
把這四行代碼寫進(jìn)類中涂乌,最后代碼部分成型:
package work.dayflowers;
import org.bukkit.plugin.java.JavaPlugin;
public class main extends JavaPlugin {
@Override
public void onEnable() {}
@Override
public void onDisable() {}
}
那么代碼部分到這里就暫時(shí)告一段落~
插件的身份標(biāo)識(shí)——plugin.yml
那么前面我們說到在Project name一欄里填寫的只是工程名字,那么怎樣聲明插件名稱以及其他的一些東西呢英岭。
bukkit為我們提供的一個(gè)辦法是用yml配置文件湾盒,在API幫助文檔下有一個(gè)這樣的表格:
其中紅框內(nèi)的鍵為必須(emmm,至于鍵是什喵玩意兒大家可以去了解一下YAML語(yǔ)法诅妹,懶得去了解的小伙伴可以接著往下看罚勾,慢慢就能明白qwq),他們是醬紫使用的:
main: work.dayflowers.main
name: Hello
version: 0.1.0
看見了嘛吭狡,每一個(gè)鍵對(duì)應(yīng)開頭冒號(hào)前的字母尖殃,右邊的內(nèi)容成為鍵值,這樣的一行語(yǔ)句稱為鍵值對(duì)划煮。一個(gè)最最基礎(chǔ)的配置文件就由三個(gè)鍵值對(duì)構(gòu)成送丰。
奧對(duì)了在此要強(qiáng)調(diào)一下,YAML語(yǔ)法及其特別以及非常的嚴(yán)格弛秋,每一個(gè)空格都可能成為報(bào)錯(cuò)的理由器躏。YAML的縮進(jìn)為2個(gè)空格,而且鍵冒號(hào)后面必須跟著一個(gè)空格蟹略,否則就會(huì)報(bào)錯(cuò)(敲黑板劃重點(diǎn)了昂)登失,像醬紫
name:Hello //錯(cuò)誤
name: Hello //正確
那么YAML的縮進(jìn)我們以后講到config.yml的時(shí)候在細(xì)說。
還有一點(diǎn)挖炬,YAML里不能有中文(非要用中文的方法有揽浙,可是我不會(huì)qwq)。
現(xiàn)在我們回到上面那三行鍵值對(duì)意敛,一個(gè)個(gè)講馅巷,第一個(gè)main,也是最最重要的空闲,前文我們說過在plugin中不能有main方法令杈,只能有一個(gè)主類和兩個(gè)用于加載和卸載的方法,那么bukkit怎么知道哪一個(gè)是他的主類呢qwq碴倾?
注意一下逗噩,前面說過bukkit的插件是用繼承的方式來聲明的主類,但這只是一個(gè)身份標(biāo)識(shí)跌榔,并不能夠被bukkit正確的找到异雁,因此需要main這個(gè)鍵來引導(dǎo)。
聰明的童鞋能夠發(fā)現(xiàn)main的鍵值是一串包名僧须,和前面我們創(chuàng)建的包一模一樣纲刀,只是末尾多了個(gè)main。
bukkit會(huì)根據(jù)包名尋找到你的主類(至于他怎么尋找的我也不知道呀qwq)担平,因此最后一個(gè)句點(diǎn)后面的內(nèi)容必須是一個(gè)類示绊,換而言之就是你的包名加上你的主類構(gòu)成這樣的一個(gè)鍵值(不要手賤加上分號(hào)锭部,不然會(huì)報(bào)錯(cuò)qwq)
那么name這個(gè)鍵就很好理解啦,除了不能用中文之外都行面褐,代表你的插件名稱拌禾,會(huì)在服務(wù)端讀取插件相關(guān)信息時(shí)顯示
version,更簡(jiǎn)單了展哭,隨便寫湃窍,代表版本號(hào)。
前面那張表格里還有非常多的鍵匪傍,用作不同的功能用來宣傳插件(說白了就是裝b)……qwq您市,我們這里略過不講,那張表格位于幫助文檔的“org.bukkit.plugin.PluginDescriptionFile”包下役衡。
解釋完一通茵休,我們可以把他正式添加進(jìn)剛才的插件中辣(≧▽≦)/
這里按照?qǐng)D片來就行:
然后會(huì)出現(xiàn)一個(gè)空白頁(yè)面(如果有一個(gè)奇怪的窗口彈出來說一堆奇怪的話,不要管他就行手蝎,直接cancel):
吧剛才的東西復(fù)制進(jìn)去泽篮,然后需改main的鍵值,改成“你的包名.你的主類”柑船,然后保存。
那么這個(gè)插件已經(jīng)可以被服務(wù)端讀取辣~但是說好的helloworld呢泼各!
helloworld
回到主類鞍时,在主類的任意一個(gè)方法里有很多很多方法可供調(diào)用,其中值得一提的是這個(gè):
由于這個(gè)方法不在bukkit包中扣蜻,所以我們只要記住它所附帶的一個(gè)方法:
getLogger().info("helloworld");
info這個(gè)方法的作用是向服務(wù)端輸出一條信息逆巍。
那么把他添加進(jìn)主類的onEnable方法中,最后成型的插件:
這些統(tǒng)統(tǒng)做完了以后莽使,我們把他編譯輸出锐极,跟著紅框走:
最后可能會(huì)有一個(gè)窗口彈出來,單擊OK就行芳肌,finish以后呢會(huì)發(fā)現(xiàn)輸出目錄下多了一個(gè)jar文件(如果IDE報(bào)錯(cuò)的話就看看有沒有劃紅線的語(yǔ)句灵再,跟著上文修改一遍qwq):
測(cè)試
然后我們進(jìn)入教材,有一個(gè)Server文件夾亿笤,單擊進(jìn)去翎迁,先把服務(wù)端開起來run一遍,等加載好以后把他關(guān)掉净薛,會(huì)出現(xiàn)一大堆文件:
我們進(jìn)入plugins文件夾下汪榔,吧剛才的jar文件拖進(jìn)去,再次開啟服務(wù)器:
怎么樣吶~ 484滿滿的成就感~
P.S.至于這個(gè)服務(wù)端在已經(jīng)包括在教材里了肃拜,至于教材在哪兒痴腌,我還是再發(fā)一遍qwq 鏈接
學(xué)完本節(jié)你應(yīng)該知道
1雌团、最基本的bukkit插件由主類、plugin.yml組成士聪;
2锦援、bukkit插件由繼承(extends)的方式聲明,并在plugin.yml配置文件的main鍵里引導(dǎo)戚嗅;
3雨涛、主類必須重寫onEnable(),onDisable()方法
4、getLogger().info("");用于向服務(wù)端輸出一條信息.
練習(xí)
再新建一個(gè)工程懦胞,編寫一個(gè)可以運(yùn)行的插件替久,并在插件被卸載時(shí)發(fā)送一條信息(P.S. 查看卸載信息可以先把插件在服務(wù)端中載入,然后在服務(wù)端使用reload命令)
好啦那么本節(jié)先到這里
下次我們開始制作有具體功能的插件qwq