Skip to content

Commit 185bd5a

Browse files
authored
Rework Filters as Cover and Fluid Pipes with Covers (#2640)
1 parent 7141fcf commit 185bd5a

File tree

4 files changed

+99
-34
lines changed

4 files changed

+99
-34
lines changed

src/main/java/gregtech/common/covers/CoverFluidFilter.java

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,19 @@
3232
import codechicken.lib.render.pipeline.IVertexOperation;
3333
import codechicken.lib.vec.Cuboid6;
3434
import codechicken.lib.vec.Matrix4;
35+
import com.cleanroommc.modularui.api.drawable.IKey;
3536
import com.cleanroommc.modularui.drawable.Rectangle;
3637
import com.cleanroommc.modularui.factory.SidedPosGuiData;
3738
import com.cleanroommc.modularui.screen.ModularPanel;
3839
import com.cleanroommc.modularui.utils.Alignment;
40+
import com.cleanroommc.modularui.utils.Color;
41+
import com.cleanroommc.modularui.value.sync.BooleanSyncValue;
3942
import com.cleanroommc.modularui.value.sync.EnumSyncValue;
4043
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
4144
import com.cleanroommc.modularui.widgets.SlotGroupWidget;
45+
import com.cleanroommc.modularui.widgets.ToggleButton;
4246
import com.cleanroommc.modularui.widgets.layout.Column;
47+
import com.cleanroommc.modularui.widgets.layout.Row;
4348
import org.jetbrains.annotations.NotNull;
4449
import org.jetbrains.annotations.Nullable;
4550

@@ -51,7 +56,8 @@ public class CoverFluidFilter extends CoverBase implements CoverWithUI {
5156
protected final SimpleOverlayRenderer texture;
5257
protected final FluidFilterContainer fluidFilterContainer;
5358
protected FluidFilterMode filterMode;
54-
protected FluidHandlerFiltered fluidHandler;
59+
protected boolean allowFlow = false;
60+
protected FluidHandlerDelegate fluidHandler;
5561

5662
public CoverFluidFilter(@NotNull CoverDefinition definition, @NotNull CoverableView coverableView,
5763
@NotNull EnumFacing attachedSide, String titleLocale, SimpleOverlayRenderer texture) {
@@ -146,14 +152,32 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan
146152
this.fluidFilterContainer.setMaxTransferSize(1);
147153

148154
return getFilter().createPanel(guiSyncManager)
149-
.size(176, 194).padding(7)
155+
.size(176, 212).padding(7)
150156
.child(CoverWithUI.createTitleRow(getFilterContainer().getFilterStack()))
151157
.child(new Column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight()
152158
.child(new EnumRowBuilder<>(FluidFilterMode.class)
153159
.value(filteringMode)
154160
.lang("cover.filter.mode.title")
155161
.overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY)
156162
.build())
163+
.child(new Row()
164+
.marginBottom(2)
165+
.widthRel(1f)
166+
.coverChildrenHeight()
167+
.setEnabledIf(b -> getFilterMode() != FluidFilterMode.FILTER_BOTH)
168+
.child(new ToggleButton()
169+
.overlay(IKey.dynamic(() -> IKey.lang(allowFlow ?
170+
"cover.generic.enabled" :
171+
"cover.generic.disabled").get())
172+
.color(Color.WHITE.main).shadow(false))
173+
.tooltip(tooltip -> tooltip
174+
.addLine(IKey.lang("cover.filter.allow_flow.tooltip")))
175+
.size(72, 18)
176+
.value(new BooleanSyncValue(() -> allowFlow, b -> allowFlow = b)))
177+
.child(IKey.lang("cover.filter.allow_flow.label")
178+
.asWidget()
179+
.height(18)
180+
.alignX(1f)))
157181
.child(new Rectangle().setColor(UI_TEXT_COLOR).asWidget()
158182
.height(1).widthRel(0.95f).margin(0, 4))
159183
.child(getFilter().createWidgets(guiSyncManager)))
@@ -207,30 +231,36 @@ public FluidHandlerFiltered(@NotNull IFluidHandler delegate) {
207231
}
208232

209233
public int fill(FluidStack resource, boolean doFill) {
210-
if (getFilterMode() == FluidFilterMode.FILTER_DRAIN || !fluidFilterContainer.test(resource)) {
211-
return 0;
212-
}
213-
return super.fill(resource, doFill);
234+
// set to drain, but filling is allowed
235+
if (getFilterMode() == FluidFilterMode.FILTER_DRAIN && allowFlow)
236+
return super.fill(resource, doFill);
237+
238+
// if set to insert or both, test the stack
239+
if (getFilterMode() != FluidFilterMode.FILTER_DRAIN && fluidFilterContainer.test(resource))
240+
return super.fill(resource, doFill);
241+
242+
// otherwise fail
243+
return 0;
214244
}
215245

216246
@Nullable
217247
public FluidStack drain(FluidStack resource, boolean doDrain) {
218-
if (getFilterMode() == FluidFilterMode.FILTER_FILL || !fluidFilterContainer.test(resource)) {
219-
return null;
220-
}
221-
return super.drain(resource, doDrain);
248+
// set to fill, draining is allowed
249+
if (getFilterMode() == FluidFilterMode.FILTER_FILL && allowFlow)
250+
return super.drain(resource, doDrain);
251+
252+
// if set to extract or both, test stack
253+
if (getFilterMode() != FluidFilterMode.FILTER_FILL && fluidFilterContainer.test(resource))
254+
return super.drain(resource, doDrain);
255+
256+
// otherwise fail
257+
return null;
222258
}
223259

224260
@Nullable
225261
public FluidStack drain(int maxDrain, boolean doDrain) {
226-
if (getFilterMode() != FluidFilterMode.FILTER_FILL) {
227-
FluidStack result = super.drain(maxDrain, false);
228-
if (result == null || result.amount <= 0 || !fluidFilterContainer.test(result)) {
229-
return null;
230-
}
231-
return doDrain ? super.drain(maxDrain, true) : result;
232-
}
233-
return super.drain(maxDrain, doDrain);
262+
var f = super.drain(maxDrain, false);
263+
return drain(f, doDrain);
234264
}
235265
}
236266
}

