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

ConfigurationSerializable

Discussion in 'Разработка плагинов для новичков' started by serega6531, Mar 29, 2014.

  1. Автор темы
    serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Как работает ConfigurationSerializable? Как сделать метод deserialize()? Почему у меня очищается конфиг при старте плагина? Нигде не нашёл примера.

    Вот мой код:
    Code:
    package ru.serega6531.NearlySpawns;
    
    import java.util.ArrayList;
    
    import org.bukkit.Location;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.configuration.serialization.ConfigurationSerialization;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class NearlySpawns extends JavaPlugin {
     
        private static FileConfiguration config;
        private static ArrayList<Spawn> spawns = new ArrayList<Spawn>();
     
        public void onEnable(){
            ConfigurationSerialization.registerClass(Spawn.class);
            config = getConfig();
            for(String key : config.getConfigurationSection("spawns").getKeys(false)) {
                getLogger().info("Loading spawn named " + key);
                spawns.add(new Spawn(config.getConfigurationSection("spawns." + key).getValues(false)));
            }
            getCommand("addspawn").setExecutor(new CommandManager());
        }
     
        public void onDisable(){
            saveConfig();
        }
    
    }
    Code:
    package ru.serega6531.NearlySpawns;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.configuration.serialization.ConfigurationSerializable;
    
    public class Spawn implements ConfigurationSerializable {
     
        private Location location;
        private String name;
     
        public Spawn(Location location, String name){
            this.location = location;
            this.name = name;
        }
     
        public Location getLocation() {
            return location;
        }
    
        public String getName() {
            return name;
        }
    
        @Override
        public Map<String, Object> serialize() {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("name", name);
            map.put("loc.x", location.getBlockX());
            map.put("loc.y", location.getBlockY());
            map.put("loc.z", location.getBlockZ());
            return map;
        }
     
        public Spawn(Map<String, Object> map){
            this(new Location(Bukkit.getWorlds().get(0), (int)map.get("loc.x"), (int)map.get("loc.y"), (int)map.get("loc.z")), (String)map.get("name"));
        }
    }
    
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    Up![DOUBLEPOST=1396166261,1396162243][/DOUBLEPOST]Конфиг уже не очищается, но вылезает NPE на строке
    Code:
    spawns.add(new Spawn(config.getConfigurationSection("spawns." + key).getValues(false)));
    [DOUBLEPOST=1396252416][/DOUBLEPOST]Up!
     
  4. kris13

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

    Trophy Points:
    78
    Судя по всему config.getConfigurationSection("spawns." + key) вернуло вам null. Надо бы конечно еще видеть как вы сохраняете в конфиг, но если я правильно помню config.getConfigurationSection("spawns").getKeys(false) вернет полные имена ключей, т.е. spawns.name и получается в методе getConfigurationSection("spawns." + key) вы спрашиваете от ключа spawns.spawns.name. Не уверен, но стоит проверить.
    А зачем вам реализация deserialize? Контракт ConfigurationSerializable предполагает только serialize
     
  5. Автор темы
    serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    А собрать обратно в объект как?
     
  6. Jampire

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

    Trophy Points:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    В данном случае ConfigurationSerializable вообще не нужен.
    просто сохраняем конфиг и всё. (config.save(path))
     
  7. Автор темы
    serega6531

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

    Trophy Points:
    173
    Skype:
    shkurovs
    A Spawn-то как сохранять?
     
  8. kris13

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

    Trophy Points:
    78
    В ConfiguratuionSerialization есть метод deserealize возвращающий ConfiguratuionSerializable, он вас чем-то не устраивает?
     
  9. Reality_SC

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

    Trophy Points:
    123
    Имя в Minecraft:
    Reality_SC
    Если править конфиг руками не будет необходимости, можно использовать Gson.
    С ним всё быстрее и понятнее.
     

Share This Page