Sorter work - hopefully outputs items now! :D
This commit is contained in:
parent
e9c038cd24
commit
8d9ee35679
6 changed files with 123 additions and 45 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
15
common/mekanism/common/transporter/SlotInfo.java
Normal file
15
common/mekanism/common/transporter/SlotInfo.java
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue