Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

[Решено] Получение списка в args[]

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

Статус темы:
Закрыта.
  1. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Всем доброго времени суток, уважаемые форумчане.

    Столкнулся с очередной проблемой, которую не могу решить.

    Собственно, имею конфиг, следующего вида:
    Код:
    Arguments
        some_arg:
            value: "Some string value"
        another_arg:
            value: "Another string value"
    
    Что мне нужно:
    Мне нужно получить список аргументов и проверить, соответствует ли аргумент, введённый игроком, списку аргументов, что указаны в конфиге.

    Класс Commands:
    Код:
    public class Commands
    implements CommandExecutor
    {
        Main plugin = Main.plugin;
        String prefix = Configuration.PREFIX;
        String no_permission = Configuration.NO_PERMISSION;
    
        @Override
        public boolean onCommand(CommandSender sender, Command command, String string, String[] args)
        {
            if (sender instanceof Player)
            {
               Player player = (Player) sender;
    
               if (args.length == 0)
               {
                  Utils.sendHelp(player);
               }
    
               if (args.length == 1)
               {
                  if (args[0].equalsIgnoreCase("reload"))
                  {
                      if (sender.hasPermission("rb.reload"))
                      {
                         plugin.reloadConfig();
                         sender.sendMessage(prefix + Configuration.PLUGIN_RELOADED);
                      } else {
    sender.sendMessage(prefix + no_permission);
                      }
                  }
        
                  if (args[0].equalsIgnoreCase("help"))
                  {
                      Utils.sendHelp(player);
                  }
      
               for (String c : Configuration.COMMANDS)
               {
                  if (args[0].equalsIgnoreCase(c))
                  {
                      sender.sendMessage("Тест прошёл успешно!");
                      break;
                  }
               }
            }
            return true;
        }
    }
    
    Та часть кода, которая не вызывается:
    Код:
    public List <String> list = plugin.getConfig().getStringList("Commands");
    
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
    {
        for (String cmd : list)
        {
            if (args[0].equalsIgnoreCase(cmd)
            {
                //do something
            }
        }
    }
    
    Пробовал я достаточно много способов, но из всех мной опробованных, ни один не рабочий.

    Прошу помощи.
     
    Последнее редактирование: 23 апр 2016
  2. Хостинг MineCraft
    <
  3. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Код:
    public List<String> list = this.getConfig().getStringList("Commands");
    
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
    {
        for (String cmd : this.list)
            if (args[0].equalsIgnoreCase(cmd))
            {
                // Мой код
                break;
            }
    
        return true;
    }
     
  4. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Не работает. Сейчас весь класс Commands скину.
     
    Последнее редактирование: 23 апр 2016
  5. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    А команды то зарегистрированы?
     
  6. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Commands:
    Код:
    public class Commands
    implements CommandExecutor
    {
        Main plugin = Main.plugin;
        String prefix = Configuration.PREFIX;
        String no_permission = Configuration.NO_PERMISSION;
    
        @Override
        public boolean onCommand(CommandSender sender, Command command, String string, String[] args)
        {
            if (sender instanceof Player)
            {
               Player player = (Player) sender;
           
               if (args.length == 0)
               {
                  Utils.sendHelp(player);
               }
       
               if (args.length == 1)
               {
                  if (args[0].equalsIgnoreCase("reload"))
                  {
                      if (sender.hasPermission("rb.reload"))
                      {
                         plugin.reloadConfig();
                         sender.sendMessage(prefix + Configuration.PLUGIN_RELOADED);
                      } else {
                          sender.sendMessage(prefix + no_permission);
                      }
                  }
             
                  if (args[0].equalsIgnoreCase("help"))
                  {
                      Utils.sendHelp(player);
                  }
           
               for (String c : Configuration.COMMANDS)
               {
                  if (args[0].equalsIgnoreCase(c))
                  {
                      sender.sendMessage("Тест прошёл успешно!");
                      break;
                  }
               }
            }
            return true;
        }
    }
    
    Вот в таком виде проверка не работает.

    @slavik123123123, вы имеете ввиду plugin.yml?
    Да команды зарегистрированы.
     
  7. Bohdan_Hrytsak

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

    Баллы:
    76
    Имя в Minecraft:
    NegaTiV
    В самом плагине.Не забиваем лучше делать 1 команда в 1 класе.
     
  8. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    В Main классе? Зарегистрировал конечно. Другие команды то работают. Насчёт разброса команд по разным классам - не уверен, что это решит мою проблему.
     
  9. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Код:
    public class Commands
    implements CommandExecutor
    {
        Main plugin = Main.plugin;
        String prefix = Configuration.PREFIX;
        String no_permission = Configuration.NO_PERMISSION;
       
        public Commands()
        {
            for(String cmd : Configuration.COMMANDS)
                plugin.getCommand(cmd).setExecutor(this);
        }
    
        //....
    }
    
    //Main.java
    public class Main extends JavaPlugin
    {
        //....
        public void onEnable()
        {
            new Commands();
        }
        //...
    }
     
  10. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    ;
    Ты мне Yoox'у напоминаешь. Молча и в точку. Какой раз уже выручаешь)
    Побежал проверять.
    Ещё раз спасибо :)
     
  11. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Так же, используй switch instead if. Более читабельно, и иерархия будет более вменяемой.
     
  12. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    В каком смысле? Типо:
    Код:
    switch(args[0])
    {
        case "someCase":
            // do smth if arg 0 is someCase
        break;
    
        case "kek":
            // do smth if arg 0 is kek
        break;
    
        case "ORRRU":
           // do smth if arg 0 is ORRRU
        break;
             
        default:
          // do smth if there was no equalities in args upper
        break;
    }
    
    UPD: @fall.us не совсем то, что мне нужно. Таким образом я зарегестрировал все команды, которые находятся у меня в конфиге. Но мне нужны не команды, а лист аргументов к одной из команд. Основная команда у меня - "/rb". Вот к ней мне нужно проверять список аргументов из конфига.
    Например, используя конфиг из топика, мне нужно:
    /rb some_command
    И происходит какое-либо действие.

    Извините, если запутал :)
     
    Последнее редактирование: 23 апр 2016
  13. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Да, типа так.
     
  14. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Недели 2 назад кое-кто уже предлагал мне так делать :)
    Но проблему свою я до сих пор так и не решил.
     
  15. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Запутали.

    Проверьте, что ваша основная команда зарегистрирована и записана в plugin.yml. Проверяйте, что список из конфига загружается правильно, и что его размер не равен нулю.

    По-идее, все, что Вы делаете, должно работать без проблем.[DOUBLEPOST=1461438526,1461438239][/DOUBLEPOST]Кстати, методом getStringList(String) список строк из предложенного конфига не получить.
    Делайте примерно так:
    Код:
        public List<String> getCmds()
        {
            List<String> cmdList = new ArrayList<String>();
           
            ConfigurationSection cmds = getConfig().getConfigurationSection("Commands");
           
            for(String cmd : cmds.getKeys(false))
                cmdList.add(cmd);
           
            return cmdList;
        }
     
  16. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Конкретно, вот эти строчки кода не запускаются:
    Код:
              for (String c : Configuration.COMMANDS)
               {
                  if (args[0].equalsIgnoreCase(c))
                  {
                      sender.sendMessage("Тест прошёл успешно!");
                      break;
                  }
               }
            }
    
    Возможно, повторюсь, но остальные команды из этого же класса работают отлично. А это значит что команда зарегистрирована и в plugin.yml, и в Main классе.

    Лист из конфига загружается правильно и не равен 0. Это я уже проверял, работая с этим же листом в другом классе.

    Вроде пишу код уже далеко не первый месяц, а с такой банальщиной справиться самостоятельно не могу :(

    На счёт запутал - извините. Я думал заголовок говорит сам за себя, как это и должно быть :)

    UPD: Поправил топик, расписал всё более подробно, добавил весь класс Commands. Всё ещё не нашёл решение проблемы. Даже в интернете нет :(
     
    Последнее редактирование: 23 апр 2016
  17. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Вот Вам рабочий пример со списком из конфига:
    Конфиг:
    Код:
    Commands:
      test:
        value: someTestValue
      reload:
        value: someReloadValue
    Main.java:
    Код:
    public class Main extends JavaPlugin
    {
        public void onEnable()
        {
            getCommand("cmd").setExecutor(new CmdExec(this));
        }
     
        public List<String> getCmds()
        {
            List<String> cmdList = new ArrayList<String>();
         
            ConfigurationSection cmds = getConfig().getConfigurationSection("Commands");
         
            for(String cmd : cmds.getKeys(false))
                cmdList.add(cmd);
         
            return cmdList;
        }
    }
    CmdExec.java:
    Код:
    public class CmdExec implements CommandExecutor
    {
        private final Main plugin;
     
        public CmdExec(Main plugin)
        {
            this.plugin = plugin;
        }
     
        @Override
        public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] args)
        {
            if(plugin.getCmds().contains(args[0]))
            {
                Bukkit.broadcastMessage(args[0] + " : " + plugin.getConfig().getString("Commands." + args[0] + ".value"));
             
                return true;
            }
         
            return false;
        }
    }
    Снимок экрана (6).png
     
  18. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Выглядит как что-то рабочее. Ещё раз спасибо. Пошёл проверять.
     
  19. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
  20. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Код:
       @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            for (Map.Entry<String, BiFunction<CommandSender, String[], Boolean>> e : comm.entrySet()) {
                if(args[0].equalsIgnoreCase(e.getKey())) {
                    return e.getValue().apply(sender, args);
                }
            }
            return false;
        }
    
    На заметку, вдруг пригодится :)[DOUBLEPOST=1461485834,1461441518][/DOUBLEPOST]И метод от @fall.us, и метод JekaRUS полностью рабочие и проверены мной. Спасибо всем кто пытался мне помочь.

    Решено. Закрыто.
     
    Последнее редактирование: 24 апр 2016
Статус темы:
Закрыта.

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