From 87f884228ed15eddbb1e155b9d8cc367a90d368b Mon Sep 17 00:00:00 2001 From: Neeve Date: Tue, 30 Jan 2024 16:10:52 +1100 Subject: [PATCH] Fix ME Storage Buses reporting contents regardless of settings (#384) --- .../fluids/parts/PartFluidStorageBus.java | 30 +++++++++- .../appeng/me/storage/MEInventoryHandler.java | 58 ++++++++++++++++--- .../parts/misc/PartOreDicStorageBus.java | 2 +- .../appeng/parts/misc/PartStorageBus.java | 30 +++++++++- 4 files changed, 106 insertions(+), 14 deletions(-) diff --git a/src/main/java/appeng/fluids/parts/PartFluidStorageBus.java b/src/main/java/appeng/fluids/parts/PartFluidStorageBus.java index 86b1d4411..adaa26b0f 100644 --- a/src/main/java/appeng/fluids/parts/PartFluidStorageBus.java +++ b/src/main/java/appeng/fluids/parts/PartFluidStorageBus.java @@ -80,6 +80,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -220,11 +221,13 @@ public class PartFluidStorageBus extends PartUpgradeable implements IGridTickabl @Override public void postChange(final IBaseMonitor monitor, final Iterable change, final IActionSource source) { if (this.getProxy().isActive()) { + var filteredChanges = this.filterChanges(change); + AccessRestriction currentAccess = (AccessRestriction) ((ConfigManager) this.getConfigManager()).getSetting(Settings.ACCESS); if (readOncePass) { readOncePass = false; try { - this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class), change, this.source); + this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class), filteredChanges, this.source); } catch (final GridAccessException e) { // :( } @@ -234,7 +237,7 @@ public class PartFluidStorageBus extends PartUpgradeable implements IGridTickabl return; } try { - this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class), change, source); + this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class), filteredChanges, source); } catch (final GridAccessException e) { // :( } @@ -426,6 +429,7 @@ public class PartFluidStorageBus extends PartUpgradeable implements IGridTickabl this.handler.setBaseAccess((AccessRestriction) this.getConfigManager().getSetting(Settings.ACCESS)); this.handler.setWhitelist(this.getInstalledUpgrades(Upgrades.INVERTER) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.handler.setPriority(this.getPriority()); + this.handler.setStorageFilter((StorageFilter) this.getConfigManager().getSetting(Settings.STORAGE_FILTER)); final IItemList priorityList = AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class).createList(); @@ -537,4 +541,26 @@ public class PartFluidStorageBus extends PartUpgradeable implements IGridTickabl public GuiBridge getGuiBridge() { return GuiBridge.GUI_STORAGEBUS_FLUID; } + + // TODO: 1/28/2024 Unify both methods. + /** + * Filters the changes to only include items that pass the storage filter. + * Optimally, this should be handled by the underlying monitor. + * + * @see appeng.parts.misc.PartStorageBus#filterChanges + */ + protected Iterable filterChanges(Iterable change) { + var storageFilter = this.getConfigManager().getSetting(Settings.STORAGE_FILTER); + if (storageFilter == StorageFilter.EXTRACTABLE_ONLY) { + var filteredList = new ArrayList(); + for (final IAEFluidStack stack : change) { + if (this.handler.passesBlackOrWhitelist(stack)) { + filteredList.add(stack); + } + } + + return filteredList; + } + return change; + } } diff --git a/src/main/java/appeng/me/storage/MEInventoryHandler.java b/src/main/java/appeng/me/storage/MEInventoryHandler.java index af17d6e21..22414556f 100644 --- a/src/main/java/appeng/me/storage/MEInventoryHandler.java +++ b/src/main/java/appeng/me/storage/MEInventoryHandler.java @@ -22,6 +22,7 @@ package appeng.me.storage; import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.IncludeExclude; +import appeng.api.config.StorageFilter; import appeng.api.networking.security.IActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEInventoryHandler; @@ -38,12 +39,14 @@ public class MEInventoryHandler> implements IMEInventoryHa private int myPriority; private IncludeExclude myWhitelist; private AccessRestriction myAccess; + private StorageFilter storageFilter; private IPartitionList myPartitionList; private AccessRestriction cachedAccessRestriction; private boolean hasReadAccess; private boolean hasWriteAccess; private boolean isSticky; + private boolean gettingAvailableContent; public MEInventoryHandler(final IMEInventory i, final IStorageChannel channel) { if (i instanceof IMEInventoryHandler) { @@ -77,7 +80,7 @@ public class MEInventoryHandler> implements IMEInventoryHa this.hasWriteAccess = this.cachedAccessRestriction.hasPermission(AccessRestriction.WRITE); } - IPartitionList getPartitionList() { + public IPartitionList getPartitionList() { return this.myPartitionList; } @@ -96,7 +99,7 @@ public class MEInventoryHandler> implements IMEInventoryHa @Override public T extractItems(final T request, final Actionable type, final IActionSource src) { - if (!this.hasReadAccess) { + if (!this.canExtract(request)) { return null; } @@ -105,11 +108,27 @@ public class MEInventoryHandler> implements IMEInventoryHa @Override public IItemList getAvailableItems(final IItemList out) { - if (!this.hasReadAccess) { + if (this.gettingAvailableContent || !this.hasReadAccess) { return out; } - return this.internal.getAvailableItems(out); + this.gettingAvailableContent = true; + try { + if (this.storageFilter == StorageFilter.EXTRACTABLE_ONLY) { + var stackList = this.internal.getAvailableItems(this.getChannel().createList()); + for (final T t : stackList) { + if (this.canExtract(t)) { + out.add(t); + } + } + } else { + return this.internal.getAvailableItems(out); + } + } finally { + this.gettingAvailableContent = false; + } + + return out; } @Override @@ -136,13 +155,11 @@ public class MEInventoryHandler> implements IMEInventoryHa return false; } - if (this.myWhitelist == IncludeExclude.BLACKLIST && this.myPartitionList.isListed(input)) { + if (!this.passesBlackOrWhitelist(input)) { return false; } - if (this.myPartitionList.isEmpty() || this.myWhitelist == IncludeExclude.BLACKLIST) { - return this.internal.canAccept(input); - } - return this.myPartitionList.isListed(input) && this.internal.canAccept(input); + + return this.internal.canAccept(input); } @Override @@ -176,4 +193,27 @@ public class MEInventoryHandler> implements IMEInventoryHa public void setSticky(boolean isSticky) { this.isSticky = isSticky; } + + protected boolean canExtract(T request) { + return this.hasReadAccess && passesBlackOrWhitelist(request); + } + + public boolean passesBlackOrWhitelist(T input) { + if (this.myPartitionList.isEmpty()) { + return true; + } + + return switch (this.myWhitelist) { + case WHITELIST -> this.myPartitionList.isListed(input); + case BLACKLIST -> !this.myPartitionList.isListed(input); + }; + } + + public StorageFilter getStorageFilter() { + return storageFilter; + } + + public void setStorageFilter(StorageFilter storageFilter) { + this.storageFilter = storageFilter; + } } diff --git a/src/main/java/appeng/parts/misc/PartOreDicStorageBus.java b/src/main/java/appeng/parts/misc/PartOreDicStorageBus.java index c1af86c77..c5af6ea61 100644 --- a/src/main/java/appeng/parts/misc/PartOreDicStorageBus.java +++ b/src/main/java/appeng/parts/misc/PartOreDicStorageBus.java @@ -111,8 +111,8 @@ public class PartOreDicStorageBus extends PartStorageBus { this.handler.setBaseAccess((AccessRestriction) this.getConfigManager().getSetting(Settings.ACCESS)); this.handler.setWhitelist(this.getInstalledUpgrades(Upgrades.INVERTER) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.handler.setPriority(this.priority); - this.handler.setPartitionList(this.getPriorityList()); + this.handler.setStorageFilter((StorageFilter) this.getConfigManager().getSetting(Settings.STORAGE_FILTER)); if (inv instanceof IBaseMonitor) { if (((AccessRestriction) ((ConfigManager) this.getConfigManager()).getSetting(Settings.ACCESS)).hasPermission(AccessRestriction.READ)) { diff --git a/src/main/java/appeng/parts/misc/PartStorageBus.java b/src/main/java/appeng/parts/misc/PartStorageBus.java index 450bb799b..0bf72bbf9 100644 --- a/src/main/java/appeng/parts/misc/PartStorageBus.java +++ b/src/main/java/appeng/parts/misc/PartStorageBus.java @@ -80,6 +80,7 @@ import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -221,11 +222,13 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC @Override public void postChange(final IBaseMonitor monitor, final Iterable change, final IActionSource source) { if (this.getProxy().isActive()) { + var filteredChanges = this.filterChanges(change); + AccessRestriction currentAccess = (AccessRestriction) ((ConfigManager) this.getConfigManager()).getSetting(Settings.ACCESS); if (readOncePass) { readOncePass = false; try { - this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class), change, mySrc); + this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class), filteredChanges, mySrc); } catch (final GridAccessException e) { // :( } @@ -235,7 +238,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC return; } try { - this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class), change, source); + this.getProxy().getStorage().postAlterationOfStoredItems(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class), filteredChanges, source); } catch (final GridAccessException e) { // :( } @@ -457,6 +460,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC this.handler.setBaseAccess((AccessRestriction) this.getConfigManager().getSetting(Settings.ACCESS)); this.handler.setWhitelist(this.getInstalledUpgrades(Upgrades.INVERTER) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST); this.handler.setPriority(this.priority); + this.handler.setStorageFilter((StorageFilter) this.getConfigManager().getSetting(Settings.STORAGE_FILTER)); final IItemList priorityList = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); @@ -571,4 +575,26 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC public GuiBridge getGuiBridge() { return GuiBridge.GUI_STORAGEBUS; } + + // TODO: 1/28/2024 Unify both methods. + /** + * Filters the changes to only include items that pass the storage filter. + * Optimally, this should be handled by the underlying monitor. + * + * @see appeng.fluids.parts.PartFluidStorageBus#filterChanges + */ + protected Iterable filterChanges(Iterable change) { + var storageFilter = this.getConfigManager().getSetting(Settings.STORAGE_FILTER); + if (storageFilter == StorageFilter.EXTRACTABLE_ONLY) { + var filteredList = new ArrayList(); + for (final IAEItemStack stack : change) { + if (this.handler.passesBlackOrWhitelist(stack)) { + filteredList.add(stack); + } + } + + return filteredList; + } + return change; + } }