问题描述
我编写了这段代码,如果您输入:MC中的/ gmspec我应该将您的游戏模式设置为观众模式。 但是它唯一说的是:“尝试执行此命令时发生内部错误。”。 在控制台中它说:arrayindexoutofboundsException:0 ...请帮助,我不知道是什么问题...
if (commandLabel.equalsIgnoreCase("gmspec")) {
Player p = (Player) sender;
Player target = Bukkit.getServer().getPlayer(args[0]);
if (args.length == 0) {
p.setGameMode(GameMode.SPECTATOR);
p.sendMessage(ChatColor.GREEN + "Your own gamemode has been changed!");
return true;
}
if (target == null) {
p.sendMessage(ChatColor.RED + "The player " + target.getName() + " is not online!");
return true;
}
target.setGameMode(GameMode.SPECTATOR);
target.sendMessage(ChatColor.GREEN + "Your gamemode is set to Spectator mode. You are not a banaan that just tries every command without any permission...");
if (sender.hasPermission("gamemode.spectator")) {
p.sendMessage(ChatColor.RED + "You banaan. Y u still try? U no permission has u dumb shit");
}
if (sender instanceof ConsoleCommandSender) {
}
}
return true;
}
1楼
您的问题是,尝试获取参数后要检查其长度。 在尝试获取参数之前,必须确保有一个或多个参数,否则将获得
另外,您将需要在将命令发送方强制转换为Player
之前检查该命令发送方是否为实际Player
。
如果不执行此操作,则只能从Player
上运行任何命令。
为了解决这个问题,你可以取代每p.sendMessage()
与sender.sendMessage()
并且只投sender
到Player
如果sender instanceof Player
因此,您的代码可能看起来像这样
if(commandLabel.equalsIgnoreCase("gmspec")){
if(args.length == 0 && sender instanceof Player){//check if the sender is a Player
Player p = (Player) sender;
p.setGameMode(GameMode.SPECTATOR);
p.sendMessage(ChatColor.GREEN + "Your own gamemode has been changed!");
return true;
}
else{
Player target = Bukkit.getServer().getPlayer(args[0]);
//the rest of the code
}
}