Skip to content

Commit ce63e7f

Browse files
committed
feat: ✨ Allow void upgrades to filter and void fluids
(cherry picked from commit a966d4ce29216b51f30a05b22f3e0351a00b405a)
1 parent 4d0153d commit ce63e7f

13 files changed

Lines changed: 351 additions & 24 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ loader_version_range=[4,)
1515
mod_id=sophisticatedcore
1616
mod_name=Sophisticated Core
1717
mod_license=All Rights Reserved
18-
mod_version=1.4.88
18+
mod_version=1.4.89
1919
mod_group_id=net.p3pp3rf1y
2020
mod_authors=P3pp3rF1y
2121
mod_description=A library / shared functionality mod for Sophisticated Storage and Backpacks

src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/IFilterSlot.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
* Just a simple marker interface for any special logic that applies to filter (ghost) slots
55
*/
66
public interface IFilterSlot {
7+
default void onItemSet(int button) {
8+
}
79
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/common/gui/StorageContainerMenuBase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ public void clicked(int slotId, int dragType, ClickType clickType, Player player
394394
}
395395

396396
slot.set(cursorStack);
397+
((IFilterSlot) slot).onItemSet(dragType);
397398
}
398399
return;
399400
} else if (isUpgradeSlot(slotId) && getSlot(slotId) instanceof StorageContainerMenuBase<?>.StorageUpgradeSlot slot) {
@@ -911,6 +912,7 @@ public void setGhostSlot(int slotNumber, ItemStack stack) {
911912
stackToSet.setCount(slot.getMaxStackSize(stackToSet));
912913
}
913914
slot.set(stackToSet);
915+
((IFilterSlot) slot).onItemSet(-1);
914916
}
915917

916918
public Optional<ItemStack> getMemorizedStackInSlot(int slotId) {

src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/recipeviewers/jei/JeiStorageGhostIngredientHandler.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.p3pp3rf1y.sophisticatedcore.common.gui.StorageContainerMenuBase;
1717
import net.p3pp3rf1y.sophisticatedcore.compat.recipeviewers.common.SetGhostSlotPayload;
1818
import net.p3pp3rf1y.sophisticatedcore.upgrades.pump.PumpUpgradeTab;
19+
import net.p3pp3rf1y.sophisticatedcore.upgrades.voiding.VoidUpgradeTab;
1920
import net.p3pp3rf1y.sophisticatedcore.util.CapabilityHelper;
2021

2122
import java.util.ArrayList;
@@ -35,7 +36,6 @@ public <I> List<Target<I>> getTargetsTyped(S gui, ITypedIngredient<I> ingredient
3536
if (!fluidStack.isEmpty()) {
3637
gui.getUpgradeSettingsControl().getOpenTab().filter(PumpUpgradeTab.Advanced.class::isInstance).map(PumpUpgradeTab.Advanced.class::cast)
3738
.ifPresent(pumpUpgradeTab -> addFluidTargets(pumpUpgradeTab, fluidStack, targets));
38-
return;
3939
}
4040
container.getOpenContainer().ifPresent(c -> c.getSlots().forEach(s -> {
4141
if (s instanceof IFilterSlot && s.mayPlace(ghostStack)) {
@@ -57,6 +57,9 @@ public void accept(I i) {
5757
gui.getUpgradeSettingsControl().getOpenTab().filter(PumpUpgradeTab.Advanced.class::isInstance).map(PumpUpgradeTab.Advanced.class::cast)
5858
.ifPresent(pumpUpgradeTab -> NeoForgeTypes.FLUID_STACK.castIngredient(ingredient.getIngredient())
5959
.ifPresent(ghostFluid -> addFluidTargets(pumpUpgradeTab, ghostFluid, targets)));
60+
gui.getUpgradeSettingsControl().getOpenTab().filter(tab -> tab instanceof VoidUpgradeTab).map(VoidUpgradeTab.class::cast)
61+
.ifPresent(voidUpgradeTab -> NeoForgeTypes.FLUID_STACK.castIngredient(ingredient.getIngredient())
62+
.ifPresent(ghostFluid -> addVoidFluidTargets(gui, voidUpgradeTab, ghostFluid, targets)));
6063
}
6164
return targets;
6265
}
@@ -81,6 +84,25 @@ public void accept(I i) {
8184
}
8285
}
8386

87+
private <I> void addVoidFluidTargets(S gui, VoidUpgradeTab voidUpgradeTab, FluidStack ghostFluid, List<Target<I>> targets) {
88+
gui.getMenu().getOpenContainer().ifPresent(container -> container.getSlots().forEach(slot -> {
89+
if (slot instanceof IFilterSlot) {
90+
int filterSlot = slot.getContainerSlot();
91+
targets.add(new Target<>() {
92+
@Override
93+
public Rect2i getArea() {
94+
return new Rect2i(gui.getGuiLeft() + slot.x, gui.getGuiTop() + slot.y, 17, 17);
95+
}
96+
97+
@Override
98+
public void accept(I i) {
99+
voidUpgradeTab.setFluidFilter(filterSlot, ghostFluid);
100+
}
101+
});
102+
}
103+
}));
104+
}
105+
84106
@Override
85107
public void onComplete() {
86108
// noop

src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/FilterLogicContainer.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,38 @@
77
import net.p3pp3rf1y.sophisticatedcore.common.gui.FilterSlotItemHandler;
88
import net.p3pp3rf1y.sophisticatedcore.common.gui.IServerUpdater;
99

10+
import java.util.function.BiConsumer;
1011
import java.util.function.Consumer;
1112
import java.util.function.Supplier;
1213

1314
public class FilterLogicContainer<T extends FilterLogic> extends FilterLogicContainerBase<T, FilterLogicContainer.FilterLogicSlot> {
1415
public FilterLogicContainer(Supplier<T> filterLogic, IServerUpdater serverUpdater, Consumer<Slot> addSlot) {
16+
this(filterLogic, serverUpdater, addSlot, (slot, button) -> {
17+
});
18+
}
19+
20+
public FilterLogicContainer(Supplier<T> filterLogic, IServerUpdater serverUpdater, Consumer<Slot> addSlot, BiConsumer<Integer, Integer> onFilterSlotSet) {
1521
super(serverUpdater, filterLogic, addSlot);
1622
ItemStacksResourceHandler filterHandler = filterLogic.get().getFilterHandler();
1723
for (int slot = 0; slot < filterHandler.size(); slot++) {
18-
FilterLogicSlot filterSlot = new FilterLogicSlot(() -> filterLogic.get().getFilterHandler(), slot);
24+
FilterLogicSlot filterSlot = new FilterLogicSlot(() -> filterLogic.get().getFilterHandler(), slot, onFilterSlotSet);
1925
addSlot.accept(filterSlot);
2026
filterSlots.add(filterSlot);
2127
}
2228
}
2329

2430
public static class FilterLogicSlot extends FilterSlotItemHandler {
2531
private boolean enabled = true;
32+
private final BiConsumer<Integer, Integer> onSet;
2633

2734
public FilterLogicSlot(Supplier<ResourceHandler<ItemResource>> filterHandler, Integer slot) {
35+
this(filterHandler, slot, (ignored, button) -> {
36+
});
37+
}
38+
39+
public FilterLogicSlot(Supplier<ResourceHandler<ItemResource>> filterHandler, Integer slot, BiConsumer<Integer, Integer> onSet) {
2840
super(filterHandler, slot, -100, -100);
41+
this.onSet = onSet;
2942
}
3043

3144
public void setEnabled(boolean enabled) {
@@ -36,5 +49,10 @@ public void setEnabled(boolean enabled) {
3649
public boolean isActive() {
3750
return enabled;
3851
}
52+
53+
@Override
54+
public void onItemSet(int button) {
55+
onSet.accept(getContainerSlot(), button);
56+
}
3957
}
4058
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/pump/FluidFilterContainer.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import net.neoforged.neoforge.fluids.FluidStack;
88
import net.neoforged.neoforge.fluids.FluidType;
99
import net.neoforged.neoforge.transfer.access.ItemAccess;
10-
import net.neoforged.neoforge.transfer.fluid.FluidResource;
1110
import net.p3pp3rf1y.sophisticatedcore.common.gui.IServerUpdater;
1211
import net.p3pp3rf1y.sophisticatedcore.util.CapabilityHelper;
1312
import net.p3pp3rf1y.sophisticatedcore.util.NBTHelper;
@@ -59,20 +58,28 @@ public int getNumberOfFluidFilters() {
5958
return fluidFilterLogic.get().getNumberOfFluidFilters();
6059
}
6160

62-
public void slotClick(int index) {
61+
public boolean slotClick(int index) {
6362
ItemStack carried = player.containerMenu.getCarried();
6463
if (carried.isEmpty()) {
6564
setFluid(index, FluidStack.EMPTY);
66-
return;
65+
return true;
66+
}
67+
68+
FluidStack containedFluid = getContainedFluid(carried);
69+
if (containedFluid.isEmpty()) {
70+
return false;
71+
}
72+
73+
setFluid(index, containedFluid);
74+
return true;
75+
}
76+
77+
public static FluidStack getContainedFluid(ItemStack stack) {
78+
if (stack.isEmpty()) {
79+
return FluidStack.EMPTY;
6780
}
6881

69-
CapabilityHelper.runOnCapability(ItemAccess.forStack(carried), Capabilities.Fluid.ITEM, itemFluidHandler -> {
70-
if (itemFluidHandler.size() > 0) {
71-
FluidResource resource = itemFluidHandler.getResource(0);
72-
if (!resource.isEmpty()) {
73-
setFluid(index, resource.toStack(FluidType.BUCKET_VOLUME));
74-
}
75-
}
76-
});
82+
return CapabilityHelper.getFromCapability(ItemAccess.forStack(stack), Capabilities.Fluid.ITEM,
83+
fluidHandler -> fluidHandler.size() > 0 ? fluidHandler.getResource(0).toStack(FluidType.BUCKET_VOLUME) : FluidStack.EMPTY, FluidStack.EMPTY);
7784
}
7885
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/pump/FluidFilterLogic.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@ public class FluidFilterLogic {
1515
private final List<FluidStack> fluidFilters;
1616
private final ItemStack upgrade;
1717
private final Consumer<ItemStack> saveHandler;
18+
private final boolean noFilterMatchesEverything;
1819
private boolean noFilter = true;
1920

2021
public FluidFilterLogic(int filterSlots, ItemStack upgrade, Consumer<ItemStack> saveHandler) {
22+
this(filterSlots, upgrade, saveHandler, true);
23+
}
24+
25+
public FluidFilterLogic(int filterSlots, ItemStack upgrade, Consumer<ItemStack> saveHandler, boolean noFilterMatchesEverything) {
2126
fluidFilters = NonNullList.withSize(filterSlots, FluidStack.EMPTY);
2227
this.upgrade = upgrade;
2328
this.saveHandler = saveHandler;
29+
this.noFilterMatchesEverything = noFilterMatchesEverything;
2430
deserializeFluidFilters();
2531
updateNoFilter();
2632
}
@@ -56,7 +62,7 @@ private boolean matchesFluidFilter(FluidResource resource) {
5662
}
5763

5864
public boolean fluidMatches(FluidStack fluid) {
59-
return noFilter || matchesFluidFilter(fluid);
65+
return noFilter ? noFilterMatchesEverything : matchesFluidFilter(fluid);
6066
}
6167

6268
private boolean matchesFluidFilter(FluidStack fluid) {
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package net.p3pp3rf1y.sophisticatedcore.upgrades.voiding;
2+
3+
import net.minecraft.client.gui.GuiGraphics;
4+
import net.minecraft.client.gui.screens.Screen;
5+
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
6+
import net.minecraft.resources.ResourceLocation;
7+
import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions;
8+
import net.neoforged.neoforge.client.textures.FluidSpriteCache;
9+
import net.neoforged.neoforge.fluids.FluidStack;
10+
import net.p3pp3rf1y.sophisticatedcore.client.gui.StorageScreenBase;
11+
import net.p3pp3rf1y.sophisticatedcore.client.gui.utils.GuiHelper;
12+
import net.p3pp3rf1y.sophisticatedcore.client.gui.utils.Position;
13+
import net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogic;
14+
import net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogicContainer;
15+
import net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogicControl;
16+
import net.p3pp3rf1y.sophisticatedcore.upgrades.PrimaryMatch;
17+
import net.p3pp3rf1y.sophisticatedcore.upgrades.pump.FluidFilterContainer;
18+
19+
import java.util.List;
20+
21+
import static net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogicControlBase.MatchButton.*;
22+
23+
public class VoidFilterLogicControl extends FilterLogicControl<FilterLogic, FilterLogicContainer<FilterLogic>> {
24+
private final FluidFilterContainer fluidFilterContainer;
25+
26+
private VoidFilterLogicControl(StorageScreenBase<?> screen, Position position, FilterLogicContainer<FilterLogic> filterLogicContainer,
27+
FluidFilterContainer fluidFilterContainer, int slotsPerRow, MatchButton... showMatchButtons) {
28+
super(screen, position, filterLogicContainer, slotsPerRow, showMatchButtons);
29+
this.fluidFilterContainer = fluidFilterContainer;
30+
}
31+
32+
@Override
33+
protected void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
34+
super.renderWidget(guiGraphics, mouseX, mouseY, partialTicks);
35+
if (container.getPrimaryMatch() == PrimaryMatch.TAGS) {
36+
return;
37+
}
38+
39+
for (int slot = 0; slot < fluidFilterContainer.getNumberOfFluidFilters(); slot++) {
40+
FluidStack fluid = fluidFilterContainer.getFluid(slot);
41+
if (!fluid.isEmpty()) {
42+
IClientFluidTypeExtensions renderProperties = IClientFluidTypeExtensions.of(fluid.getFluid());
43+
ResourceLocation texture = renderProperties.getStillTexture(fluid);
44+
TextureAtlasSprite still = FluidSpriteCache.getSprite(texture);
45+
int slotX = x + slot % slotsPerRow * 18 + 1;
46+
int slotY = y + slotsTopYOffset + slot / slotsPerRow * 18 + 1;
47+
GuiHelper.renderTiledSprite(guiGraphics, still, renderProperties.getTintColor(fluid), slotX, slotY, 16);
48+
}
49+
}
50+
}
51+
52+
@Override
53+
public void renderTooltip(Screen screen, GuiGraphics guiGraphics, int mouseX, int mouseY) {
54+
super.renderTooltip(screen, guiGraphics, mouseX, mouseY);
55+
int slot = getFilterSlot(mouseX, mouseY);
56+
if (slot >= 0) {
57+
FluidStack fluid = fluidFilterContainer.getFluid(slot);
58+
if (!fluid.isEmpty()) {
59+
GuiHelper.renderTooltip(screen, guiGraphics, List.of(fluid.getHoverName()), mouseX, mouseY);
60+
}
61+
}
62+
}
63+
64+
private int getFilterSlot(double mouseX, double mouseY) {
65+
if (container.getPrimaryMatch() == PrimaryMatch.TAGS || mouseX < x || mouseY < y + slotsTopYOffset) {
66+
return -1;
67+
}
68+
int column = (int) ((mouseX - x) / 18);
69+
int row = (int) ((mouseY - y - slotsTopYOffset) / 18);
70+
int slot = row * slotsPerRow + column;
71+
return column < 0 || column >= slotsPerRow || slot < 0 || slot >= fluidFilterContainer.getNumberOfFluidFilters() ? -1 : slot;
72+
}
73+
74+
public static class Basic extends VoidFilterLogicControl {
75+
public Basic(StorageScreenBase<?> screen, Position position, FilterLogicContainer<FilterLogic> filterLogicContainer,
76+
FluidFilterContainer fluidFilterContainer, int slotsPerRow) {
77+
super(screen, position, filterLogicContainer, fluidFilterContainer, slotsPerRow, ALLOW_LIST);
78+
}
79+
}
80+
81+
public static class Advanced extends VoidFilterLogicControl {
82+
public Advanced(StorageScreenBase<?> screen, Position position, FilterLogicContainer<FilterLogic> filterLogicContainer,
83+
FluidFilterContainer fluidFilterContainer, int slotsPerRow) {
84+
super(screen, position, filterLogicContainer, fluidFilterContainer, slotsPerRow, ALLOW_LIST, PRIMARY_MATCH, DURABILITY, NBT);
85+
}
86+
}
87+
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/upgrades/voiding/VoidUpgradeContainer.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,62 @@
22

33
import net.minecraft.nbt.CompoundTag;
44
import net.minecraft.world.entity.player.Player;
5+
import net.minecraft.world.item.ItemStack;
6+
import net.neoforged.neoforge.fluids.FluidStack;
57
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeContainerBase;
68
import net.p3pp3rf1y.sophisticatedcore.common.gui.UpgradeContainerType;
79
import net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogic;
810
import net.p3pp3rf1y.sophisticatedcore.upgrades.FilterLogicContainer;
11+
import net.p3pp3rf1y.sophisticatedcore.upgrades.pump.FluidFilterContainer;
912
import net.p3pp3rf1y.sophisticatedcore.util.NBTHelper;
1013

1114
public class VoidUpgradeContainer extends UpgradeContainerBase<VoidUpgradeWrapper, VoidUpgradeContainer> {
1215
private static final String DATA_SHOULD_WORKD_IN_GUI = "shouldWorkdInGUI";
1316
private static final String DATA_VOID_TYPE = "voidType";
1417
private final FilterLogicContainer<FilterLogic> filterLogicContainer;
18+
private final FluidFilterContainer fluidFilterContainer;
19+
private boolean syncingFilters = false;
1520

1621
public VoidUpgradeContainer(Player player, int containerId, VoidUpgradeWrapper wrapper,
1722
UpgradeContainerType<VoidUpgradeWrapper, VoidUpgradeContainer> type) {
1823
super(player, containerId, wrapper, type);
19-
filterLogicContainer = new FilterLogicContainer<>(supplyFromWrapper(VoidUpgradeWrapper::getFilterLogic), this, slots::add);
24+
fluidFilterContainer = new FluidFilterContainer(player, this, supplyFromWrapper(VoidUpgradeWrapper::getFluidFilterLogic)) {
25+
@Override
26+
public void setFluid(int index, FluidStack fluid) {
27+
super.setFluid(index, fluid);
28+
if (!syncingFilters) {
29+
syncingFilters = true;
30+
upgradeWrapper.getFilterLogic().getFilterHandler().setStackInSlot(index, ItemStack.EMPTY);
31+
syncingFilters = false;
32+
}
33+
}
34+
};
35+
filterLogicContainer = new FilterLogicContainer<>(supplyFromWrapper(VoidUpgradeWrapper::getFilterLogic), this, slots::add,
36+
(slot, button) -> clearFluidFilter(slot));
2037
}
2138

2239
@Override
2340
public void handlePacket(CompoundTag data) {
2441
data.getBoolean(DATA_SHOULD_WORKD_IN_GUI).ifPresent(this::setShouldWorkdInGUI);
2542
data.getString(DATA_VOID_TYPE).ifPresent(voidTypeName -> setVoidType(VoidType.fromName(voidTypeName)));
2643
filterLogicContainer.handlePacket(data);
44+
fluidFilterContainer.handlePacket(data);
2745
}
2846

2947
public FilterLogicContainer<FilterLogic> getFilterLogicContainer() {
3048
return filterLogicContainer;
3149
}
3250

51+
public FluidFilterContainer getFluidFilterContainer() {
52+
return fluidFilterContainer;
53+
}
54+
55+
private void clearFluidFilter(int slot) {
56+
syncingFilters = true;
57+
fluidFilterContainer.setFluid(slot, FluidStack.EMPTY);
58+
syncingFilters = false;
59+
}
60+
3361
public void setShouldWorkdInGUI(boolean shouldWorkdInGUI) {
3462
upgradeWrapper.setShouldWorkdInGUI(shouldWorkdInGUI);
3563
sendDataToServer(() -> NBTHelper.putBoolean(new CompoundTag(), DATA_SHOULD_WORKD_IN_GUI, shouldWorkdInGUI));

0 commit comments

Comments
 (0)