Making it so players can only put a certain item into a certain inventory slot.

Discussion in 'Plugin Development' started by morrnd, Jul 21, 2016.

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

    morrnd

    Hey, I was wondering if there was a way to make it so players can put ONLY golden nuggets(or nothing) into slot 9(top-left), so that if someone tries to put something that isn't a golden nugget into slot 9 then it doesn't let them.
     
  2. Offline

    morrnd

    @AlvinB
    I'm new to this, so I can't get it to work(I've registered it).

    Code:
    package net.rodamar.amulets;
    
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    
    public class SlotNineAttempt implements Listener {
       
        @EventHandler
        public void SlotNineAttempt(InventoryClickEvent e) {
            Player player = (Player) e.getWhoClicked();
            int slot = e.getSlot();
            if (slot == 9) {
                player.sendMessage("Slot 9");
            }
        }
       
    }
    
     
  3. Offline

    MCMastery

    check if the item type is not a gold nugget, and if the slot is 9. then cancel the event
     
  4. Offline

    ArsenArsen

    By the way, slots start with 0
     
  5. Offline

    morrnd

    Yeah, I know how the slots work.

    ---

    I can put only golden nuggets in now, but I can't take anything out.

    Code:
    package net.rodamar.amulets;
    
    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.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class SlotNineAttempt implements Listener {
       
       @EventHandler
       public void SlotNineAttempt(InventoryClickEvent e) {
         Player player = (Player) e.getWhoClicked();
         int slot = e.getSlot();
         ItemStack material = e.getCurrentItem();
         ItemStack gNug = new ItemStack(Material.GOLD_NUGGET, 1);
         ItemStack air = new ItemStack(Material.AIR);
         if (slot == 9 & !(material == gNug || material == air)) {
           player.sendMessage(ChatColor.AQUA + "This is not a valid amulet.");
           e.setCancelled(true);
         }
       }
       
    }
    
    
     
    Last edited: Jul 21, 2016
  6. @morrnd Why aren't you just comparing Material's rather than ItemStack? Also use != rather than !Object == Object
    Also, check before casting
     
  7. Offline

    morrnd

    I'm using item stacks because it said it needed an itemStack, not a Material(which it was before). (It said "Incompatible operand types ItemStack and Material")

    Okay, so the code is:
    Code:
    package net.rodamar.amulets;
    
    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.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class SlotNineAttempt implements Listener {
      
        @EventHandler
        public void SlotNineAttempt(InventoryClickEvent e) {
            Player player = (Player) e.getWhoClicked();
            int slot = e.getSlot();
            ItemStack material = e.getCurrentItem();
            ItemStack gNug = new ItemStack(Material.GOLD_NUGGET, 1);
            if (slot == 9 & material != gNug) {
                player.sendMessage(ChatColor.AQUA + "This is not a valid amulet.");
                e.setCancelled(true);
            }
        }
      
    }
    It's letting me move anything anywhere, but nothing can go into 9.
     
    Last edited: Jul 21, 2016
  8. @morrnd
    Code:
    if (slot == 9 && material != gNug)
    You cannot compare objects using == and != operators. Use .equals() instead. == compares memory locations, while .equals() compares the actual values. The implications of this is that only primitives and enums can be compared with ==, because they always reference the same memory values.
     
  9. Offline

    morrnd

    I mean everything including a golden nugget doesn't go into slot 9.

    @AlvinB
    Also, unless I'm doing it wrong, .equals() isn't fixing it.
    Code:
    package net.rodamar.amulets;
    
    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.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class SlotNineAttempt implements Listener {
       
        @EventHandler
        public void SlotNineAttempt(InventoryClickEvent e) {
            Player player = (Player) e.getWhoClicked();
            int slot = e.getSlot();
            ItemStack material = e.getCurrentItem();
            ItemStack gNug = new ItemStack(Material.GOLD_NUGGET, 1);
            if (slot == 9 & !(material.equals(gNug))) {
                player.sendMessage(ChatColor.AQUA + "This is not a valid amulet.");
                e.setCancelled(true);
            }
        }
       
    }
    
     
    Last edited: Jul 21, 2016
  10. @morrnd
    You need two &'s in you if statement. A single & compares bitwise, which is something completely different.
     
  11. Offline

    morrnd

    Same issue occurs.
     
  12. Offline

    morrnd

    Code:
    package net.rodamar.amulets;
    
    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.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class SlotNineAttempt implements Listener {
      
       @EventHandler
       public void SlotNineAttempt(InventoryClickEvent e) {
         Player player = (Player) e.getWhoClicked();
         int slot = e.getSlot();
         ItemStack material = e.getCurrentItem();
         ItemStack gNug = new ItemStack(Material.GOLD_NUGGET, 1);
         if (slot == 9 && !(material.equals(gNug))) {
           player.sendMessage(ChatColor.AQUA + "This is not a valid amulet.");
           e.setCancelled(true);
         }
       }
      
    }
     
  13. @morrnd
    You would only be able to put in 1 gold nugget with this code. Anyways, instead of using you current approach, I'd recommend comparing ItemStack.getType().
     
  14. Offline

    Zombie_Striker

    @morrnd
    I think everyone here forgot that .equals compares if every single value is the same. This includes item stack amounts, name, lore, and durability. I'm assuming you want it where a player can put any amount of gold nuggets in that slot. To do so, use Itemstack#isSimilar() to test if two itemstacks are similar, not exactly the same.
     
  15. Or, just compare the Material.
     
  16. Offline

    morrnd

    Still isn't working. Also, how I want it to work is I want each player to put only one amulet on and for it to buff them accordingly(the 'lore' dictates what buff a player gets).

    Code:
    package net.rodamar.amulets;
    
    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.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class SlotNineAttempt implements Listener {
    
       @EventHandler
       public void SlotNineAttempt(InventoryClickEvent e) {
         Player player = (Player) e.getWhoClicked();
         int slot = e.getSlot();
         ItemStack material = e.getCurrentItem();
         ItemStack gNug = new ItemStack(Material.GOLD_NUGGET, 1);
         if (slot == 9 && !(material.isSimilar(gNug))) {
             player.sendMessage(ChatColor.AQUA + "This is not a valid amulet.");
             e.setCancelled(true);
         }
       }
    
    }
    I tried with them materials, didn't work:
    Code:
    package net.rodamar.amulets;
    
    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.inventory.InventoryClickEvent;
    import org.bukkit.inventory.ItemStack;
    
    public class SlotNineAttempt implements Listener {
    
       @EventHandler
       public void SlotNineAttempt(InventoryClickEvent e) {
         Player player = (Player) e.getWhoClicked();
         int slot = e.getSlot();
         ItemStack materialItemStack = e.getCurrentItem();
         Material material = materialItemStack.getType();
         Material gNug = Material.GOLD_NUGGET;
         if (slot == 9 && !(material.equals(gNug))) {
             player.sendMessage(ChatColor.AQUA + "This is not a valid amulet.");
             e.setCancelled(true);
         }
       }
    
    }
     
    Last edited: Jul 22, 2016
  17. Offline

    alaa15

    @morrnd I'd suggest you do what @AlvinB said and compare the material instead of checking whether both items are similar or not, to get the material change the variable 'material's type to Material and use e.getCurrentItem().getType()
    Then you can do material.equals(Material.GOLD). Also, make sure the slot you're putting the gold in is slot 10, as slots start at 0. So slot 9 should be top left inventory slot.

    Also, are you registering your listener class?
     
    Last edited: Jul 22, 2016
  18. Offline

    I Al Istannen

    @morrnd
    Has your "amulet" any display name or lore? If yes, it will NOT BE SIMILAR to a plain old item stack.
    Just check if "material#getType() != Material.GOLD_NUGGET".
     
  19. Offline

    morrnd

    I already stated that I want it to be slot 9, and I just tried that(I just edited the previous post before I saw your post).

    Yeah, it has lore, so I just tested it as a material and it doesn't work - see my last post.
     
  20. Offline

    Lordloss

    You dont need to create all those variables if you just need them once. It makes your code less readable. Just do e.getCurrentItem.getType.equals(Material.GOLD_NUGGET)
     
  21. @Lordloss *getType() == Material.GOLD_NUGGET
     
  22. Offline

    I Al Istannen

    @morrnd
    Do you want to get e.getCursor() and not e.getCurrentItem() by any chance?
     
  23. Offline

    Lordloss

    @bwfcwalshy youre right, i still prefer equals for enums.
     
Thread Status:
Not open for further replies.

Share This Page