diff --git a/src/main/java/appeng/me/Grid.java b/src/main/java/appeng/me/Grid.java index daab0dbd5..4762d4937 100644 --- a/src/main/java/appeng/me/Grid.java +++ b/src/main/java/appeng/me/Grid.java @@ -39,6 +39,7 @@ import appeng.api.util.IReadOnlyCollection; import appeng.core.worlddata.WorldData; import appeng.hooks.TickHandler; import appeng.util.ReadOnlyCollection; +import appeng.me.cache.CraftingGridCache; public class Grid implements IGrid @@ -219,7 +220,10 @@ public class Grid implements IGrid @Override public MENetworkEvent postEvent( final MENetworkEvent ev ) { - return this.eventBus.postEvent( this, ev ); + CraftingGridCache.pauseRebuilds(); + final MENetworkEvent ret = this.eventBus.postEvent( this, ev ); + CraftingGridCache.unpauseRebuilds(); + return ret; } @Override diff --git a/src/main/java/appeng/me/GridNode.java b/src/main/java/appeng/me/GridNode.java index 6dc863a48..958685b8f 100644 --- a/src/main/java/appeng/me/GridNode.java +++ b/src/main/java/appeng/me/GridNode.java @@ -55,6 +55,7 @@ import appeng.api.util.IReadOnlyCollection; import appeng.core.AELog; import appeng.core.worlddata.WorldData; import appeng.hooks.TickHandler; +import appeng.me.cache.CraftingGridCache; import appeng.me.pathfinding.IPathItem; import appeng.util.IWorldCallable; import appeng.util.ReadOnlyCollection; @@ -164,6 +165,8 @@ public class GridNode implements IGridNode, IPathItem { final Object tracker = new Object(); + CraftingGridCache.pauseRebuilds(); + Deque nextRun = new ArrayDeque<>(); nextRun.add( this ); @@ -203,6 +206,7 @@ public class GridNode implements IGridNode, IPathItem } } } + CraftingGridCache.unpauseRebuilds(); } @Override diff --git a/src/main/java/appeng/me/cache/CraftingGridCache.java b/src/main/java/appeng/me/cache/CraftingGridCache.java index 1ec8cbc39..30ecf13b0 100644 --- a/src/main/java/appeng/me/cache/CraftingGridCache.java +++ b/src/main/java/appeng/me/cache/CraftingGridCache.java @@ -114,7 +114,8 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper private IStorageGrid storageGrid; private IEnergyGrid energyGrid; private boolean updateList = false; - private boolean updatePatterns = false; + private static int pauseRebuilds = 0; + private static Set rebuildNeeded = new HashSet<>(); public CraftingGridCache( final IGrid grid ) { @@ -139,12 +140,6 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper this.updateCPUClusters(); } - if( this.updatePatterns ) - { - this.updatePatterns = false; - this.updatePatterns(); - } - final Iterator craftingLinkIterator = this.craftingLinks.values().iterator(); while( craftingLinkIterator.hasNext() ) { @@ -192,7 +187,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper if( machine instanceof ICraftingProvider ) { this.craftingProviders.remove( machine ); - this.updatePatterns = true; + this.updatePatterns(); } } @@ -226,7 +221,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper if( machine instanceof ICraftingProvider ) { this.craftingProviders.add( (ICraftingProvider) machine ); - this.updatePatterns = true; + this.updatePatterns(); } } @@ -247,8 +242,34 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper // nothing! } + public static void pauseRebuilds() + { + pauseRebuilds++; + } + + public static void unpauseRebuilds() + { + pauseRebuilds--; + if (pauseRebuilds == 0 && rebuildNeeded.size() > 0) + { + ImmutableSet needed = ImmutableSet.copyOf(rebuildNeeded); + rebuildNeeded.clear(); + for ( CraftingGridCache cache: needed ) + { + cache.updatePatterns(); + } + } + } + private void updatePatterns() { + // coalesce change events during a grid traversal to a single rebuild + if (pauseRebuilds != 0) + { + rebuildNeeded.add(this); + return; + } + final Map> oldItems = this.craftableItems; // erase list. @@ -344,7 +365,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper @MENetworkEventSubscribe public void updateCPUClusters( final MENetworkCraftingPatternChange c ) { - this.updatePatterns = true; + this.updatePatterns(); } @Override