resonant-induction/archive/java/resonantinduction/old/transport/hopper/TileEntityAdvancedHopper.java
2014-01-11 17:44:07 +08:00

149 lines
4.5 KiB
Java

package resonantinduction.old.transport.hopper;
import java.util.List;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.ForgeDirection;
import resonantinduction.core.prefab.tile.TileEntityFilterable;
import resonantinduction.old.transport.imprinter.ItemImprinter;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.HelperMethods;
import calclavia.lib.utility.InvInteractionHelper;
/**
* Advanced version of the hopper with features such as redstone control, sorting, filtering, and
* crate version.
*
* @author DarkGuardsman
*/
public class TileEntityAdvancedHopper extends TileEntityFilterable
{
public ForgeDirection connection = ForgeDirection.DOWN;
public boolean[] connections = new boolean[6];
public boolean singleConnection = true;
/** The class that interacts with inventories for this machine */
private InvInteractionHelper invExtractionHelper;
public TileEntityAdvancedHopper()
{
this.invSlots = 5;
}
/** Gets the class that managed extracting and placing items into inventories */
public InvInteractionHelper invHelper()
{
if (invExtractionHelper == null || invExtractionHelper.world != this.worldObj)
{
this.invExtractionHelper = new InvInteractionHelper(this.worldObj, new Vector3(this), this.getFilter() != null ? ItemImprinter.getFilters(getFilter()) : null, this.isInverted());
}
return invExtractionHelper;
}
/**
* Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner
* uses this to count ticks and creates a new spawn inside its implementation.
*/
@Override
public void updateEntity()
{
super.updateEntity();
if (!this.worldObj.isRemote && this.ticks % 8 == 0)
{
this.grabItems();
this.dumpItems();
}
}
public void grabItems()
{
Vector3 inputPos = this.getThisPos().clone().modifyPositionFromSide(ForgeDirection.UP);
List<EntityItem> itemsInBound = HelperMethods.getEntitiesInDirection(worldObj, this.getThisPos(), ForgeDirection.UP);
ItemStack itemStack = invHelper().tryGrabFromPosition(inputPos, ForgeDirection.UP, 1);
if (itemStack != null)
{
itemStack = invHelper().tryPlaceInPosition(itemStack, this.getThisPos(), ForgeDirection.UNKNOWN);
if (itemStack != null)
{
itemStack = invHelper().tryPlaceInPosition(itemStack, inputPos, ForgeDirection.DOWN);
if (itemStack != null)
{
invHelper().throwItem(inputPos, itemStack);
}
}
}
else if (inputPos.getTileEntity(worldObj) == null && itemsInBound != null)
{
for (EntityItem entity : itemsInBound)
{
if (entity.isDead)
{
continue;
}
ItemStack remainingStack = entity.getEntityItem().copy();
if (this.getFilter() == null || this.isFiltering(remainingStack))
{
if (remainingStack != null)
{
remainingStack = invHelper().tryPlaceInPosition(itemStack, this.getThisPos(), ForgeDirection.UNKNOWN);
}
if (remainingStack == null || remainingStack.stackSize <= 0)
{
entity.setDead();
}
else
{
entity.setEntityItemStack(remainingStack);
}
}
}
}
}
public void dumpItems()
{
Vector3 outputPos = this.getThisPos().clone().modifyPositionFromSide(this.connection);
for (int slot = 0; slot < this.getInventory().getSizeInventory(); slot++)
{
if (this.getInventory().getStackInSlot(slot) != null)
{
ItemStack stack = this.getInventory().getStackInSlot(slot).copy();
if (this.getFilter() == null || this.isFiltering(stack))
{
stack = this.invHelper().tryGrabFromPosition(outputPos, this.connection.getOpposite(), 1);
if (stack == null || !areItemStacksEqualItem(stack, this.getInventory().getStackInSlot(slot)) || this.getInventory().getStackInSlot(slot).stackSize != stack.stackSize)
{
this.getInventory().setInventorySlotContents(slot, stack);
this.onInventoryChanged();
}
}
}
}
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
}
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
}
@Override
public String getInvName()
{
return "container.advancedhopper";
}
private static boolean areItemStacksEqualItem(ItemStack stack, ItemStack stack2)
{
return stack.itemID != stack2.itemID ? false : (stack.getItemDamage() != stack2.getItemDamage() ? false : (stack.stackSize > stack.getMaxStackSize() ? false : ItemStack.areItemStackTagsEqual(stack, stack2)));
}
}