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

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

Discussion in 'Разработка плагинов для новичков' started by Grazy, May 23, 2017.

Thread Status:
Not open for further replies.
  1. Автор темы
    Grazy

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

    Trophy Points:
    76
    Имя в Minecraft:
    Prost
    Достать случайное значение из конфига. Есть следующий код.
    Code:
        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 Старожил Пользователь

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

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

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    Prost
    Ясн, моя не внимательность :(
     
    Last edited: May 23, 2017
  6. Ission

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

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    Prost
    Я час мучался, пока вы не сказали мне про то что я забыл "locations", это все моя не внимательность(((.
    Этим цыклом получается мы перебираем все строки в конфиге что у нас есть, а то у меня в коде почему-то берет 1 строку.
    Code:
    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 Старожил Девелопер Пользователь

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

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

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

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

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

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

    Trophy Points:
    46
    Имя в Minecraft:
    opy
    Code:
    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 Активный участник Пользователь

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

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

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    Prost
    Ладно всем спасибо за помощь, спасибо что помогли темы закрываю.
     
Thread Status:
Not open for further replies.

Share This Page