Вопрос Как сделать 2 или больше аргумента?

sleinexxx

Пользователь
Сообщения
63
Объясните мне пожалуйста, почему это не работает?
Java:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    Player p = (Player)sender;
    Player target = Bukkit.getPlayer(args[1]);
        if(p.hasPermission("ZendeX.Essentials"))
        {
            if(args.length == 0)
            {
                p.sendMessage("§cИспользуйте: /gm [0,1,2] (Nickname)");
            }   
            if(args.length == 1)
            {
                if(args[0].equalsIgnoreCase("0"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else
                    {
                        p.sendMessage("§cУ игрока успешно обновился игровой режим!");
                        target.setGameMode(GameMode.SURVIVAL);
                    }
                }
                if(args[0].equalsIgnoreCase("1"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else
                    {
                        p.sendMessage("§cУ игрока успешно обновился игровой режим!");
                        target.setGameMode(GameMode.CREATIVE);
                    }
                }
                if(args[0].equalsIgnoreCase("2"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else
                    {
                        p.sendMessage("§cУ игрока успешно обновился игровой режим!");
                        target.setGameMode(GameMode.ADVENTURE);
                    }
                }
            }
        }
        return false;
    }
 
Решение
Объясните мне пожалуйста, почему это не работает?
Java:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
    Player p = (Player)sender;
    Player target = Bukkit.getPlayer(args[1]);
        if(p.hasPermission("ZendeX.Essentials"))
        {
            if(args.length == 0)
            {
                p.sendMessage("§cИспользуйте: /gm [0,1,2] (Nickname)");
            }
            if(args.length == 1)
            {
                if(args[0].equalsIgnoreCase("0"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else...
1. Player target = Bukkit.getPlayer(args[1]); - будет бросать IndexOutOfBoundsException каждый раз, когда твою команду вызвали с одним или без аргументов.
2. if(args.length == 0) замени на if(args.length < 2)
3. if(args.length == 1) замени на if(args.length == 2)
4. Ты никогда не возвращаешь true,
5. Права для команды можно установить в plugin.yml
6. Рекомендую вынести всё в switch case и избавиться от дубликации кода в виде
Java:
if(target == null || !target.isOnline())
{
    p.sendMessage("Игрок оффлайн или ник введен не верно!");
}
 
Объясните мне пожалуйста, почему это не работает?
Java:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
    Player p = (Player)sender;
    Player target = Bukkit.getPlayer(args[1]);
        if(p.hasPermission("ZendeX.Essentials"))
        {
            if(args.length == 0)
            {
                p.sendMessage("§cИспользуйте: /gm [0,1,2] (Nickname)");
            }
            if(args.length == 1)
            {
                if(args[0].equalsIgnoreCase("0"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else
                    {
                        p.sendMessage("§cУ игрока успешно обновился игровой режим!");
                        target.setGameMode(GameMode.SURVIVAL);
                    }
                }
                if(args[0].equalsIgnoreCase("1"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else
                    {
                        p.sendMessage("§cУ игрока успешно обновился игровой режим!");
                        target.setGameMode(GameMode.CREATIVE);
                    }
                }
                if(args[0].equalsIgnoreCase("2"))
                {
                    if(target == null || !target.isOnline())
                    {
                        p.sendMessage("Игрок оффлайн или ник введен не верно!");
                    } else
                    {
                        p.sendMessage("§cУ игрока успешно обновился игровой режим!");
                        target.setGameMode(GameMode.ADVENTURE);
                    }
                }
            }
        }
        return false;
    }
1) Коммандсендер может быть консолью. И тогда метод обосрётся с самого начала.
2) Установку gm можно вообще вынести в отдельный метод. У тебя кроме цифры гм ничего не меняется, не заметил?
Java:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
    if (!(sender instanceof Player))
    {
        return false;
    }

    // На этом этапе у нас в 'sender' обьект плеера,
    // но доставать его оттуда не обязательно,
    // все нужные методы есть в самом сендере

    if (!sender.hasPermission("blabla"))
    {
        sender.sendMessage("no perm");
        return false;
    }

    if (args.length != 2)
    {
        sender.sendMessage("Use /gamemode mode playerName");
        return false;
    }

    this.setGamemode(sender, args[0], args[1]);
    sender.sendMessage("player gamemode updated");
    return true;
}

private void setGamemode(CommandSender sender, String playerName, String gamemodeArgument)
{
    int gamemode = Integer.parseInt(gamemodeArgument); // сам тут обрабатываешь ошибку короче, если вместо числа написали что угодно ещё

    Player target = Bukkit.getPlayerExact(playerName);

    if (target == null || !target.isOnline())
    {
        sender.sendMessage("игрок не найден!");
        return;
    }

    target.setGamemode(gamemode == 0 ? Gamemode.SURVIVAL : gamemode == 1 ? Gamemode.CREATIVE : Gamemode.ADVENTURE);
}
И чтобы уменьшать адскую вложенность кода используй обратные условия.
 
Последнее редактирование:
Назад
Сверху Снизу