Hello World! - Nukkit插件從0開始


請認准本教程目錄篇永久鏈接:http://www.cnblogs.com/xtypr/p/nukkit_plugin_start_from_0.html ,未經作者許可轉載本系列文章任何內容的,視為已向作者支付50元人民幣稿酬。作者支付寶賬號:237356812@qq.com。

系列作者:粉鞋大媽 文章出處:http://www.cnblogs.com/xtypr 歡迎轉載、翻譯、收錄,也請保留這段聲明,不勝感激。

Nukkit插件從0開始:Hello World!

上一篇:搭建環境 目錄:Nukkit插件從0開始 下一篇:命令與權限

 

這里我們以一個簡單的插件作為例子,來講解一個Nukkit插件的開發過程,和一些基本方法的使用。

 

無中生有:列出功能列表


插件制作之前,我們應該對插件的功能有一個規划。以下是我個人的一些經驗和看法,大家可以保持自己的看法。

  1. 插件作為一個程序,應該有自己實現的功能,如果能在開發前列舉這些功能,對開發的速度會有提升,也讓你不至於寫到一半沒了思路。
  2. 我們列出功能列表的時候,首先要明確這個插件的用途,比如一個pvp小游戲,或者一個鎖箱子工具。“一個奇怪的插件”或者“一個游樂園插件”這樣的用途不夠明確,容易讓人產生誤解,就算提出功能列表的人和開發者是同一個人。而“一個不用電腦就能開服的插件”或“一個vps到期還能開服的插件”這樣幾乎不可能實現的東西,就不要嘗試去想了,以免浪費青春。
  3. 現在你明確了這個插件的用途,不過不要急着開始做,你應該先通過論壇、搜索引擎、插件站等各種途徑尋找是否有人做過這個用途的插件。如果你的想法相對別人有改進,比如別人的鎖箱子插件需要輸入指令而你的直接用牌子點擊箱子是個很好的優化,你可以試着做自己的插件。如果你的想法沒有改進,別人的插件可能比你經歷過更長的時間和更多服務器的考驗,擁有更少的bug,除非你對這個想法相比別人的有一些改進,不然還是用別人的插件吧,除非是為了學習,不要試着去做/模仿別人做過的東西。
  4. 如果你如此的有想象力,以至於想出了前無古人的插件點子,恭喜你可以開始細化功能了。細化功能就是把你粗略的插件點子,細化成有哪些主要的操作,再到需要哪些指令和權限。我們來一個頭腦風暴,我要設計一個牌子鎖箱子工具,該有哪些功能?你可以監聽方塊被點擊的事件,先檢查這個方塊是不是箱子,再檢查這個箱子是不是被別人鎖了,再檢查你手里是不是拿着牌子,然后就把箱子登記到被鎖箱子列表;你一想覺得需要op可以查看所有玩家箱子,又可以添加這個功能;再一想還需要幾個玩家共享箱子,還可以加付費鎖箱子……哎喲媽呀,功能太多了,一想真停不下來。這時候你可以把細化的功能寫到紙上或者干脆記在腦子里,以后做插件的時候就能明確思路了。
  5. 現在你得到了插件的很多功能,你需要將它們分類。對於一個插件來說,有一些功能是其它功能所依賴/需要的,有一些功能是可開啟可關閉或者不影響其它功能使用的,這時候我們需要給這些功能歸到一類。那些被其它功能依賴性最強的功能,需要我們優先制作;一些不知道該不該添加的功能,我們可以丟到配置文件讓插件的使用者來決定。我們回到鎖箱子插件,這個插件有基本的鎖箱子功能、op看箱子功能、共享箱子功能,其中后兩者需要鎖箱子功能的支持,這時候我們需要先制作基本的鎖箱子功能,共享箱子放在以后或者以后的插件版本制作,而op看箱子這個功能實在不知道該不該有,我們制作的時候就可以在配置文件里加一行,讓腐竹/插件使用者來配置。

我們得到了詳細的、分了類的功能,現在可以開始制作了。如果不知道一些功能能不能、該不該實現,可以在以后的學習中慢慢體會。

 

這里我以使用IDEA制作一個簡單的插件為例子,它的功能只有一個:在自己加載和卸載的時候在控制台輸出文字。夠簡單,是不是?我們開始吧。

 版*權*聲*明**本文*章歡迎轉*載 收*錄 翻*譯 請認*准本教*程目**篇永***接:http://www.cnblogs.com/xtypr/p/nukkit_plugin_start_from_0.html 除該鏈**以外刊*登此文*章的鏈*接均不*是作*者所撰*寫 不*能保*證內*容的最*新性和可*靠性 特***明  本*段是為防惡*意網*站爬*蟲的抄*襲或復*制粘*貼式抄*襲而特*意撰*寫 搬*運者和翻**者可*以不把這*段搬*運或翻*

實現願望:你的第一個插件


創建Java包

