001 package net.minecraft.inventory; 002 003 import net.minecraft.entity.IMerchant; 004 import net.minecraft.entity.player.EntityPlayer; 005 import net.minecraft.item.ItemStack; 006 import net.minecraft.village.MerchantRecipe; 007 import net.minecraft.village.MerchantRecipeList; 008 009 public class InventoryMerchant implements IInventory 010 { 011 private final IMerchant theMerchant; 012 private ItemStack[] theInventory = new ItemStack[3]; 013 private final EntityPlayer thePlayer; 014 private MerchantRecipe currentRecipe; 015 private int currentRecipeIndex; 016 017 public InventoryMerchant(EntityPlayer par1EntityPlayer, IMerchant par2IMerchant) 018 { 019 this.thePlayer = par1EntityPlayer; 020 this.theMerchant = par2IMerchant; 021 } 022 023 /** 024 * Returns the number of slots in the inventory. 025 */ 026 public int getSizeInventory() 027 { 028 return this.theInventory.length; 029 } 030 031 /** 032 * Returns the stack in slot i 033 */ 034 public ItemStack getStackInSlot(int par1) 035 { 036 return this.theInventory[par1]; 037 } 038 039 /** 040 * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a 041 * new stack. 042 */ 043 public ItemStack decrStackSize(int par1, int par2) 044 { 045 if (this.theInventory[par1] != null) 046 { 047 ItemStack var3; 048 049 if (par1 == 2) 050 { 051 var3 = this.theInventory[par1]; 052 this.theInventory[par1] = null; 053 return var3; 054 } 055 else if (this.theInventory[par1].stackSize <= par2) 056 { 057 var3 = this.theInventory[par1]; 058 this.theInventory[par1] = null; 059 060 if (this.inventoryResetNeededOnSlotChange(par1)) 061 { 062 this.resetRecipeAndSlots(); 063 } 064 065 return var3; 066 } 067 else 068 { 069 var3 = this.theInventory[par1].splitStack(par2); 070 071 if (this.theInventory[par1].stackSize == 0) 072 { 073 this.theInventory[par1] = null; 074 } 075 076 if (this.inventoryResetNeededOnSlotChange(par1)) 077 { 078 this.resetRecipeAndSlots(); 079 } 080 081 return var3; 082 } 083 } 084 else 085 { 086 return null; 087 } 088 } 089 090 /** 091 * if par1 slot has changed, does resetRecipeAndSlots need to be called? 092 */ 093 private boolean inventoryResetNeededOnSlotChange(int par1) 094 { 095 return par1 == 0 || par1 == 1; 096 } 097 098 /** 099 * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - 100 * like when you close a workbench GUI. 101 */ 102 public ItemStack getStackInSlotOnClosing(int par1) 103 { 104 if (this.theInventory[par1] != null) 105 { 106 ItemStack var2 = this.theInventory[par1]; 107 this.theInventory[par1] = null; 108 return var2; 109 } 110 else 111 { 112 return null; 113 } 114 } 115 116 /** 117 * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). 118 */ 119 public void setInventorySlotContents(int par1, ItemStack par2ItemStack) 120 { 121 this.theInventory[par1] = par2ItemStack; 122 123 if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit()) 124 { 125 par2ItemStack.stackSize = this.getInventoryStackLimit(); 126 } 127 128 if (this.inventoryResetNeededOnSlotChange(par1)) 129 { 130 this.resetRecipeAndSlots(); 131 } 132 } 133 134 /** 135 * Returns the name of the inventory. 136 */ 137 public String getInvName() 138 { 139 return "mob.villager"; 140 } 141 142 /** 143 * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't 144 * this more of a set than a get?* 145 */ 146 public int getInventoryStackLimit() 147 { 148 return 64; 149 } 150 151 /** 152 * Do not make give this method the name canInteractWith because it clashes with Container 153 */ 154 public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) 155 { 156 return this.theMerchant.getCustomer() == par1EntityPlayer; 157 } 158 159 public void openChest() {} 160 161 public void closeChest() {} 162 163 /** 164 * Called when an the contents of an Inventory change, usually 165 */ 166 public void onInventoryChanged() 167 { 168 this.resetRecipeAndSlots(); 169 } 170 171 public void resetRecipeAndSlots() 172 { 173 this.currentRecipe = null; 174 ItemStack var1 = this.theInventory[0]; 175 ItemStack var2 = this.theInventory[1]; 176 177 if (var1 == null) 178 { 179 var1 = var2; 180 var2 = null; 181 } 182 183 if (var1 == null) 184 { 185 this.setInventorySlotContents(2, (ItemStack)null); 186 } 187 else 188 { 189 MerchantRecipeList var3 = this.theMerchant.getRecipes(this.thePlayer); 190 191 if (var3 != null) 192 { 193 MerchantRecipe var4 = var3.canRecipeBeUsed(var1, var2, this.currentRecipeIndex); 194 195 if (var4 != null && !var4.func_82784_g()) 196 { 197 this.currentRecipe = var4; 198 this.setInventorySlotContents(2, var4.getItemToSell().copy()); 199 } 200 else if (var2 != null) 201 { 202 var4 = var3.canRecipeBeUsed(var2, var1, this.currentRecipeIndex); 203 204 if (var4 != null && !var4.func_82784_g()) 205 { 206 this.currentRecipe = var4; 207 this.setInventorySlotContents(2, var4.getItemToSell().copy()); 208 } 209 else 210 { 211 this.setInventorySlotContents(2, (ItemStack)null); 212 } 213 } 214 else 215 { 216 this.setInventorySlotContents(2, (ItemStack)null); 217 } 218 } 219 } 220 } 221 222 public MerchantRecipe getCurrentRecipe() 223 { 224 return this.currentRecipe; 225 } 226 227 public void setCurrentRecipeIndex(int par1) 228 { 229 this.currentRecipeIndex = par1; 230 this.resetRecipeAndSlots(); 231 } 232 }