diff --git a/src/main/java/aztech/modern_industrialization/inventory/FilledItemStorage.java b/src/main/java/aztech/modern_industrialization/inventory/FilledItemStorage.java new file mode 100644 index 000000000..c7996c7ea --- /dev/null +++ b/src/main/java/aztech/modern_industrialization/inventory/FilledItemStorage.java @@ -0,0 +1,35 @@ +/* + * MIT License + * + * Copyright (c) 2020 Azercoco & Technici4n + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package aztech.modern_industrialization.inventory; + +import net.neoforged.neoforge.items.IItemHandler; + +public interface FilledItemStorage { + static boolean isFull(IItemHandler handler) { + return handler instanceof FilledItemStorage filled && filled.isFull(); + } + + boolean isFull(); +} diff --git a/src/main/java/aztech/modern_industrialization/inventory/MIInventory.java b/src/main/java/aztech/modern_industrialization/inventory/MIInventory.java index 4814f4ee0..20973b0dc 100644 --- a/src/main/java/aztech/modern_industrialization/inventory/MIInventory.java +++ b/src/main/java/aztech/modern_industrialization/inventory/MIInventory.java @@ -96,7 +96,7 @@ public void autoExtractItems(Level world, BlockPos pos, Direction direction) { } var target = outputCache.getCapability(); - if (target != null) { + if (target != null && !FilledItemStorage.isFull(target)) { TransferHelper.moveAll(itemStorage.itemHandler, target, true); } } @@ -112,7 +112,7 @@ public void autoExtractFluids(Level world, BlockPos pos, Direction direction) { public void autoInsertItems(Level world, BlockPos pos, Direction direction) { IItemHandler target = world.getCapability(Capabilities.ItemHandler.BLOCK, pos.relative(direction), direction.getOpposite()); - if (target != null) { + if (target != null && !FilledItemStorage.isFull(itemStorage.itemHandler)) { TransferHelper.moveAll(target, itemStorage.itemHandler, false); } } diff --git a/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java b/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java index 02aad8399..72e229788 100644 --- a/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java +++ b/src/main/java/aztech/modern_industrialization/inventory/MIItemStorage.java @@ -41,7 +41,7 @@ public MIItemStorage(List stacks) { super(stacks, false); } - public class ItemHandler implements IItemHandler, WhitelistedItemStorage { + public class ItemHandler implements IItemHandler, WhitelistedItemStorage, FilledItemStorage { @Override public int getSlots() { return stacks.size(); @@ -137,5 +137,15 @@ public void getWhitelistedItems(Set whitelist) { } } } + + @Override + public boolean isFull() { + for (var stack : stacks) { + if (!stack.isLockedTo(Items.AIR) && stack.getAmount() < stack.getCapacity()) { + return false; + } + } + return true; + } } } diff --git a/src/main/java/aztech/modern_industrialization/pipes/item/ItemNetwork.java b/src/main/java/aztech/modern_industrialization/pipes/item/ItemNetwork.java index d00c47ef1..1a2432aec 100644 --- a/src/main/java/aztech/modern_industrialization/pipes/item/ItemNetwork.java +++ b/src/main/java/aztech/modern_industrialization/pipes/item/ItemNetwork.java @@ -24,6 +24,7 @@ package aztech.modern_industrialization.pipes.item; +import aztech.modern_industrialization.inventory.FilledItemStorage; import aztech.modern_industrialization.inventory.WhitelistedItemStorage; import aztech.modern_industrialization.pipes.api.PipeNetwork; import aztech.modern_industrialization.pipes.api.PipeNetworkData; @@ -112,6 +113,10 @@ private void doNetworkTransfer(ServerLevel world) { private static int moveAll(ServerLevel world, ExtractionSource target, List sinks, Predicate filter, int maxToMove) { + if (sinks.isEmpty()) { + return 0; + } + IItemHandler source = target.storage(); int moved = 0; @@ -147,7 +152,7 @@ private List getAggregatedInsertTargets(ServerLevel world) { entry.getPos().relative(connection.direction), connection.direction.getOpposite()); } var target = connection.cache.getCapability(); - if (target != null && target.getSlots() > 0) { + if (target != null && target.getSlots() > 0 && !FilledItemStorage.isFull(target)) { PriorityBucket bucket = priorityBuckets.computeIfAbsent(connection.insertPriority, PriorityBucket::new); InsertTarget it = new InsertTarget(connection, new ItemSink.HandlerWrapper(target, entry.getPos(), connection.direction)); diff --git a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java index 614f0776f..4e8805776 100644 --- a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java +++ b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/api/bridge/SlotItemHandler.java @@ -24,6 +24,7 @@ package aztech.modern_industrialization.thirdparty.fabrictransfer.api.bridge; +import aztech.modern_industrialization.inventory.FilledItemStorage; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.item.ItemVariant; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.storage.base.SingleSlotStorage; import aztech.modern_industrialization.thirdparty.fabrictransfer.api.transaction.Transaction; @@ -31,7 +32,7 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.items.IItemHandler; -public record SlotItemHandler(SingleSlotStorage storage) implements IItemHandler { +public record SlotItemHandler(SingleSlotStorage storage) implements IItemHandler, FilledItemStorage { @Override public int getSlots() { return 1; @@ -83,4 +84,9 @@ public int getSlotLimit(int slot) { public boolean isItemValid(int slot, ItemStack stack) { return true; } + + @Override + public boolean isFull() { + return storage.getAmount() >= storage.getCapacity(); + } } diff --git a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java index 17cccd49b..9d8b01048 100644 --- a/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java +++ b/src/main/java/aztech/modern_industrialization/thirdparty/fabrictransfer/impl/item/ItemVariantImpl.java @@ -32,6 +32,7 @@ import net.minecraft.core.component.DataComponentPatch; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,6 +59,7 @@ public static ItemVariant of(ItemStack stack) { private static final Logger LOGGER = LoggerFactory.getLogger("fabric-transfer-api-v1/item"); private final ItemStack stack; + private @Nullable Integer maxStackSize; private final int hashCode; private ItemVariantImpl(ItemStack stack) { @@ -92,7 +94,10 @@ public ItemStack toStack(int count) { @Override public int getMaxStackSize() { - return this.stack.getMaxStackSize(); + if (maxStackSize == null) { + maxStackSize = stack.getMaxStackSize(); + } + return maxStackSize; } @Override