LV. 3
GP 3

【教學】如何自製bukkit插件[影+文](已夭折)

樓主 happyjohn369
GP102 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

哈囉 大家好 我是曙 我今天要來教大家如何做自己的插件
因為之前想做插件 可是找到的資料都是英文的
好不容易找到版上的中文資料 可是樓主好像把文刪了
古文

我能教各位大大的只有一些些東西 請見諒
PS:建議各位大大先有基礎的物件概念再去寫插件 要不然寫起來會很辛苦

標題顏色的意思:
必學
稍微進階

#1 基礎中的基礎-Hello World(有雜音+爆音 抱歉)

開發環境安裝:

開發bukkit插件需要有下列3個東西:
安裝完後你就可以開始來開發bukkit插件了
PS:建議使用乾淨的伺服端做測試 比較不會有衝突

新增插件:

請點選 檔案→新建→Java專案
專案名稱請自行輸入(這邊我輸入helloworld)然後直接點完成
然後請到src按右鍵,點 新建→套件(Package)
套件名稱請自行輸入(這邊我輸入cc.john.bukkit.helloworld)
然後到那個套件那邊點右鍵 新建→類別(Class)
名稱的話 一般來說主類別會輸入main

Hello World:

上面的動作完成後Eclipse會幫你產生像這樣的程式:

  1. package cc.john.bukkit.helloworld;
  2. public class main {

  3. }
然後我們要把他改成這樣:
  1. package cc.john.bukkit.helloworld;
  2. import org.bukkit.plugin.java.JavaPlugin;
  3. //↑這行是Eclipse自動import的
  4. public class main extends JavaPlugin {
  5.    //↑因為我們寫的是Java插件 所以要繼承JavaPlugin
  6.    public void onEnable(){
  7.       /*-----------------------------------------------------------
  8.       onEnable()這個函數在
  9.       插件被讀取的時候會執行
  10.       可以做一些程式的初始化
  11.       -------------------------------------------------------------*/
  12.       getLogger().info("正在開啟...");
  13.       //getLogger().info()會輸出訊息到cmd(黑盒子)
  14.       getLogger().info("Hello Bukkit!!!");
  15.    }
  16.    public void onDisable(){
  17.       /*-----------------------------------------------
  18.       onDisable()這個函數在伺服器結束
  19.       或重讀插件的時候會執行
  20.       可以執行存檔或資源釋放之類的工作
  21.       -------------------------------------------------*/
  22.       getLogger().info("正在關閉...");
  23.    }
  24. }

plugin.yml:

之後到專案的根目錄 右鍵→新建→檔案
檔名輸入plugin.yml
檔案內容如下:
name: Hellow_Bukkit #這個插件的名稱(不建議有空格)
main: cc.john.bukkit.helloworld.main
#↑這個插件的主類別路徑(就是"你的package路徑.主類別名稱")
version: 0.1 #這個插件的版本
#以上東西 缺一不可
檔案建立完後 請按幾次F5 讓他重新整理 不然匯出的時後會有錯誤
plugin.yml的檔案編碼必須為UTF-8,不然會出現"Invalid plugin.yml"這個錯誤

匯出:

全部完成後 請到專案的根目錄 右鍵→匯出
選擇Java→JAR檔 下一步
選擇匯出目的地(練習的話建議直接匯出到測試伺服器的plugin資料夾)
PS .classpath.project可以不用匯出
直接點完成 啟動伺服端 驗收成果

成功!

如果你看到下面的畫面

輸入stop後又看到下面的畫面


那恭喜你 你已經完成你人生的第一個插件了!!


#2 指令事件 -onCommand() (講的有點不順 抱歉)


onCommand():

完整寫法:
public boolean onCommand(CommandSender sender,Command cmd,String cmdlable,String[] args)

CommandSender sender
:
送出指令的那個人
Command cmd: 指令物件(名稱,權限,介紹等)(感謝Sky奇亞大大補充)
String cmdlable: 指令名稱
String[] args: 指令的參數

一個onCommand()可以包含很多的指令(透過cmdlable辨認)
由於cmdlable是String型別 所以比較時不能用==下去比 要用cmdlable.equals("命令名稱")下去比

plugin.yml:

有新增指令的話 都要在plugin.yml裡註冊 註冊結構如下:
commands:
  指令1:
    description: 指令1介紹
  指令2:
    description: 指令2介紹


Player類別的函式:

