1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как проверить, есть ли такой ключ в HashMap

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

Статус темы:
Закрыта.
  1. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    И так, у меня есть HashMap, в котором записываю все нужные мне данные.
    Код:
    private static HashMap<Player, Economy> economies = new HashMap<Player, Economy>();
    
    И получаю нужные мне данные через:

    Код:
    public static Economy getEconomy(Player player) {
        return economies.get(player);
    }
    
    public static HashMap<Player, Economy> getEconomies() {
        return economies;
    }
    
    И теперь мне надо проверить, есть ли такой ключ в HashMap:

    Код:
    @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
    
            if (!EconomyManager.getEconomies().containsKey(player)) {
                Economy economy = new Economy(player, 0);
                EconomyManager.getEconomies().put(player, economy);
            }
    
        }
    Захожу на сервер, игрок добавляется в хэшмап и всё правильно.

    И я для примера выдам игроку 500 заработанных монет:

    Код:
    if (args[0].equalsIgnoreCase("set")) {
                EconomyManager.getEconomy(player).setEarned(Integer.valueOf(args[1]));
                return true;
            }
    Монеты выдаются и всё отображается правильно.

    НО проблема в том, что после перезахода игрока все данные сбрасываются и игрок записывается в хэшмап заново. Может я проверяю на наличие игрока в хэшмапе неправильно?

    Все классы:

    EconomyManager:

    Код:
    public class EconomyManager {
    
        private static HashMap<Player, Economy> economies = new HashMap<Player, Economy>();
    
        public static Economy getEconomy(Player player) {
            return economies.get(player);
        }
    
        public static HashMap<Player, Economy> getEconomies() {
            return economies;
        }
    }
    
    EventManager:

    Код:
    public class EventManager implements Listener {
    
        @EventHandler
        public void onJoin(PlayerJoinEvent event) {
            Player player = event.getPlayer();
    
            if (!EconomyManager.getEconomies().containsKey(player)) {
                Economy economy = new Economy(player, 0);
                EconomyManager.getEconomies().put(player, economy);
            }
    
        }
    
    }
    Economy:

    Код:
    public class Economy {
    
        private Player player;
        private Integer earned;
    
        public Economy(Player player, Integer earned) {
            this.player = player;
            this.earned = earned;
        }
    
        public Player getPlayer() {
            return player;
        }
    
        public Integer getEarned() {
            return earned;
        }
    
        public void setEarned(Integer earned) {
            this.earned = earned;
        }
    
    }
     
  2. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
  3. Sturm_PT

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

    Баллы:
    76
    1)не апай тему через две минуты, она и так в топе
    2)economies.containsKey(player) проверяет, есть ли ключ в мапе
     
  4. Fairwol

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

    Баллы:
    61
    В твоём случае надо хранить не объект <Player>, а String ника игрока или UUID игрока.
    Если не имеешь приватного лаунчера, то лучше записывать UUID, соответственно при входе поместить в контейнс
    event.getPlayer().getUUID();
     
  5. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Сейчас проверю, спасибо за быстрый ответ!
     
  6. Fairwol

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

    Баллы:
    61
    Объект игрока можно хранить в рантайме, но не в хешмапе, после перезахода на сервере у тебя создается новый объект, исходя из этого и не находит через контейнс в мапе.
     
  7. Автор темы
    xflyiwnl

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

    Баллы:
    66
    Имя в Minecraft:
    xflyiwnl
    Блин, спасибо вам огромное!
    Много времени не кодил, забыл про это.
     
Статус темы:
Закрыта.

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