My HashMap is null

Discussion in 'Plugin Development' started by VinexAx789, Jun 13, 2016.

Thread Status:
Not open for further replies.
  1. Offline

    VinexAx789

    Problem: My HashMap is null and is not giving the kit to the correct person.

    Code:

    Code:
        public DTP plugin;
    
        public MainMenu(DTP plugin) {
            this.plugin = plugin;
    
            inv = Bukkit.getServer().createInventory(null, 9, ChatColor.BLUE + "" + ChatColor.BOLD + "Main Menu");
            teams = Bukkit.getServer().createInventory(null, 18, ChatColor.RED + "" + ChatColor.BOLD + "Team Menu");
            kits = Bukkit.getServer().createInventory(null, 18, ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Kit Menu");
    
            team = createTeamItem(DyeColor.RED, ChatColor.BLUE + "Teams");
            kititem = createItem(Material.DIAMOND_CHESTPLATE, ChatColor.YELLOW + "Kits");
            back = createItem(Material.BARRIER, ChatColor.RED + "Back");
    
            attackers = createTeamItem(DyeColor.RED, ChatColor.RED + "Attackers");
            defenders = createTeamItem(DyeColor.BLUE, ChatColor.BLUE + "Defenders");
    
            kitattackers = createItem(Material.IRON_SWORD, ChatColor.RED + "Kit Attacker");
            kitdefenders = createItem(Material.IRON_CHESTPLATE, ChatColor.RED + "Kit Defender");
            kitarcher = createItem(Material.BOW, ChatColor.RED + "Kit Archer");
    
            autoselect = createItem(Material.NAME_TAG, ChatColor.RED + "Auto Select");
    
            inv.setItem(3, team);
            inv.setItem(5, kititem);
    
            kits.setItem(3, kitattackers);
            kits.setItem(4, kitarcher);
            kits.setItem(5, kitdefenders);
            kits.setItem(17, back);
    
            teams.setItem(2, attackers);
            teams.setItem(4, autoselect);
            teams.setItem(6, defenders);
            teams.setItem(17, back);
            kitselected = new HashMap<Player, KitType>();
    
        }
    
        public Inventory inv, teams, kits;
        public HashMap<Player, KitType> kitselected;
        private ItemStack kititem, team, back, attackers, defenders, kitattackers, kitdefenders, autoselect, kitarcher;
    

    Code:
        @EventHandler
        public void onInventoryClick(InventoryClickEvent e) {
            Player player = (Player) e.getWhoClicked();
            if (!e.getInventory().getName().equalsIgnoreCase(inv.getName())
                    && !e.getInventory().getName().equalsIgnoreCase(teams.getName())
                    && !e.getInventory().getName().equalsIgnoreCase(kits.getName()))
                return;
            if (e.getCurrentItem().getItemMeta() == null)
                return;
            if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Teams")) {
                e.setCancelled(true);
                player.sendMessage(plugin.prefix + "Opening team menu.");
                player.closeInventory();
                player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                player.openInventory(teams);
            } else if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Kits")) {
                e.setCancelled(true);
                player.sendMessage(plugin.prefix + "Opening kit menu.");
                player.closeInventory();
                player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                player.openInventory(kits);
            } else if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Back")) {
                e.setCancelled(true);
                player.sendMessage(plugin.prefix + "Going back to main menu.");
                player.closeInventory();
                player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                player.openInventory(inv);
    
            } else if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Kit Attacker")) {
                e.setCancelled(true);
                if (!(plugin.getPlayersTeam(player) == plugin.getRed())
                        || !(plugin.getPlayersTeam(player) == plugin.getBlue())) {
                    player.sendMessage(plugin.prefix + "Either pick a kit or get one automatically when the game starts!");
                    player.closeInventory();
                }
                if (plugin.getPlayersTeam(player) == plugin.getBlue()) {
                    player.sendMessage(plugin.prefix + "Selected Kit Attacker");
                    player.closeInventory();
                    player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                    player.closeInventory();
                } else if (plugin.getPlayersTeam(player) == plugin.getBlue()) {
                    player.sendMessage(plugin.prefix + "You cannot select this kit as a Defender!");
                    player.closeInventory();
                }
    
            } else if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Kit Defender")) {
                e.setCancelled(true);
                if (!(plugin.getPlayersTeam(player) == plugin.getBlue())
                        || !(plugin.getPlayersTeam(player) == plugin.getRed())) {
                    player.sendMessage(plugin.prefix + "Either pick a kit or get one automatically when the game starts!");
                    player.closeInventory();
                }
                if (plugin.getPlayersTeam(player) == plugin.getBlue()) {
                    player.sendMessage(plugin.prefix + "Selected Kit Defender");
                    player.closeInventory();
                    player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                    player.closeInventory();
                } else if (plugin.getPlayersTeam(player) == plugin.getRed()) {
                    player.sendMessage(plugin.prefix + "You cannot select this kit as a Attacker!");
                    player.closeInventory();
                }
    
            } else if (e.getCurrentItem().getItemMeta().getDisplayName().contains("Kit Archer")) {
                e.setCancelled(true);
                player.sendMessage(plugin.prefix + "Selected Kit Archer");
                kitselected.remove(player);
                kitselected.put(player, KitType.ARCHER);
                player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                player.closeInventory();
            }
    
        }
    
        public KitType getKit(Player player) {
            if (kitselected.containsKey(player)) {
                return kitselected.get(player);
            }
            return KitType.DEFAULT;
        }
    
        public void giveSelectedKit(final Player p) {
            if (getKit(p).equals(KitType.DEFAULT)) {
                if (plugin.getPlayersTeam(p) == plugin.getRed()) {
                    ItemStack sword = new ItemStack(Material.IRON_SWORD, 1);
                    ItemMeta swordmeta = sword.getItemMeta();
                    swordmeta.addEnchant(Enchantment.DAMAGE_ALL, 1, true);
                    swordmeta.setDisplayName(ChatColor.RED + p.getName() + "'s sword");
                    sword.setItemMeta(swordmeta);
                    p.getInventory().setItem(0, sword);
                    swordmeta.spigot().setUnbreakable(true);
    
                    ItemStack pickaxe = new ItemStack(Material.STONE_PICKAXE, 1);
                    ItemMeta pickaxeMeta = pickaxe.getItemMeta();
                    p.getInventory().setItem(3, pickaxe);
                    pickaxeMeta.spigot().setUnbreakable(true);
    
                    ItemStack grenade = new ItemStack(Material.TNT, 2);
                    ItemMeta grenademeta = grenade.getItemMeta();
                    grenademeta.addEnchant(Enchantment.DIG_SPEED, 1, true);
                    grenademeta.setDisplayName(ChatColor.RED + p.getName() + "'s Grenades " + ChatColor.DARK_GRAY + "("
                            + ChatColor.YELLOW + "Left Click" + ChatColor.DARK_GRAY + ")");
                    grenade.setItemMeta(grenademeta);
                    p.getInventory().setItem(2, grenade);
    
                    p.getInventory().setHelmet(new ItemStack(Material.CHAINMAIL_HELMET, 1));
                    p.getInventory().setChestplate(new ItemStack(Material.IRON_CHESTPLATE, 1));
                    p.getInventory().setLeggings(new ItemStack(Material.CHAINMAIL_LEGGINGS, 1));
                    p.getInventory().setBoots(new ItemStack(Material.DIAMOND_BOOTS, 1));
    
                } else if (plugin.getPlayersTeam(p) == plugin.getBlue()) {
                    ItemStack dsword = new ItemStack(Material.STONE_SWORD, 1);
                    ItemMeta dswordmeta = dsword.getItemMeta();
                    dswordmeta.addEnchant(Enchantment.DAMAGE_ALL, 1, true);
                    dswordmeta.setDisplayName(ChatColor.BLUE + p.getName() + "'s sword");
                    dsword.setItemMeta(dswordmeta);
                    dswordmeta.spigot().setUnbreakable(true);
                    p.getInventory().setItem(0, dsword);
    
                    ItemStack dpickaxe = new ItemStack(Material.STONE_PICKAXE, 1);
                    ItemMeta dpickaxeMeta = dpickaxe.getItemMeta();
                    p.getInventory().setItem(3, dpickaxe);
                    dpickaxeMeta.spigot().setUnbreakable(true);
    
                    p.getInventory().setItem(3, new ItemStack(Material.GOLDEN_APPLE, 3));
    
                    ItemStack dgrenade = new ItemStack(Material.TNT, 2);
                    ItemMeta dgrenademeta = dgrenade.getItemMeta();
                    dgrenademeta.addEnchant(Enchantment.DIG_SPEED, 1, true);
                    dgrenademeta.setDisplayName(ChatColor.RED + p.getName() + "'s Grenades " + ChatColor.DARK_GRAY + "("
                            + ChatColor.YELLOW + "Left Click" + ChatColor.DARK_GRAY + ")");
                    dgrenade.setItemMeta(dgrenademeta);
                    p.getInventory().setItem(4, dgrenade);
    
                    p.getInventory().setHelmet(new ItemStack(Material.DIAMOND_HELMET, 1));
                    p.getInventory().setChestplate(new ItemStack(Material.IRON_CHESTPLATE, 1));
                    p.getInventory().setLeggings(new ItemStack(Material.IRON_LEGGINGS, 1));
                    p.getInventory().setBoots(new ItemStack(Material.DIAMOND_BOOTS, 1));
                }
            } else if (getKit(p).equals(KitType.ARCHER)) {
                ItemStack bow = new ItemStack(Material.BOW, 1);
                ItemMeta bowMeta = bow.getItemMeta();
                bowMeta.addEnchant(Enchantment.ARROW_INFINITE, 1, true);
                bowMeta.spigot().isUnbreakable();
    
                if (plugin.getPlayersTeam(p) == plugin.getBlue()) {
                    bowMeta.setDisplayName(C.blue + p.getName() + "'s bow");
                } else {
                    bowMeta.setDisplayName(C.red + p.getName() + "'s bow");
                }
                bow.setItemMeta(bowMeta);
    
                ItemStack sword = new ItemStack(Material.WOOD_SWORD, 1);
                ItemMeta swordMeta = bow.getItemMeta();
                swordMeta.addEnchant(Enchantment.DAMAGE_ALL, 1, true);
                swordMeta.spigot().isUnbreakable();
    
                if (plugin.getPlayersTeam(p) == plugin.getBlue()) {
                    swordMeta.setDisplayName(C.blue + p.getName() + "'s sword");
                } else {
                    swordMeta.setDisplayName(C.red + p.getName() + "'s sword");
                }
                sword.setItemMeta(swordMeta);
    
                p.getInventory().setItem(0, sword);
                p.getInventory().setItem(1, bow);
                p.getInventory().setItem(9, new ItemStack(Material.ARROW, 1));
                p.getInventory().setHelmet(new ItemStack(Material.CHAINMAIL_HELMET, 1));
                p.getInventory().setChestplate(new ItemStack(Material.IRON_CHESTPLATE, 1));
                p.getInventory().setLeggings(new ItemStack(Material.IRON_LEGGINGS, 1));
                p.getInventory().setBoots(new ItemStack(Material.CHAINMAIL_BOOTS, 1));
            }
        }
     
  2. Offline

    Zombie_Striker

    @VinexAx789
    Are you sure the MainMenu constructor is ever called? Are there any errors?

    Can you explain what you mean by this?
     
    mine-care likes this.
  3. Offline

    VinexAx789

    @Zombie_Striker

    Yes it is called. Everything works but when I click kit archer it doesn't give me the kit because the map is null there is no errors printing to console the way I knew it is null is that I debugged it with Bukkit.broadcast etc.
     
  4. Offline

    mine-care

    If it is null it means that it isn't initialized. So either the constructor isnt fully run (can occur if an action performed in the constructor blocks, but that would freeze the server asuming you are running synchronously) or the constructor isn't even called in the fist place.

    the other possibility is that the map is being changed by another object, or a part of the code that you havent provided above. Thats why encapsulation is useful, to controll the modification and access other objects have.

    Lastly, it is possible that the code is executed before the map is ever initialized if static is involved...

    I asume the OP means that there is an error (an NPE presumably) thus the player does not get their kit.
     
  5. Offline

    VinexAx789

    @mine-care Thanks for the response theirs nothing I can think of I'm not using static the constructor runs everything but maybe it's stoping when it reaches the map.
     
    Last edited: Jun 14, 2016
  6. Offline

    Zombie_Striker

    @VinexAx789
    Try doing this: If the map is null when you need to use it, set it equal to something. If you have to keep re-setting it to a new map every time, then that means that something is repetitively setting it back to null. If it stays equal to something after that, then the problem is it is not being initialized/ something is setting it back to null only once.
     
  7. Offline

    VinexAx789

    @Zombie_Striker Alright thanks trying it.

    @Zombie_Striker You we're right, it's only setting it to null once. But thing is I don't know where.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 14, 2016
  8. Offline

    Zombie_Striker

    @VinexAx789
    An easy way to test would be to rename the Hashmap. After that, (if you're using an IDE like eclipse or intelliJ), look at all the lines that are now broken because they can't find the hashmap.
     
    VinexAx789 and MrGeneralQ like this.
  9. Offline

    VinexAx789

    @Zombie_Striker Yeah I've done that before the only things I'm using the hashmap for is this:
    Code:
                    } else if (e.getCurrentItem().getItemMeta().getDisplayName().toLowerCase().contains("kit archer")) {
                        kitselected.remove(player.getName());
                        kitselected.put(player.getName(), KitType.ARCHER);
                        e.setCancelled(true);
                        Bukkit.broadcastMessage(C.debug + kitselected.get(player.getName()));
                        player.closeInventory();
                        player.sendMessage(plugin.prefix + "Selected Kit Archer");
                        player.playSound(e.getWhoClicked().getLocation(), Sound.NOTE_PLING, 1, 1);
                    }
                }
            }
    
        }
    
        public KitType getKit(Player player) {
            if (kitselected.containsKey(player.getName())) {
                return kitselected.get(player.getName());
            }
            return KitType.DEFAULT;
        }
     
  10. Offline

    Lordloss

    As i can see it is not set to null anywhere, there are 2 possible options here:
    1. The events that access the hasmap are called bevore your MainMenu gets initialized.
    2. You dont store a proper reference to the MainMenu instance, so it is allready destroyed at the moment the hashmap gets accessed.
     
Thread Status:
Not open for further replies.

Share This Page