diff --git a/src/main/java/mekanism/common/Mekanism.java b/src/main/java/mekanism/common/Mekanism.java index 35386f462..429cca6a8 100644 --- a/src/main/java/mekanism/common/Mekanism.java +++ b/src/main/java/mekanism/common/Mekanism.java @@ -421,7 +421,7 @@ public class Mekanism " AB", "E B", " AB", Character.valueOf('A'), EnrichedAlloy, Character.valueOf('B'), Items.string, Character.valueOf('E'), EnergyTablet.getUnchargedItem() })); CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(EnergyTablet.getUnchargedItem(), new Object[] { - "RCR", "ECE", "RCR", Character.valueOf('C'), Items.gold_ingot, Character.valueOf('R'), Items.redstone, Character.valueOf('E'), EnrichedAlloy + "RCR", "ECE", "RCR", Character.valueOf('C'), "ingotGold", Character.valueOf('R'), Items.redstone, Character.valueOf('E'), EnrichedAlloy })); CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(MachineBlock, 1, 0), new Object[] { "RCR", "iIi", "RCR", Character.valueOf('i'), "ingotIron", Character.valueOf('C'), "circuitBasic", Character.valueOf('R'), "alloyBasic", Character.valueOf('I'), new ItemStack(BasicBlock, 1, 8) diff --git a/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java b/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java index e8ef818cf..c21753787 100644 --- a/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java +++ b/src/main/java/mekanism/common/multipart/PartLogisticalTransporter.java @@ -394,8 +394,18 @@ public class PartLogisticalTransporter extends PartSidedPipe implements ILogisti { needsSync.add(stack); - if(!TransporterManager.didEmit(stack.itemStack, stack.recalculatePath(this, 0))) + if(stack.pathType != Path.NONE) { + if(!TransporterManager.didEmit(stack.itemStack, stack.recalculatePath(this, 0))) + { + if(!stack.calculateIdle(this)) + { + TransporterUtils.drop(this, stack); + return false; + } + } + } + else { if(!stack.calculateIdle(this)) { TransporterUtils.drop(this, stack); diff --git a/src/main/java/mekanism/common/transporter/TransporterPathfinder.java b/src/main/java/mekanism/common/transporter/TransporterPathfinder.java index c572228e1..87524c456 100644 --- a/src/main/java/mekanism/common/transporter/TransporterPathfinder.java +++ b/src/main/java/mekanism/common/transporter/TransporterPathfinder.java @@ -2,6 +2,7 @@ package mekanism.common.transporter; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -28,8 +29,6 @@ public final class TransporterPathfinder public Coord4D start; - public Set destinations = new HashSet(); - public TransporterStack transportStack; public IdlePath(World world, Coord4D obj, TransporterStack stack) @@ -39,65 +38,117 @@ public final class TransporterPathfinder transportStack = stack; } - public void loop(Coord4D pointer, ArrayList currentPath, int dist) + public Destination find() { - if(pointer == null) + ArrayList ret = new ArrayList(); + ret.add(start); + + if(transportStack.idleDir == ForgeDirection.UNKNOWN) { - return; - } - - currentPath.add(pointer); - - dist += ((ILogisticalTransporter)pointer.getTileEntity(worldObj)).getCost(); - - boolean found = false; - - for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = pointer.getFromSide(side).getTileEntity(worldObj); - - if(transportStack.canInsertToTransporter(tile, side) && !currentPath.contains(Coord4D.get(tile))) + ForgeDirection newSide = findSide(); + + if(newSide == null) { - loop(Coord4D.get(tile), (ArrayList)currentPath.clone(), dist); - found = true; + return null; } + + transportStack.idleDir = newSide; + loopSide(ret, newSide); + return new Destination(ret, 0, true, null).setPathType(Path.NONE); } - - if(!found) - { - destinations.add(new Destination(currentPath, dist, true, null)); - } - } - - public List find() - { - loop(start, new ArrayList(), 0); - - Destination farthest = null; - - for(Destination obj : destinations) - { - if(farthest == null || obj.score > farthest.score) + else { + TileEntity tile = start.getFromSide(transportStack.idleDir).getTileEntity(worldObj); + + if(transportStack.canInsertToTransporter(tile, transportStack.idleDir)) { - if(!obj.path.isEmpty() && !obj.path.get(0).equals(start)) + loopSide(ret, transportStack.idleDir); + return new Destination(ret, 0, true, null).setPathType(Path.NONE); + } + else { + Destination newPath = TransporterPathfinder.getNewBasePath((ILogisticalTransporter)start.getTileEntity(worldObj), transportStack, 0); + + if(newPath != null && TransporterManager.didEmit(transportStack.itemStack, newPath.rejected)) { - farthest = obj; + transportStack.idleDir = ForgeDirection.UNKNOWN; + newPath.setPathType(Path.DEST); + return newPath; + } + else { + ForgeDirection newSide = findSide(); + + if(newSide == null) + { + return null; + } + + transportStack.idleDir = newSide; + loopSide(ret, newSide); + return new Destination(ret, 0, true, null).setPathType(Path.NONE); } } } - - if(farthest == null) + } + + private void loopSide(List list, ForgeDirection side) + { + int count = 1; + + while(true) { - return null; + Coord4D coord = start.getFromSide(side, count); + + if(transportStack.canInsertToTransporter(coord.getTileEntity(worldObj), side)) + { + list.add(coord); + count++; + } + else { + break; + } } - - return farthest.path; + } + + private ForgeDirection findSide() + { + if(transportStack.idleDir == ForgeDirection.UNKNOWN) + { + for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tile = start.getFromSide(side).getTileEntity(worldObj); + + if(transportStack.canInsertToTransporter(tile, side)) + { + return side; + } + } + } + else { + for(ForgeDirection side : EnumSet.complementOf(EnumSet.of(ForgeDirection.UNKNOWN, transportStack.idleDir.getOpposite()))) + { + TileEntity tile = start.getFromSide(side).getTileEntity(worldObj); + + if(transportStack.canInsertToTransporter(tile, side)) + { + return side; + } + } + + TileEntity tile = start.getFromSide(transportStack.idleDir.getOpposite()).getTileEntity(worldObj); + + if(transportStack.canInsertToTransporter(tile, transportStack.idleDir.getOpposite())) + { + return transportStack.idleDir.getOpposite(); + } + } + + return null; } } public static class Destination implements Comparable { public List path = new ArrayList(); + public Path pathType; public double score; public ItemStack rejected; @@ -113,6 +164,12 @@ public final class TransporterPathfinder score = d; rejected = rejects; } + + public Destination setPathType(Path type) + { + pathType = type; + return this; + } @Override public int hashCode() @@ -513,22 +570,20 @@ public final class TransporterPathfinder return path; } else { - if(stack.homeLocation.getTileEntity(start.getTile().getWorldObj()) == null) - { - stack.homeLocation = null; - } + stack.homeLocation = null; } } IdlePath d = new IdlePath(start.getTile().getWorldObj(), Coord4D.get(start.getTile()), stack); - List path = d.find(); - stack.pathType = Path.NONE; + Destination dest = d.find(); - if(path == null) + if(dest == null) { return null; } + + stack.pathType = dest.pathType; - return path; + return dest.path; } } diff --git a/src/main/java/mekanism/common/transporter/TransporterStack.java b/src/main/java/mekanism/common/transporter/TransporterStack.java index 07322fc71..6fa41a535 100644 --- a/src/main/java/mekanism/common/transporter/TransporterStack.java +++ b/src/main/java/mekanism/common/transporter/TransporterStack.java @@ -27,6 +27,8 @@ public class TransporterStack public EnumColor color = null; public boolean initiatedPath = false; + + public ForgeDirection idleDir = ForgeDirection.UNKNOWN; public List pathToTarget = new ArrayList(); @@ -103,6 +105,7 @@ public class TransporterStack nbtTags.setInteger("progress", progress); nbtTags.setTag("originalLocation", originalLocation.write(new NBTTagCompound())); + nbtTags.setInteger("idleDir", idleDir.ordinal()); if(homeLocation != null) { @@ -122,6 +125,7 @@ public class TransporterStack progress = nbtTags.getInteger("progress"); originalLocation = Coord4D.read(nbtTags.getCompoundTag("originalLocation")); + idleDir = ForgeDirection.values()[nbtTags.getInteger("idleDir")]; if(nbtTags.hasKey("homeLocation")) { @@ -163,8 +167,9 @@ public class TransporterStack } pathToTarget = newPath.path; - + System.out.println("Def reset"); pathType = Path.DEST; + idleDir = ForgeDirection.UNKNOWN; initiatedPath = true; return newPath.rejected; @@ -180,8 +185,9 @@ public class TransporterStack } pathToTarget = newPath.path; - + System.out.println("RR reset"); pathType = Path.DEST; + idleDir = ForgeDirection.UNKNOWN; initiatedPath = true; return newPath.rejected; @@ -195,6 +201,12 @@ public class TransporterStack { return false; } + + if(pathType == Path.HOME) + { + System.out.println("Idle reset"); + idleDir = ForgeDirection.UNKNOWN; + } pathToTarget = newPath;