首先打開IDEA,IDEA默認打開我們已經配置環境好的插件工程。右鍵側邊欄的“src”文件夾,點擊“New”->“Package”,在彈出的“New Package”中填你的插件應該存放的java包名。這里可以根據java包名的命名習慣,全部使用小寫字母開頭,前面把你的域名倒過來寫,后面跟上后面產品的名字,你可以不參照這個習慣自己寫,但是不能和別人的一樣,因為java包名的前綴用於區分不同的作者。這里我用了com.cnblogs.xtypr.helloworldplugin,你應該自己定插件的包名。以下幾個包名都是可以的:

  • com.cnblogs.xtypr.helloworldplugin
  • xtypr.helloworldplugin
  • net.xtypr.helloworldplugin

另外注意,不要作死的把插件放進cn.nukkit這個包,筆者已為自己的好奇心付出慘痛的代價!

創建好包之后,我們還需要在里面添加主類。

添加和編寫主類

右鍵剛剛創建的包,選擇“New”->“Java Class”,在彈出窗口的Name后面寫上自己插件的主類的名字,習慣上使用大寫開頭。個人不提倡用Main或者MainClass這樣的名字,因為這會導致不同插件的主類難以區分。另外注意的是,不能用帶“nukkit”“minecraft”“mojang”之類的字符串作為插件的名字。插件的運行都是從主類的方法開始的。點擊“OK”,完成創建。

主類創建完畢后,IDEA會幫你打開主類的編輯器,這時候你會看到這樣的代碼(中間IDEA會給你自動創建一個注釋,為了節省篇幅我刪除了):

package com.cnblogs.xtypr.helloworldplugin;

public class HelloWorldPlugin{

}

Nukkit插件必須繼承一個叫PluginBase的父類,這個類被存放在cn.nukkit.plugin包內,我們需要讓插件繼承這個類,於是你的代碼變成了這個樣子:

package com.cnblogs.xtypr.helloworldplugin;

import cn.nukkit.plugin.PluginBase;

public class HelloWorldPlugin extends PluginBase{

}

一個Nukkit插件應該有加載、啟用和停用這幾個方法,這幾個方法應該重寫PluginBase里的某些方法。讓我們看看PluginBase類:

package cn.nukkit.plugin;
/*  此處略去若干代碼 */

/**
 * author: MagicDroidX
 * Nukkit Project
 */
abstract public class PluginBase implements Plugin {

/*  此處略去若干代碼 */

    public void onLoad() {

    }

    public void onEnable() {

    }

    public void onDisable() {

    }

/*  此處略去若干代碼 */
}
View Code

我們發現里面有onLoad(),onEnable()和onDisable()這幾個方法。文.章出.自:http://cnblogs.com/xtypr/

  • onLoad()。Nukkit服務器在開啟的時候,會調用所有插件的onLoad()方法(至於在地圖加載前還是后調用我們等一下會講到),而且服務器開啟到停止只會調用一次。我們需要把一些預處理代碼放進去,比如檢查和創建默認配置文件、初始化數組變量等等。
  • onEnale()。所有的onLoad()調用完成后,Nukkit服務器會調用所有的onEnable(),onEnable()方法可能被調用多次(尤其是有插件管理器插件的時候)。我們應該把讀取配置文件,連接數據庫這樣在啟動后可能需要停用的方法放在這里。
  • onDisbale()。Nukkit服務器關閉,或者一個插件onLoad()或onEnable()時發生問題,會調用插件的onDisable()方法。同onEnable(),onDisable()也可能被調用多次。我們應該把關閉數據庫,關閉I/O數據流這樣的東西放在這里。由於服務器過卡導致關閉時間太長,Nukkit會直接調用系統殺死自己,而導致一些插件的onDisable()不會被執行,所以我們在插件使用的過程中應該隨時保存數據,盡量不要把I/O操作和保存數據部分放在onDisable(),以免意外發生。

這幾個方法調用之前,服務器都會在控制台輸出類似這樣的信息(其中SuchAPlugin是插件名,2.3.3插件是版本號):

13:52:10 [INFO] Loading SuchAPlugin v2.3.3 

繼承這幾個方法后,你的代碼應該是這樣的:

package com.cnblogs.xtypr.helloworldplugin;

import cn.nukkit.plugin.PluginBase;

public class HelloWorldPlugin extends PluginBase{
  @Override
    public void onLoad() {

    }
  @Override
    public void onEnable() {

    }
  @Override
    public void onDisable() {

    }
}
View Code

接下來我們在方法中添加代碼,這個插件的功能很簡單,所以我在三個方法中直接添加在控制台打印文字的代碼就可以了。

package com.cnblogs.xtypr.helloworldplugin;

import cn.nukkit.plugin.PluginBase;

public class HelloWorldPlugin extends PluginBase{
  @Override
    public void onLoad() {
        getLogger().info("Hello Nukkit,I've loaded!");
    }
  @Override
    public void onEnable() {
        getLogger().info("Hello Nukkit,I've enabled!");
    }
  @Override
    public void onDisable() {
        getLogger().info("Hello Nukkit,I've disabled!");
    }
}

這里簡單介紹一下logger。Nukkit服務器的控制台有很多消息,這些消息都是Logger輸出的。所有插件主類的父類PluginBase提供了getLogger()函數,返回當前服務器使用的Logger對象,並轉換成PluginLogger對象。當你在插件主類調用

