Помогите Ключи HashMap пропадают после перезагрузки сервера

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Как сделать так, чтобы ключи HashMap не пропадали после перезапуска сервера. Например. Человек заболел. После перезагрузки он болеть перестает, но вот бесконечный голод остается, а мне это не надо. Помогите мне с проблемой.
 
Всем привет. Как сделать так, чтобы ключи HashMap не пропадали после перезапуска сервера. Например. Человек заболел. После перезагрузки он болеть перестает, но вот бесконечный голод остается, а мне это не надо. Помогите мне с проблемой.
Не пользоваться HashMap. Храни данные о заболевших в Flat файлах, либо mysql.
 
При выключении плагина вручную сохранять всё содержимое hashmap в файл, при включении -- восстанавливать.
 
При выключении плагина вручную сохранять всё содержимое hashmap в файл, при включении -- восстанавливать.
А как это сделать? Я пробовал, как с ArrayList, но ничего не вышло.
 
А как это сделать? Я пробовал, как с ArrayList, но ничего не вышло.
Код:
      HashMap<Player, String> hashmap = new HashMap<>();
        for(Player p:hashmap.keySet()){
            plugin.getConfig().set("hashmap."+p.getName(), hashmap.get(p));
        }
Примерно так, при заходе игрока смотришь есть ли у него болезнь.
 
Ничего не происходит. Вот немного переделанный код:

CSS:
    public static HashMap<Player, Boolean> sickPlayers = new HashMap<Player, Boolean>(); {
        for(Player p:sickPlayers.keySet()) {
            plugin.getConfig().set("hashmap."+p.getName(), sickPlayers.get(p));
        }
    }

Может быть у меня хешмепы в другой классе?
 
Ничего не происходит. Вот немного переделанный код:

CSS:
    public static HashMap<Player, Boolean> sickPlayers = new HashMap<Player, Boolean>(); {
        for(Player p:sickPlayers.keySet()) {
            plugin.getConfig().set("hashmap."+p.getName(), sickPlayers.get(p));
        }
    }

Может быть у меня хешмепы в другой классе?
Просто у тебя код делает невыполняемые функции.
Цикл с сохранением надо производить при сохранении мапы, а не после её инициализации.
Хранить в картах Player - фу. Храни либо UUID, либо ник игрока.
 
Просто у тебя код делает невыполняемые функции.
Цикл с сохранением надо производить при сохранении мапы, а не после её инициализации.
Хранить в картах Player - фу. Храни либо UUID, либо ник игрока.
Не понимаю, как!

Понял только то, что нельзя сохранять мапу после ее включения.

UUID хотелось бы сделать, но когда делал, не работало,а ник неймы - устарело.
 
Не понимаю, как!

Понял только то, что нельзя сохранять мапу после ее включения.

UUID хотелось бы сделать, но когда делал, не работало,а ник неймы - устарело.
Мозги твои устарели, а мапки с никами отлично работают. Под UUID сейчас только лицушники стелятся, ибо с ними гемморой. На пиратке же с UUID можно не мучиться.
 
Мозги твои устарели, а мапки с никами отлично работают. Под UUID сейчас только лицушники стелятся, ибо с ними гемморой. На пиратке же с UUID можно не мучиться.


Значит понятно. Буду использовать ники.

Почитав гайды я понял, что мапы надо сохранять в ГК в onEnable или в onDisable, пытался циклом, который чуть выше, но не вышло.
 
Последнее редактирование:
Значит понятно. Буду использовать ники.

Почитав гайды я понял, что мапы надо сохранять в ГК в onEnable или в onDisable, пытался циклом, который чуть выше, но не вышло.
А зачем тебе HashMap, когда можно обойтись ArrayList?
 
А зачем тебе HashMap, когда можно обойтись ArrayList?
Да не знаю. Как-то привык к нему.
Да не знаю. Как-то привык к нему.
Настраивать его мне как-то проще. С ArrayList можно сказать я почти не знаком. Разве что только он читает миры, в котором плагин работать не будет.
 
А зачем тебе HashMap, когда можно обойтись ArrayList?
из хешмапы быстрее будет достать map.get(player). чем из листа list.contains(player), но сохранять эту мапу как мапу действительно тупо.

Автор, ты же сказал, что сохранял ArrayList? возьми из мапы только тех, у кого стоит true, и запиши в этот лист и сохрани. При загрузке загрузи этот лист и всех из листа запихни в мапу.
 
Попробовал в ГК сделать так:

JavaScript:
    public  void saveHashMap() {
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            for(Player p : com.realistic.list.MinecraftList.sickPlayers.keySet()) {
                this.getConfig().set("hashmap."+p.getName(), com.realistic.list.MinecraftList.sickPlayers.get(p));
            }
            File f = new File (getDataFolder()+File.separator+"hashmap.yml");
            if (f.exists()) f.delete();
            cfg.save(f);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

Наверно очередной мой криворукий код. Он все равно не сохраняет.
 
Java:
    HashMap<String, Boolean> hm = new HashMap<String, Boolean>();
    Random r = new Random();
    public void onEnable() {
        this.saveDefaultConfig();
        if (this.getConfig().isConfigurationSection("hm")) {
            for (String a : this.getConfig().getConfigurationSection("hm").getKeys(false)) {
                hm.put(a, this.getConfig().getBoolean("hm." + a));
                this.getConfig().set("hm." + a, null);
            }
            this.saveConfig();
        }
        System.out.print(hm);
        putMap();
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    public void onDisable() {
        for (String pn : hm.keySet()) {
            this.getConfig().set("hm."+ pn, hm.get(pn));
        }
        this.saveConfig();
    }
    public void putMap() {
        if (hm.isEmpty()) {
            for (int i=0; i < 30; i ++) {
                hm.put("player"+ r.nextInt(999999), r.nextBoolean());
            }
        }
        System.out.print(hm);
    }
както так получилось. putMap() игнорируй.
 
Java:
    HashMap<String, Boolean> hm = new HashMap<String, Boolean>();
    Random r = new Random();
    public void onEnable() {
        this.saveDefaultConfig();
        if (this.getConfig().isConfigurationSection("hm")) {
            for (String a : this.getConfig().getConfigurationSection("hm").getKeys(false)) {
                hm.put(a, this.getConfig().getBoolean("hm." + a));
                this.getConfig().set("hm." + a, null);
            }
            this.saveConfig();
        }
        System.out.print(hm);
        putMap();
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    public void onDisable() {
        for (String pn : hm.keySet()) {
            this.getConfig().set("hm."+ pn, hm.get(pn));
        }
        this.saveConfig();
    }
    public void putMap() {
        if (hm.isEmpty()) {
            for (int i=0; i < 30; i ++) {
                hm.put("player"+ r.nextInt(999999), r.nextBoolean());
            }
        }
        System.out.print(hm);
    }
както так получилось. putMap() игнорируй.

А почему String, а не Player?
Если я поставлю String, ругаются все классы, где задействован хешмеп.
 
А почему String, а не Player?
Потомучто потом получить назад игрока немного сложнее.
Если я поставлю String, ругаются все классы, где задействован хешмеп.
Ну так добавляй в мапу или бери из неё через player.getName()
 
Потомучто потом получить назад игрока немного сложнее.

Ну так добавляй в мапу или бери из неё через player.getName()

В цикле не знаю, что указать. Укажу String - ругается на Bukkit.getOnlinePlayers(), а из-за этого ругается весь класс с таймером.
 
Назад
Верх