149 lines
4.5 KiB
Java
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)));
|
|
}
|
|
}
|