package openblocks.common.tileentity;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.util.ForgeDirection;
import openblocks.client.gui.GuiItemDropper;
import openblocks.common.container.ContainerItemDropper;
import openmods.api.IHasGui;
import openmods.api.INeighbourAwareTile;
import openmods.fakeplayer.FakePlayerPool;
import openmods.fakeplayer.FakePlayerPool.PlayerUser;
import openmods.fakeplayer.OpenModsFakePlayer;
import openmods.include.IncludeInterface;
import openmods.inventory.GenericInventory;
import openmods.inventory.IInventoryProvider;
import openmods.inventory.TileEntityInventory;
import openmods.tileentity.OpenTileEntity;
import openmods.utils.InventoryUtils;
public class TileEntityItemDropper extends OpenTileEntity implements INeighbourAwareTile, IInventoryProvider, IHasGui {
static final int BUFFER_SIZE = 9;
private boolean _redstoneSignal;
private GenericInventory inventory = registerInventoryCallback(new TileEntityInventory(this, "itemDropper", false, 9));
public TileEntityItemDropper() {}
public void setRedstoneSignal(boolean redstoneSignal) {
if (redstoneSignal != _redstoneSignal) {
_redstoneSignal = redstoneSignal;
if (_redstoneSignal && !InventoryUtils.inventoryIsEmpty(inventory)) {
dropItem();
}
}
}
private void dropItem() {
if (!(worldObj instanceof WorldServer)) return;
for (int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack stack = inventory.getStackInSlot(i);
if (stack == null || stack.stackSize <= 0) continue;
final ItemStack dropped = stack.splitStack(1);
if (stack.stackSize <= 0) inventory.setInventorySlotContents(i, null);
FakePlayerPool.instance.executeOnPlayer((WorldServer)worldObj, new PlayerUser() {
@Override
public void usePlayer(OpenModsFakePlayer fakePlayer) {
fakePlayer.dropItemAt(dropped, xCoord, yCoord, zCoord, ForgeDirection.DOWN);
}
});
break;
}
}
@Override
public void onNeighbourChanged(Block block) {
if (!worldObj.isRemote) {
setRedstoneSignal(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord));
}
}
@Override
public Object getServerGui(EntityPlayer player) {
return new ContainerItemDropper(player.inventory, this);
}
@Override
public Object getClientGui(EntityPlayer player) {
return new GuiItemDropper(new ContainerItemDropper(player.inventory, this));
}
@Override
public boolean canOpenGui(EntityPlayer player) {
return true;
}
@Override
@IncludeInterface
public IInventory getInventory() {
return inventory;
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
inventory.writeToNBT(tag);
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
inventory.readFromNBT(tag);
}
@Override
public boolean canUpdate() {
return false;
}
}