Bukkit插件開(kāi)發(fā)教程 - 命令

命令 - Command

注:從本章開(kāi)始將會(huì)減少圖片,將會(huì)以代碼的形式講解,實(shí)際還是要大家去實(shí)踐...

學(xué)習(xí)目標(biāo):

  • 如何注冊(cè)命令(理解)
  • 如何重寫(xiě)JavaPlugin中的onCommand方法來(lái)做到命令處理(理解)
  • 如何在一個(gè)獨(dú)立類(lèi)中作為命令處理類(lèi)(理解,重點(diǎn))

如何注冊(cè)命令

注冊(cè)命令的方式有幾種

  • 利用plugin.yml添加指令
  • 利用PlayerCommandProcessEvent直接處理
  • 利用反射添加指令

這里我只講解利用 plugin.yml 添加命令,那么我們來(lái)看下面的代碼

name: Tutorial1
main: cc.zoyn.tutorial1.Tutorial1
version: 1.0
author: Zoyn

這是一段我們?cè)?strong>第一個(gè)插件當(dāng)中寫(xiě)的 plugin.yml 那么我們?cè)?author: Zoyn 的下面寫(xiě)上以下內(nèi)容

commands:
  demo: #指令名
    description: "測(cè)試指令" #指令的注解
    usage: /demo #指令的用法 當(dāng)onCommand()方法返回false時(shí)提示這里的內(nèi)容
    aliases: [d,de] #指令的多種形式 意為可以用 d, de 來(lái)觸發(fā)/demo這個(gè)指令
    permission: "demo.use" #指令所需要的權(quán)限
    permission-message: "無(wú)權(quán)使用" #當(dāng)輸入者無(wú)上方權(quán)限時(shí)提示該信息

那么這樣我們就注冊(cè)好了一個(gè)指令叫 demo
注意 demo: 之后的內(nèi)容都是選寫(xiě)

如何重寫(xiě)JavaPlugin中的onCommand方法來(lái)做到命令處理(理解)

那么有了上面啟發(fā),那么我們就可以開(kāi)始寫(xiě)對(duì)于指令的處理
首先我們轉(zhuǎn)到主類(lèi),重寫(xiě) JavaPlugin 當(dāng)中的 onCommand() 方法

package cc.zoyn.tutorial1;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public final class Tutorial1 extends JavaPlugin {

  @Override
  public void onEnable() {
    getLogger().info("onEnable has been invoked!");
  }

  @Override
  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    return false;
  }
}

那么我們來(lái)解析一下這個(gè)命令里面的參數(shù)
劃重點(diǎn)
sender -> 命令發(fā)送者
command -> 命令的對(duì)象
label -> 命令發(fā)送者實(shí)際輸入的指令
args -> 命令后所跟的參數(shù) 如/demo a b c 則后面的 a b c 就是args對(duì)應(yīng)過(guò)來(lái)的 args[0],args[1],args[2]
那么我們要怎么判斷好一個(gè)指令呢? 我們可以做如下操作

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
  if (command.getName().equalsIgnoreCase("demo")) { // 判斷輸入的指令是否是 /demo
    if (!(sender instanceof Player)) { // 判斷輸入者的類(lèi)型 為了防止出現(xiàn) 控制臺(tái)或命令方塊 輸入的情況
      sender.sendMessage("你必須是一名玩家!");
      return true; // 這里返回true只是因?yàn)樵撦斎胝卟皇峭婕?并不是輸入錯(cuò)指令,所以我們直接返回true即可
    }
    // 如果我們已經(jīng)判斷好sender是一名玩家之后,我們就可以將其強(qiáng)轉(zhuǎn)為Player對(duì)象,把它作為一個(gè)"玩家"來(lái)處理
    Player player = (Player) sender;
    player.sendMessage("你成功的執(zhí)行了指令/demo");
    return true; // 返回true防止返回指令的usage信息
  }
  return false;
}
但是你會(huì)發(fā)現(xiàn)無(wú)法使用

這是什么原因呢?其實(shí)是 Bukkit 需要開(kāi)發(fā)者做一個(gè)注冊(cè)的操作, 那么我們?cè)?onEnable() 方法鍵入以下代碼

Bukkit.getPluginCommand("demo").setExecutor(this);

完整代碼:

package cc.zoyn.tutorial1;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

public final class Tutorial1 extends JavaPlugin {

  @Override
  public void onEnable() {
    getLogger().info("onEnable has been invoked!");
    Bukkit.getPluginCommand("demo").setExecutor(this);
  }

  @Override
  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if (command.getName().equalsIgnoreCase("demo")) { // 判斷輸入的指令是否是 /demo
      if (!(sender instanceof Player)) { // 判斷輸入者的類(lèi)型 為了防止出現(xiàn) 控制臺(tái)或命令方塊 輸入的情況
        sender.sendMessage("你必須是一名玩家!");
        return true; // 這里返回true只是因?yàn)樵撦斎胝卟皇峭婕?并不是輸入錯(cuò)指令,所以我們直接返回true即可
      }
      // 如果我們已經(jīng)判斷好sender是一名玩家之后,我們就可以將其強(qiáng)轉(zhuǎn)為Player對(duì)象,把它作為一個(gè)"玩家"來(lái)處理
      Player player = (Player) sender;
      player.sendMessage("你成功的執(zhí)行了指令/demo");
      return true; // 返回true防止返回指令的usage信息
    }
    return false;
  }
}

那么我相信通過(guò)上方的代碼你已經(jīng)可以領(lǐng)悟?qū)τ诿畹奶幚砹?/p>

如何在一個(gè)獨(dú)立類(lèi)中作為命令處理類(lèi)(理解,重點(diǎn))

現(xiàn)在我們創(chuàng)建一個(gè)類(lèi)叫做 CommandHandler, 并且讓它實(shí)現(xiàn) CommandExcutor 接口

public class CommandHandler implements CommandExecutor {

}

之后我們讓它實(shí)現(xiàn)方法 onCommand

public class CommandHandler implements CommandExecutor {
  @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        return false;
    }
}

那么接下來(lái)的我就不用多說(shuō)了, 還需要提的就是注冊(cè)命令時(shí)你需要改成這樣

Bukkit.getPluginCommand("demo").setExecutor(new CommandHandler());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容