getLogger().info("MDX與Nukkit大法!");
getLogger().warning("狸貓不吃魚!");

的時候,控制台會輸出類似這樣的文字(其中NukkitDaFa是插件名):

13:57:38 [INFO] [NukkitDaFa] MDX與Nukkit大法!  
13:57:38 [WARNING] [NukkitDaFa] 狸貓不吃魚! 

關於Logger的詳細介紹可以參閱本系列教程的番外篇。

使用ctrl+s保存編輯好的主類文件。

為了讓Nukkit正常識別,我們還需要添加plugin.yml。

添加和配置plugin.yml

打開側邊欄里我們以前創建的“plugin.yml”文件,在編輯框編寫內容。plugin.yml文件需要符合Nukkit規定的格式,下面是一個簡單的plugin.yml:

name: HelloWorldPlugin
main: com.cnblogs.xtypr.helloworldplugin.HelloWorldPlugin
version: "1.0.0"
api: ["1.0.0"]

load: POSTWORLD
author: 粉鞋大媽 description: 這是一個簡單的Hello World website: http://www.cnblogs.com/xtypr #commands: [] #permissions: []

我來逐一解釋這個文件的結構。標注必需的,說明這些選項必需要填,剩下的如果用不到可以省略用默認值。

  • name必需,你應該填插件的名字,這個在Logger和其他東西里會用到,再次強調名字不能帶“nukkit”“minecraft”“mojang”這幾個詞語
  • main必需,是這個插件的主類,必須填剛才創建的插件主類的完整路徑(感謝@Lyw指出),這個將用於nukkit服務器加載你的插件。
  • version必需,是這個插件的版本,這里注意如果是數字版本(比如“103”或“1.1.0”)需要加上雙引號,這樣yaml才能把這里識別成字符串,下面的api版本同理。
  • api必需,是這個插件支持的Nukkit API版本,這里注意是一個數組,如果支持多個api版本應該使用 ["1.0.0","1.0.1","1.0.2"] 這樣的數組。編譯和發布插件前,你需要對盡可能多的api版本進行測試,如果穩定說明你的插件支持這個api版本,那你應該把這個api版本加入這個數組。
  • load是插件加載的次序,在Nukkit API 1.0.0中可選擇STARTUP或POSTWORLD,STARTUP意味着插件在服務器開啟時優先加載,POSTWORLD說明插件會在第一個世界(默認的世界)加載后再加載。有些需要依賴地圖的插件,可以選擇POSTWORLD。
  • author description website這三個,是用於識別你的版權,讓其它開發者/插件能識別你。

至於commands和permissions,我們會在后面的內容詳細講解。

關於plugin.yml的詳細介紹可以參閱本系列教程的番外篇。

填寫plugin.yml后,使用ctrl+s保存文件。現在我們可以調試插件了。

調試插件

點擊“Run”->“Debug 'HelloWorldPlugin'”,IDEA會自動編譯並開啟調試。由於我們已經配置了環境,調試前會自動編譯並值nukkit文件夾的plugins里面生成插件的jar包。筆者個人習慣使用shift+F9快捷鍵開啟調試。點擊后,我們看到下面出來了一個調試欄,那里是控制台的輸出。在調試時,我們應該測試插件的所有功能,並試着在不同的環境中尋找插件的bug,調試失敗出exception不要緊,修復了bug之后你的插件會穩定下來,直到可以投入使用。文章出自:http://www.cnblogs.com/xtypr/

從輸出我們可以看到,我們的插件已經正常運行,而且輸出了我們設置的字符串,功能完美實現無bug(噗)。

調試完畢后,我們發現插件已經可以投入使用了,這時候我們應該把插件打包和發布。

 

誕生:打包與發布


如果整個插件調試無誤了,我們可以打包插件然后發布給別人。

點擊菜單欄的“Build”->“Make Project”來編譯整個工程。打開jar包,能看到我們的plugin.yml和編譯生成的.class文件已經被IDEA打包進jar,所以可以被nukkit正常識別。

你得到了能在任何一台相應版本的nukkit服務器上使用的HelloWorldPlugin.jar。你可以重命名這個jar包的名字(比如HelloWorld_1.0.0.jar)且不影響使用。

現在你可以把jar包發布了。你可以把jar包在貼吧或者論壇上發布,或者丟給需要的腐竹。作為一個合格的插件開發者,你需要從插件使用者獲取你未發現的bug,你也可以在新的版本的插件中添加新的功能。一個插件的開發過程應該是永遠不會結束的,你可能想不到,你的插件會被一代又一代的腐竹使用,被一代又一代的開發者穩定和完善。你的插件如果唱響大江南北,那將會成為其它插件開發者制作新玩意的動力,也會吸引更多人加入nukkit插件開發的領(tian)域(keng),而你作為開發者也會被腐竹們當大神一樣膜拜,被全宇宙的nukkit開發者傳唱。

我們制作的第一個nukkit插件,只有在控制台輸出文本的簡單功能,在以后的章節中我們將會學習更多的有趣的玩法。 

 

上一篇:搭建環境 目錄:Nukkit插件從0開始 下一篇:命令與權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM