Skip to content

Commit

Permalink
Add in-line filtering for item and fluid pipes (#2126)
Browse files Browse the repository at this point in the history
  • Loading branch information
YoungOnionMC authored and krossgg committed Oct 13, 2024
1 parent 0bbf126 commit 2d73247
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,21 @@
import com.gregtechceu.gtceu.api.cover.CoverDefinition;
import com.gregtechceu.gtceu.api.cover.IUICover;
import com.gregtechceu.gtceu.api.cover.filter.FluidFilter;
import com.gregtechceu.gtceu.api.transfer.fluid.FluidTransferDelegate;

import com.lowdragmc.lowdraglib.gui.widget.LabelWidget;
import com.lowdragmc.lowdraglib.gui.widget.Widget;
import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
import com.lowdragmc.lowdraglib.side.fluid.FluidTransferHelper;

import com.lowdragmc.lowdraglib.side.fluid.IFluidHandlerModifiable;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.Direction;

import net.neoforged.neoforge.fluids.FluidStack;
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
import org.jetbrains.annotations.Nullable;

import javax.annotation.ParametersAreNonnullByDefault;

/**
Expand All @@ -26,6 +32,7 @@
public class FluidFilterCover extends CoverBehavior implements IUICover {

protected FluidFilter fluidFilter;
private FilteredFluidTransferWrapper fluidFilterWrapper;

public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) {
super(definition, coverHolder, attachedSide);
Expand All @@ -43,11 +50,45 @@ public FluidFilter getFluidFilter() {
return fluidFilter;
}

@Override
public @Nullable IFluidHandlerModifiable getFluidTransferCap(@Nullable IFluidHandlerModifiable defaultValue) {
if (defaultValue == null) {
return null;
}

if (fluidFilterWrapper == null || fluidFilterWrapper.delegate != defaultValue) {
this.fluidFilterWrapper = new FilteredFluidTransferWrapper(defaultValue);
}

return fluidFilterWrapper;
}

@Override
public Widget createUIWidget() {
final var group = new WidgetGroup(0, 0, 176, 80);
group.addWidget(new LabelWidget(5, 3, attachItem.getDescriptionId()));
group.addWidget(getFluidFilter().openConfigurator((176 - 80) / 2, (60 - 55) / 2 + 15));
return group;
}

private class FilteredFluidTransferWrapper extends FluidTransferDelegate {

public FilteredFluidTransferWrapper(IFluidHandlerModifiable delegate) {
super(delegate);
}

@Override
public int fill(FluidStack resource, FluidAction action) {
if (!fluidFilter.test(resource))
return 0;
return super.fill(resource, action);
}

@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
if (!fluidFilter.test(resource))
return FluidStack.EMPTY;
return super.drain(resource, action);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.gregtechceu.gtceu.api.cover.IUICover;
import com.gregtechceu.gtceu.api.cover.filter.ItemFilter;
import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget;
import com.gregtechceu.gtceu.api.transfer.item.ItemTransferDelegate;
import com.gregtechceu.gtceu.common.cover.data.ItemFilterMode;

import com.lowdragmc.lowdraglib.gui.widget.LabelWidget;
Expand All @@ -18,8 +19,12 @@

import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack;

import lombok.Getter;
import net.neoforged.neoforge.items.IItemHandlerModifiable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.annotation.ParametersAreNonnullByDefault;

Expand All @@ -40,6 +45,7 @@ public class ItemFilterCover extends CoverBehavior implements IUICover {
@DescSynced
@Getter
protected ItemFilterMode filterMode = ItemFilterMode.FILTER_INSERT;
private FilteredItemTransferWrapper itemFilterWrapper;

public ItemFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) {
super(definition, coverHolder, attachedSide);
Expand All @@ -62,6 +68,17 @@ public boolean canAttach() {
return ItemTransferHelper.getItemTransfer(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) != null;
}

@Override
public @Nullable IItemHandlerModifiable getItemTransferCap(IItemHandlerModifiable defaultValue) {
if (defaultValue == null) {
return null;
}
if (itemFilterWrapper == null || itemFilterWrapper.delegate != defaultValue) {
this.itemFilterWrapper = new ItemFilterCover.FilteredItemTransferWrapper(defaultValue);
}
return itemFilterWrapper;
}

@Override
public Widget createUIWidget() {
final var group = new WidgetGroup(0, 0, 176, 85);
Expand All @@ -76,4 +93,27 @@ public Widget createUIWidget() {
public ManagedFieldHolder getFieldHolder() {
return MANAGED_FIELD_HOLDER;
}

private class FilteredItemTransferWrapper extends ItemTransferDelegate {

public FilteredItemTransferWrapper(IItemHandlerModifiable delegate) {
super(delegate);
}

@Override
public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) {
if (filterMode != ItemFilterMode.FILTER_EXTRACT && !itemFilter.test(stack))
return stack;
return super.insertItem(slot, stack, simulate);
}

@Override
public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) {
ItemStack result = super.extractItem(slot, amount, true);
if (result.isEmpty() || (filterMode != ItemFilterMode.FILTER_INSERT && !itemFilter.test(result))) {
return ItemStack.EMPTY;
}
return simulate ? result : super.extractItem(slot, amount, false);
}
}
}

0 comments on commit 2d73247

Please sign in to comment.