NPE with interacting event

Discussion in 'Plugin Development' started by superchris05326, Jan 4, 2015.

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

    superchris05326

    With this code, I can right or left click the item and it does the right thing, but when I right or left click with nothing in my hand, I get a NullPointerException on
    Code:
    if(im.getDisplayName().equalsIgnoreCase(m.getDisplayName())){
    Here is all of my code:
    Code:
    package me.superchris05326.hubitems;
    
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerDropItemEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class HubItems extends JavaPlugin implements Listener{
    
        public static Material m = Material.WATCH;
        public static ItemStack is;
       
        public void onEnable(){
            getServer().getPluginManager().registerEvents(this, this);
            initItem();
        }
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent e){
            Player p = e.getPlayer();
            p.chat("/spawn");
            p.getInventory().addItem(is);
        }
    
        public static void initItem(){
            is = new ItemStack(m);
            ItemMeta im = is.getItemMeta();
            im.setDisplayName(ChatColor.GOLD + "Game Selector");
            is.setItemMeta(im);
        }
    
        @EventHandler
        public void onPlayerDrop(PlayerDropItemEvent e){
            ItemStack i = e.getItemDrop().getItemStack();
            if(i.getItemMeta() == is.getItemMeta()){
                e.setCancelled(true);
            }else{
                return;
            }
        }
    
        @EventHandler
        public void onInteract(PlayerInteractEvent e){
            Player p = e.getPlayer();
            ItemStack i = p.getItemInHand();
            if(p.getItemInHand() == null){
                return;
            }else if(sameItem(is, i)){
                p.chat("/menu open menu");
            }else{
                return;
            }
        }
    
        public boolean sameItem(ItemStack is, ItemStack i){
            ItemMeta im = is.getItemMeta();
            ItemMeta m = i.getItemMeta();
            if(im.getDisplayName().equalsIgnoreCase(m.getDisplayName())){
                if(is.getType() == i.getType()){
                    return true;
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }
    
    }
    
     
  2. Offline

    superchris05326

  3. Offline

    tangster132

  4. Offline

    sirrus86

    Try i.hasItemMeta() as a conditional near the beginning of your sameItem() method. When empty-handed you're actually carrying an air block that I believe has no metadata, hence the NPE.
     
  5. Offline

    nj2miami

    ^ Yah, you need to always check for nulls when dealing with metadata because occasionally you could interact with something which doesn't have it and trigger a NPE.

    Before your code listed, simply add:

    if (im.hasItemMeta() && m.hasItemMeta()) and bracket all your code inside it.

    and you should be good to go. Not sure if you will need to double check for if(im.getItemMeta.hasDisplayName()) as well because it could have meta but no display name I am thinking at times.
     
Thread Status:
Not open for further replies.

Share This Page