Помогите Достать случайное значение из конфига.

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

Grazy

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Prost
Достать случайное значение из конфига. Есть следующий код.
Код:
    final Set<String> set = Main.instance.config.getConfigurationSection("locations").getKeys(false);
    final String result = new ArrayList<>(set).get(new Random().nextInt(set.size()));
 
    public boolean abs(CommandSender sender){
        if(sender instanceof Player){
            return false;
        }
        return true;
    }
    @Override
    public boolean onCommand (CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("rtp")){
            if (abs(sender)){
                sender.sendMessage("Uo dont to player");
                return true;
            }
            Player p = (Player) sender;
            Location result1 = new Location(Bukkit.getWorld(Main.instance.getConfig().getString(result + ".world")), Main.instance.getConfig().getInt(result + ".x"), Main.instance.getConfig().getInt(result + ".y"), Main.instance.getConfig().getInt(result + ".z"));
            p.teleport(result1);
        }
        return true;
    }
Судя по коду ясно что я хочу телепортировать игрока в случайное место с координатами прописанными в конфиге. При прописывании команды ошибка в строке Location result1.
 
Я могу сказать что ваш код ужасен, подумайте над содержимым и избавьтесь от создания такого количества объектов подобным образом. Например можете создать в этом классе List, в который добавите все возможные Location, а уже из него выбирать и телепортировать на конкретную.
На счёт вашей проблемы. Вы выбираете ключи из секции ".getConfigurationSection("locations")", в то время, как в самом коде вы используете ".getConfig().getString(result + ".world")", что значит, что вы игнорируете "locations", в этом может быть проблема.
 
Ясн, моя не внимательность :(
 
Последнее редактирование:
Я новичок в джаве, потом подумаю как это все оформить нормально.
Значит мне нужно перебирать не ключи, а сами строки? Не подскажите метод, или пример его использования.
Конфиг выглядит как-то так.
locations:
'Tochka':
world: world
x: 118
y: 171
z: 181
Я так и понял. Давайте я сейчас покажу пару моментов, а вы сами потом их как-нибудь вместите.
Инициализация набора локаций, желательно при инициализации класса. List<Location> вынести в сам класс.
Java:
List<Location> locations;
Random rand = new Random();
....
    FileConfigurations config = Main.instance.getConfig();
    final Set<String> set = config.getConfigurationSection("locations").getKeys(false);
    locations = new ArrayList<>();
    for(String s: set)
       locations.add(new Location(Bukkit.getWorld(config.getString("locations."+s+ ".world")), config.getInt("locations."+s+".x"), config.getInt("locations."+s+".y"), config.getInt("locations."+s+".z")));
А вот таким образом мы сможем получить случайную Location из тех, что собрали из конфига выше.
Java:
locations.get(rand.nextInt(locations.size())
 
Я час мучался, пока вы не сказали мне про то что я забыл "locations", это все моя не внимательность(((.
Этим цыклом получается мы перебираем все строки в конфиге что у нас есть, а то у меня в коде почему-то берет 1 строку.
Код:
for(String s: set)
   locations.add(new Location(Bukkit.getWorld(config.getString("locations."+s+".world")), config.getInt("locations."+s+".x"), config.getInt("locations."+s+".y"), config.getInt("locations."+s+".z")));
 
Я час мучался, пока вы не сказали мне про то что я забыл "locations", это все моя не внимательность(((.
Этим цыклом получается мы перебираем все строки в конфиге что у нас есть, а то у меня в коде почему-то берет 1 строку.
Код:
for(String s: set)
   locations.add(new Location(Bukkit.getWorld(config.getString("locations."+s+".world")), config.getInt("locations."+s+".x"), config.getInt("locations."+s+".y"), config.getInt("locations."+s+".z")));
Да, должно перебрать все ключи в "locations".
 
Я так и понял. Давайте я сейчас покажу пару моментов, а вы сами потом их как-нибудь вместите.
Инициализация набора локаций, желательно при инициализации класса. List<Location> вынести в сам класс.
Java:
List<Location> locations;
Random rand = new Random();
....
    FileConfigurations config = Main.instance.getConfig();
    final Set<String> set = config.getConfigurationSection("locations").getKeys(false);
    locations = new ArrayList<>();
    for(String s: set)
       locations.add(new Location(Bukkit.getWorld(config.getString("locations."+s+ ".world")), config.getInt("locations."+s+".x"), config.getInt("locations."+s+".y"), config.getInt("locations."+s+".z")));
А вот таким образом мы сможем получить случайную Location из тех, что собрали из конфига выше.
Java:
locations.get(rand.nextInt(locations.size())
А как потом телепортировать игрока на эту локацию?
 
А как потом телепортировать игрока на эту локацию?
Java:
FileConfiguration config = Main.instance.getConfig();
ConfigurationSection section = config.getConfigurationSection("locations");

List<Location> locs = new ArrayList<>();

for(String key: section.getKeys(false)) {
    section = config.getConfigurationSection("locations." + key);

    World world;
    double x, y, z;
    float yaw, pitch;

    try {
        world = Bukkit.getWorld(section.getString("world"));
        x = section.getDouble("x");
        y = section.getDouble("y");
        z = section.getDouble("z");
        yaw = section.getLong("yaw");
        pitch = section.getLong("pitch");

        Location loc = new Location(world, x, y, z, yaw, pitch);
        locs.add(loc);
    } catch (NumberFormatException | NullPointerException ex) {
        Main.instance.getLogger().log(Level.WARNING, "Не удалось найти локацию!", ex);
    }
}

Location rndLoc = locs.get(new Random().nextInt(locs.size()));
p.teleport(rndLoc);
Что то вроде такого :)
 
Немного запутанно, но спасибо теперь вроде бы разобрался что к чему.
Получилось. Телепортирует по значением которые есть в конфиге, но если я добавлю еще одну точку, то плагин ее не видет до тех пор пока я не перезагружу сервер. Можно ли как-то обновлять лист с значениями при добавлении новой точки.
 
Немного запутанно, но спасибо теперь вроде бы разобрался что к чему.
Получилось. Телепортирует по значением которые есть в конфиге, но если я добавлю еще одну точку, то плагин ее не видет до тех пор пока я не перезагружу сервер. Можно ли как-то обновлять лист с значениями при добавлении новой точки.
Можно.
Шедулер тебе в помощь
 
Ладно всем спасибо за помощь, спасибо что помогли темы закрываю.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх