package advancedsystemsmanager.tileentities;
import advancedsystemsmanager.registry.ClusterRegistry;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TileEntityValve extends TileEntityElementRotation implements IInventory
{
private static final int DISTANCE = 3;
private List<EntityItem> items;
@Override
public int getSizeInventory()
{
updateInventory();
return items.size() + 1; //always leave an empty slot
}
@Override
public ItemStack getStackInSlot(int id)
{
updateInventory();
id--;
if (id < 0 || !canPickUp(items.get(id)))
{
return null;
} else
{
return items.get(id).getEntityItem();
}
}
@Override
public ItemStack decrStackSize(int id, int count)
{
ItemStack item = getStackInSlot(id);
if (item != null)
{
if (item.stackSize <= count)
{
setInventorySlotContents(id, null);
return item;
}
ItemStack ret = item.splitStack(count);
if (item.stackSize == 0)
{
setInventorySlotContents(id, null);
}
return ret;
} else
{
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int i)
{
return null;
}
@Override
public void setInventorySlotContents(int id, ItemStack itemstack)
{
updateInventory();
id--;
if (id < 0 || !canPickUp(items.get(id)))
{
if (itemstack != null)
{
ForgeDirection direction = getFacing();
double posX = xCoord + 0.5 + direction.offsetX * 0.75;
double posY = yCoord + 0.5 + direction.offsetY * 0.75;
double posZ = zCoord + 0.5 + direction.offsetZ * 0.75;
if (direction.offsetY == 0)
{
posY -= 0.1;
}
EntityItem item = new EntityItem(worldObj, posX, posY, posZ, itemstack);
item.motionX = direction.offsetX * 0.2;
item.motionY = direction.offsetY * 0.2;
item.motionZ = direction.offsetZ * 0.2;
item.delayBeforeCanPickup = 40;
worldObj.spawnEntityInWorld(item);
if (id < 0)
{
items.add(item);
} else
{
items.set(id, item);
}
}
} else if (itemstack != null)
{
items.get(id).setEntityItemStack(itemstack);
} else
{
//seems to be an issue with setting it to null
items.get(id).setEntityItemStack(items.get(id).getEntityItem().copy());
items.get(id).getEntityItem().stackSize = 0;
items.get(id).setDead();
}
}
@Override
public String getInventoryName()
{
return ClusterRegistry.VALVE.getUnlocalizedName(subtype);
}
@Override
public boolean hasCustomInventoryName()
{
return true;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
return false;
}
@Override
public void openInventory()
{
}
@Override
public void closeInventory()
{
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
return true;
}
private void updateInventory()
{
if (items == null)
{
items = new ArrayList<EntityItem>();
int lowX = xCoord - DISTANCE;
int lowY = yCoord - DISTANCE;
int lowZ = zCoord - DISTANCE;
int highX = xCoord + 1 + DISTANCE;
int highY = yCoord + 1 + DISTANCE;
int highZ = zCoord + 1 + DISTANCE;
items = worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(lowX, lowY, lowZ, highX, highY, highZ));
//remove items we can't use right away, this check is done when we interact with items too, to make sure it hasn't changed
for (Iterator<EntityItem> iterator = items.iterator(); iterator.hasNext(); )
{
EntityItem next = iterator.next();
if (!canPickUp(next))
{
iterator.remove();
}
}
}
}
private boolean canPickUp(EntityItem item)
{
return !item.isDead && (item.delayBeforeCanPickup == 0 || subtype == 1);
}
@Override
public void updateEntity()
{
items = null;
}
}