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 27, 2024
1 parent 6610aec commit cd12a74
Show file tree
Hide file tree
Showing 14 changed files with 136 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,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
11 changes: 6 additions & 5 deletions src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java
Original file line number Diff line number Diff line change
Expand Up @@ -664,10 +664,10 @@ public Predicate<ItemStack> getItemCapFilter(@Nullable Direction side) {
return item -> true;
}

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 @@ -713,11 +713,12 @@ public IFluidHandlerModifiable getFluidTransferCap(@Nullable Direction side, boo
io = IO.OUT;
}

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

CoverBehavior cover = getCoverContainer().getCoverAtSide(side);
return cover != null ? cover.getFluidTransferCap(transferList) : transferList;
return cover != null ? cover.getFluidTransferCap(handlerList) : handlerList;
}

//////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,9 @@ public void exportToNearby(Direction... facings) {
var level = getMachine().getLevel();
var pos = getMachine().getPos();
for (Direction facing : facings) {
FluidTransferHelper.exportToTarget(this, Integer.MAX_VALUE, f -> true, level, pos.relative(facing),
facing.getOpposite());
var filter = getMachine().getFluidCapFilter(facing, IO.OUT);
GTTransferUtils.getAdjacentFluidHandler(level, pos, facing)
.ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(this, adj, filter));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -271,19 +271,19 @@ public void exportToNearby(@NotNull Direction... facings) {
var level = getMachine().getLevel();
var pos = getMachine().getPos();
for (Direction facing : facings) {
FluidTransferHelper.exportToTarget(this, Integer.MAX_VALUE, getMachine().getFluidCapFilter(facing), level,
pos.relative(facing),
facing.getOpposite());
var filter = getMachine().getFluidCapFilter(facing, IO.OUT);
GTTransferUtils.getAdjacentFluidHandler(level, pos, facing)
.ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(this, adj, filter));
}
}

public void importFromNearby(@NotNull Direction... facings) {
var level = getMachine().getLevel();
var pos = getMachine().getPos();
for (Direction facing : facings) {
FluidTransferHelper.importToTarget(this, Integer.MAX_VALUE, getMachine().getFluidCapFilter(facing), level,
pos.relative(facing),
facing.getOpposite());
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 @@ -23,29 +23,43 @@ public class IOFluidTransferList extends FluidTransferList implements IFluidHand

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

public IOFluidTransferList(List<IFluidHandler> transfers, IO io, Predicate<FluidStack> filter) {
public IOFluidTransferList(List<IFluidHandler> transfers, IO io,
Predicate<FluidStack> inFilter, Predicate<FluidStack> outFilter) {
super(transfers);
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.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 @NotNull FluidStack drain(FluidStack resource, FluidAction action) {
if (io != IO.OUT && io != IO.BOTH) return FluidStack.EMPTY;
return super.drain(resource, action);
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 @@ -12,7 +12,9 @@
import com.gregtechceu.gtceu.api.machine.TickableSubscription;
import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider;
import com.gregtechceu.gtceu.api.material.material.properties.FluidPipeProperties;
import com.gregtechceu.gtceu.api.misc.IOFluidTransferList;
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 @@ -59,6 +61,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,18 +5,26 @@
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.FluidTransferDelegate;
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.syncdata.annotation.DescSynced;
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
import com.lowdragmc.lowdraglib.side.fluid.FluidTransferHelper;
import com.lowdragmc.lowdraglib.side.fluid.IFluidHandlerModifiable;

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 org.jetbrains.annotations.Nullable;

import javax.annotation.ParametersAreNonnullByDefault;
Expand All @@ -30,13 +38,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 FilteredFluidTransferWrapper 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 FluidTransferHelper.getFluidTransfer(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) != null;
Expand Down Expand Up @@ -64,12 +86,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 FilteredFluidTransferWrapper extends FluidTransferDelegate {

public FilteredFluidTransferWrapper(IFluidHandlerModifiable delegate) {
Expand All @@ -78,16 +108,20 @@ public FilteredFluidTransferWrapper(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,9 @@
import com.gregtechceu.gtceu.api.machine.MachineCoverContainer;
import com.gregtechceu.gtceu.api.machine.MetaMachine;
import com.gregtechceu.gtceu.api.transfer.item.ItemTransferDelegate;
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;
import com.lowdragmc.lowdraglib.gui.widget.Widget;
Expand All @@ -27,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 @@ -48,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 FilteredItemTransferWrapper itemFilterWrapper;
@Setter
@Getter
protected ManualIOMode allowFlow = ManualIOMode.DISABLED;

public ItemFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) {
super(definition, coverHolder, attachedSide);
Expand All @@ -66,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 @@ -94,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 @@ -115,18 +122,25 @@ public FilteredItemTransferWrapper(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;
}
}
}
Loading

0 comments on commit cd12a74

Please sign in to comment.