blob: d7cf8845640108447526106d4f084027d8808acf [file] [log] [blame] [raw]
package mekanism.common.tile.component;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.List;
import mekanism.api.Coord4D;
import mekanism.api.EnumColor;
import mekanism.api.transmitters.TransmissionType;
import mekanism.common.SideData;
import mekanism.common.base.IEjector;
import mekanism.common.base.ILogisticalTransporter;
import mekanism.common.base.ISideConfiguration;
import mekanism.common.base.ITileComponent;
import mekanism.common.content.transporter.TransporterManager;
import mekanism.common.tile.TileEntityContainerBlock;
import mekanism.common.util.InventoryUtils;
import mekanism.common.util.MekanismUtils;
import mekanism.common.util.TransporterUtils;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
public class TileComponentEjector implements ITileComponent, IEjector
{
public TileEntityContainerBlock tileEntity;
public boolean strictInput;
public EnumColor outputColor;
public EnumColor[] inputColors = new EnumColor[] {null, null, null, null, null, null};
public int tickDelay = 0;
public SideData sideData;
public int[] trackers;
public TileComponentEjector(TileEntityContainerBlock tile, SideData data)
{
tileEntity = tile;
sideData = data;
trackers = new int[sideData.availableSlots.length];
tile.components.add(this);
}
public void readFrom(TileComponentEjector ejector)
{
strictInput = ejector.strictInput;
outputColor = ejector.outputColor;
inputColors = ejector.inputColors;
tickDelay = ejector.tickDelay;
sideData = ejector.sideData;
trackers = ejector.trackers;
}
private List<ForgeDirection> getTrackedOutputs(int index, List<ForgeDirection> dirs)
{
List<ForgeDirection> sides = new ArrayList<ForgeDirection>();
for(int i = trackers[index]+1; i <= trackers[index]+6; i++)
{
for(ForgeDirection side : dirs)
{
if(ForgeDirection.getOrientation(i%6) == side)
{
sides.add(side);
}
}
}
return sides;
}
@Override
public void tick()
{
if(tickDelay == 0)
{
onOutput();
}
else {
tickDelay--;
}
}
@Override
public void onOutput()
{
if(!getEjecting(TransmissionType.ITEM) || tileEntity.getWorldObj().isRemote)
{
return;
}
List<ForgeDirection> outputSides = new ArrayList<ForgeDirection>();
ISideConfiguration configurable = (ISideConfiguration)tileEntity;
for(int i = 0; i < configurable.getConfig().getConfig(TransmissionType.ITEM).length; i++)
{
if(configurable.getConfig().getConfig(TransmissionType.ITEM)[i] == configurable.getConfig().getOutputs(TransmissionType.ITEM).indexOf(sideData))
{
outputSides.add(ForgeDirection.getOrientation(MekanismUtils.getBaseOrientation(i, tileEntity.facing)));
}
}
for(int index = 0; index < sideData.availableSlots.length; index++)
{
int slotID = sideData.availableSlots[index];
if(tileEntity.inventory[slotID] == null)
{
continue;
}
ItemStack stack = tileEntity.inventory[slotID];
List<ForgeDirection> outputs = getTrackedOutputs(index, outputSides);
for(ForgeDirection side : outputs)
{
TileEntity tile = Coord4D.get(tileEntity).getFromSide(side).getTileEntity(tileEntity.getWorldObj());
ItemStack prev = stack.copy();
if(tile instanceof IInventory && !(tile instanceof ILogisticalTransporter))
{
stack = InventoryUtils.putStackInInventory((IInventory)tile, stack, side.ordinal(), false);
}
else if(tile instanceof ILogisticalTransporter)
{
ItemStack rejects = TransporterUtils.insert(tileEntity, (ILogisticalTransporter)tile, stack, outputColor, true, 0);
if(TransporterManager.didEmit(stack, rejects))
{
stack = rejects;
}
}
if(stack == null || prev.stackSize != stack.stackSize)
{
trackers[index] = side.ordinal();
}
if(stack == null)
{
break;
}
}
tileEntity.inventory[slotID] = stack;
tileEntity.markDirty();
}
tickDelay = 20;
}
@Override
public boolean hasStrictInput()
{
return strictInput;
}
@Override
public void setStrictInput(boolean strict)
{
strictInput = strict;
MekanismUtils.saveChunk(tileEntity);
}
@Override
public void setOutputColor(EnumColor color)
{
outputColor = color;
MekanismUtils.saveChunk(tileEntity);
}
@Override
public EnumColor getOutputColor()
{
return outputColor;
}
@Override
public void setInputColor(ForgeDirection side, EnumColor color)
{
inputColors[side.ordinal()] = color;
MekanismUtils.saveChunk(tileEntity);
}
@Override
public EnumColor getInputColor(ForgeDirection side)
{
return inputColors[side.ordinal()];
}
@Override
public void read(NBTTagCompound nbtTags)
{
strictInput = nbtTags.getBoolean("strictInput");
if(nbtTags.hasKey("ejectColor"))
{
outputColor = TransporterUtils.colors.get(nbtTags.getInteger("ejectColor"));
}
for(int i = 0; i < sideData.availableSlots.length; i++)
{
trackers[i] = nbtTags.getInteger("tracker" + i);
}
for(int i = 0; i < 6; i++)
{
if(nbtTags.hasKey("inputColors" + i))
{
int inC = nbtTags.getInteger("inputColors" + i);
if(inC != -1)
{
inputColors[i] = TransporterUtils.colors.get(inC);
}
else {
inputColors[i] = null;
}
}
}
}
@Override
public void read(ByteBuf dataStream)
{
strictInput = dataStream.readBoolean();
int c = dataStream.readInt();
if(c != -1)
{
outputColor = TransporterUtils.colors.get(c);
}
else {
outputColor = null;
}
for(int i = 0; i < 6; i++)
{
int inC = dataStream.readInt();
if(inC != -1)
{
inputColors[i] = TransporterUtils.colors.get(inC);
}
else {
inputColors[i] = null;
}
}
}
@Override
public void write(NBTTagCompound nbtTags)
{
nbtTags.setBoolean("strictInput", strictInput);
if(outputColor != null)
{
nbtTags.setInteger("ejectColor", TransporterUtils.colors.indexOf(outputColor));
}
for(int i = 0; i < sideData.availableSlots.length; i++)
{
nbtTags.setInteger("tracker" + i, trackers[i]);
}
for(int i = 0; i < 6; i++)
{
if(inputColors[i] == null)
{
nbtTags.setInteger("inputColors" + i, -1);
}
else {
nbtTags.setInteger("inputColors" + i, TransporterUtils.colors.indexOf(inputColors[i]));
}
}
}
@Override
public void write(ArrayList data)
{
data.add(strictInput);
if(outputColor != null)
{
data.add(TransporterUtils.colors.indexOf(outputColor));
}
else {
data.add(-1);
}
for(int i = 0; i < 6; i++)
{
if(inputColors[i] == null)
{
data.add(-1);
}
else {
data.add(TransporterUtils.colors.indexOf(inputColors[i]));
}
}
}
private boolean getEjecting(TransmissionType type)
{
return ((ISideConfiguration)tileEntity).getConfig().isEjecting(type);
}
}