src/main/java/gregtech/common/covers/CoverItemFilter.java

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,19 @@
3131
import codechicken.lib.render.pipeline.IVertexOperation;
3232
import codechicken.lib.vec.Cuboid6;
3333
import codechicken.lib.vec.Matrix4;
34+
import com.cleanroommc.modularui.api.drawable.IKey;
3435
import com.cleanroommc.modularui.drawable.Rectangle;
3536
import com.cleanroommc.modularui.factory.SidedPosGuiData;
3637
import com.cleanroommc.modularui.screen.ModularPanel;
3738
import com.cleanroommc.modularui.utils.Alignment;
39+
import com.cleanroommc.modularui.utils.Color;
40+
import com.cleanroommc.modularui.value.sync.BooleanSyncValue;
3841
import com.cleanroommc.modularui.value.sync.EnumSyncValue;
3942
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
4043
import com.cleanroommc.modularui.widgets.SlotGroupWidget;
44+
import com.cleanroommc.modularui.widgets.ToggleButton;
4145
import com.cleanroommc.modularui.widgets.layout.Column;
46+
import com.cleanroommc.modularui.widgets.layout.Row;
4247
import org.jetbrains.annotations.NotNull;
4348
import org.jetbrains.annotations.Nullable;
4449

@@ -50,7 +55,8 @@ public class CoverItemFilter extends CoverBase implements CoverWithUI {
5055
protected final SimpleOverlayRenderer texture;
5156
protected final ItemFilterContainer itemFilterContainer;
5257
protected ItemFilterMode filterMode = ItemFilterMode.FILTER_INSERT;
53-
protected ItemHandlerFiltered itemHandler;
58+
protected boolean allowFlow = false;
59+
protected ItemHandlerDelegate itemHandler;
5460

5561
public CoverItemFilter(@NotNull CoverDefinition definition, @NotNull CoverableView coverableView,
5662
@NotNull EnumFacing attachedSide, String titleLocale, SimpleOverlayRenderer texture) {
@@ -148,14 +154,32 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan
148154
guiSyncManager.syncValue("filtering_mode", filteringMode);
149155

150156
return getFilter().createPanel(guiSyncManager)
151-
.size(176, 194).padding(7)
157+
.size(176, 212).padding(7)
152158
.child(CoverWithUI.createTitleRow(getFilterContainer().getFilterStack()).left(4))
153159
.child(new Column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight()
154160
.child(new EnumRowBuilder<>(ItemFilterMode.class)
155161
.value(filteringMode)
156162
.lang("cover.filter.mode.title")
157163
.overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY)
158164
.build())
165+
.child(new Row()
166+
.marginBottom(2)
167+
.widthRel(1f)
168+
.coverChildrenHeight()
169+
.setEnabledIf(b -> getFilterMode() != ItemFilterMode.FILTER_BOTH)
170+
.child(new ToggleButton()
171+
.overlay(IKey.dynamic(() -> IKey.lang(allowFlow ?
172+
"cover.generic.enabled" :
173+
"cover.generic.disabled").get())
174+
.color(Color.WHITE.main).shadow(false))
175+
.tooltip(tooltip -> tooltip
176+
.addLine(IKey.lang("cover.filter.allow_flow.tooltip")))
177+
.size(72, 18)
178+
.value(new BooleanSyncValue(() -> allowFlow, b -> allowFlow = b)))
179+
.child(IKey.lang("cover.filter.allow_flow.label")
180+
.asWidget()
181+
.height(18)
182+
.alignX(1f)))
159183
.child(new Rectangle().setColor(UI_TEXT_COLOR).asWidget()
160184
.height(1).widthRel(0.95f).margin(0, 4))
161185
.child(getFilter().createWidgets(guiSyncManager).left(0)))
@@ -212,23 +236,31 @@ public ItemHandlerFiltered(IItemHandler delegate) {
212236
@NotNull
213237
@Override
214238
public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) {
215-
if (getFilterMode() == ItemFilterMode.FILTER_EXTRACT || !itemFilterContainer.test(stack)) {
216-
return stack;
217-
}
218-
return super.insertItem(slot, stack, simulate);
239+
// set to extract, but insertion is allowed
240+
if (getFilterMode() == ItemFilterMode.FILTER_EXTRACT && allowFlow)
241+
return super.insertItem(slot, stack, simulate);
242+
243+
// if set to insert or both, test the stack
244+
if (getFilterMode() != ItemFilterMode.FILTER_EXTRACT && itemFilterContainer.test(stack))
245+
return super.insertItem(slot, stack, simulate);
246+
247+
// otherwise fail
248+
return stack;
219249
}
220250

221251
@NotNull
222252
@Override
223253
public ItemStack extractItem(int slot, int amount, boolean simulate) {
224-
if (getFilterMode() != ItemFilterMode.FILTER_INSERT) {
225-
ItemStack result = super.extractItem(slot, amount, true);
226-
if (result.isEmpty() || !itemFilterContainer.test(result)) {
227-
return ItemStack.EMPTY;
228-
}
229-
return simulate ? result : super.extractItem(slot, amount, false);
230-
}
231-
return super.extractItem(slot, amount, simulate);
254+
// set to insert, but extraction is allowed
255+
if (getFilterMode() == ItemFilterMode.FILTER_INSERT && allowFlow)
256+
return super.extractItem(slot, amount, simulate);
257+
258+
// if set to extract or both, test stack
259+
if (getFilterMode() != ItemFilterMode.FILTER_INSERT && itemFilterContainer.test(getStackInSlot(slot)))
260+
return super.extractItem(slot, amount, simulate);
261+
262+
// otherwise fail
263+
return ItemStack.EMPTY;
232264
}
233265
}
234266
}

