請認准本教程目錄篇永久鏈接: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中,每個命令都需要有相應權限的人員使用;另外,有一些動作我們需要對相應的用戶做出反應,比如接收廣播消息需要不是op。要創建一個新命令,必須規定屬於哪個權限組的用戶可以使用。我們在cn.nukkit.permission.Permission中發現了這樣的代碼:

package cn.nukkit.permission; /* 此處省略若干行 */ /** * author: MagicDroidX * Nukkit Project */ public class Permission { public final static String DEFAULT_OP = "op"; public final static String DEFAULT_NOT_OP = "notop"; public final static String DEFAULT_TRUE = "true"; public final static String DEFAULT_FALSE = "false"; public static String DEFAULT_PERMISSION = DEFAULT_OP; public static String getByName(String value) { switch (value.toLowerCase()) { case "op": case "isop": case "operator": case "isoperator": case "admin": case "isadmin": return DEFAULT_OP; case "!op": case "notop": case "!operator": case "notoperator": case "!admin": case "notadmin": return DEFAULT_NOT_OP; case "true": return DEFAULT_TRUE; default: return DEFAULT_FALSE; } } /* 此處省略若干行 */ }
分析以上代碼我們發現,Nukkit默認的用戶組有幾種:
- op,代表服務器管理員,在ops.txt中規定。
- notop,代表除服務器管理員外的所有玩家。
- true,代表所有玩家。
- false,代表空集。如果某個命令對應這個權限,那就沒有人能夠使用這個命令(控制台除外)。
知道了用戶組之后,就可以在規定權限組時設置它對應的權限組。Nukkit的權限組一般滿足這樣的格式:
插件/模塊名.動作名.動作分類名
所以以下的權限組都是滿足這個格式的:
- nukkit.command.stop
- nukkit.command.ban.player
- nukkit.broadcast.user
- helloworldplugin.command.helloworld
Nukkit建議使用以上的格式來規定權限組的名字,這能方便區分不同插件的權限和不同功能的權限。
關於Permission類和權限系統的詳細講解,可以參考本插件教程的番外篇。
添加權限組到插件
打開plugin.yml,找到yaml文檔中permissions字段(如果沒有,添加之),在下面添加權限組。添加權限組的方法是在permissions對應的散列下添加一個和權限組名字同名的鍵,在這個鍵對應的散列下添加default字段和description字段,在default后面添加權限組包含的用戶組,description后面填對這個權限組的一些描述。
permissions:
bgmcraft.play:
description: 能在地圖內播放bgm的權限
default: op
bgmcraft.hear:
description: 能聽到bgm的權限
default: true
我們來添加一個helloworldplugin.command.helloworld權限組,並設置它包含的用戶組為true(所有玩家)。修改好后我們的yaml文檔應該類似於這樣:
name: HelloWorldPlugin
main: com.cnblogs.xtypr.helloworldplugin.HelloWorldPlugin
version: "1.0.0"
api: ["1.0.0"]
#此處省略若干行
permissions:
helloworldplugin.command.helloworld:
description: 允許用戶使用helloworld指令
default: true
添加了權限組后,我們可以在插件中添加命令了。
版,權,聲,明,,本文,章歡迎轉,載 收,錄 翻,譯 請認,准本教,程目,錄,篇永,久,鏈,接 http://www.cnblogs.com/xtypr/p/nukkit_plugin_start_from_0.html 除該鏈,接以外刊,登此文,章的鏈,接均不,是作,者所撰,寫 不,能保,證內,容的最,新性和可,靠性 特,此,聲,明 本,段是為,防惡,意網,站爬,蟲的抄,襲或復,制粘,貼式抄,襲而特,意撰,寫 搬,運者和翻,譯者可,以不把這,段搬,運或翻,譯
初識命令系統
Nukkit命令系統是以發送一行命令來運行規定好的代碼段的系統。一般情況下Nukkit命令直接由命令的名字組成,比如stop;如果有參數,需要再加上空格再加上以空格分割的參數,比如time set sunrise。Nukkit命令可以在控制台直接輸入然后回車來運行;在Minecraft PE中運行的時候需要在聊天框輸入斜杠加命令,比如/gamemode c。
了解基本的內容后,你可以嘗試制作第一個命令了。我們從這里開始:
通過重寫方法來添加命令
在Nukkit插件中添加命令,我們需要重寫替換的方法來實現命令系統。我們在PluginBase類中發現了這些代碼:
@Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { return false; }
然后在PluginCommand類發現了下面的代碼:

