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