Bukkit插件開發(fā)-創(chuàng)建一個命令
上一期我們成功加載了插件,但是我們并沒有往插件添加任何功能。所以這期的內(nèi)容是:
Command?(命令)是向聊天欄輸出一串特定格式的信息激活Minecraft游戲中的拓展功能,我們??吹揭恍┓?wù)器擁有自己專屬的命令,那么我們今天就利用插件實現(xiàn)一個全局喊話的插件,這期教程我們會涉及到 if 判斷語句和數(shù)組,接口以及方法傳參的使用。

我們首先創(chuàng)建一個叫做MessageCommand的類,用作我們喊話指令功能的實現(xiàn)

創(chuàng)建好的類差不多是這樣的,那么我們就需要在類中添加代碼了。

首先我們實現(xiàn)Bukkit給我們提供的命令模塊接口API(Application Program Interface-應(yīng)用程序編程接口),這個類在org.bukkit.command包下,我們利用IDEA的代碼補全提高寫代碼的效率,首先我們在第3行語句花括號后方輸出im兩個字符

可以看見下方彈出了一個小窗口并且有一個單詞,這個就是我們需要的,然后我們按下鍵盤上一個叫做Tab的按鍵(一般在你鍵盤左上方)可以看到單詞被補全到代碼中,然后我們接著輸出Com3個字母,查看彈出來的窗口

然后看到CommandExecuto單詞被藍色高亮后按下TAB補全代碼。
如果你發(fā)現(xiàn)這個藍色的高亮欄不在CommandExecutor單詞中,你可以使用鼠標滾輪或者鍵盤上的↑↓兩個按鍵移動這個高亮框。
然后我們看到CommandExecutor被補全到代碼中,且IDEA自動幫我們用import語句把CommandExecutor接口導(dǎo)入進來了

然后我們發(fā)現(xiàn)IDEA在代碼第5行位置報錯了,這個時候我們不著急,繼續(xù)用IDEA提供給我們的快捷鍵解決這個麻煩,我們緊接著一起按下鍵盤上的Alt和回車按鍵,會發(fā)現(xiàn)彈出來一個新的窗口,我們發(fā)現(xiàn)藍色高亮已經(jīng)在“實現(xiàn)方法”項上了,我們直接按下回車

然后在彈出來的窗口中發(fā)現(xiàn)藍色高亮選中了我們要實現(xiàn)的方法,點擊確定

然后我們發(fā)現(xiàn)代碼就完美的解決了錯誤

注意,第二期部署項目的開發(fā)者糾錯后可能發(fā)現(xiàn)代碼會有一點點不同,在第9行的位置上某些單詞不是相同的,這個我們不用擔心,將commandSender改成sender,將s改成label,將strings改成args即可

然后我們將光標移動到第9行末尾并按下回車,輸入以下代碼
這里我們發(fā)現(xiàn)需要利用TAB補全很多處代碼,但是最為主要的是Player和ChatColor還有Bukkit這三個單詞,因為我們需要依靠IDEA的補全在上方自動加入import語句將這3個API導(dǎo)入進來,我們才可以正確使用,以下是寫好的代碼

