1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Проверка названия аргумента.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Vlad8989, 20 апр 2018.

  1. Автор темы
    Vlad8989

    Vlad8989 Активный участник Пользователь

    Баллы:
    61
    Как через if сделать так, что если игрок написал аргумент info то выведет ему то-то, а если ip то-то, а если не указано то-то. (Пример: /goto info - Выводит информацию; /goto ip - Выводит еще что-то; /goto asdv - выводит ошибку что аргумент указан не верно.)
     
  2. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    PHP:
    if(args[0].equals("ip")) {
        
    //то-то
    } else if (args[0].equals("info")) {
        
    //что-то
    } else {
        
    //неправильный аргумент
    }
     
  3. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Я у себя делал через switch, но кто знает этих новичков, ещё попросят им через if переписать :confused:
     
  4. Cristalix

    Cristalix Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Test
    А если напишет iP (P - большая) он никак не отреагирует в цикла switch.
     
  5. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Оно что так, что так хреново, без разницы
     
  6. bristol

    bristol Активный участник Пользователь

    Баллы:
    46
    А разве это по другому сделать как то можно?
     
  7. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    Нет, если сделать args[n].toLowerCase()
     
  8. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Можно strategy для аргов заюзать
     
  9. TheZefirrkka

    TheZefirrkka Активный участник Пользователь

    Баллы:
    76
    Тут с свитча будет достаточно.
     
  10. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Тогда так.
    Код:
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            boolean b = false;
            if(args.length==0) {
                return b;
            }
            try {
                Method method = this.getClass().getDeclaredMethod(args[0].toLowerCase(), CommandSender.class, String[].class);
                b = (boolean) method.invoke(this, sender, args);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return b;
        }

    Код:
        public boolean info(CommandSender sender, String[] args) {
            //TODO
            return true;
        }
     
        public boolean ip(CommandSender sender, String[] args) {
            //TODO
            return false;
        }
     
  11. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Зачем? Можн просто Map<String, Supplier<CommandDTO>>
     
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Варик с мамой у меня уже был.
     
  13. onepastee

    onepastee Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    rsakey
    PHP:
    if(args.length != 0)
            switch (
    args[0].toLowerCase()) {
                    case 
    "ip":
                            \\do 
    something
                            
    break;
                    case 
    "info":
                            \\do 
    something but with info
                            
    break;
            }
    не?
     
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
    public interface ICommand {
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args);
    }

    Код:
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (args.length == 0) {
                return false;
            }
            if (this.plugin.cmds.containsKey(args[0]).toLowerCase()) {
                return this.plugin.cmds.get(args[0].toLowerCase()).onCommand(sender, cmd, label, args);
            }
            return false;
        }
    Код:
    Map<String, ICommand> cmds = new HashMap<String, ICommand>();
    cmds.put("info", new CmdInfo(this));
    cmds.put("ip", new CmdIp(this));
    
     
  15. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну с мапой лучше чем с рефлексией
     
  16. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Не сильно важно. Скорость не особо важна тут, если на команды есть задержка от идиотов.
     
  17. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    С рефлексией то все таки больше шансов ошибиться когда название метода пишешь
     
  18. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Если ты про таб комплит аргументов. На.

    Код:
            for(Method m : this.getClass().getDeclaredMethods()) {
                if(!m.getName().equals("onCommand")/* TODO прочие методы на пропуск*/) {
                    //TODO заполняем таб комплит.
                    m.getName();
                }
            }
     
  19. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    С рефлексией так себе. Из другого класса если над получить, то тоже так же рефлексией, засоряет код, а с мапой норм
     
  20. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Мапа была просто уже, писал же). Осталось еще автомапа по классам из пакета.
     

Поделиться этой страницей