001 package net.minecraft.inventory; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import net.minecraft.entity.player.EntityPlayer; 006 import net.minecraft.item.ItemStack; 007 008 public class Slot 009 { 010 /** The index of the slot in the inventory. */ 011 private final int slotIndex; 012 013 /** The inventory we want to extract a slot from. */ 014 public final IInventory inventory; 015 016 /** the id of the slot(also the index in the inventory arraylist) */ 017 public int slotNumber; 018 019 /** display position of the inventory slot on the screen x axis */ 020 public int xDisplayPosition; 021 022 /** display position of the inventory slot on the screen y axis */ 023 public int yDisplayPosition; 024 025 /** Position within background texture file, normally -1 which causes no background to be drawn. */ 026 protected int backgroundIconIndex = -1; 027 028 /** Background texture file assigned to this slot, if any. Vanilla "/gui/items.png" is used if this is null. */ 029 protected String texture = "/gui/items.png"; 030 031 public Slot(IInventory par1IInventory, int par2, int par3, int par4) 032 { 033 this.inventory = par1IInventory; 034 this.slotIndex = par2; 035 this.xDisplayPosition = par3; 036 this.yDisplayPosition = par4; 037 } 038 039 /** 040 * if par2 has more items than par1, onCrafting(item,countIncrease) is called 041 */ 042 public void onSlotChange(ItemStack par1ItemStack, ItemStack par2ItemStack) 043 { 044 if (par1ItemStack != null && par2ItemStack != null) 045 { 046 if (par1ItemStack.itemID == par2ItemStack.itemID) 047 { 048 int var3 = par2ItemStack.stackSize - par1ItemStack.stackSize; 049 050 if (var3 > 0) 051 { 052 this.onCrafting(par1ItemStack, var3); 053 } 054 } 055 } 056 } 057 058 /** 059 * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an 060 * internal count then calls onCrafting(item). 061 */ 062 protected void onCrafting(ItemStack par1ItemStack, int par2) {} 063 064 /** 065 * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. 066 */ 067 protected void onCrafting(ItemStack par1ItemStack) {} 068 069 public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack) 070 { 071 this.onSlotChanged(); 072 } 073 074 /** 075 * Check if the stack is a valid item for this slot. Always true beside for the armor slots. 076 */ 077 public boolean isItemValid(ItemStack par1ItemStack) 078 { 079 return true; 080 } 081 082 /** 083 * Helper fnct to get the stack in the slot. 084 */ 085 public ItemStack getStack() 086 { 087 return this.inventory.getStackInSlot(this.slotIndex); 088 } 089 090 /** 091 * Returns if this slot contains a stack. 092 */ 093 public boolean getHasStack() 094 { 095 return this.getStack() != null; 096 } 097 098 /** 099 * Helper method to put a stack in the slot. 100 */ 101 public void putStack(ItemStack par1ItemStack) 102 { 103 this.inventory.setInventorySlotContents(this.slotIndex, par1ItemStack); 104 this.onSlotChanged(); 105 } 106 107 /** 108 * Called when the stack in a Slot changes 109 */ 110 public void onSlotChanged() 111 { 112 this.inventory.onInventoryChanged(); 113 } 114 115 /** 116 * Returns the maximum stack size for a given slot (usually the same as getInventoryStackLimit(), but 1 in the case 117 * of armor slots) 118 */ 119 public int getSlotStackLimit() 120 { 121 return this.inventory.getInventoryStackLimit(); 122 } 123 124 /** 125 * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new 126 * stack. 127 */ 128 public ItemStack decrStackSize(int par1) 129 { 130 return this.inventory.decrStackSize(this.slotIndex, par1); 131 } 132 133 /** 134 * returns true if this slot is in par2 of par1 135 */ 136 public boolean isSlotInInventory(IInventory par1IInventory, int par2) 137 { 138 return par1IInventory == this.inventory && par2 == this.slotIndex; 139 } 140 141 /** 142 * Return whether this slot's stack can be taken from this slot. 143 */ 144 public boolean canTakeStack(EntityPlayer par1EntityPlayer) 145 { 146 return true; 147 } 148 149 @SideOnly(Side.CLIENT) 150 151 /** 152 * Returns the icon index on items.png that is used as background image of the slot. 153 */ 154 public int getBackgroundIconIndex() 155 { 156 return backgroundIconIndex; 157 } 158 159 /** 160 * Gets the path of the texture file to use for the background image of this slot when drawing the GUI. 161 * @return String: The texture file that will be used in GuiContainer.drawSlotInventory for the slot background. 162 */ 163 public String getBackgroundIconTexture() 164 { 165 return (texture == null ? "/gui/items.png" : texture); 166 } 167 168 /** 169 * Sets which icon index to use as the background image of the slot when it's empty. 170 * @param iconIndex int: The index into the texture file, 0-255, or -1 for no background. 171 */ 172 public void setBackgroundIconIndex(int iconIndex) 173 { 174 backgroundIconIndex = iconIndex; 175 } 176 177 /** 178 * Sets the texture file to use for the background image of the slot when it's empty. 179 * @param textureFilename String: Path of texture file to use, or null to use "/gui/items.png" 180 */ 181 public void setBackgroundIconTexture(String textureFilename) 182 { 183 texture = textureFilename; 184 } 185 186 /** 187 * Retrieves the index in the inventory for this slot, this value should typically not 188 * be used, but can be useful for some occasions. 189 * 190 * @return Index in associated inventory for this slot. 191 */ 192 public int getSlotIndex() 193 { 194 return slotIndex; 195 } 196 }