命令 - 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());