Помогите Достать локации из конфига и загрузить их в лист.

Статус
Закрыто для дальнейших ответов.

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Хотел сделать сохранение координат блоков, которые я предварительно внес в лист и выгрузки тех самых локаций обратно в лист после включения, но уже 2 день я не знаю, как можно внести в лист эти координаты. Помогите мне с загрузкой координат в лист после включения плагина.

Вот сам код, когда сервер выключается и ему нужно перед выключением записать координаты и мир самого блока:
JavaScript:
    @SuppressWarnings("unused")
    public static void save() {

        ConfigurationSection section = API.getInstance().getConfig().getConfigurationSection("AnvilLoc");

        for (String key : section.getKeys(false)) {
            size++;
        }

        for (Location loc : EventListener.loc) {

            API.getInstance().getConfig().set("AnvilLoc." + size + ".World", loc.getWorld().getName());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".X", loc.getX());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".Y", loc.getY());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".Z", loc.getZ());
            API.getInstance().saveConfig();
        }
    }
 
Достанешь построчно потом Location loc = new Location (world, x, y, z);
А уже loc пишешь в лист
 
Через for попробуй
 
JavaScript:
FileConfiguration config;
Set<String> locations;

for(String key : config.getConfigurationSection("[тут верхний элемент конфига]").getKeys(false)){
       
            locations.add(key);
        
}

Попробуй в таком духе. "Верхним элементом конфига" я обозвал (вроде как) AnvilLoc
 
Код:
for (String key : section.getKeys(false)) {
            size++;
        }
        for (Location loc : EventListener.loc) {
            API.getInstance().getConfig().set("AnvilLoc." + size + ".World", loc.getWorld().getName());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".X", loc.getX());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".Y", loc.getY());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".Z", loc.getZ());
            API.getInstance().saveConfig();
        }

Откуда-то берете переменную size, потом ее увеличиваете и записываете много раз в for (Location loc : EventListener.loc) в одну и ту же секцию вашего листа "size" данные.
 
Код:
for (String key : section.getKeys(false)) {
            size++;
        }
        for (Location loc : EventListener.loc) {
            API.getInstance().getConfig().set("AnvilLoc." + size + ".World", loc.getWorld().getName());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".X", loc.getX());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".Y", loc.getY());
            API.getInstance().getConfig().set("AnvilLoc." + size + ".Z", loc.getZ());
            API.getInstance().saveConfig();
        }

Откуда-то берете переменную size, потом ее увеличиваете и записываете много раз в for (Location loc : EventListener.loc) в одну и ту же секцию вашего листа "size" данные.
а не проще все в одну строчку и .split?
 
Попробуй как-то так
Java:
for (int i = 0; i < EventListener.loc.size(); i++) {
Location loc =  EventListener.loc.get(i);

            API.getInstance().getConfig().set("AnvilLoc." + i + ".World", loc.getWorld().getName());
            API.getInstance().getConfig().set("AnvilLoc." + i + ".X", loc.getX());
            API.getInstance().getConfig().set("AnvilLoc." + i + ".Y", loc.getY());
            API.getInstance().getConfig().set("AnvilLoc." + i + ".Z", loc.getZ());
            API.getInstance().saveConfig();
        }
 
бл*** что за костыли алло?!
Java:
    public void addLocations() {
        for (String s : cfg.getConfigurationSection("AnvilLoc").getKeys(false)) {
            try {
                Location loc = stringToLocation(config.getString(s));
                locations.add(loc);
            } catch (Throwable t) {
                // add location failed
            }
        }
    }

    public String locToString(Location loc) {
        return loc.getWorld().getName() + ":" + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ();
    }

    public Location stringToLocation(String str) {
        String str2loc[] = str.split("\\:");
        Location loc = new Location(Bukkit.getServer().getWorld(str2loc[0]), 0, 0, 0);
        loc.setX(Double.parseDouble(str2loc[1]));
        loc.setY(Double.parseDouble(str2loc[2]));
        loc.setZ(Double.parseDouble(str2loc[3]));
        return loc;
    }
 
Последнее редактирование:
Удобнее для визуала делать наглядную иерархию.
 
А из хэша в конфиг:
Java:
    public void loadInConfig() {
        Iterator<Location> iterator = locs.iterator();
        while (iterator.hasNext()){
            Location loc = iterator.next();
            int size = cfg.getConfigurationSection("AnvilLoc").getKeys(false).toArray().length;
            cfg.set("AnvilLoc." + ++size, locToString(loc)); // ++size = Integer.valueOf(size + 1)
            saveConfig();
        }
    }
   
    public String locToString(Location loc) {
        return loc.getWorld().getName() + ":" + loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ();
    }
 
Не, с таким готовым кодом он не сохраняет, printstacktrace молчит.
 
Код:
List<String> list = new ArrayList<String>();
public void onEnable() {
    config = getConfig();
    list = config.getStringList("Anvil");
}
public void onDisable() {
    config.set("Anvil", list);
    saveConfig();
}

@EventHandler
public void PlayerInteract(PlayerInteractEvent e) {
    if (e.isCancelled())
        return;
    Block b = e.getClickedBlock();
    if (e.getAction() == Action.RIGHT_CLICK_BLOCK && list.contains(getLocation(b.getLocation()))
            && b.getType() == Material.ANVIL) {
        e.setCancelled(true);
        //код
    }
}
String getLocation(Location l) {
    return l.getWorld().getName() + ";" + l.getBlockX() + ";" + l.getBlockY() + ";" + l.getBlockZ();
}

Location getLocation(String l) {
    String[] g = l.split(";");
    return new Location(Bukkit.getWorld(g[0]), Integer.parseInt(g[1]), Integer.parseInt(g[2]), Integer.parseInt(g[3]));
}
 
Так ты перезаписываешь те же секции.
List<Map<String, Object>> AnvilLoc = new ArrayList<Map<String, Object>>();
Добавляем мапы locs.add(loc.serialize());
Записываем лист this.plugin.getConfig().set("AnvilLoc", locs);
Читаем лист AnvilLoc = (List<Map<String, Object>>) this.plugin.getConfig().get("AnvilLoc");
Пруфит.
 
alexandrage, help в моей теме.Плиз.Нужно по другому достать значение world, x, y, z.И потом при вводе команды /tphome телепортировалься игрок на Default кординаты.Там я выложил логи и сам плуг.
 
alexandrage, help в моей теме.Плиз.Нужно по другому достать значение world, x, y, z.И потом при вводе команды /tphome телепортировалься игрок на Default кординаты.Там я выложил логи и сам плуг.
Дураку не помочь.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх