在插件中创建一个指令主要分为三个步骤:
- 设计命令
- 注册命令
- 添加进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来代替空格,冒号后面记得加空格,否则插件加载会出错
运行结果:
游戏内使用效果:
代码见github:CmdDemo