命令與權限 - 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中,每個命令都需要有相應權限的人員使用;另外,有一些動作我們需要對相應的用戶做出反應,比如接收廣播消息需要不是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;
        }
    }

/* 此處省略若干行 */

}
View Code

分析以上代碼我們發現,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;
    }
/* 此處省略若干行 */
}
View Code

我們發現,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;
    }
}
View Code

我們發現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開始 下一篇:事件與監聽器


免責聲明!

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



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