Removing one itemstack

Discussion in 'Plugin Development' started by iClaw, Apr 25, 2015.

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

    iClaw

    Code:
    @EventHandler
       public void onDispense(BlockDispenseEvent e){
         if(e.getBlock().getType() == Material.DISPENSER
             && e.getItem().getType() == Material.SAPLING){
           BlockFace face = ((org.bukkit.material.Dispenser) e.getBlock().getState().getData()).getFacing();
           if((face == BlockFace.UP) || (face == BlockFace.DOWN)) return;
           Location loc1 = new Location(e.getBlock().getWorld(), e.getBlock().getX() + face.getModX() * 1, e.getBlock().getY()
               + face.getModY() * 1, e.getBlock().getZ() + face.getModZ() * 1);
           Location loc2 = new Location(e.getBlock().getWorld(), e.getBlock().getX() + face.getModX() * 1, e.getBlock().getY() - 1
               + face.getModY() * 1, e.getBlock().getZ() + face.getModZ() * 1);
           if(loc1.getBlock().getType() == Material.AIR){
             if((loc2.getBlock().getType() == Material.DIRT)
                 || (loc2.getBlock().getType() == Material.GRASS)){
               Inventory inv = ((org.bukkit.block.Dispenser)e.getBlock().getState()).getInventory();
               items = new ItemStack[] { new ItemStack(e.getItem()) };
               if(items.length == 1){
                 Bukkit.broadcastMessage("IS A. == 1");
                 inv.removeItem(e.getItem());
               }else{
                 for(ItemStack i : items){
                   inv.removeItem(i);
                 }
               }
               e.setCancelled(true);
               loc1.getBlock().setType(Material.SAPLING);
               loc1.getBlock().setData(e.getItem().getData().getData());
             }
           }
         }
       }
    
    That is the code i've got so far.
    Even if the dispenser has more than 1 sapling, it broadcasts the message "IS A. == 1".
    And if it has only 1 sapling it doesn't remove it
     
  2. e.getItem on line 16 just gets the item that is dispensed. You need to do "items = inv.getContents()" or something similar to that.
     
  3. Offline

    iClaw

    @Bram0101
    Uh this isn't working either:
    Code:
    Inventory inv = ((org.bukkit.block.Dispenser)e.getBlock().getState()).getInventory();
                            for(ItemStack is : inv.getContents()){
                                if(is != null && is.getType() == Material.SAPLING){
                                    if(is.getAmount() > 1){
                                        is.setAmount(is.getAmount() - 1);
                                        Bukkit.broadcastMessage("1");
                                        break;
                                    }else if(is.getAmount() == 1){
                                        inv.removeItem(is);
                                        Bukkit.broadcastMessage("2");
                                        break;
                                    }else if(is.getAmount() == 0){
                                        inv.removeItem(is);
                                        inv.removeItem(e.getItem());
                                        is.setType(Material.AIR);
                                        Bukkit.broadcastMessage("3");
                                        break;
                                    }
                                }
                            e.setCancelled(true);
                            loc1.getBlock().setType(Material.SAPLING);
                            loc1.getBlock().setData(e.getItem().getData().getData());
                        }
    bump

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 12, 2016
Thread Status:
Not open for further replies.

Share This Page