Sorter work - hopefully outputs items now! :D

This commit is contained in:
Aidan C. Brady 2013-10-25 16:07:25 -04:00
parent e9c038cd24
commit 8d9ee35679
6 changed files with 123 additions and 45 deletions

View file

@ -81,7 +81,7 @@ public class ItemConfigurator extends ItemEnergized
else if(world.getBlockTileEntity(x, y, z) instanceof TileEntityLogisticalTransporter)
{
TileEntityLogisticalTransporter transporter = (TileEntityLogisticalTransporter)world.getBlockTileEntity(x, y, z);
transporter.insert(new Object3D(x, y, z).getFromSide(ForgeDirection.getOrientation(side)), new ItemStack(Item.appleRed));
transporter.insert(new Object3D(x, y, z).getFromSide(ForgeDirection.getOrientation(side)), new ItemStack(Item.appleRed), EnumColor.RED);
return true;
}
else if(world.getBlockTileEntity(x, y, z) instanceof ITransmitter)

View file

@ -4,23 +4,41 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import mekanism.api.EnumColor;
import mekanism.api.Object3D;
import mekanism.common.IActiveState;
import mekanism.common.IRedstoneControl;
import mekanism.common.IRedstoneControl.RedstoneControl;
import mekanism.common.PacketHandler;
import mekanism.common.PacketHandler.Transmission;
import mekanism.common.block.BlockMachine.MachineType;
import mekanism.common.network.PacketTileEntity;
import mekanism.common.transporter.SlotInfo;
import mekanism.common.transporter.TransporterFilter;
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.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import com.google.common.io.ByteArrayDataInput;
public class TileEntityLogisticalSorter extends TileEntityElectricBlock implements IRedstoneControl
public class TileEntityLogisticalSorter extends TileEntityElectricBlock implements IRedstoneControl, IActiveState
{
public Set<TransporterFilter> filters = new HashSet<TransporterFilter>();
public RedstoneControl controlType = RedstoneControl.DISABLED;
public final int MAX_DELAY = 10;
public int delayTicks;
public boolean isActive;
public boolean clientActive;
public TileEntityLogisticalSorter()
{
super("LogisticalSorter", MachineType.LOGISTICAL_SORTER.baseEnergy);
@ -34,9 +52,47 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen
if(!worldObj.isRemote)
{
if(MekanismUtils.canFunction(this))
delayTicks = Math.max(0, delayTicks-1);
if(delayTicks == 8)
{
//TODO
setActive(false);
}
if(MekanismUtils.canFunction(this) && delayTicks == 0)
{
TileEntity back = Object3D.get(this).getFromSide(ForgeDirection.getOrientation(facing).getOpposite()).getTileEntity(worldObj);
TileEntity front = Object3D.get(this).getFromSide(ForgeDirection.getOrientation(facing)).getTileEntity(worldObj);
if(back instanceof IInventory && front instanceof TileEntityLogisticalTransporter)
{
IInventory inventory = (IInventory)back;
TileEntityLogisticalTransporter transporter = (TileEntityLogisticalTransporter)front;
SlotInfo inInventory = TransporterUtils.takeItem(inventory, facing);
EnumColor color = null;
for(TransporterFilter filter : filters)
{
if(filter.canFilter(inInventory.itemStack))
{
color = filter.color;
break;
}
}
if(inInventory != null && inInventory.itemStack != null)
{
if(TransporterUtils.insert((TileEntity)inventory, transporter, inInventory.itemStack, color))
{
inventory.setInventorySlotContents(inInventory.slotID, null);
setActive(true);
}
}
delayTicks = 10;
}
}
}
}
@ -86,6 +142,7 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen
{
super.handlePacketData(dataStream);
isActive = dataStream.readBoolean();
controlType = RedstoneControl.values()[dataStream.readInt()];
filters.clear();
@ -103,6 +160,7 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen
{
super.getNetworkedData(data);
data.add(isActive);
data.add(controlType.ordinal());
data.add(filters.size());
@ -143,4 +201,29 @@ public class TileEntityLogisticalSorter extends TileEntityElectricBlock implemen
{
controlType = type;
}
@Override
public void setActive(boolean active)
{
isActive = active;
if(clientActive != active)
{
PacketHandler.sendPacket(Transmission.ALL_CLIENTS, new PacketTileEntity().setParams(Object3D.get(this), getNetworkedData(new ArrayList())));
clientActive = active;
}
}
@Override
public boolean getActive()
{
return isActive;
}
@Override
public boolean hasVisual()
{
return true;
}
}

View file

@ -200,12 +200,18 @@ public class TileEntityLogisticalTransporter extends TileEntityTransmitter<Inven
return true;
}
public boolean insert(Object3D original, ItemStack itemStack)
public boolean insert(Object3D original, ItemStack itemStack, EnumColor color)
{
needsSync = true;
TransporterStack stack = new TransporterStack();
stack.itemStack = itemStack;
stack.originalLocation = original;
stack.color = color;
if(!stack.canInsert(this))
{
return false;
}
if(stack.recalculatePath(this))
{

View file

@ -0,0 +1,15 @@
package mekanism.common.transporter;
import net.minecraft.item.ItemStack;
public final class SlotInfo
{
public ItemStack itemStack;
public int slotID;
public SlotInfo(ItemStack stack, int i)
{
itemStack = stack;
slotID = i;
}
}

View file

@ -519,7 +519,7 @@ public final class MekanismUtils
*/
public static int getTicks(int speedUpgrade, int def)
{
return (int) (def * Math.pow(10, (-speedUpgrade/9.0)));
return (int)(def * Math.pow(10, (-speedUpgrade/9.0)));
}
/**
@ -531,7 +531,7 @@ public final class MekanismUtils
*/
public static int getEnergyPerTick(int speedUpgrade, int energyUpgrade, int def)
{
return (int) (def * Math.pow(10, ((speedUpgrade-energyUpgrade)/9.0)));
return (int)(def * Math.pow(10, ((speedUpgrade-energyUpgrade)/9.0)));
}
/**
@ -554,7 +554,7 @@ public final class MekanismUtils
*/
public static double getEnergy(int energyUpgrade, double def)
{
return (int) (def * Math.pow(10, (energyUpgrade/9.0)));
return (int)(def * Math.pow(10, (energyUpgrade/9.0)));
}
/**
@ -593,31 +593,6 @@ public final class MekanismUtils
world.updateAllLightTypes(x, y, z);
}
/**
* Converts a ForgeDirection enum value to it's corresponding value in IndustrialCraft's 'Direction.' Using values()[ordinal()] will not work in this situation,
* as IC2 uses different values from base MC direction theory.
* @param side - ForgeDirection value
* @return Direction value
*/
public static Direction toIC2Direction(ForgeDirection side)
{
switch(side)
{
case DOWN:
return Direction.YN;
case UP:
return Direction.YP;
case NORTH:
return Direction.ZN;
case SOUTH:
return Direction.ZP;
case WEST:
return Direction.XN;
default:
return Direction.XP;
}
}
/**
* Whether or not a certain block is considered a fluid.
* @param world - world the block is in

View file

@ -2,12 +2,14 @@ package mekanism.common.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import mekanism.api.EnumColor;
import mekanism.api.Object3D;
import mekanism.api.transmitters.ITransmitter;
import mekanism.api.transmitters.TransmissionType;
import mekanism.common.tileentity.TileEntityLogisticalTransporter;
import mekanism.common.transporter.SlotInfo;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
@ -134,9 +136,9 @@ public final class TransporterUtils
return inventories;
}
public static boolean insert(TileEntity outputter, TileEntityLogisticalTransporter tileEntity, ItemStack itemStack)
public static boolean insert(TileEntity outputter, TileEntityLogisticalTransporter tileEntity, ItemStack itemStack, EnumColor color)
{
return tileEntity.insert(Object3D.get(outputter), itemStack);
return tileEntity.insert(Object3D.get(outputter), itemStack, color);
}
public static boolean canInsert(TileEntity tileEntity, ItemStack itemStack, int side)
@ -304,7 +306,7 @@ public final class TransporterUtils
return itemStack;
}
public static ItemStack takeTopItemFromInventory(IInventory inventory, int side)
public static SlotInfo takeItem(IInventory inventory, int side)
{
if(!(inventory instanceof ISidedInventory))
{
@ -313,16 +315,14 @@ public final class TransporterUtils
if(inventory.getStackInSlot(i) != null)
{
ItemStack toSend = inventory.getStackInSlot(i).copy();
toSend.stackSize = 1;
inventory.setInventorySlotContents(i, null);
inventory.decrStackSize(i, 1);
return toSend;
return new SlotInfo(toSend, i);
}
}
}
else {
ISidedInventory sidedInventory = (ISidedInventory) inventory;
ISidedInventory sidedInventory = (ISidedInventory)inventory;
int[] slots = sidedInventory.getAccessibleSlotsFromSide(side);
if(slots != null)
@ -334,13 +334,12 @@ public final class TransporterUtils
if(sidedInventory.getStackInSlot(slotID) != null)
{
ItemStack toSend = sidedInventory.getStackInSlot(slotID);
toSend.stackSize = 1;
if(sidedInventory.canExtractItem(slotID, toSend, side))
{
sidedInventory.decrStackSize(slotID, 1);
sidedInventory.setInventorySlotContents(slotID, null);
return toSend;
return new SlotInfo(toSend, slotID);
}
}
}