Player類別是管理各個玩家的類別 裡面包含很多有趣的函數
像這次用的player.setWalkSpeed(value) (value是一個float浮點數)
他就可以設定玩家的行走速度(正常走路速度是0.25)
更多函式的使用請參考
bukkit的javadoc

指令參數:

在onCommand()的最後一個參數args[]是玩家輸入的參數 參數位置如下:
/tp ifTNT ~0 -9999 ~0
↑cmdlable ↑args[0] ↑args[1] ↑args[2] ↑args[3]



#3 設定檔-兩個驚嘆號 !!

config.yml:

說到設定檔 最重要的大概就是config.yml了
建立config.yml的步驟和plugin.yml一樣
在專案根目錄按右鍵→新建→檔案
名稱輸入:config.yml
然後存檔後一樣要按幾次F5
config.yml的內容就是這個插件的預設設定檔
以影片為例 檔案內容如下:
  1. #default (經過測試 任何註解都不會被匯出)
  2. message:
  3.   s: "加速跑"
  4.   d: "恢復正常速度"

載入設定檔:

設定檔的載入一般會放在onEnable()內 讓插件一被載入就讀去設定檔
程式如下:
  1. public void onEnable(){
  2.    ......
  3.    getConfig().options().copyDefaults(true);
  4.    /* ↑這行會在插件設定檔不存在時 複製插件內的設定檔過去
  5.    ---可是copyDefaults預設就是true 所以這行可以不用寫---*/
  6.    saveConfig();
  7.    //↑儲存設定檔
  8.    ......
  9. }

讀取設定檔:

讀取設定檔就用getConfig().get你要的型別("路徑");
例如:
要取得String型別就用 getConfig.getString("路徑");
要取得boolean型別就用 getConfig.getBoolean("路徑");

路徑要填入設定檔內的路徑 假設有個設定檔如下:
  1. a:
  2.   b: "test"
  3.   c: "test2"
  4.   d:
  5.     e: "test3"
  6. f: "test4"

b的路徑就是: a.b
c的路徑就是: a.c
e的路徑就是: a.d.e
f的路徑就是: f
a和d是所謂的"樹枝節點"

重新載入設定檔:

好的插件會有一個reload指令 reload的時候會執行很多事 重讀設定檔就是其中一件
重讀設定檔可以用這個函數: reloadConfig();


#4權限和事件

權限:

權限的設定:

權限的設定很簡單,只要在plugin.yml加入下面的東西:
permissions:
  權限的節點名稱:
    description: "權限介紹"
    default: 預設給誰權限(op之類的 不填預設是所有人)
    children:
      子權限(只要父權限是true,子權限就是true)
權限的設定方式不只一種 還有直接在插件裡設定的方式
不過這裡只介紹比較簡單的方式

權限的檢測:

權限的檢測也很簡單
只要:
玩家物件.hasPermission("權限節點名稱")
如果該玩家有權限 就回傳true 沒有就回傳false

事件:

基本語法:

要使用事件之前請將main class由:
public class main extends JavaPlugin{
改成:
public class main extends JavaPlugin implements Listener{

然後在onEnable加入下面的程式碼:
getServer().getPluginManager()
          .registerEvents(監聽的class,插件的main class);

一般來說 用下面的程式碼即可
getServer().getPluginManager().registerEvents(this,this);
就完成事件監聽的基本語法了

監聽方法:

要新增監聽方法 請加入下面的程式碼:

@EventHandler
public void 監聽方法的名稱(監聽物件 e){
  //監聽方法的名稱可以自訂
  //但是監聽物件請到下面查詢
  //Bukkit的javadoc->Classes->Class List->org->bukkit->event
  //e可以自訂名稱
}
之後你就可以用e來做一些事情
像PlayLoginEvent 就可以用e.getPlayer()來取得登入的玩家

#5預告-物品(item)和方塊(block)的互動 (夭折)


另外我有Google到一位外國大大拍的影片 奉上(我所有的內容都是從這位大大那裡學來的)

更多Bukkit的函數,物件 請參考Bukkit的javadoc


以上 感謝各位大大的觀看 如果有任何需要改進或需要介紹的東西 請在下面留言或回復 謝謝
上面是我所服務的團隊 有空請去按個讚 謝謝
102
-
未登入的勇者,要加入討論嗎?
板務人員:

1315 筆精華,11/24 更新
一個月內新增 3
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】