如何在 spigot 插件中使用子命令创建命令?

How to make commands with subcommands in spigot plugins?

所以我正在尝试使用子命令创建命令
命令示例:

/its heal (player)
/its feed (player)
/its help

如果需要,这是我的主要插件文件代码:

    package com.itsmateo20;
    
    import com.itsmateo20.events.JoinQuit;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class ItsPlugin20 extends JavaPlugin {
        private static ItsPlugin20 instance;
    
    
        @Override
        public void onEnable() {
            instance = this;
            FileConfiguration config = getConfig();
            config.addDefault("Prefix", "[ItsPlugin20]:");
            config.addDefault("JoinQuit", true);
            config.options().copyDefaults(true);
            saveConfig();

            if (config.getBoolean("JoinQuit")) {
                Bukkit.getPluginManager().registerEvents(new JoinQuit(), this);
            }
            Bukkit.getLogger().info(config.getString("Prefix") + ChatColor.GREEN + " Enabled successfully!");
        }
    
        @Override
        public void onDisable() {
            FileConfiguration config = getConfig();
            Bukkit.getLogger().info(config.getString("Prefix") + ChatColor.RED + " Disabled successfully!");
        }
    
        public static ItsPlugin20 getInstance() {
            return instance;
        }
    }

首先,您必须在 plugin.yml 文件中 register your command :

commands:
   its:
      description: "Made things"

然后,要在您的插件中使用它,在 onEnable() 方法中:

getCommand("its").setExecutor(new ItsCommand());

在此之后,您应该创建 class ItsCommand 并制作完整的命令,包括所有子命令。 Spigot 对此没有很好的 API。 class 应该是这样的:

public class ItsCommand implements CommandExecutor {

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

每次运行命令时都会调用该方法。

  1. sender可以是控制台、命令方块或播放器。我们应该使用 :
  2. 检查
if(!(sender instanceof Player)) {
   sender.sendMessage("Only players can run this command !");
   return false;
}
  1. 该命令全局从未使用过。
  2. 标签对应于玩家运行的确切命令(知道它是“/plugin:its”、“/its”……)
  3. args就是您要找的。

你应该用args.length == 0检查它是否为空,所以玩家只用“/its”。你可以显示帮助。

然后,你应该检查参数是什么,比如args[0].equalsIgnoreCase("feed")

方法的完整示例:

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if(!(sender instanceof Player)) {
        sender.sendMessage("Only players can run this command !");
        return false;
    }
    Player p = (Player) sender;
    if(args.length == 0 || args[0].equalsIgnoreCase("help")) { // if no args or help
        showHelp(p);
    } else if(args[0].equalsIgnoreCase("feed")) { // if the first arg is what you want
        if(args.length == 1) { // only run "/its feed" without player
            p.sendMessage(ChatColor.RED + "You forget the player name !");
            return false;
        }

        Player cible = Bukkit.getPlayer(args[1]); // get the player given
        if(cible == null){ // player not online/invalid
            p.sendMessage(ChatColor.RED + "The given player doesn't exist !");
        } else {
            cible.setFoodLevel(20); // do what you want with the cible
            p.sendMessage(ChatColor.GREEN + "Player feeded !");
        }
    } else { // unknow sub command
        p.sendMessage(ChatColor.RED + "Unknow arguments !");
        showHelp(p);
    }
    return false;
}