From fda8c87410b3e91cd76f5268400d6829d6ac2d57 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Mon, 26 Jul 2021 18:25:08 -0300 Subject: [PATCH] attempts to fix #42 and #43 --- gradle.properties | 2 +- .../api/networking/storage/IStorageGrid.java | 1 + .../java/appeng/helpers/DualityInterface.java | 2 +- .../appeng/me/cache/CraftingGridCache.java | 31 ++++++++++++------- .../appeng/me/cache/GridStorageCache.java | 6 ++++ .../java/appeng/me/cache/NetworkMonitor.java | 14 +++++++++ .../appeng/parts/misc/ItemHandlerAdapter.java | 5 ++- 7 files changed, 47 insertions(+), 14 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6b00652b1..4fd5e713e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ aechannel=stable aebuild=7 aegroup=appeng aebasename=appliedenergistics2 -trousers=omni-fixes-v45c +trousers=omni-fixes-v45e ######################################################### # Versions # diff --git a/src/api/java/appeng/api/networking/storage/IStorageGrid.java b/src/api/java/appeng/api/networking/storage/IStorageGrid.java index cec8900f8..118a4cb69 100644 --- a/src/api/java/appeng/api/networking/storage/IStorageGrid.java +++ b/src/api/java/appeng/api/networking/storage/IStorageGrid.java @@ -51,6 +51,7 @@ public interface IStorageGrid extends IGridCache, IStorageMonitorable * @param input injected items */ void postAlterationOfStoredItems( IStorageChannel chan, Iterable> input, IActionSource src ); + void postCraftablesChanges( IStorageChannel chan, Iterable> input, IActionSource src); /** * Used to add a cell provider to the storage system diff --git a/src/main/java/appeng/helpers/DualityInterface.java b/src/main/java/appeng/helpers/DualityInterface.java index 15c1e67bc..7ce93d5ab 100644 --- a/src/main/java/appeng/helpers/DualityInterface.java +++ b/src/main/java/appeng/helpers/DualityInterface.java @@ -182,7 +182,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn { this.readConfig(); } - else if( inv == this.patterns && ( !removed.isEmpty() || !added.isEmpty() ) ) + else if( inv == this.patterns ) { this.updateCraftingList(); } diff --git a/src/main/java/appeng/me/cache/CraftingGridCache.java b/src/main/java/appeng/me/cache/CraftingGridCache.java index 74ff8ffb9..76ee54a91 100644 --- a/src/main/java/appeng/me/cache/CraftingGridCache.java +++ b/src/main/java/appeng/me/cache/CraftingGridCache.java @@ -30,22 +30,19 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.TreeSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; +import appeng.api.storage.data.IAEFluidStack; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; -import it.unimi.dsi.fastutil.objects.Object2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet; -import it.unimi.dsi.fastutil.objects.ObjectSet; +import it.unimi.dsi.fastutil.objects.*; import net.minecraft.world.World; import appeng.api.AEApi; @@ -274,17 +271,13 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper return; } - final Object2ObjectMap> oldItems = this.craftableItems; + final Object2ObjectMap> oldItems = new Object2ObjectOpenHashMap<>(this.craftableItems); // erase list. this.craftingMethods.clear(); this.craftableItems.clear(); this.emitableItems.clear(); - // update the stuff that was in the list... - this.storageGrid.postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), oldItems.keySet(), - new BaseActionSource() ); - // re-create list.. for( final ICraftingProvider provider : this.craftingProviders ) { @@ -319,7 +312,23 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper this.craftableItems.put( e.getKey(), ImmutableList.copyOf( e.getValue() ) ); } - this.storageGrid.postAlterationOfStoredItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), this.craftableItems.keySet(), + Object2ObjectMap> craftablesChanged = new Object2ObjectArrayMap<>(); + + ObjectSet>> i = oldItems.entrySet(); + for ( Entry> ais : i) { + if (!this.craftableItems.containsKey( ais.getKey() )) { + craftablesChanged.put( ais.getKey().setCraftable( false ), ais.getValue() ); + } + } + + ObjectSet>> j = this.craftableItems.entrySet(); + for ( Entry> ais : j) { + if (!oldItems.containsKey( ais )){ + craftablesChanged.put( ais.getKey().setCraftable( true ), ais.getValue() ); + } + } + + this.storageGrid.postCraftablesChanges( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), craftablesChanged.keySet(), new BaseActionSource() ); } diff --git a/src/main/java/appeng/me/cache/GridStorageCache.java b/src/main/java/appeng/me/cache/GridStorageCache.java index 713e909b9..559180776 100644 --- a/src/main/java/appeng/me/cache/GridStorageCache.java +++ b/src/main/java/appeng/me/cache/GridStorageCache.java @@ -281,6 +281,12 @@ public class GridStorageCache implements IStorageGrid this.storageMonitors.get( chan ).postChange( true, (Iterable) input, src ); } + @Override + public void postCraftablesChanges( IStorageChannel chan, Iterable> input, IActionSource src ) + { + this.storageMonitors.get( chan ).updateCraftables( (Iterable) input, src ); + } + @Override public void registerCellProvider( final ICellProvider provider ) { diff --git a/src/main/java/appeng/me/cache/NetworkMonitor.java b/src/main/java/appeng/me/cache/NetworkMonitor.java index b8f6d1ad9..484d90487 100644 --- a/src/main/java/appeng/me/cache/NetworkMonitor.java +++ b/src/main/java/appeng/me/cache/NetworkMonitor.java @@ -217,6 +217,20 @@ public class NetworkMonitor> implements IMEMonitor } } + protected void updateCraftables( Iterable input, IActionSource src ) + { + for( final T changedItem : input ) + { + if (changedItem.isCraftable()) { + this.cachedList.add( changedItem.copy().setCraftable( true ) ); + } + else + { + this.cachedList.findPrecise( changedItem ).setCraftable( false ); + } + } + } + protected void postChange( final boolean add, final Iterable changes, final IActionSource src ) { if( GLOBAL_DEPTH.contains( this ) ) diff --git a/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java b/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java index 545fe05d1..6327615df 100644 --- a/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java +++ b/src/main/java/appeng/parts/misc/ItemHandlerAdapter.java @@ -21,6 +21,7 @@ package appeng.parts.misc; import javax.annotation.Nullable; import appeng.api.AEApi; +import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.Settings; import appeng.api.config.StorageFilter; @@ -59,6 +60,7 @@ class ItemHandlerAdapter implements IMEInventory, IBaseMonitor, IBaseMonitor, IBaseMonitor changes = this.cache.update(); - if( !changes.isEmpty() ) + if( !changes.isEmpty() && access.hasPermission( AccessRestriction.READ ) ) { this.postDifference( changes ); return TickRateModulation.URGENT;