如何在 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;
}
}
每次运行命令时都会调用该方法。
sender
可以是控制台、命令方块或播放器。我们应该使用 : 检查
if(!(sender instanceof Player)) {
sender.sendMessage("Only players can run this command !");
return false;
}
- 该命令全局从未使用过。
- 标签对应于玩家运行的确切命令(知道它是“/plugin:its”、“/its”……)
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;
}
所以我正在尝试使用子命令创建命令
命令示例:
/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;
}
}
每次运行命令时都会调用该方法。
sender
可以是控制台、命令方块或播放器。我们应该使用 : 检查
if(!(sender instanceof Player)) {
sender.sendMessage("Only players can run this command !");
return false;
}
- 该命令全局从未使用过。
- 标签对应于玩家运行的确切命令(知道它是“/plugin:its”、“/its”……)
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;
}