package cn.nukkit.command; /* 此處省略若干行 */ /** * author: MagicDroidX * Nukkit Project */ public class PluginCommand<T extends Plugin> extends Command implements PluginIdentifiableCommand { /* 此處省略若干行 */ @Override public boolean execute(CommandSender sender, String commandLabel, String[] args) { if (!this.owningPlugin.isEnabled()) { return false; } if (!this.testPermission(sender)) { return false; } boolean success = this.executor.onCommand(sender, this, commandLabel, args); if (!success && !this.usageMessage.equals("")) { sender.sendMessage(new TranslationContainer("commands.generic.usage", this.usageMessage)); } return success; } /* 此處省略若干行 */ }
我們發現,Nukkit在讀取插件的時候,會加載所有插件的命令為一系列PluginCommand類;在控制台或者玩家聊天欄輸入命令的時候,會調用相應插件的onCommand方法,並判斷返回值:如果是true說明命令使用成功,false說明使用失敗。所以我們編寫命令的時候,應該重寫onCommand方法。所以主類的代碼應該會變成這樣子:

package com.cnblogs.xtypr.helloworldplugin; import cn.nukkit.command.Command; import cn.nukkit.command.CommandSender; 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!"); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { return false; } }
我們發現onCommand函數有一些參數。
- sender,CommandSender類。通過這個類,可以獲得命令使用者的相關信息,包括獲取使用者有無相應權限(使用Permissible接口的方法)。
- command,Command類。通過這個類可以關於命令的一些信息。
- label,String類,表示這個命令的名字。
- args,String[],表示這個命令的參數列表。
在這里,我們可以檢測相應的命令名字和參數列表,來實現相應的操作。
我們需要先給自己的命令取一個名字。命令的名字應該簡短容易記,讓使用者更方便的操作命令。除非是有意的重寫nukkit自帶的命令,不要使用nukkit已經保留的命令;同理,不要使用別的插件已經使用的命令。不要占用過多的命令,最好是一個插件占用一個有插件名字特點的命令,然后通過后面的參數來實現對應的操作。
我們取好了命令名字,現在我們需要在插件中重寫這個方法,來實現這個命令。如果我們要實現在使用helloworld命令時,給命令使用者發送“Hello World!”信息,代碼的onCommand部分會變成這樣:
@Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { switch(command.getName()){ case "helloworld": sender.sendMessage("Hello World!"); return true; default: return false; } }
這里我們使用了switch來判斷命令是否是“helloworld”,如果是,那就給使用者發送相應的信息。
我們在插件中實現了這個命令,但是我們還需要在plugin.yml添加命令來保證Nukkit能正常識別。
在plugin.yml中添加命令
打開plugin.yml,在commands字段添加一個字段,字段名是剛才添加的命令名字。在這個添加的字段對應的散列中添加description,usage,permission三個字段。
- description,字符串,表示這個命令的一些說明。在 help 和 help 命令名字 指令中,description會作為指令的說明來顯示。
- usage,字符串,表示這個命令的使用方法。在 help 命令名字 指令中,會作為使用方法來顯示。在使用指令調用onCommand返回false時,Nukkit會給命令使用者顯示這個命令的usage。
> help
14:16:24 [INFO] --- 顯示幫助手冊總 * 頁中的第 * 頁 (/help <頁碼>) ---
14:16:24 [INFO] /helloworld: helloworld指令> help helloworld
14:16:29 [INFO] --------- Help: /helloworld ---------
14:16:29 [INFO] Description: helloworld指令
14:16:29 [INFO] Usage: /helloworld - permission,字符串,表示能使用這個指令的權限組。這里可以填之前設定好的權限組,來表示這個指令只有這個權限組可以使用。
關於此處plugin.yml的設置的一些好玩的東西,可以參閱教程番外篇的plugin.yml部分。
使用ctrl+s保存。設置了字段之后,我們的plugin.yml類似於這樣:
name: HelloWorldPlugin
main: com.cnblogs.xtypr.helloworldplugin.HelloWorldPlugin
version: "1.0.0"
api: ["1.0.0"]
#此處省略若干行
permissions:
helloworldplugin.command.helloworld:
description: 允許用戶使用helloworld指令
default: true
commands:
helloworld:
description: helloworld指令
usage: "/helloworld"
permission: helloworldplugin.command.helloworld
點擊“Build”->“Make Project”來編譯。編譯后運行Nukkit來調試,在控制台輸入helloworld,我們可以看到控制台輸出了結果:
> helloworld
14:24:06 [INFO] Hello World!
這說明我們已經成功的給插件添加了命令。我們現在可以使用命令來完成一些操作了。
這個例子中我們只添加了一個功能簡單的命令,你可以發揮你的想象力玩出更多的功能。如果想知道如何玩出聊天框輸入@#¥%&等開頭字符時完成一些操作的“命令”,可以參閱下一章教程的聊天監聽器部分。
有些情況下,我們還需要在點擊方塊或者其它事情發生的時候完成一些操作,這時候你需要事件與監聽器。
上一篇:Hello World! | 目錄:Nukkit插件從0開始 | 下一篇:事件與監聽器 |