Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Robot Arm Keep Exact functionality with item pipes #2897

Merged
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.items.ItemHandlerHelper;

import lombok.Getter;

Expand Down Expand Up @@ -160,9 +159,9 @@ public int getTotalConfiguredItemCount(ItemStack itemStack) {
int totalCount = 0;

for (var candidate : matches) {
if (ignoreNbt && ItemStack.isSameItemSameTags(candidate, itemStack)) {
if (ignoreNbt && ItemStack.isSameItem(candidate, itemStack)) {
totalCount += candidate.getCount();
} else if (ItemHandlerHelper.canItemStacksStack(candidate, itemStack)) {
} else if (ItemStack.isSameItemSameTags(candidate, itemStack)) {
totalCount += candidate.getCount();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
import com.gregtechceu.gtceu.api.capability.ICoverable;
import com.gregtechceu.gtceu.api.capability.recipe.IO;
import com.gregtechceu.gtceu.api.cover.CoverBehavior;
import com.gregtechceu.gtceu.api.cover.filter.ItemFilter;
import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter;
import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity;
import com.gregtechceu.gtceu.common.cover.ConveyorCover;
import com.gregtechceu.gtceu.common.cover.ItemFilterCover;
import com.gregtechceu.gtceu.common.cover.RobotArmCover;
import com.gregtechceu.gtceu.common.cover.data.DistributionMode;
import com.gregtechceu.gtceu.common.cover.data.FilterMode;
import com.gregtechceu.gtceu.utils.FacingPos;
import com.gregtechceu.gtceu.utils.ItemStackHashStrategy;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
Expand Down Expand Up @@ -365,14 +366,17 @@ public CoverBehavior getCoverOnNeighbour(BlockPos pos, Direction handlerFacing)
public ItemStack insertOverRobotArm(IItemHandler handler, RobotArmCover arm, ItemStack stack, boolean simulate,
int allowed, boolean ignoreLimit) {
int rate;
boolean isStackSpecific = false;
rate = arm.getFilterHandler().getFilter().testItemCount(stack);
int count;
switch (arm.getTransferMode()) {
case TRANSFER_ANY:
return insert(handler, stack, simulate, allowed, ignoreLimit);
case KEEP_EXACT:
count = rate - countStack(handler, stack, arm, isStackSpecific);
if (arm.getFilterHandler().getFilter().supportsAmounts()) {
count = rate - countStack(handler, stack, arm);
} else {
count = rate;
}
if (count <= 0) return stack;
count = Math.min(allowed, Math.min(stack.getCount(), count));
return insert(handler, stack, simulate, count, ignoreLimit);
Expand All @@ -393,14 +397,17 @@ public ItemStack insertOverRobotArm(IItemHandler handler, RobotArmCover arm, Ite
return stack;
}

public static int countStack(IItemHandler handler, ItemStack stack, RobotArmCover arm, boolean isStackSpecific) {
public static int countStack(IItemHandler handler, ItemStack stack, RobotArmCover arm) {
if (arm == null) return 0;
int count = 0;
ItemFilter filter = arm.getFilterHandler().getFilter();
boolean ignoreNBT = filter instanceof SimpleItemFilter simple && simple.isIgnoreNbt();
for (int i = 0; i < handler.getSlots(); i++) {
ItemStack slot = handler.getStackInSlot(i);
if (slot.isEmpty()) continue;
if (isStackSpecific ? ItemStackHashStrategy.comparingAllButCount().equals(stack, slot) :
arm.getFilterHandler().getFilter().test(slot)) {
if (ignoreNBT && !ItemStack.isSameItem(stack, slot)) continue;
else if (!ItemStack.isSameItemSameTags(stack, slot)) continue;
if (arm.getFilterHandler().getFilter().test(slot)) {
count += slot.getCount();
}
}
Expand Down