From 12ebfe674592843ff1eee72eaf848370204d0440 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Tue, 7 Apr 2015 10:41:17 -0400 Subject: [PATCH 1/4] ThreadSparkle is now operated in main client thread time - new safety checks will prevent serious lag anyway --- src/main/java/mekanism/client/ClientProxy.java | 8 ++++---- .../client/{ThreadSparkle.java => SparkleAnimation.java} | 5 ++--- src/main/java/mekanism/common/CommonProxy.java | 2 +- .../common/tile/TileEntitySolarEvaporationController.java | 2 +- .../common/tile/reactor/TileEntityReactorController.java | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) rename src/main/java/mekanism/client/{ThreadSparkle.java => SparkleAnimation.java} (96%) diff --git a/src/main/java/mekanism/client/ClientProxy.java b/src/main/java/mekanism/client/ClientProxy.java index d43f7240d..dd6f6ddd3 100644 --- a/src/main/java/mekanism/client/ClientProxy.java +++ b/src/main/java/mekanism/client/ClientProxy.java @@ -6,7 +6,7 @@ import mekanism.api.Coord4D; import mekanism.api.MekanismConfig.client; import mekanism.api.MekanismConfig.general; import mekanism.api.Pos3D; -import mekanism.client.ThreadSparkle.INodeChecker; +import mekanism.client.SparkleAnimation.INodeChecker; import mekanism.client.entity.EntityLaser; import mekanism.client.gui.GuiAmbientAccumulator; import mekanism.client.gui.GuiChemicalCrystallizer; @@ -543,19 +543,19 @@ public class ClientProxy extends CommonProxy @Override public void doGenericSparkle(TileEntity tileEntity, INodeChecker checker) { - new ThreadSparkle(tileEntity, checker).start(); + new SparkleAnimation(tileEntity, checker).run(); } @Override public void doMultiblockSparkle(final TileEntityMultiblock tileEntity) { - new ThreadSparkle(tileEntity, new INodeChecker() { + new SparkleAnimation(tileEntity, new INodeChecker() { @Override public boolean isNode(TileEntity tile) { return MultiblockManager.areEqual(tile, tileEntity); } - }).start(); + }).run(); } @Override diff --git a/src/main/java/mekanism/client/ThreadSparkle.java b/src/main/java/mekanism/client/SparkleAnimation.java similarity index 96% rename from src/main/java/mekanism/client/ThreadSparkle.java rename to src/main/java/mekanism/client/SparkleAnimation.java index b19cf707e..8cec7a9f6 100644 --- a/src/main/java/mekanism/client/ThreadSparkle.java +++ b/src/main/java/mekanism/client/SparkleAnimation.java @@ -13,7 +13,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) -public class ThreadSparkle extends Thread +public class SparkleAnimation { public TileEntity pointer; @@ -23,13 +23,12 @@ public class ThreadSparkle extends Thread public INodeChecker nodeChecker; - public ThreadSparkle(TileEntity tileEntity, INodeChecker checker) + public SparkleAnimation(TileEntity tileEntity, INodeChecker checker) { pointer = tileEntity; nodeChecker = checker; } - @Override public void run() { try { diff --git a/src/main/java/mekanism/common/CommonProxy.java b/src/main/java/mekanism/common/CommonProxy.java index 6f151d26f..98dfaaca2 100644 --- a/src/main/java/mekanism/common/CommonProxy.java +++ b/src/main/java/mekanism/common/CommonProxy.java @@ -10,7 +10,7 @@ import mekanism.api.MekanismConfig.usage; import mekanism.api.Pos3D; import mekanism.api.util.UnitDisplayUtils.EnergyType; import mekanism.api.util.UnitDisplayUtils.TempType; -import mekanism.client.ThreadSparkle.INodeChecker; +import mekanism.client.SparkleAnimation.INodeChecker; import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.entity.EntityRobit; diff --git a/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java b/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java index fc3a366d2..a940eb73d 100644 --- a/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java +++ b/src/main/java/mekanism/common/tile/TileEntitySolarEvaporationController.java @@ -9,7 +9,7 @@ import java.util.Set; import mekanism.api.Coord4D; import mekanism.api.ISalinationSolar; import mekanism.api.Range4D; -import mekanism.client.ThreadSparkle.INodeChecker; +import mekanism.client.SparkleAnimation.INodeChecker; import mekanism.common.Mekanism; import mekanism.common.base.IActiveState; import mekanism.common.base.ITankManager; diff --git a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java index c2f78d7f1..43d191c79 100644 --- a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java +++ b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorController.java @@ -10,7 +10,7 @@ import mekanism.api.Pos3D; import mekanism.api.gas.GasRegistry; import mekanism.api.gas.GasStack; import mekanism.api.gas.GasTank; -import mekanism.client.ThreadSparkle.INodeChecker; +import mekanism.client.SparkleAnimation.INodeChecker; import mekanism.client.sound.ISoundSource; import mekanism.common.Mekanism; import mekanism.common.base.IActiveState; From 36f0607d5e29dafa2d218fc931fde6723b749c56 Mon Sep 17 00:00:00 2001 From: Ben Spiers Date: Thu, 9 Apr 2015 02:02:38 +0100 Subject: [PATCH 2/4] Prioritise faster paths, by making cost inversely proportional to speed. --- .../mekanism/common/base/ILogisticalTransporter.java | 2 +- .../content/transporter/TransporterPathfinder.java | 11 +++-------- .../common/multipart/MultipartTransporter.java | 2 +- .../common/multipart/PartLogisticalTransporter.java | 4 ++-- .../common/multipart/PartRestrictiveTransporter.java | 2 +- 5 files changed, 8 insertions(+), 13 deletions(-) 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 Date: Thu, 9 Apr 2015 02:04:11 +0100 Subject: [PATCH 3/4] Use path score to sort paths, not length. --- .../transporter/TransporterPathfinder.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java b/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java index b75f82d56..de002b6bb 100644 --- a/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java +++ b/src/main/java/mekanism/common/content/transporter/TransporterPathfinder.java @@ -58,7 +58,7 @@ public final class TransporterPathfinder transportStack.idleDir = newSide; loopSide(ret, newSide); - return new Destination(ret, true, null).setPathType(Path.NONE); + return new Destination(ret, true, null, 0).setPathType(Path.NONE); } else { TileEntity tile = start.getFromSide(transportStack.idleDir).getTileEntity(worldObj); @@ -66,7 +66,7 @@ public final class TransporterPathfinder if(transportStack.canInsertToTransporter(tile, transportStack.idleDir)) { loopSide(ret, transportStack.idleDir); - return new Destination(ret, true, null).setPathType(Path.NONE); + return new Destination(ret, true, null, 0).setPathType(Path.NONE); } else { Destination newPath = TransporterPathfinder.getNewBasePath((ILogisticalTransporter)start.getTileEntity(worldObj), transportStack, 0); @@ -87,7 +87,7 @@ public final class TransporterPathfinder transportStack.idleDir = newSide; loopSide(ret, newSide); - return new Destination(ret, true, null).setPathType(Path.NONE); + return new Destination(ret, true, null, 0).setPathType(Path.NONE); } } } @@ -154,8 +154,9 @@ public final class TransporterPathfinder public List 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); } } From 94189a4f618c4c90b7ec12faae5ad5645888ff76 Mon Sep 17 00:00:00 2001 From: Ben Spiers Date: Thu, 9 Apr 2015 02:32:59 +0100 Subject: [PATCH 4/4] Fix Transporters with multipart. --- .../common/content/transporter/TransporterStack.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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; }