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

Статус
Закрыто для дальнейших ответов.

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);
 
Используй ConcurrentHashMap
 
Мем смешной, а ситуация страшная. :ninja::creeper::nerd:

Код:
if(toldVN.get(player.getName()) == true)
 
И тут можно просто Set использовать, либо есть либо нет.
 
Зачем? Нету значит = false. У тебя же нет третьего значения.
Да, но просто ведь эти события повторяются каждую ночь, а значит придётся постоянно добавлять и удалять эти ключи, а это лично для меня не очень удобно. Но если по другому никак не станет оно работать, тогда буду проверять есть ли ключ или нет. Спасибо
 
Да, но просто ведь эти события повторяются каждую ночь, а значит придётся постоянно добавлять и удалять эти ключи, а это лично для меня не очень удобно. Но если по другому никак не станет оно работать, тогда буду проверять есть ли ключ или нет. Спасибо
Может будет проще лист вампиров и держать общий булев для всех не?
 
Может будет проще создать класс с листом вампиров и держать общий булев для всех не?
Я так и хотел сделать, это проще всего. Но если зайдёт игрок, уже после того как было отправлено сообщение, то он это сообщение не увидит, поэтому я и проверяю каждого игрока на то, что было ли отправлено ему сообщение или нет
 
Я так и хотел сделать, это проще всего. Но если зайдёт игрок, уже после того как было отправлено сообщение, то он это сообщение не увидит, поэтому я и проверяю каждого игрока на то, что было ли отправлено ему сообщение или нет
Почему же не увидит? Строка же останется, по ней игрока и получишь.
 
Код:
        if(set.contains(key) && Bukkit.getPlayerExact(key)!=null) {
            Bukkit.getPlayerExact(key).sendMessage(message);
        }
 
Код:
        if(set.contains(key) && Bukkit.getPlayerExact(key)!=null) {
            Bukkit.getPlayerExact(key).sendMessage(message);
        }
В целом понятно, спасибо, но не очень понял кого в set ставить? Игроков, которым сообщение ещё не пришло? А потом удалять их из этого списка, и ночью снова добавлять в него?
 
В целом понятно, спасибо, но не очень понял кого в set ставить? Игроков, которым сообщение ещё не пришло? А потом удалять их из этого списка, и ночью снова добавлять в него?
Ну это ты сам решай когда и как тебе слать сообщения игрокам. Твой плагин же.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх