Войти или зарегистрироваться

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

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Всем доброго времени суток, уважаемые форумчане.

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

Собственно, имею конфиг, следующего вида:
Код:
Arguments
    some_arg:
        value: "Some string value"
    another_arg:
        value: "Another string value"

Что мне нужно:
Мне нужно получить список аргументов и проверить, соответствует ли аргумент, введённый игроком, списку аргументов, что указаны в конфиге.

Класс Commands:
Java:
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;
    }
}
Та часть кода, которая не вызывается:
Java:
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
        }
    }
}

Пробовал я достаточно много способов, но из всех мной опробованных, ни один не рабочий.

Прошу помощи.
 
Последнее редактирование:
Java:
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;
}
 
Java:
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;
}
Не работает. Сейчас весь класс Commands скину.
 
Последнее редактирование:
А команды то зарегистрированы?
Commands:
Java:
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?
Да команды зарегистрированы.
 
Commands:
Java:
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?
Да команды зарегистрированы.
Commands:
Java:
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?
Да команды зарегистрированы.
В самом плагине.Не забиваем лучше делать 1 команда в 1 класе.
 
В самом плагине.Не забиваем лучше делать 1 команда в 1 класе.
В Main классе? Зарегистрировал конечно. Другие команды то работают. Насчёт разброса команд по разным классам - не уверен, что это решит мою проблему.
 
Java:
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();
    }
    //...
}
 
;
Java:
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();
    }
    //...
}
Ты мне Yoox'у напоминаешь. Молча и в точку. Какой раз уже выручаешь)
Побежал проверять.
Ещё раз спасибо :)
 
Так же, используй switch instead if. Более читабельно, и иерархия будет более вменяемой.
 
Так же, используй switch instead if. Более читабельно, и иерархия будет более вменяемой.
В каком смысле? Типо:
Java:
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
И происходит какое-либо действие.

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

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

По-идее, все, что Вы делаете, должно работать без проблем.
Кстати, методом getStringList(String) список строк из предложенного конфига не получить.
Делайте примерно так:
Java:
    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;
    }
 
Commands:
Java:
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;
    }
}
Конкретно, вот эти строчки кода не запускаются:
Java:
          for (String c : Configuration.COMMANDS)
           {
              if (args[0].equalsIgnoreCase(c))
              {
                  sender.sendMessage("Тест прошёл успешно!");
                  break;
              }
           }
        }
Возможно, повторюсь, но остальные команды из этого же класса работают отлично. А это значит что команда зарегистрирована и в plugin.yml, и в Main классе.

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

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

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

UPD: Поправил топик, расписал всё более подробно, добавил весь класс Commands. Всё ещё не нашёл решение проблемы. Даже в интернете нет :(
 
Последнее редактирование:
Всё ещё не нашёл решение проблемы. Даже в интернете нет :(
Вот Вам рабочий пример со списком из конфига:
Конфиг:
YAML:
Commands:
  test:
    value: someTestValue
  reload:
    value: someReloadValue
Main.java:
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:
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
 
Вот Вам рабочий пример со списком из конфига:
Конфиг:
YAML:
Commands:
  test:
    value: someTestValue
  reload:
    value: someReloadValue
Main.java:
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:
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;
    }
}
Посмотреть вложение 40562
Выглядит как что-то рабочее. Ещё раз спасибо. Пошёл проверять.
 
Java:
   @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;
    }
На заметку, вдруг пригодится :)
И метод от @fall.us, и метод JekaRUS полностью рабочие и проверены мной. Спасибо всем кто пытался мне помочь.

Решено. Закрыто.
 
Последнее редактирование:
Статус
Закрыто для дальнейших ответов.
Назад
Верх