然后我們挨個講解每一行代碼都是什么意思以及它們有什么作用,首先我們把目光放在第13行代碼處
這段代碼利用了if語句做為程序的流程控制,意思是" 如果 sender 實例于 Player " 則執(zhí)行后方花括號內(nèi)部的代碼(14-17行內(nèi)的代碼) 我們發(fā)現(xiàn)18行有個右花括號是13行if語句的花括號收尾括號,但是后面還有個else
這個意思代表 “ 否則 調(diào)用一個叫Bukkit類中的getLogger方法,并使用通過這個方法返回的實例對象進一步調(diào)用其中的warning方法,向其中傳入"你不能在控制臺使用這個命令"這個字符串值作為該方法的參數(shù) ” 作用在于,如果我們上方這個if語句條件不成立(則代表使用這條命令的不是玩家),則利用Bukkit類向控制臺輸出一個級別為警告的日志,日志的內(nèi)容就是我們傳入的參數(shù)。
然后我們將目光放到代碼第14行
這個是為了方便我們后續(xù)寫代碼用的,是將sender直接類型轉(zhuǎn)換成Player (這樣我們利用代碼補全就方便的多了),然后我們看第15行-17行代碼
這里我們調(diào)用了Player中的一個叫做isOp的方法,這個方法我們可以判斷這個玩家是否具有服務(wù)器管理員權(quán)限,如果玩家沒有權(quán)限則調(diào)用Player的sendMessage方法,向玩家聊天欄發(fā)送一段信息。這個信息我們利用ChatColor去修飾了一下,這樣玩家聊天欄接受到的消息就變成了紅色。
最后我們把目光放入之前代碼第12行中 “String[] args” 這段代碼中,這是一個數(shù)組形參,這個形參里存儲了玩家輸出指令中包含的參數(shù),比如玩家A輸入了/time set day這段命令,那么這個數(shù)組形參就會存入set和day這兩個參數(shù)。不過這里我們?yōu)榱朔乐雇婕逸斎胛覀兊暮霸挷寮r候沒有輸入任何參數(shù),我們加一段代碼作為判斷
以上代碼我們對args這個數(shù)組的長度作了一個判斷,如果數(shù)組長度為0代表玩家沒有輸入任何參數(shù),這時候我們直接給玩家返回一個錯誤消息即可
然后我們在這條if語句中間添加我們的喊話代碼
這里我們運用了一個for循環(huán),來不斷從Bukit提供的一個叫g(shù)etOnlinePlayers的方法返回的Collection實例中抽取服務(wù)器所有的玩家,并且將每次抽取出來的玩家賦值到player1這個對象中,循環(huán)體內(nèi)我們又運用了ChatColor修飾我們的信息,那么編寫好的代碼如下。

這樣我們喊話命令的功能就實現(xiàn)了,下一步我們需要將這個命令注冊進服務(wù)端,注冊進服務(wù)端需要兩個步驟。
第一步:服務(wù)端需要知道有你這個命令
我們進入plugin.yml文件中,將以下信息寫進去(注意一定不要填錯,YAML文件對格式有嚴格要求,如果填錯一個位置整個插件就無法被加載了
寫入后的plugin.yml如下:

這樣我們就注冊了一個叫做allmsg的命令,用法是在聊天欄輸出 /allmsg 喊話內(nèi)容 即可進行喊話
第二步:服務(wù)端需要知道你這個命令的功能實現(xiàn)在哪里
我們跳轉(zhuǎn)到插件主類部分將以下代碼輸入進去
以下是輸入后的主類代碼

這樣我們的插件就寫完了,然后我們按照上期的教程編譯插件,編譯好后第一期的開發(fā)者將插件放入服務(wù)端再啟動服務(wù)端,第二期的開發(fā)者直接點擊IDEA右上角綠色小箭頭啟動服務(wù)端。
然后我們看到插件成功啟用

接著打開我們的Minecraft,連接我們的插件測試服務(wù)器,IP地址是localhost:25565

然后我們測試插件,首先輸入/allmsg 你好

顯示我們無權(quán)使用,證明插件的第15行代碼起作用了,我們進入控制臺輸入op 你的游戲ID 給予我們自己服務(wù)器管理員權(quán)限后再次輸入

成功!如果叫上你的小伙伴來跟你一起測試的話效果會更加明顯(他也會收到 “你好” 這條消息),不過記得一定要用內(nèi)網(wǎng)映射軟件,你的服務(wù)器才會被其他人連接

作者的話
那么本期的教程就結(jié)束了,你成功的給你的插件添加了一個功能,讓它變得看起來有那么一丟丟作用了。這何嘗不是一個巨大的進步,如果對代碼部分還不太熟悉的小伙伴可以去網(wǎng)上尋找一些JAVA教程,了解一下各種代碼語句的作用都是什么。下期我們進入更加深層次的教學(xué):事件監(jiān)聽,利用事件監(jiān)聽,你可以得知玩家的一舉一動以及服務(wù)器的各種變化。