Как сделать команды с подкомандами в плагинах spigot?

Итак, я пытаюсь сделать команду с
примерами команд подкоманд:

/лечит (игрок)
/питает (игрок)
/помощь

Вот мой основной код файла плагина, если это необходимо:

          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;
        }
    }

1 ответ

Во-первых, вы должны зарегистрировать свою команду в своем plugin.ymlфайл :

      commands:
   its:
      description: "Made things"

Затем, чтобы использовать его в своем плагине, в onEnable()метод:

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

После этого вы должны создать класс ItsCommandи выполните полную команду со всеми подкомандами. У Spigot не очень хороший API для этого. Класс должен выглядеть так:

      public class ItsCommand implements CommandExecutor {

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

Метод будет вызываться каждый раз при выполнении команды.

  1. The senderможет быть консолью, командным блоком или плеером. Мы должны проверить, используя:
      if(!(sender instanceof Player)) {
   sender.sendMessage("Only players can run this command !");
   return false;
}
  1. Команда глобально никогда не используется.
  2. Метка соответствует точной команде, которую запустил плеер (чтобы узнать, является ли это "/plugin:its", "/its"...)
  3. The 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;
}
Другие вопросы по тегам