package net.minecraft.inventory; import net.minecraft.entity.IMerchant; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.village.MerchantRecipe; import net.minecraft.village.MerchantRecipeList; public class InventoryMerchant implements IInventory { private final IMerchant theMerchant; private ItemStack[] theInventory = new ItemStack[3]; private final EntityPlayer thePlayer; private MerchantRecipe currentRecipe; private int currentRecipeIndex; public InventoryMerchant(EntityPlayer par1EntityPlayer, IMerchant par2IMerchant) { this.thePlayer = par1EntityPlayer; this.theMerchant = par2IMerchant; } /** * Returns the number of slots in the inventory. */ public int getSizeInventory() { return this.theInventory.length; } /** * Returns the stack in slot i */ public ItemStack getStackInSlot(int par1) { return this.theInventory[par1]; } /** * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a * new stack. */ public ItemStack decrStackSize(int par1, int par2) { if (this.theInventory[par1] != null) { ItemStack itemstack; if (par1 == 2) { itemstack = this.theInventory[par1]; this.theInventory[par1] = null; return itemstack; } else if (this.theInventory[par1].stackSize <= par2) { itemstack = this.theInventory[par1]; this.theInventory[par1] = null; if (this.inventoryResetNeededOnSlotChange(par1)) { this.resetRecipeAndSlots(); } return itemstack; } else { itemstack = this.theInventory[par1].splitStack(par2); if (this.theInventory[par1].stackSize == 0) { this.theInventory[par1] = null; } if (this.inventoryResetNeededOnSlotChange(par1)) { this.resetRecipeAndSlots(); } return itemstack; } } else { return null; } } /** * if par1 slot has changed, does resetRecipeAndSlots need to be called? */ private boolean inventoryResetNeededOnSlotChange(int par1) { return par1 == 0 || par1 == 1; } /** * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - * like when you close a workbench GUI. */ public ItemStack getStackInSlotOnClosing(int par1) { if (this.theInventory[par1] != null) { ItemStack itemstack = this.theInventory[par1]; this.theInventory[par1] = null; return itemstack; } else { return null; } } /** * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). */ public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { this.theInventory[par1] = par2ItemStack; if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit()) { par2ItemStack.stackSize = this.getInventoryStackLimit(); } if (this.inventoryResetNeededOnSlotChange(par1)) { this.resetRecipeAndSlots(); } } /** * Returns the name of the inventory. */ public String getInvName() { return "mob.villager"; } /** * If this returns false, the inventory name will be used as an unlocalized name, and translated into the player's * language. Otherwise it will be used directly. */ public boolean isInvNameLocalized() { return false; } /** * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't * this more of a set than a get?* */ public int getInventoryStackLimit() { return 64; } /** * Do not make give this method the name canInteractWith because it clashes with Container */ public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) { return this.theMerchant.getCustomer() == par1EntityPlayer; } public void openChest() {} public void closeChest() {} /** * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot. */ public boolean isStackValidForSlot(int par1, ItemStack par2ItemStack) { return true; } /** * Called when an the contents of an Inventory change, usually */ public void onInventoryChanged() { this.resetRecipeAndSlots(); } public void resetRecipeAndSlots() { this.currentRecipe = null; ItemStack itemstack = this.theInventory[0]; ItemStack itemstack1 = this.theInventory[1]; if (itemstack == null) { itemstack = itemstack1; itemstack1 = null; } if (itemstack == null) { this.setInventorySlotContents(2, (ItemStack)null); } else { MerchantRecipeList merchantrecipelist = this.theMerchant.getRecipes(this.thePlayer); if (merchantrecipelist != null) { MerchantRecipe merchantrecipe = merchantrecipelist.canRecipeBeUsed(itemstack, itemstack1, this.currentRecipeIndex); if (merchantrecipe != null && !merchantrecipe.func_82784_g()) { this.currentRecipe = merchantrecipe; this.setInventorySlotContents(2, merchantrecipe.getItemToSell().copy()); } else if (itemstack1 != null) { merchantrecipe = merchantrecipelist.canRecipeBeUsed(itemstack1, itemstack, this.currentRecipeIndex); if (merchantrecipe != null && !merchantrecipe.func_82784_g()) { this.currentRecipe = merchantrecipe; this.setInventorySlotContents(2, merchantrecipe.getItemToSell().copy()); } else { this.setInventorySlotContents(2, (ItemStack)null); } } else { this.setInventorySlotContents(2, (ItemStack)null); } } } } public MerchantRecipe getCurrentRecipe() { return this.currentRecipe; } public void setCurrentRecipeIndex(int par1) { this.currentRecipeIndex = par1; this.resetRecipeAndSlots(); } }