src/main/java/gregtech/common/pipelike/fluidpipe/tile/TileEntityFluidPipeTickable.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import gregtech.api.util.EntityDamageUtil;
1414
import gregtech.api.util.TextFormattingUtil;
1515
import gregtech.common.covers.CoverPump;
16-
import gregtech.common.covers.ManualImportExportMode;
1716
import gregtech.common.pipelike.fluidpipe.net.PipeTankList;
1817

1918
import net.minecraft.entity.EntityLivingBase;
@@ -202,7 +201,7 @@ private boolean checkForPumpCover(@Nullable Cover cover) {
202201
if (coverPump.getTransferRate() > pipeThroughput) {
203202
coverPump.setTransferRate(pipeThroughput);
204203
}
205-
return coverPump.getManualImportExportMode() == ManualImportExportMode.DISABLED;
204+
return true; // disable pushing completely if there's a pump
206205
}
207206
return false;
208207
}

src/main/resources/assets/gregtech/lang/en_us.lang

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,8 @@ cover.filter.mode.title=Filter Mode
12801280
cover.filter.mode.filter_insert=Filter Insert
12811281
cover.filter.mode.filter_extract=Filter Extract
12821282
cover.filter.mode.filter_both=Filter Insert/Extract
1283+
cover.filter.allow_flow.label=Allow Flow
1284+
cover.filter.allow_flow.tooltip=By default, Items/Fluids can only move in the direction\nof the filter with respect to the filter's setting.\n\nIf Enabled, Items/Fluids are allowed to pass unfiltered\nthrough the opposite direction of this filter.
12831285
cover.item_filter.ignore_damage.enabled=Ignore Damage
12841286
cover.item_filter.ignore_damage.disabled=Respect Damage
12851287
cover.item_filter.ignore_nbt.enabled=Ignore NBT
@@ -1309,6 +1311,8 @@ cover.smart_item_filter.filtering_mode.centrifuge=Centrifuge
13091311
cover.smart_item_filter.filtering_mode.sifter=Sifter
13101312
cover.smart_item_filter.filtering_mode.description=Select Machine this Smart Filter will use for filtering./nIt will automatically pick right portions of items for robotic arm.
13111313

1314+
cover.generic.disabled=Disabled
1315+
cover.generic.enabled=Enabled
13121316
cover.generic.transfer_mode=Transfer Mode
13131317
cover.generic.manual_io=Manual IO Mode
13141318
cover.generic.io=IO Mode

0 commit comments

Comments
 (0)