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

Помогите HashMap не видит ключ

Тема в разделе "Разработка плагинов для новичков", создана пользователем VirtualGuys, 15 мар 2021.

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

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

    Баллы:
    61
    Здравствуйте. Пишу плагин на классы, и мне нужно делать проверку, было ли игроку уже отправлено данное сообщение, или ещё нет. Я решил использовать для этого HashMap, хотя ранее ими никогда не пользовался. Проблема в том, что когда я делаю проверку на существование ключа (я делал её разными способами, не только как показано ниже), то в итоге ничего не находит. Хотя по сути, после проверки, если ничего не находит, должны добавляться значения false для ключей, но это не работает. Возможно я что-то делаю не так? Заранее спасибо!
    P.S: Я начал делать проверку изначально из-за того, что в консоли выдавало ошибку NullPointerExpection на строке, где я проверял, какое значение (true или false) у ключей.

    Код:
             BukkitScheduler scheduler = getServer().getScheduler();
                scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                    @Override
                    public void run() {
                        List<Player> p = getServer().getWorld("world").getPlayers();
                        HashMap<String, Boolean> toldVN = new HashMap<String, Boolean>();
                        HashMap<String, Boolean> toldVM = new HashMap<String, Boolean>();
                        HashMap<String, Boolean> toldVD = new HashMap<String, Boolean>();
                        for (Player player : p) {
                            player.sendMessage("0 работает");
                          if(toldVN.get(player.getName()) != null && toldVM.get(player.getName()) != null && toldVD.get(player.getName()) != null) {
                              player.sendMessage("1 работает");
                            if(player.getWorld().getTime() >= 13500 && player.getWorld().getTime() <= 21500) {
                                player.sendMessage("2 работает");
                                if(toldVN.get(player.getName()) == false || toldVN.get(player.getName()) == null) {
                                    player.sendMessage("3 работает");
                                    player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "Ночь наступает. Вампиры просыпаются.");
                                    player.setAllowFlight(true);
                                    toldVN.put(player.getName(), true);
                                    if(toldVM.get(player.getName()) == true) toldVM.replace(player.getName(), false);
                                    if(toldVD.get(player.getName()) == true) toldVD.replace(player.getName(), false);
                                }
                            } else if(player.getWorld().getTime() >=21501 && player.getWorld().getTime() <= 22500) {
                                if(toldVM.get(player.getName()) == false || toldVM.get(player.getName()) == null) {
                                    player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "Будьте осторожнее, скоро наступит день!");
                                    if(toldVN.get(player.getName()) == true) toldVN.replace(player.getName(), false);
                                    if(toldVD.get(player.getName()) == true) toldVD.replace(player.getName(), false);
                                }
                            } else {
                                if(toldVD.get(player.getName()) == false || toldVD.get(player.getName()) == null) {
                                    player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "День наступил. Вампиры устают.");
                                    player.setAllowFlight(false);
                                    if(toldVM.get(player.getName()) == true) toldVM.replace(player.getName(), false);
                                    if(toldVN.get(player.getName()) == true) toldVN.replace(player.getName(), false);
                                }
                              }
                           } else if(toldVN.get(player.getName()) == null && toldVM.get(player.getName()) == null && toldVD.get(player.getName()) == null) {
                               toldVN.put(player.getName(), false);
                               toldVM.put(player.getName(), false);
                               toldVD.put(player.getName(), false);
                           }
                        }
                    }
                }, 0L, 100L);
     
  2. _MRDen3000YT_

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

    Баллы:
    76
    Используй ConcurrentHashMap
     
  3. Fairwol

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

    Баллы:
    61
    Мем смешной, а ситуация страшная. :ninja::creeper::nerd:

    Код:
    if(toldVN.get(player.getName()) == true)
     
  4. Автор темы
    VirtualGuys

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

    Баллы:
    61
    А что здесь не так?
     
  5. alexandrage

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

    Баллы:
    173
    Серьезно? if(map.containsKey(ключ)) { }
     
  6. Автор темы
    VirtualGuys

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

    Баллы:
    61
    Я изначально так и писал, но оно и так не работало
     
  7. alexandrage

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

    Баллы:
    173
    И тут можно просто Set использовать, либо есть либо нет.
     
  8. Автор темы
    VirtualGuys

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

    Баллы:
    61
    Можно, но мне нужно именно проверять чему оно равно, так даже удобнее
     
  9. alexandrage

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

    Баллы:
    173
    Зачем? Нету значит = false. У тебя же нет третьего значения.
     
  10. Автор темы
    VirtualGuys

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

    Баллы:
    61
    Да, но просто ведь эти события повторяются каждую ночь, а значит придётся постоянно добавлять и удалять эти ключи, а это лично для меня не очень удобно. Но если по другому никак не станет оно работать, тогда буду проверять есть ли ключ или нет. Спасибо
     
  11. alexandrage

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

    Баллы:
    173
    Может будет проще лист вампиров и держать общий булев для всех не?
     
  12. Автор темы
    VirtualGuys

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

    Баллы:
    61
    Я так и хотел сделать, это проще всего. Но если зайдёт игрок, уже после того как было отправлено сообщение, то он это сообщение не увидит, поэтому я и проверяю каждого игрока на то, что было ли отправлено ему сообщение или нет
     
  13. alexandrage

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

    Баллы:
    173
    Почему же не увидит? Строка же останется, по ней игрока и получишь.
     
  14. alexandrage

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

    Баллы:
    173
    Код:
            if(set.contains(key) && Bukkit.getPlayerExact(key)!=null) {
                Bukkit.getPlayerExact(key).sendMessage(message);
            }
     
  15. Автор темы
    VirtualGuys

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

    Баллы:
    61
    В целом понятно, спасибо, но не очень понял кого в set ставить? Игроков, которым сообщение ещё не пришло? А потом удалять их из этого списка, и ночью снова добавлять в него?
     
  16. alexandrage

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

    Баллы:
    173
    Ну это ты сам решай когда и как тебе слать сообщения игрокам. Твой плагин же.
     
  17. Автор темы
    VirtualGuys

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

    Баллы:
    61
    Хорошо. Спасибо!
     
Статус темы:
Закрыта.

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