在插件中创建一个指令主要分为三个步骤:

  1. 设计命令
  2. 注册命令
  3. 添加进plugin.yml

首先,参考《Spigot插件开发环境搭建及空白插件的创建》来创建一个新的插件,在此基础上本篇内容将介绍如何在自己的插件中使用指令。

设计命令

首先,先要构思一个指令名,在本篇教程中,使用/cjcmd 来作为演示,只要不和其他插件冲突,任意字符串的组合都可以用作命令。
建议有条理地为每个命令创建一个新类。 您的类必须实现接口CommandExecutor。 类文件内容类似于:

package com.xuchaoji.spigot;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

public class CjCmd implements CommandExecutor{
     // This method is called, when somebody uses our command
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String lable, String[] args) {
        // TODO Auto-generated method stub
        return false;
    }


}

下面解释一下onCommand方法的参数:

  • CommandSender表示发送命令的实体。 可以是Player(玩家),ConsoleCommandSender(控制台)或BlockCommandSender(命令方块)
  • Command表示被调用的命令是什么。
  • Label表示发件人输入的命令的第一个字(不包括参数)
  • Args是命令语句的其余部分(不包括标签),由空格分隔并放入数组中。

这里以res圈地插件的命令来具体展示各个参数,如创建领地的指令
/res create newRes
这个指令由玩家发出,所以CommandSender就是Player, 其中res对应Command,create 和 newRes 为其他参数保存在String[]数组中,String[0]为create,String1为newRes。

当玩家发送/cjcmd时,可以获得10块面包和2颗钻石。
首先,要发放物品的话,命令的使用者必须是玩家(控制台和命令方块没有背包可以存放物品),因此需要先判断一下sender是否为Player。然后需要创建ItemStack来存放物品,ItemStack需要两个参数,材料名称和数量。关于Spigot的相关API介绍可以查阅:Spigot-API官方文档,本教程不会挨个介绍Spigot的每一个API,需要你自行查阅文档。玩家背包、玩家名称、玩家所在的世界及坐标、玩家手中物品及身上装备、当前世界天气及时间等等,游戏中所有你能看到听到的,基本都有其对应的API,如果你想实现某个功能,请在官方文档中搜索对应的关键词(英文)。
下面我写的CjCmdl类的代码,你也可以根据自己的脑洞自行添加其他内容:

package com.xuchaoji.spigot;

import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import net.md_5.bungee.api.ChatColor;

public class CjCmd implements CommandExecutor{
     // This method is called, when somebody uses our command
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String lable, String[] args) {
        //判断sender是否为玩家,非玩家没有背包,无法给物品
        if (sender instanceof Player){
            Player player = (Player)sender;
            player.sendMessage(ChatColor.AQUA+"[CmdDemo]"+ChatColor.AQUA+sender.getName()+ChatColor.AQUA+"执行了cjcmd指令,下面发放物品。");
            //创建ItemStack,bread和diamond,ItemStack需要两个参数,第一个是材料名称,第二个是数量。
            ItemStack bread = new ItemStack(Material.BREAD,10);
            ItemStack diamond = new ItemStack(Material.DIAMOND,2);
            player.getInventory().addItem(bread, diamond);

        }else {
            //当非玩家执行命令时,给个错误提示。
            sender.sendMessage(ChatColor.DARK_RED+"[CmdDemo]只有玩家才能执行此命令!");
        }
        //当指令执行顺利时,返回true,否则玩家每次输入指令都会在客户端看到自己发送的指令。
        return true;
    }


}

注册命令

命令的executor已经写好,现在需要将命令在插件启用时候进行注册,设置命令对应的executor,在main class 的onEnable()方法中添加如下代码来注册指令(注意根据自己的类名来修改代码):

this.getCommand("cjcmd").setExecutor(new CjCmd());

以下是完整的main class:

package com.xuchaoji.spigot.commanddemo;

import org.bukkit.plugin.java.JavaPlugin;

import net.md_5.bungee.api.ChatColor;

public class CmdDemo extends JavaPlugin {
    //加载插件执行
    @Override
    public void onEnable() {
        getServer().getConsoleSender().sendMessage(ChatColor.AQUA+"[CmdDemo]已加载");
        this.getCommand("cjcmd").setExecutor(new CjCmd());
        getServer().getConsoleSender().sendMessage(ChatColor.AQUA+"[CmdDemo]cjcmd命令注册成功!");
    }
    //停用插件执行
    @Override
    public void onDisable() {
        getServer().getConsoleSender().sendMessage(ChatColor.RED+"[CmdDemo]已停用");
    }
}

添加命令进plugin.yml

已经完成了设计命令和注册命令,现在需要在plugin.yml中将插件和用法添加进去,这样在服务器中使用/help命令才能查看到你插件的指令。

name: CmdDemo
main: com.xuchaoji.spigot.commanddemo.CmdDemo
version: 1.0
api-version: 1.13
commands: 
    cjcmd: 
        description: CmdDemo command, give player 10bread and 2diamond
        usage: /cjcmd

编辑plugin.yml的时候不要用tab来代替空格,冒号后面记得加空格,否则插件加载会出错

运行结果:

11-cmdDemo-running.png
游戏内使用效果:
12-cmdDemo-inGame.png

代码见github:CmdDemo