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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lisenochek, 6 июл 2016.

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

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Всем привет. Как сделать так, чтобы ключи HashMap не пропадали после перезапуска сервера. Например. Человек заболел. После перезагрузки он болеть перестает, но вот бесконечный голод остается, а мне это не надо. Помогите мне с проблемой.
     
  2. Хостинг MineCraft
    <
  3. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Не пользоваться HashMap. Храни данные о заболевших в Flat файлах, либо mysql.
     
  4. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Так записывай мапу в конфиг.
     
  5. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Как? Я только ArrayList юзал и то как-то криво.[DOUBLEPOST=1467819973,1467819942][/DOUBLEPOST]
    Что такое Flat файл?
     
  6. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    При выключении плагина вручную сохранять всё содержимое hashmap в файл, при включении -- восстанавливать.
     
  7. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    А как это сделать? Я пробовал, как с ArrayList, но ничего не вышло.
     
  8. Sonicxd2

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

    Баллы:
    76
    Код:
          HashMap<Player, String> hashmap = new HashMap<>();
            for(Player p:hashmap.keySet()){
                plugin.getConfig().set("hashmap."+p.getName(), hashmap.get(p));
            }
    Примерно так, при заходе игрока смотришь есть ли у него болезнь.
     
  9. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Ничего не происходит. Вот немного переделанный код:

    Код:
        public static HashMap<Player, Boolean> sickPlayers = new HashMap<Player, Boolean>(); {
            for(Player p:sickPlayers.keySet()) {
                plugin.getConfig().set("hashmap."+p.getName(), sickPlayers.get(p));
            }
        }
    Может быть у меня хешмепы в другой классе?
     
  10. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Просто у тебя код делает невыполняемые функции.
    Цикл с сохранением надо производить при сохранении мапы, а не после её инициализации.
    Хранить в картах Player - фу. Храни либо UUID, либо ник игрока.
     
  11. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Не понимаю, как!

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

    UUID хотелось бы сделать, но когда делал, не работало,а ник неймы - устарело.
     
  12. CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Мозги твои устарели, а мапки с никами отлично работают. Под UUID сейчас только лицушники стелятся, ибо с ними гемморой. На пиратке же с UUID можно не мучиться.
     
  13. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek

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

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

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А зачем тебе HashMap, когда можно обойтись ArrayList?
     
  15. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Да не знаю. Как-то привык к нему.[DOUBLEPOST=1467966314,1467966146][/DOUBLEPOST]
    Настраивать его мне как-то проще. С ArrayList можно сказать я почти не знаком. Разве что только он читает миры, в котором плагин работать не будет.
     
  16. Code

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

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    из хешмапы быстрее будет достать map.get(player). чем из листа list.contains(player), но сохранять эту мапу как мапу действительно тупо.

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

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    Попробовал в ГК сделать так:

    Код:
        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();
            }
        }
    Наверно очередной мой криворукий код. Он все равно не сохраняет.
     
  18. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
        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() игнорируй.
     
  19. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    А почему String, а не Player?[DOUBLEPOST=1467969250,1467969107][/DOUBLEPOST]Если я поставлю String, ругаются все классы, где задействован хешмеп.
     
  20. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Потомучто потом получить назад игрока немного сложнее.[DOUBLEPOST=1467969597,1467969554][/DOUBLEPOST]
    Ну так добавляй в мапу или бери из неё через player.getName()
     
  21. Автор темы
    Lisenochek

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

    Баллы:
    76
    Имя в Minecraft:
    Lisenochek
    В цикле не знаю, что указать. Укажу String - ругается на Bukkit.getOnlinePlayers(), а из-за этого ругается весь класс с таймером.
     

Поделиться этой страницей