package net.minecraft.entity.player;
import java.util.concurrent.Callable;
import net.minecraft.block.Block;
import net.minecraft.command.server.CommandTestForBlock;
import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.ReportedException;
public class InventoryPlayer implements IInventory
{
/**
* An array of 36 item stacks indicating the main player inventory (including the visible bar).
*/
public ItemStack[] mainInventory = new ItemStack[36];
/** An array of 4 item stacks containing the currently worn armor pieces. */
public ItemStack[] armorInventory = new ItemStack[4];
/** The index of the currently held item (0-8). */
public int currentItem;
/** The player whose inventory this is. */
public EntityPlayer player;
private ItemStack itemStack;
/**
* Set true whenever the inventory changes. Nothing sets it false so you will have to write your own code to check
* it and reset the value.
*/
public boolean inventoryChanged;
private static final String __OBFID = "CL_00001709";
public InventoryPlayer(EntityPlayer p_i1750_1_)
{
this.player = p_i1750_1_;
}
/**
* Returns the item stack currently held by the player.
*/
public ItemStack getCurrentItem()
{
return this.currentItem < 9 && this.currentItem >= 0 ? this.mainInventory[this.currentItem] : null;
}
/**
* Get the size of the player hotbar inventory
*/
public static int getHotbarSize()
{
return 9;
}
private int getInventorySlotContainItem(Item itemIn)
{
for (int var2 = 0; var2 < this.mainInventory.length; ++var2)
{
if (this.mainInventory[var2] != null && this.mainInventory[var2].getItem() == itemIn)
{
return var2;
}
}
return -1;
}
/**
* stores an itemstack in the users inventory
*/
private int storeItemStack(ItemStack p_70432_1_)
{
for (int var2 = 0; var2 < this.mainInventory.length; ++var2)
{
if (this.mainInventory[var2] != null && this.mainInventory[var2].getItem() == p_70432_1_.getItem() && this.mainInventory[var2].isStackable() && this.mainInventory[var2].stackSize < this.mainInventory[var2].getMaxStackSize() && this.mainInventory[var2].stackSize < this.getInventoryStackLimit() && (!this.mainInventory[var2].getHasSubtypes() || this.mainInventory[var2].getMetadata() == p_70432_1_.getMetadata()) && ItemStack.areItemStackTagsEqual(this.mainInventory[var2], p_70432_1_))
{
return var2;
}
}
return -1;
}
/**
* Returns the first item stack that is empty.
*/
public int getFirstEmptyStack()
{
for (int var1 = 0; var1 < this.mainInventory.length; ++var1)
{
if (this.mainInventory[var1] == null)
{
return var1;
}
}
return -1;
}
public int func_174925_a(Item p_174925_1_, int p_174925_2_, int p_174925_3_, NBTTagCompound p_174925_4_)
{
int var5 = 0;
int var6;
ItemStack var7;
int var8;
for (var6 = 0; var6 < this.mainInventory.length; ++var6)
{
var7 = this.mainInventory[var6];
if (var7 != null && (p_174925_1_ == null || var7.getItem() == p_174925_1_) && (p_174925_2_ <= -1 || var7.getMetadata() == p_174925_2_) && (p_174925_4_ == null || CommandTestForBlock.func_175775_a(p_174925_4_, var7.getTagCompound(), true)))
{
var8 = p_174925_3_ <= 0 ? var7.stackSize : Math.min(p_174925_3_ - var5, var7.stackSize);
var5 += var8;
if (p_174925_3_ != 0)
{
this.mainInventory[var6].stackSize -= var8;
if (this.mainInventory[var6].stackSize == 0)
{
this.mainInventory[var6] = null;
}
if (p_174925_3_ > 0 && var5 >= p_174925_3_)
{
return var5;
}
}
}
}
for (var6 = 0; var6 < this.armorInventory.length; ++var6)
{
var7 = this.armorInventory[var6];
if (var7 != null && (p_174925_1_ == null || var7.getItem() == p_174925_1_) && (p_174925_2_ <= -1 || var7.getMetadata() == p_174925_2_) && (p_174925_4_ == null || CommandTestForBlock.func_175775_a(p_174925_4_, var7.getTagCompound(), false)))
{
var8 = p_174925_3_ <= 0 ? var7.stackSize : Math.min(p_174925_3_ - var5, var7.stackSize);
var5 += var8;
if (p_174925_3_ != 0)
{
this.armorInventory[var6].stackSize -= var8;
if (this.armorInventory[var6].stackSize == 0)
{
this.armorInventory[var6] = null;
}
if (p_174925_3_ > 0 && var5 >= p_174925_3_)
{
return var5;
}
}
}
}
if (this.itemStack != null)
{
if (p_174925_1_ != null && this.itemStack.getItem() != p_174925_1_)
{
return var5;
}
if (p_174925_2_ > -1 && this.itemStack.getMetadata() != p_174925_2_)
{
return var5;
}
if (p_174925_4_ != null && !CommandTestForBlock.func_175775_a(p_174925_4_, this.itemStack.getTagCompound(), false))
{
return var5;
}
var6 = p_174925_3_ <= 0 ? this.itemStack.stackSize : Math.min(p_174925_3_ - var5, this.itemStack.stackSize);
var5 += var6;
if (p_174925_3_ != 0)
{
this.itemStack.stackSize -= var6;
if (this.itemStack.stackSize == 0)
{
this.itemStack = null;
}
if (p_174925_3_ > 0 && var5 >= p_174925_3_)
{
return var5;
}
}
}
return var5;
}
/**
* This function stores as many items of an ItemStack as possible in a matching slot and returns the quantity of
* left over items.
*/
private int storePartialItemStack(ItemStack p_70452_1_)
{
Item var2 = p_70452_1_.getItem();
int var3 = p_70452_1_.stackSize;
int var4 = this.storeItemStack(p_70452_1_);
if (var4 < 0)
{
var4 = this.getFirstEmptyStack();
}
if (var4 < 0)
{
return var3;
}
else
{
if (this.mainInventory[var4] == null)
{
this.mainInventory[var4] = new ItemStack(var2, 0, p_70452_1_.getMetadata());
if (p_70452_1_.hasTagCompound())
{
this.mainInventory[var4].setTagCompound((NBTTagCompound)p_70452_1_.getTagCompound().copy());
}
}
int var5 = var3;
if (var3 > this.mainInventory[var4].getMaxStackSize() - this.mainInventory[var4].stackSize)
{
var5 = this.mainInventory[var4].getMaxStackSize() - this.mainInventory[var4].stackSize;
}
if (var5 > this.getInventoryStackLimit() - this.mainInventory[var4].stackSize)
{
var5 = this.getInventoryStackLimit() - this.mainInventory[var4].stackSize;
}
if (var5 == 0)
{
return var3;
}
else
{
var3 -= var5;
this.mainInventory[var4].stackSize += var5;
this.mainInventory[var4].animationsToGo = 5;
return var3;
}
}
}
/**
* Decrement the number of animations remaining. Only called on client side. This is used to handle the animation of
* receiving a block.
*/
public void decrementAnimations()
{
for (int var1 = 0; var1 < this.mainInventory.length; ++var1)
{
if (this.mainInventory[var1] != null)
{
this.mainInventory[var1].updateAnimation(this.player.worldObj, this.player, var1, this.currentItem == var1);
}
}
}
/**
* removed one item of specified Item from inventory (if it is in a stack, the stack size will reduce with 1)
*/
public boolean consumeInventoryItem(Item p_146026_1_)
{
int var2 = this.getInventorySlotContainItem(p_146026_1_);
if (var2 < 0)
{
return false;
}
else
{
if (--this.mainInventory[var2].stackSize <= 0)
{
this.mainInventory[var2] = null;
}
return true;
}
}
/**
* Checks if a specified Item is inside the inventory
*/
public boolean hasItem(Item p_146028_1_)
{
int var2 = this.getInventorySlotContainItem(p_146028_1_);
return var2 >= 0;
}
/**
* Adds the item stack to the inventory, returns false if it is impossible.
*/
public boolean addItemStackToInventory(final ItemStack p_70441_1_)
{
if (p_70441_1_ != null && p_70441_1_.stackSize != 0 && p_70441_1_.getItem() != null)
{
try
{
int var2;
if (p_70441_1_.isItemDamaged())
{
var2 = this.getFirstEmptyStack();
if (var2 >= 0)
{
this.mainInventory[var2] = ItemStack.copyItemStack(p_70441_1_);
this.mainInventory[var2].animationsToGo = 5;
p_70441_1_.stackSize = 0;
return true;
}
else if (this.player.capabilities.isCreativeMode)
{
p_70441_1_.stackSize = 0;
return true;
}
else
{
return false;
}
}
else
{
do
{
var2 = p_70441_1_.stackSize;
p_70441_1_.stackSize = this.storePartialItemStack(p_70441_1_);
}
while (p_70441_1_.stackSize > 0 && p_70441_1_.stackSize < var2);
if (p_70441_1_.stackSize == var2 && this.player.capabilities.isCreativeMode)
{
p_70441_1_.stackSize = 0;
return true;
}
else
{
return p_70441_1_.stackSize < var2;
}
}
}
catch (Throwable var5)
{
CrashReport var3 = CrashReport.makeCrashReport(var5, "Adding item to inventory");
CrashReportCategory var4 = var3.makeCategory("Item being added");
var4.addCrashSection("Item ID", Integer.valueOf(Item.getIdFromItem(p_70441_1_.getItem())));
var4.addCrashSection("Item data", Integer.valueOf(p_70441_1_.getMetadata()));
var4.addCrashSectionCallable("Item name", new Callable()
{
private static final String __OBFID = "CL_00001710";
public String call()
{
return p_70441_1_.getDisplayName();
}
});
throw new ReportedException(var3);
}
}
else
{
return false;
}
}
/**
* 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 index, int count)
{
ItemStack[] var3 = this.mainInventory;
if (index >= this.mainInventory.length)
{
var3 = this.armorInventory;
index -= this.mainInventory.length;
}
if (var3[index] != null)
{
ItemStack var4;
if (var3[index].stackSize <= count)
{
var4 = var3[index];
var3[index] = null;
return var4;
}
else
{
var4 = var3[index].splitStack(count);
if (var3[index].stackSize == 0)
{
var3[index] = null;
}
return var4;
}
}
else
{
return null;
}
}
/**
* 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 index)
{
ItemStack[] var2 = this.mainInventory;
if (index >= this.mainInventory.length)
{
var2 = this.armorInventory;
index -= this.mainInventory.length;
}
if (var2[index] != null)
{
ItemStack var3 = var2[index];
var2[index] = null;
return var3;
}
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 index, ItemStack stack)
{
ItemStack[] var3 = this.mainInventory;
if (index >= var3.length)
{
index -= var3.length;
var3 = this.armorInventory;
}
var3[index] = stack;
}
public float getStrVsBlock(Block p_146023_1_)
{
float var2 = 1.0F;
if (this.mainInventory[this.currentItem] != null)
{
var2 *= this.mainInventory[this.currentItem].getStrVsBlock(p_146023_1_);
}
return var2;
}
/**
* Writes the inventory out as a list of compound tags. This is where the slot indices are used (+100 for armor, +80
* for crafting).
*/
public NBTTagList writeToNBT(NBTTagList p_70442_1_)
{
int var2;
NBTTagCompound var3;
for (var2 = 0; var2 < this.mainInventory.length; ++var2)
{
if (this.mainInventory[var2] != null)
{
var3 = new NBTTagCompound();
var3.setByte("Slot", (byte)var2);
this.mainInventory[var2].writeToNBT(var3);
p_70442_1_.appendTag(var3);
}
}
for (var2 = 0; var2 < this.armorInventory.length; ++var2)
{
if (this.armorInventory[var2] != null)
{
var3 = new NBTTagCompound();
var3.setByte("Slot", (byte)(var2 + 100));
this.armorInventory[var2].writeToNBT(var3);
p_70442_1_.appendTag(var3);
}
}
return p_70442_1_;
}
/**
* Reads from the given tag list and fills the slots in the inventory with the correct items.
*/
public void readFromNBT(NBTTagList p_70443_1_)
{
this.mainInventory = new ItemStack[36];
this.armorInventory = new ItemStack[4];
for (int var2 = 0; var2 < p_70443_1_.tagCount(); ++var2)
{
NBTTagCompound var3 = p_70443_1_.getCompoundTagAt(var2);
int var4 = var3.getByte("Slot") & 255;
ItemStack var5 = ItemStack.loadItemStackFromNBT(var3);
if (var5 != null)
{
if (var4 >= 0 && var4 < this.mainInventory.length)
{
this.mainInventory[var4] = var5;
}
if (var4 >= 100 && var4 < this.armorInventory.length + 100)
{
this.armorInventory[var4 - 100] = var5;
}
}
}
}
/**
* Returns the number of slots in the inventory.
*/
public int getSizeInventory()
{
return this.mainInventory.length + 4;
}
/**
* Returns the stack in slot i
*/
public ItemStack getStackInSlot(int slotIn)
{
ItemStack[] var2 = this.mainInventory;
if (slotIn >= var2.length)
{
slotIn -= var2.length;
var2 = this.armorInventory;
}
return var2[slotIn];
}
/**
* Gets the name of this command sender (usually username, but possibly "Rcon")
*/
public String getName()
{
return "container.inventory";
}
/**
* Returns true if this thing is named
*/
public boolean hasCustomName()
{
return false;
}
public IChatComponent getDisplayName()
{
return (IChatComponent)(this.hasCustomName() ? new ChatComponentText(this.getName()) : new ChatComponentTranslation(this.getName(), new Object[0]));
}
/**
* 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;
}
public boolean func_146025_b(Block p_146025_1_)
{
if (p_146025_1_.getMaterial().isToolNotRequired())
{
return true;
}
else
{
ItemStack var2 = this.getStackInSlot(this.currentItem);
return var2 != null ? var2.canHarvestBlock(p_146025_1_) : false;
}
}
/**
* returns a player armor item (as itemstack) contained in specified armor slot.
*/
public ItemStack armorItemInSlot(int p_70440_1_)
{
return this.armorInventory[p_70440_1_];
}
/**
* Based on the damage values and maximum damage values of each armor item, returns the current armor value.
*/
public int getTotalArmorValue()
{
int var1 = 0;
for (int var2 = 0; var2 < this.armorInventory.length; ++var2)
{
if (this.armorInventory[var2] != null && this.armorInventory[var2].getItem() instanceof ItemArmor)
{
int var3 = ((ItemArmor)this.armorInventory[var2].getItem()).damageReduceAmount;
var1 += var3;
}
}
return var1;
}
/**
* Damages armor in each slot by the specified amount.
*/
public void damageArmor(float p_70449_1_)
{
p_70449_1_ /= 4.0F;
if (p_70449_1_ < 1.0F)
{
p_70449_1_ = 1.0F;
}
for (int var2 = 0; var2 < this.armorInventory.length; ++var2)
{
if (this.armorInventory[var2] != null && this.armorInventory[var2].getItem() instanceof ItemArmor)
{
this.armorInventory[var2].damageItem((int)p_70449_1_, this.player);
if (this.armorInventory[var2].stackSize == 0)
{
this.armorInventory[var2] = null;
}
}
}
}
/**
* Drop all armor and main inventory items.
*/
public void dropAllItems()
{
int var1;
for (var1 = 0; var1 < this.mainInventory.length; ++var1)
{
if (this.mainInventory[var1] != null)
{
this.player.func_146097_a(this.mainInventory[var1], true, false);
this.mainInventory[var1] = null;
}
}
for (var1 = 0; var1 < this.armorInventory.length; ++var1)
{
if (this.armorInventory[var1] != null)
{
this.player.func_146097_a(this.armorInventory[var1], true, false);
this.armorInventory[var1] = null;
}
}
}
/**
* For tile entities, ensures the chunk containing the tile entity is saved to disk later - the game won't think it
* hasn't changed and skip it.
*/
public void markDirty()
{
this.inventoryChanged = true;
}
/**
* Set the stack helds by mouse, used in GUI/Container
*/
public void setItemStack(ItemStack p_70437_1_)
{
this.itemStack = p_70437_1_;
}
/**
* Stack helds by mouse, used in GUI and Containers
*/
public ItemStack getItemStack()
{
return this.itemStack;
}
/**
* Do not make give this method the name canInteractWith because it clashes with Container
*/
public boolean isUseableByPlayer(EntityPlayer playerIn)
{
return this.player.isDead ? false : playerIn.getDistanceSqToEntity(this.player) <= 64.0D;
}
/**
* Returns true if the specified ItemStack exists in the inventory.
*/
public boolean hasItemStack(ItemStack p_70431_1_)
{
int var2;
for (var2 = 0; var2 < this.armorInventory.length; ++var2)
{
if (this.armorInventory[var2] != null && this.armorInventory[var2].isItemEqual(p_70431_1_))
{
return true;
}
}
for (var2 = 0; var2 < this.mainInventory.length; ++var2)
{
if (this.mainInventory[var2] != null && this.mainInventory[var2].isItemEqual(p_70431_1_))
{
return true;
}
}
return false;
}
public void openInventory(EntityPlayer playerIn) {}
public void closeInventory(EntityPlayer playerIn) {}
/**
* Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot.
*/
public boolean isItemValidForSlot(int index, ItemStack stack)
{
return true;
}
/**
* Copy the ItemStack contents from another InventoryPlayer instance
*/
public void copyInventory(InventoryPlayer p_70455_1_)
{
int var2;
for (var2 = 0; var2 < this.mainInventory.length; ++var2)
{
this.mainInventory[var2] = ItemStack.copyItemStack(p_70455_1_.mainInventory[var2]);
}
for (var2 = 0; var2 < this.armorInventory.length; ++var2)
{
this.armorInventory[var2] = ItemStack.copyItemStack(p_70455_1_.armorInventory[var2]);
}
this.currentItem = p_70455_1_.currentItem;
}
public int getField(int id)
{
return 0;
}
public void setField(int id, int value) {}
public int getFieldCount()
{
return 0;
}
public void clearInventory()
{
int var1;
for (var1 = 0; var1 < this.mainInventory.length; ++var1)
{
this.mainInventory[var1] = null;
}
for (var1 = 0; var1 < this.armorInventory.length; ++var1)
{
this.armorInventory[var1] = null;
}
}
}