Skip to content

Commit

Permalink
Filter Cover Directionality (#2343)
Browse files Browse the repository at this point in the history
Co-authored-by: kross <135918757+krossgg@users.noreply.github.com>
  • Loading branch information
2 people authored and screret committed Dec 5, 2024
1 parent 35f7ea5 commit 1347c34
Show file tree
Hide file tree
Showing 14 changed files with 128 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ public void detectAndSendChanges() {
group.addWidget(slot);
}
}
group.addWidget(new ToggleButtonWidget(18 * 3 + 2, 9, 18, 18,
group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 0, 20, 20,
GuiTextures.BUTTON_BLACKLIST, this::isBlackList, this::setBlackList));
group.addWidget(new ToggleButtonWidget(18 * 3 + 2, (18) + 9, 18, 18,
group.addWidget(new ToggleButtonWidget(18 * 3 + 5, 20, 20, 20,
GuiTextures.BUTTON_FILTER_NBT, this::isIgnoreNbt, this::setIgnoreNbt));
return group;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -665,11 +665,10 @@ public Predicate<ItemStack> getItemCapFilter(@Nullable Direction side, IO io) {
return item -> true;
}

// TODO: ADD Fluid Filter Modes
public Predicate<FluidStack> getFluidCapFilter(@Nullable Direction side) {
public Predicate<FluidStack> getFluidCapFilter(@Nullable Direction side, IO io) {
if (side != null) {
var cover = getCoverContainer().getCoverAtSide(side);
if (cover instanceof FluidFilterCover filterCover) {
if (cover instanceof FluidFilterCover filterCover && filterCover.getFilterMode().filters(io)) {
return filterCover.getFluidFilter();
}
}
Expand Down Expand Up @@ -716,7 +715,8 @@ public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, bool
io = IO.OUT;
}

IOFluidHandlerList handlerList = new IOFluidHandlerList(list, io, getFluidCapFilter(side));
IOFluidHandlerList handlerList = new IOFluidHandlerList(list, io, getFluidCapFilter(side, IO.IN),
getFluidCapFilter(side, IO.OUT));
if (!useCoverCapability || side == null) return handlerList;

CoverBehavior cover = getCoverContainer().getCoverAtSide(side);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public void exportToNearby(Direction... facings) {
var level = getMachine().getLevel();
var pos = getMachine().getPos();
for (Direction facing : facings) {
var filter = getMachine().getFluidCapFilter(facing);
var filter = getMachine().getFluidCapFilter(facing, IO.OUT);
GTTransferUtils.getAdjacentFluidHandler(level, pos, facing)
.ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(this, adj, filter));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ public void exportToNearby(@NotNull Direction... facings) {
var level = getMachine().getLevel();
var pos = getMachine().getPos();
for (Direction facing : facings) {
var filter = getMachine().getFluidCapFilter(facing);
var filter = getMachine().getFluidCapFilter(facing, IO.OUT);
GTTransferUtils.getAdjacentFluidHandler(level, pos, facing)
.ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(this, adj, filter));
}
Expand All @@ -296,7 +296,7 @@ public void importFromNearby(@NotNull Direction... facings) {
var level = getMachine().getLevel();
var pos = getMachine().getPos();
for (Direction facing : facings) {
var filter = getMachine().getFluidCapFilter(facing);
var filter = getMachine().getFluidCapFilter(facing, IO.IN);
GTTransferUtils.getAdjacentFluidHandler(level, pos, facing)
.ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(adj, this, filter));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,29 +22,43 @@ public class IOFluidHandlerList extends FluidHandlerList implements IFluidHandle

@Getter
private final IO io;
private final Predicate<FluidStack> inFilter;
private final Predicate<FluidStack> outFilter;

public IOFluidHandlerList(List<IFluidHandler> handlers, IO io, Predicate<FluidStack> filter) {
public IOFluidHandlerList(List<IFluidHandler> handlers, IO io, Predicate<FluidStack> inFilter,
Predicate<FluidStack> outFilter) {
super(handlers);
this.io = io;
setFilter(filter);
this.inFilter = inFilter;
this.outFilter = outFilter;
}

@Override
public int fill(FluidStack resource, FluidAction action) {
if (io != IO.IN && io != IO.BOTH) return 0;
if (!io.support(IO.IN) || !inFilter.test(resource)) return 0;
return super.fill(resource, action);
}

@Override
public @NotNull FluidStack drain(FluidStack resource, FluidAction action) {
if (io != IO.OUT && io != IO.BOTH) return FluidStack.EMPTY;
if (!io.support(IO.OUT) || !outFilter.test(resource)) return FluidStack.EMPTY;
return super.drain(resource, action);
}

@Override
public @NotNull FluidStack drain(int maxDrain, FluidAction action) {
if (io != IO.OUT && io != IO.BOTH) return FluidStack.EMPTY;
return super.drain(maxDrain, action);
if (!io.support(IO.OUT)) return FluidStack.EMPTY;
var fluidStack = super.drain(maxDrain, FluidAction.SIMULATE);
if (fluidStack.isEmpty() || !outFilter.test(fluidStack)) return FluidStack.EMPTY;
return action.simulate() ? fluidStack : super.drain(maxDrain, action);
}

@Override
public boolean isFluidValid(int tank, @NotNull FluidStack stack) {
Predicate<FluidStack> filter = s -> true;
if (io.support(IO.IN)) filter = inFilter.and(filter);
if (io.support(IO.OUT)) filter = outFilter.and(filter);
return filter.test(stack) && super.isFluidValid(tank, stack);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity;
import com.gregtechceu.gtceu.api.capability.GTCapability;
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.fluid.FluidConstants;
import com.gregtechceu.gtceu.api.fluid.FluidState;
Expand All @@ -13,6 +14,7 @@
import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider;
import com.gregtechceu.gtceu.api.material.material.properties.FluidPipeProperties;
import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank;
import com.gregtechceu.gtceu.common.cover.FluidFilterCover;
import com.gregtechceu.gtceu.common.cover.PumpCover;
import com.gregtechceu.gtceu.common.cover.data.ManualIOMode;
import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior;
Expand Down Expand Up @@ -60,6 +62,7 @@
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.function.Predicate;

public class FluidPipeBlockEntity extends PipeBlockEntity<FluidPipeType, FluidPipeProperties>
implements IDataInfoProvider {
Expand Down Expand Up @@ -111,6 +114,16 @@ public boolean canAttachTo(Direction side) {
return false;
}

private Predicate<FluidStack> getFluidCapFilter(@Nullable Direction side, IO io) {
if (side != null) {
var cover = getCoverContainer().getCoverAtSide(side);
if (cover instanceof FluidFilterCover filterCover && filterCover.getFilterMode().filters(io)) {
return filterCover.getFluidFilter();
}
}
return fluid -> true;
}

public int getCapacityPerTank() {
return getNodeData().getThroughput() * 20;
}
Expand Down Expand Up @@ -209,11 +222,8 @@ private void distributeFluid(int channel, CustomFluidTank tank, FluidStack fluid
// Now distribute
for (FluidTransaction transaction : tanks) {
if (availableCapacity > maxAmount) {
transaction.amount = Mth.floor(transaction.amount * maxAmount / availableCapacity); // Distribute fluids
// based on
// percentage
// available space
// at destination
// Distribute fluids based on percentage available space at destination
transaction.amount = Mth.floor(transaction.amount * maxAmount / availableCapacity);
}
if (transaction.amount == 0) {
if (tank.getFluidAmount() <= 0) break; // If there is no more stored fluid, stop transferring to prevent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,30 @@
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.gui.widget.EnumSelectorWidget;
import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerDelegate;
import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable;
import com.gregtechceu.gtceu.common.cover.data.FilterMode;
import com.gregtechceu.gtceu.common.cover.data.ManualIOMode;

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 com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced;
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder;

import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.Direction;
import net.neoforged.neoforge.fluids.FluidStack;

import lombok.Getter;
import lombok.Setter;
import net.neoforged.neoforge.fluids.FluidUtil;
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
import net.neoforged.neoforge.fluids.capability.IFluidHandler.FluidAction;
import org.jetbrains.annotations.Nullable;

import javax.annotation.ParametersAreNonnullByDefault;
Expand All @@ -31,13 +42,27 @@
@MethodsReturnNonnullByDefault
public class FluidFilterCover extends CoverBehavior implements IUICover {

public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(FluidFilterCover.class,
CoverBehavior.MANAGED_FIELD_HOLDER);
protected FluidFilter fluidFilter;
@Persisted
@DescSynced
@Getter
protected FilterMode filterMode = FilterMode.FILTER_INSERT;
private FilteredFluidHandlerWrapper fluidFilterWrapper;
@Setter
@Getter
protected ManualIOMode allowFlow = ManualIOMode.DISABLED;

public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) {
super(definition, coverHolder, attachedSide);
}

public void setFilterMode(FilterMode filterMode) {
this.filterMode = filterMode;
coverHolder.markDirty();
}

@Override
public boolean canAttach() {
return FluidUtil.getFluidHandler(coverHolder.getLevel(), coverHolder.getPos(), attachedSide).isPresent();
Expand Down Expand Up @@ -65,12 +90,20 @@ public FluidFilter getFluidFilter() {

@Override
public Widget createUIWidget() {
final var group = new WidgetGroup(0, 0, 120, 85);
group.addWidget(new LabelWidget(5, 5, attachItem.getDescriptionId()));
group.addWidget(getFluidFilter().openConfigurator(25, 25));
final var group = new WidgetGroup(0, 0, 178, 85);
group.addWidget(new LabelWidget(60, 5, attachItem.getDescriptionId()));
group.addWidget(new EnumSelectorWidget<>(35, 25, 18, 18,
FilterMode.VALUES, filterMode, this::setFilterMode));
group.addWidget(new EnumSelectorWidget<>(35, 45, 18, 18, ManualIOMode.VALUES, allowFlow, this::setAllowFlow));
group.addWidget(getFluidFilter().openConfigurator(62, 25));
return group;
}

@Override
public ManagedFieldHolder getFieldHolder() {
return MANAGED_FIELD_HOLDER;
}

private class FilteredFluidHandlerWrapper extends FluidHandlerDelegate {

public FilteredFluidHandlerWrapper(IFluidHandlerModifiable delegate) {
Expand All @@ -79,16 +112,20 @@ public FilteredFluidHandlerWrapper(IFluidHandlerModifiable delegate) {

@Override
public int fill(FluidStack resource, FluidAction action) {
if (!getFluidFilter().test(resource))
return 0;
return super.fill(resource, action);
if ((filterMode == FilterMode.FILTER_EXTRACT) && allowFlow == ManualIOMode.UNFILTERED)
return super.fill(resource, action);
if (filterMode != FilterMode.FILTER_EXTRACT && getFluidFilter().test(resource))
return super.fill(resource, action);
return 0;
}

@Override
public FluidStack drain(FluidStack resource, FluidAction action) {
if (!getFluidFilter().test(resource))
return FluidStack.EMPTY;
return super.drain(resource, action);
if ((filterMode == FilterMode.FILTER_INSERT) && allowFlow == ManualIOMode.UNFILTERED)
return super.drain(resource, action);
if (filterMode != FilterMode.FILTER_INSERT && getFluidFilter().test(resource))
return super.drain(resource, action);
return FluidStack.EMPTY;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
import com.gregtechceu.gtceu.api.machine.MachineCoverContainer;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.transfer.item.ItemHandlerDelegate;
import com.gregtechceu.gtceu.common.cover.data.ItemFilterMode;
import com.gregtechceu.gtceu.common.cover.data.FilterMode;
import com.gregtechceu.gtceu.common.cover.data.ManualIOMode;
import com.gregtechceu.gtceu.utils.GTTransferUtils;

import com.lowdragmc.lowdraglib.gui.widget.LabelWidget;
Expand All @@ -28,6 +29,7 @@
import net.neoforged.neoforge.items.IItemHandlerModifiable;

import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

Expand All @@ -49,8 +51,11 @@ public class ItemFilterCover extends CoverBehavior implements IUICover {
@Persisted
@DescSynced
@Getter
protected ItemFilterMode filterMode = ItemFilterMode.FILTER_INSERT;
protected FilterMode filterMode = FilterMode.FILTER_INSERT;
private FilteredItemHandlerWrapper itemFilterWrapper;
@Setter
@Getter
protected ManualIOMode allowFlow = ManualIOMode.DISABLED;

public ItemFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) {
super(definition, coverHolder, attachedSide);
Expand All @@ -67,7 +72,7 @@ public ItemFilter getItemFilter() {
return itemFilter;
}

public void setFilterMode(ItemFilterMode filterMode) {
public void setFilterMode(FilterMode filterMode) {
this.filterMode = filterMode;
coverHolder.markDirty();
}
Expand Down Expand Up @@ -95,11 +100,12 @@ public void onAttached(ItemStack itemStack, ServerPlayer player) {

@Override
public Widget createUIWidget() {
final var group = new WidgetGroup(0, 0, 120, 85);
group.addWidget(new LabelWidget(5, 5, attachItem.getDescriptionId()));
group.addWidget(new EnumSelectorWidget<>(7, 61, 18, 18,
ItemFilterMode.VALUES, filterMode, this::setFilterMode));
group.addWidget(getItemFilter().openConfigurator(30, 25));
final var group = new WidgetGroup(0, 0, 178, 85);
group.addWidget(new LabelWidget(60, 5, attachItem.getDescriptionId()));
group.addWidget(new EnumSelectorWidget<>(35, 25, 18, 18,
FilterMode.VALUES, filterMode, this::setFilterMode));
group.addWidget(new EnumSelectorWidget<>(35, 45, 18, 18, ManualIOMode.VALUES, allowFlow, this::setAllowFlow));
group.addWidget(getItemFilter().openConfigurator(62, 25));
return group;
}

Expand All @@ -116,18 +122,25 @@ public FilteredItemHandlerWrapper(IItemHandlerModifiable delegate) {

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

@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 && !getItemFilter().test(result))) {
return ItemStack.EMPTY;
if (result.isEmpty() && (filterMode == FilterMode.FILTER_INSERT) && allowFlow == ManualIOMode.UNFILTERED) {
return super.extractItem(slot, amount, false);
}

if (filterMode != FilterMode.FILTER_INSERT && getItemFilter().test(result)) {
return super.extractItem(slot, amount, false);
}
return simulate ? result : super.extractItem(slot, amount, false);
return ItemStack.EMPTY;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@

@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public enum ItemFilterMode implements EnumSelectorWidget.SelectableEnum {
public enum FilterMode implements EnumSelectorWidget.SelectableEnum {

FILTER_INSERT("filter_insert"),
FILTER_EXTRACT("filter_extract"),
FILTER_BOTH("filter_both");

public static final ItemFilterMode[] VALUES = values();
public static final FilterMode[] VALUES = values();

public final String localeName;

ItemFilterMode(String localeName) {
FilterMode(String localeName) {
this.localeName = localeName;
}

Expand All @@ -33,7 +33,7 @@ public String getTooltip() {

@Override
public IGuiTexture getIcon() {
return new ResourceTexture("gtceu:textures/gui/icon/item_filter_mode/" + localeName + ".png");
return new ResourceTexture("gtceu:textures/gui/icon/filter_mode/" + localeName + ".png");
}

public boolean filters(IO io) {
Expand Down
Loading

0 comments on commit 1347c34

Please sign in to comment.