146 lines
3.7 KiB
Java
146 lines
3.7 KiB
Java
package net.minecraft.tileentity;
|
|
|
|
import java.util.Random;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.entity.player.InventoryPlayer;
|
|
import net.minecraft.inventory.Container;
|
|
import net.minecraft.inventory.ContainerDispenser;
|
|
import net.minecraft.inventory.ItemStackHelper;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.NonNullList;
|
|
import net.minecraft.util.datafix.DataFixer;
|
|
import net.minecraft.util.datafix.FixTypes;
|
|
import net.minecraft.util.datafix.walkers.ItemStackDataLists;
|
|
|
|
public class TileEntityDispenser extends TileEntityLockableLoot
|
|
{
|
|
private static final Random RNG = new Random();
|
|
private NonNullList<ItemStack> stacks = NonNullList.<ItemStack>withSize(9, ItemStack.EMPTY);
|
|
|
|
/**
|
|
* Returns the number of slots in the inventory.
|
|
*/
|
|
public int getSizeInventory()
|
|
{
|
|
return 9;
|
|
}
|
|
|
|
public boolean isEmpty()
|
|
{
|
|
for (ItemStack itemstack : this.stacks)
|
|
{
|
|
if (!itemstack.isEmpty())
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public int getDispenseSlot()
|
|
{
|
|
this.fillWithLoot((EntityPlayer)null);
|
|
int i = -1;
|
|
int j = 1;
|
|
|
|
for (int k = 0; k < this.stacks.size(); ++k)
|
|
{
|
|
if (!((ItemStack)this.stacks.get(k)).isEmpty() && RNG.nextInt(j++) == 0)
|
|
{
|
|
i = k;
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
/**
|
|
* Add the given ItemStack to this Dispenser. Return the Slot the Item was placed in or -1 if no free slot is
|
|
* available.
|
|
*/
|
|
public int addItemStack(ItemStack stack)
|
|
{
|
|
for (int i = 0; i < this.stacks.size(); ++i)
|
|
{
|
|
if (((ItemStack)this.stacks.get(i)).isEmpty())
|
|
{
|
|
this.setInventorySlotContents(i, stack);
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
/**
|
|
* Get the name of this object. For players this returns their username
|
|
*/
|
|
public String getName()
|
|
{
|
|
return this.hasCustomName() ? this.customName : "container.dispenser";
|
|
}
|
|
|
|
public static void registerFixes(DataFixer fixer)
|
|
{
|
|
fixer.registerWalker(FixTypes.BLOCK_ENTITY, new ItemStackDataLists(TileEntityDispenser.class, new String[] {"Items"}));
|
|
}
|
|
|
|
public void readFromNBT(NBTTagCompound compound)
|
|
{
|
|
super.readFromNBT(compound);
|
|
this.stacks = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
|
|
|
|
if (!this.checkLootAndRead(compound))
|
|
{
|
|
ItemStackHelper.loadAllItems(compound, this.stacks);
|
|
}
|
|
|
|
if (compound.hasKey("CustomName", 8))
|
|
{
|
|
this.customName = compound.getString("CustomName");
|
|
}
|
|
}
|
|
|
|
public NBTTagCompound writeToNBT(NBTTagCompound compound)
|
|
{
|
|
super.writeToNBT(compound);
|
|
|
|
if (!this.checkLootAndWrite(compound))
|
|
{
|
|
ItemStackHelper.saveAllItems(compound, this.stacks);
|
|
}
|
|
|
|
if (this.hasCustomName())
|
|
{
|
|
compound.setString("CustomName", this.customName);
|
|
}
|
|
|
|
return compound;
|
|
}
|
|
|
|
/**
|
|
* Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended.
|
|
*/
|
|
public int getInventoryStackLimit()
|
|
{
|
|
return 64;
|
|
}
|
|
|
|
public String getGuiID()
|
|
{
|
|
return "minecraft:dispenser";
|
|
}
|
|
|
|
public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn)
|
|
{
|
|
this.fillWithLoot(playerIn);
|
|
return new ContainerDispenser(playerInventory, this);
|
|
}
|
|
|
|
protected NonNullList<ItemStack> getItems()
|
|
{
|
|
return this.stacks;
|
|
}
|
|
} |