From fe31ada0897e1907342c14f684059b4592cde218 Mon Sep 17 00:00:00 2001 From: Ruben Taelman Date: Sun, 28 Apr 2024 09:53:55 +0200 Subject: [PATCH] Fix predicate-based importing ignoring round-robin This bug was introduced in 8f659ea686fed797b195c50ddb81708af7fc8623 as a fix for #271. That commit enforced slot-based iteration over the network, which ignores round-robin-based iterators. That fix actually only needed to be applied to exporting, which is what this commit does now. Closes #288 --- .../aspect/FluidTargetCapabilityProvider.java | 11 +++++---- .../part/aspect/FluidTargetStorage.java | 6 +++++ .../part/aspect/IFluidTarget.java | 3 +++ .../part/aspect/IItemTarget.java | 3 +++ .../aspect/ItemTargetCapabilityProvider.java | 11 +++++---- .../part/aspect/ItemTargetStorage.java | 6 +++++ .../aspect/TunnelAspectWriteBuilders.java | 24 ++++++++++++------- 7 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetCapabilityProvider.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetCapabilityProvider.java index be6fe94eb..342c425dc 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetCapabilityProvider.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetCapabilityProvider.java @@ -5,6 +5,7 @@ import net.minecraftforge.fluids.FluidStack; import org.cyclops.commoncapabilities.api.ingredient.IngredientComponent; import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorage; +import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorageSlotted; import org.cyclops.integrateddynamics.api.network.INetwork; import org.cyclops.integrateddynamics.api.part.PartTarget; import org.cyclops.integrateddynamics.api.part.aspect.property.IAspectProperties; @@ -48,11 +49,11 @@ public PartTarget getPartTarget() { @Override public IIngredientComponentStorage getFluidChannel() { - if (getFluidStackMatcher().hasMatchFlags()) { - return getChanneledNetwork().getChannel(getChannel()); - } - // For predicate-based matchers, make sure we can iterate over the contents in a slotted manner, - // as the predicate must apply to each slotted ingredient. + return getChanneledNetwork().getChannel(getChannel()); + } + + @Override + public IIngredientComponentStorageSlotted getFluidChannelSlotted() { return getChanneledNetwork().getChannelSlotted(getChannel()); } diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetStorage.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetStorage.java index 71ac7278a..c08f95fd8 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetStorage.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/FluidTargetStorage.java @@ -2,6 +2,7 @@ import net.minecraftforge.fluids.FluidStack; import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorage; +import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorageSlotted; import org.cyclops.integrateddynamics.api.network.INetwork; import org.cyclops.integrateddynamics.api.part.PartTarget; import org.cyclops.integrateddynamics.api.part.aspect.property.IAspectProperties; @@ -44,6 +45,11 @@ public IIngredientComponentStorage getFluidChannel() { return getChanneledNetwork().getChannel(getChannel()); } + @Override + public IIngredientComponentStorageSlotted getFluidChannelSlotted() { + return getChanneledNetwork().getChannelSlotted(getChannel()); + } + @Override public boolean hasValidTarget() { return storage != null; diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/IFluidTarget.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/IFluidTarget.java index 4b0b2309f..0a2411c21 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/IFluidTarget.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/IFluidTarget.java @@ -4,6 +4,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.fluids.FluidStack; import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorage; +import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorageSlotted; import org.cyclops.integrateddynamics.api.network.INetwork; import org.cyclops.integrateddynamics.api.part.PartPos; import org.cyclops.integrateddynamics.api.part.PartTarget; @@ -21,6 +22,8 @@ public interface IFluidTarget extends IChanneledTarget getFluidChannel(); + public IIngredientComponentStorageSlotted getFluidChannelSlotted(); + public IIngredientComponentStorage getStorage(); public IngredientPredicate getFluidStackMatcher(); diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/IItemTarget.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/IItemTarget.java index 4c62111b5..621867980 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/IItemTarget.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/IItemTarget.java @@ -4,6 +4,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorage; +import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorageSlotted; import org.cyclops.integrateddynamics.api.network.INetwork; import org.cyclops.integrateddynamics.api.part.PartPos; import org.cyclops.integrateddynamics.api.part.PartTarget; @@ -21,6 +22,8 @@ public interface IItemTarget extends IChanneledTarget { public IIngredientComponentStorage getItemChannel(); + public IIngredientComponentStorageSlotted getItemChannelSlotted(); + public IIngredientComponentStorage getStorage(); public int getSlot(); diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetCapabilityProvider.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetCapabilityProvider.java index ba97d51da..9ce3e265f 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetCapabilityProvider.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetCapabilityProvider.java @@ -5,6 +5,7 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider; import org.cyclops.commoncapabilities.api.ingredient.IngredientComponent; import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorage; +import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorageSlotted; import org.cyclops.integrateddynamics.api.network.INetwork; import org.cyclops.integrateddynamics.api.part.PartTarget; import org.cyclops.integrateddynamics.api.part.aspect.property.IAspectProperties; @@ -45,11 +46,11 @@ public ItemTargetCapabilityProvider(ITunnelTransfer transfer, INetwork network, @Override public IIngredientComponentStorage getItemChannel() { - if (getItemStackMatcher().hasMatchFlags()) { - return getChanneledNetwork().getChannel(getChannel()); - } - // For predicate-based matchers, make sure we can iterate over the contents in a slotted manner, - // as the predicate must apply to each slotted ingredient. + return getChanneledNetwork().getChannel(getChannel()); + } + + @Override + public IIngredientComponentStorageSlotted getItemChannelSlotted() { return getChanneledNetwork().getChannelSlotted(getChannel()); } diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetStorage.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetStorage.java index 500677d93..59746b208 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetStorage.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/ItemTargetStorage.java @@ -2,6 +2,7 @@ import net.minecraft.world.item.ItemStack; import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorage; +import org.cyclops.commoncapabilities.api.ingredient.storage.IIngredientComponentStorageSlotted; import org.cyclops.integrateddynamics.api.network.INetwork; import org.cyclops.integrateddynamics.api.part.PartTarget; import org.cyclops.integrateddynamics.api.part.aspect.property.IAspectProperties; @@ -46,6 +47,11 @@ public IIngredientComponentStorage getItemChannel() { return getChanneledNetwork().getChannel(getChannel()); } + @Override + public IIngredientComponentStorageSlotted getItemChannelSlotted() { + return getChanneledNetwork().getChannelSlotted(getChannel()); + } + @Override public boolean hasValidTarget() { return storage != null; diff --git a/src/main/java/org/cyclops/integratedtunnels/part/aspect/TunnelAspectWriteBuilders.java b/src/main/java/org/cyclops/integratedtunnels/part/aspect/TunnelAspectWriteBuilders.java index cf201d81a..bd40163e4 100644 --- a/src/main/java/org/cyclops/integratedtunnels/part/aspect/TunnelAspectWriteBuilders.java +++ b/src/main/java/org/cyclops/integratedtunnels/part/aspect/TunnelAspectWriteBuilders.java @@ -1,16 +1,16 @@ package org.cyclops.integratedtunnels.part.aspect; import com.google.common.collect.ImmutableList; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.nbt.Tag; import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.phys.AABB; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.CapabilityEnergy; @@ -786,12 +786,16 @@ public static final class Item { if (input.hasValidTarget()) { input.preTransfer(); + // For predicate-based matchers, make sure we can iterate over the contents in a slotted manner, + // as the predicate must apply to each slotted ingredient. + // Only do this for exporting, not for importing, as this would otherwise break round-robin imports. + IIngredientComponentStorage source = input.getItemStackMatcher().hasMatchFlags() ? input.getItemChannel() : input.getItemChannelSlotted(); TunnelHelpers.moveSingleStateOptimized( input.getNetwork(), input.getChanneledNetwork(), input.getChannel(), input.getConnection(), - input.getItemChannel(), -1, + source, -1, input.getStorage(), input.getSlot(), input.getItemStackMatcher(), input.getPartTarget().getCenter(), @@ -1152,12 +1156,16 @@ public boolean test(FluidStack integer) { if (input.hasValidTarget()) { input.preTransfer(); + // For predicate-based matchers, make sure we can iterate over the contents in a slotted manner, + // as the predicate must apply to each slotted ingredient. + // Only do this for exporting, not for importing, as this would otherwise break round-robin imports. + IIngredientComponentStorage source = input.getFluidStackMatcher().hasMatchFlags() ? input.getFluidChannel() : input.getFluidChannelSlotted(); TunnelHelpers.moveSingleStateOptimized( input.getNetwork(), input.getChanneledNetwork(), input.getChannel(), input.getConnection(), - input.getFluidChannel(), + source, -1, input.getStorage(), -1,