diff --git a/src/main/java/mekanism/common/base/ILogisticalTransporter.java b/src/main/java/mekanism/common/base/ILogisticalTransporter.java index e7a680eb7..e0dcae5a7 100644 --- a/src/main/java/mekanism/common/base/ILogisticalTransporter.java +++ b/src/main/java/mekanism/common/base/ILogisticalTransporter.java @@ -29,5 +29,5 @@ public interface ILogisticalTransporter extends IGridTransmitter path = new ArrayList(); public Path pathType; public ItemStack rejected; + public double score; - public Destination(ArrayList list, boolean inv, ItemStack rejects) + public Destination(ArrayList list, boolean inv, ItemStack rejects, double gScore) { path = (List)list.clone(); @@ -165,6 +166,7 @@ public final class TransporterPathfinder } rejected = rejects; + score = gScore; } public Destination setPathType(Path type) @@ -173,6 +175,20 @@ public final class TransporterPathfinder return this; } + public Destination calculateScore(World world) + { + score = 0; + for(Coord4D location : path) + { + TileEntity tile = location.getTileEntity(world); + if(tile instanceof ITransporterTile) + { + score += ((ITransporterTile)tile).getTransmitter().getCost(); + } + } + return this; + } + @Override public int hashCode() { @@ -190,16 +206,17 @@ public final class TransporterPathfinder @Override public int compareTo(Destination dest) { - if(path.size() < dest.path.size()) + if(score < dest.score) { return -1; } - else if(path.size() > dest.path.size()) + else if(score > dest.score) { return 1; } - else { - return 0; + else + { + return path.size() - dest.path.size(); } } } @@ -240,7 +257,7 @@ public final class TransporterPathfinder if(test != null) { - return new Destination(test, false, rejects); + return new Destination(test, false, rejects, 0).calculateScore(start.world()); } Pathfinder p = new Pathfinder(checker, start.world(), dest, start.coord(), stack); @@ -251,7 +268,7 @@ public final class TransporterPathfinder { PathfinderCache.cachedPaths.put(new PathData(start.coord(), dest, p.side), p.getPath()); - return new Destination(p.getPath(), false, rejects); + return new Destination(p.getPath(), false, rejects, p.finalScore); } } @@ -415,17 +432,14 @@ public final class TransporterPathfinder openSet.remove(currentNode); closedSet.add(currentNode); - for(int i = 0; i < 6; i++) + for(ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - ForgeDirection direction = ForgeDirection.getOrientation(i); Coord4D neighbor = currentNode.getFromSide(direction); if(transportStack.canInsertToTransporter(neighbor.getTileEntity(worldObj), direction)) { TileEntity tile = neighbor.getTileEntity(worldObj); - double tentativeG = gScore.get(currentNode) + currentNode.distanceTo(neighbor); - - tentativeG += ((ITransporterTile)tile).getTransmitter().getCost(); + double tentativeG = gScore.get(currentNode) + ((ITransporterTile)tile).getTransmitter().getCost(); if(closedSet.contains(neighbor)) { @@ -435,8 +449,6 @@ public final class TransporterPathfinder } } - TileEntity currTile = currentNode.getTileEntity(worldObj); - if(!openSet.contains(neighbor) || tentativeG < gScore.get(neighbor)) { navMap.put(neighbor, currentNode); @@ -445,7 +457,7 @@ public final class TransporterPathfinder openSet.add(neighbor); } } - else if(neighbor.equals(finalNode) && destChecker.isValid(transportStack, i, neighbor.getTileEntity(worldObj))) + else if(neighbor.equals(finalNode) && destChecker.isValid(transportStack, direction.ordinal(), neighbor.getTileEntity(worldObj))) { side = direction; results = reconstructPath(navMap, currentNode); diff --git a/src/main/java/mekanism/common/content/transporter/TransporterStack.java b/src/main/java/mekanism/common/content/transporter/TransporterStack.java index 68bee214d..2bb68841b 100644 --- a/src/main/java/mekanism/common/content/transporter/TransporterStack.java +++ b/src/main/java/mekanism/common/content/transporter/TransporterStack.java @@ -281,17 +281,16 @@ public class TransporterStack return 0; } - public boolean canInsertToTransporter(TileEntity tileEntity, ForgeDirection side) + public boolean canInsertToTransporter(TileEntity tileEntity, ForgeDirection from) { if(!(tileEntity instanceof ITransporterTile)) { return false; } - TileEntity from = Coord4D.get(tileEntity).getFromSide(side.getOpposite()).getTileEntity(tileEntity.getWorldObj()); ILogisticalTransporter transporter = ((ITransporterTile)tileEntity).getTransmitter(); - if(!((ITransporterTile)tileEntity).canConnectMutual(side)) + if(!((ITransporterTile)tileEntity).canConnectMutual(from.getOpposite())) { return false; } diff --git a/src/main/java/mekanism/common/multipart/MultipartTransporter.java b/src/main/java/mekanism/common/multipart/MultipartTransporter.java index 95a2ca5f5..3aa394164 100644 --- a/src/main/java/mekanism/common/multipart/MultipartTransporter.java +++ b/src/main/java/mekanism/common/multipart/MultipartTransporter.java @@ -373,7 +373,7 @@ public class MultipartTransporter extends MultipartTransmitter