/** Custom dispense routines */ @Override protected void dispense(World worldIn, BlockPos pos) { BlockSourceImpl src = new BlockSourceImpl(worldIn, pos); TileEntityDispenser tile = (TileEntityDispenser)src.getBlockTileEntity(); if (tile != null) { int i = tile.getDispenseSlot(); if (i < 0) { worldIn.playEvent(1001, pos, 0); } else { // get the active item from its slot ItemStack itemstack = tile.getStackInSlot(i); IBehaviorDispenseItem defaultbehavior = this.getBehavior(itemstack); // make sure it's not regular dropper behavior if (defaultbehavior != IBehaviorDispenseItem.DEFAULT_BEHAVIOR) { ItemStack itemstack1 = null; // replace vanilla behavior if(defaultbehavior instanceof BehaviorProjectileDispense) { itemstack1 = this.dispenseProjectile((BehaviorProjectileDispense)defaultbehavior, src, itemstack); } else if(itemstack.getItem() instanceof ItemSplashPotion || itemstack.getItem() instanceof ItemLingeringPotion) { itemstack1 = this.dispensePotion(src, itemstack); } else if(itemstack.getItem() instanceof ItemFireball) { itemstack1 = this.dispenseFireball(src, itemstack); } // revert to vanilla on failure if(itemstack1 == null) { itemstack1 = defaultbehavior.dispense(src, itemstack); } // update the inventory tile.setInventorySlotContents(i, itemstack1.getCount() <= 0 ? ItemStack.EMPTY : itemstack1); } } } }