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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    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.
     
  2. Хостинг MineCraft
    <
  3. Mr_RoboMan

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

    Баллы:
    123
    Да прибудет с нами Ванга!
     
  4. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Я могу сказать что ваш код ужасен, подумайте над содержимым и избавьтесь от создания такого количества объектов подобным образом. Например можете создать в этом классе List, в который добавите все возможные Location, а уже из него выбирать и телепортировать на конкретную.
    На счёт вашей проблемы. Вы выбираете ключи из секции ".getConfigurationSection("locations")", в то время, как в самом коде вы используете ".getConfig().getString(result + ".world")", что значит, что вы игнорируете "locations", в этом может быть проблема.
     
  5. Автор темы
    Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Ясн, моя не внимательность :(
     
    Последнее редактирование: 23 май 2017
  6. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Я так и понял. Давайте я сейчас покажу пару моментов, а вы сами потом их как-нибудь вместите.
    Инициализация набора локаций, желательно при инициализации класса. List<Location> вынести в сам класс.
    Код:
    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 из тех, что собрали из конфига выше.
    Код:
    locations.get(rand.nextInt(locations.size())
     
  7. Автор темы
    Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Я час мучался, пока вы не сказали мне про то что я забыл "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")));
    
     
  8. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Да, должно перебрать все ключи в "locations".
     
  9. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    ШТО?!?
     
  10. Автор темы
    Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    А как потом телепортировать игрока на эту локацию?
     
  11. iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Код:
    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);
    Что то вроде такого :)
     
  12. Автор темы
    Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Немного запутанно, но спасибо теперь вроде бы разобрался что к чему.[DOUBLEPOST=1495650251,1495647507][/DOUBLEPOST]Получилось. Телепортирует по значением которые есть в конфиге, но если я добавлю еще одну точку, то плагин ее не видет до тех пор пока я не перезагружу сервер. Можно ли как-то обновлять лист с значениями при добавлении новой точки.
     
  13. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Можно.
    Шедулер тебе в помощь
     
  14. Автор темы
    Grazy

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

    Баллы:
    76
    Имя в Minecraft:
    Prost
    Ладно всем спасибо за помощь, спасибо что помогли темы закрываю.
     
Статус темы:
Закрыта.

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