@Override
  public boolean isAvailable(final Slot slot) {
    if (entity.isAdminMode()) return true;

    final ItemStack[] inv = entity.getRawInventory();
    final ItemStack stack = inv[slot.getSlotIndex()];
    if (stack != null)
      return InventoryHelper.doesInventoryContain(
          inv,
          VendingTileEntity.INVENTORY_SLOT_START,
          VendingTileEntity.GENERAL_INVENTORY_SIZE - 1,
          stack,
          null);

    return true;
  }
  protected ItemStack doTrade(final Slot slot, final EntityPlayer player) {

    final ItemStack[] entityInventory = entity.getRawInventory();
    final ItemStack[] playerInventory = player.inventory.mainInventory;

    // Get the result of the potential trade. If there is nothing,
    // or the player inventory cannot hold the stack then return null.
    final ItemStack result = slot.getStack();
    if (result == null
        || !InventoryHelper.canInventoryAccept(
            playerInventory, 0, playerInventory.length - 1, result, null)) return null;

    final boolean normalMode = !entity.isAdminMode();

    // Can the inventory provide the result item?
    if (normalMode
        && !InventoryHelper.doesInventoryContain(
            entityInventory,
            VendingTileEntity.INVENTORY_SLOT_START,
            VendingTileEntity.GENERAL_INVENTORY_SIZE - 1,
            result,
            null)) return null;

    // Get the input slots. We do some math on the slot index to
    // figure out the right input slots.
    final int index = slot.slotNumber / 3 + VendingTileEntity.CONFIG_SLOT_START;
    final ItemStack input1 = entity.getStackInSlot(index);
    final ItemStack input2 = entity.getStackInSlot(index + 6);

    // See if the vending inventory can accept the required items
    if (normalMode
        && !InventoryHelper.canInventoryAccept(
            entityInventory,
            VendingTileEntity.INVENTORY_SLOT_START,
            VendingTileEntity.GENERAL_INVENTORY_SIZE - 1,
            input1,
            input2)) return null;

    // See if the player can provide the payment
    if (!InventoryHelper.doesInventoryContain(
        playerInventory, 0, playerInventory.length - 1, input1, input2)) return null;

    // OK - things should work. Do the transaction.
    if (input1 != null) {
      if (!entity.isAdminMode()) {
        entity.addStackToOutput(input1.copy());
      }
      InventoryHelper.removeItemStackFromInventory(
          playerInventory, input1.copy(), 0, playerInventory.length - 1);
    }
    if (input2 != null) {
      if (!entity.isAdminMode()) {
        entity.addStackToOutput(input2.copy());
      }
      InventoryHelper.removeItemStackFromInventory(
          playerInventory, input2.copy(), 0, playerInventory.length - 1);
    }

    if (!entity.isAdminMode()) {
      entity.removeStackFromOutput(result.copy());
    }

    player.inventory.addItemStackToInventory(result.copy());

    // play a tink sound to signal the trade
    if (player.worldObj.isRemote) player.playSound("random.orb", 0.5F, 5F);
    player.onUpdate();

    return null;
  }