Помогите Как сохранить это в конфиг?

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

pro100koder

Активный участник
Пользователь
Баллы
76
Окей. У меня есть миниигра. Добавляю в неё team режим. Остановился и очень сильно заступорился на проблеме о точках спавнов тимейтов. Окей, добавляется всё в HM хорошо, всё работает, как надо, но всё никак не могу нормальное сохранение и доставание из config-а сделать... Окей, локации я храню в HashMap<String (Название цвета команды), List<Location>>. И не знаю, почему, но ну ни в какую не могу нормально сохранять и загружать это... Окей, сохраняется оно более-менее нормально этим кодом.
Код:
for(Entry<String, List<Location>> tostore: Tspawns.entrySet()) {
            for(int i=0;i<tostore.getValue().size();i++){
                getConfig().set("Teams."+tostore.getKey()+"."+i+".World",tostore.getValue().get(i).getWorld().getName());
                getConfig().set("Teams."+tostore.getKey()+"."+i+".x",tostore.getValue().get(i).getX());
                getConfig().set("Teams."+tostore.getKey()+"."+i+".y",tostore.getValue().get(i).getY());
                getConfig().set("Teams."+tostore.getKey()+"."+i+".z",tostore.getValue().get(i).getZ());
            }
        }
Но какое чудо нужно написать, чтобы обратно загружать - kill me please. Вот на чём я сейчас остановился. Разумеется, код не работает...
Код:
for(String b : getConfig().getConfigurationSection("Teams").getKeys(false)) {
            List<Location> toadd = new ArrayList<>();
            for(String i : getConfig().getConfigurationSection("Teams."+b).getKeys(false)){
                toadd.add(new Location(Bukkit.getWorld(getConfig().getString("Teams." + b + "."+i+".World")),getConfig().getInt("Teams." + b + "."+i+".x"), getConfig().getInt("Teams." + b + "."+i+".y"), getConfig().getInt("Teams." + b + "."+i+".z")));
            }
            Tspawns.put(getConfig().getString("Teams."+b), toadd);
        }
*Если что, сохраняю в onDisable, загружаю в onEnable.
 
Делай сериализацию / десериализацию вручную, например, сохраняешь локацию в строку в виде:
"<world> <x> <y> <z> <yaw> <pitch>"
Код:
String locData = new StringBuilder()
        .append(location.getWorld().getName()).append(" ")
        .append....
        .toString();
Для выгрузки берешь строку, сплиттишь через пробел на части:
Код:
String[] data = locData.split(" ");
А дальше каждый параметр по очереди парсишь, например:
Код:
double x = Double.parseDouble(data[1]);

Делаешь всего два метода, которые работают с сериализацией и больше не паришся.
 
Код:
package Example.sfg;

import java.util.Map;

import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.SerializableAs;

@SerializableAs(value = "MapSer")
public class MapSer implements ConfigurationSerializable {

    private Map<String, Object> map;

    public MapSer(Map<String, Object> map) {
        this.map = map;
    }

    @Override
    public Map<String, Object> serialize() {
        return map;
    }

    public static MapSer deserialize(Map<String, Object> map) {
        return new MapSer(map);
    }

    public Map<String, Object> get() {
        return map;
    }
}
Регаешь его в главном классе.

Код:
    static {
        ConfigurationSerialization.registerClass(MapSer.class, "MapSer");
    }
Код:
        MapSer ms = new MapSer(map);
        this.getConfig().set("name", ms);
        ms = (MapSer) this.getConfig().get("name", MapSer.class);
 
Последнее редактирование:
Код:
package Example.sfg;

import java.util.Map;

import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.SerializableAs;

@SerializableAs(value = "MapSer")
public class MapSer implements ConfigurationSerializable {

    private Map<String, Object> map;

    public MapSer(Map<String, Object> map) {
        this.map = map;
    }

    @Override
    public Map<String, Object> serialize() {
        return map;
    }

    public static MapSer deserialize(Map<String, Object> map) {
        return new MapSer(map);
    }

    public Map<String, Object> get() {
        return map;
    }
}
Регаешь его в главном классе.

Код:
    static {
        ConfigurationSerialization.registerClass(MapSer.class, "MapSer");
    }
Код:
        MapSer ms = new MapSer(map);
        this.getConfig().set("name", ms);
        ms = (MapSer) this.getConfig().get("name", MapSer.class);
Извиняюсь, но я решил уже по старинке) А зачем нужно что-то особое? Как я понял (тупо поглядев на название), сериализация - это что-то вроде сохранения данных в реальном времени? Просто данные о спавнах нужно сохранить раз в жизни, а потом просто использовать данные, и не терять их при краше. Данных немного, так что любым способом разницы на нагрузку сервера не заметно.
 
Извиняюсь, но я решил уже по старинке) А зачем нужно что-то особое? Как я понял (тупо поглядев на название), сериализация - это что-то вроде сохранения данных в реальном времени? Просто данные о спавнах нужно сохранить раз в жизни, а потом просто использовать данные, и не терять их при краше. Данных немного, так что любым способом разницы на нагрузку сервера не заметно.
Нет, не в реальном времени, а более правильным способом..
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх