Skip to content

Commit d575521

Browse files
authored
Merge pull request #618
Stop Singleblock Combustion Generators From Destroying Incorrect Fluid On Manual Import
2 parents afb5532 + af32745 commit d575521

File tree

4 files changed

+161
-22
lines changed

4 files changed

+161
-22
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package supersymmetry.api.fluids;
2+
3+
import net.minecraft.item.ItemStack;
4+
import net.minecraftforge.fluids.FluidStack;
5+
import net.minecraftforge.fluids.IFluidTank;
6+
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
7+
import net.minecraftforge.fluids.capability.IFluidHandler;
8+
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
9+
import net.minecraftforge.fml.relauncher.Side;
10+
import net.minecraftforge.fml.relauncher.SideOnly;
11+
12+
import gregtech.api.gui.widgets.TankWidget;
13+
14+
public class FilteredTankWidget extends TankWidget {
15+
16+
public FilteredTankWidget(IFluidTank fluidTank, int x, int y, int width, int height) {
17+
super(fluidTank, x, y, width, height);
18+
}
19+
20+
@Override
21+
@SideOnly(Side.CLIENT)
22+
public boolean mouseClicked(int mouseX, int mouseY, int button) {
23+
if (isMouseOverElement(mouseX, mouseY) && fluidTank instanceof IFluidHandler) {
24+
ItemStack held = gui.entityPlayer.inventory.getItemStack();
25+
if (!held.isEmpty()) {
26+
IFluidHandlerItem itemHandler = held.getCapability(
27+
CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null);
28+
if (itemHandler != null) {
29+
FluidStack heldFluid = itemHandler.drain(Integer.MAX_VALUE, false);
30+
if (heldFluid != null && heldFluid.amount > 0) {
31+
if (((IFluidHandler) fluidTank).fill(heldFluid, false) <= 0) {
32+
return false;
33+
}
34+
}
35+
}
36+
}
37+
}
38+
return super.mouseClicked(mouseX, mouseY, button);
39+
}
40+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package supersymmetry.api.fluids;
2+
3+
import net.minecraftforge.fluids.FluidStack;
4+
import net.minecraftforge.fluids.capability.IFluidTankProperties;
5+
6+
import gregtech.api.capability.impl.NotifiableFilteredFluidHandler;
7+
import gregtech.api.metatileentity.MetaTileEntity;
8+
9+
public class SuSyFluidTankHandler extends NotifiableFilteredFluidHandler {
10+
11+
public SuSyFluidTankHandler(int capacity, MetaTileEntity entityToNotify, boolean isExport) {
12+
super(capacity, entityToNotify, isExport);
13+
}
14+
15+
@Override
16+
public int fill(FluidStack resource, boolean doFill) {
17+
if (resource == null || !canFillFluidType(resource)) {
18+
return 0;
19+
}
20+
return super.fill(resource, doFill);
21+
}
22+
23+
@Override
24+
public boolean canFillFluidType(FluidStack fluid) {
25+
boolean result = super.canFillFluidType(fluid);
26+
System.out.println("[SuSyFilteredFluidTank] canFillFluidType() called with: " +
27+
(fluid != null ? fluid.getFluid().getName() : "null") + ", result: " + result);
28+
return result;
29+
}
30+
31+
@Override
32+
public IFluidTankProperties[] getTankProperties() {
33+
IFluidTankProperties[] properties = super.getTankProperties();
34+
return new IFluidTankProperties[] {
35+
new IFluidTankProperties() {
36+
37+
@Override
38+
public FluidStack getContents() {
39+
return properties[0].getContents();
40+
}
41+
42+
@Override
43+
public int getCapacity() {
44+
return properties[0].getCapacity();
45+
}
46+
47+
@Override
48+
public boolean canFill() {
49+
return properties[0].canFill();
50+
}
51+
52+
@Override
53+
public boolean canDrain() {
54+
return properties[0].canDrain();
55+
}
56+
57+
@Override
58+
public boolean canFillFluidType(FluidStack fluidStack) {
59+
boolean result = fluidStack != null && SuSyFluidTankHandler.this.canFillFluidType(fluidStack);
60+
System.out.println("[SuSyFilteredFluidTank] getTankProperties().canFillFluidType() with: " +
61+
(fluidStack != null ? fluidStack.getFluid().getName() : "null") + ", result: " +
62+
result);
63+
return result;
64+
}
65+
66+
@Override
67+
public boolean canDrainFluidType(FluidStack fluidStack) {
68+
return properties[0].canDrainFluidType(fluidStack);
69+
}
70+
}
71+
// gross
72+
};
73+
}
74+
}

src/main/java/supersymmetry/common/metatileentities/multi/electric/RotationGeneratorController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@ public boolean checkRecipe(@NotNull Recipe recipe) {
194194
if (proposedEUt > getMaximumAllowedVoltage()) {
195195
return false;
196196
}
197+
// Prevent recipe from starting if energy buffer is full, and we're not voiding energy
198+
if (isFull && !voidEnergy) {
199+
return false;
200+
}
201+
197202
return sufficientFluids;
198203
}
199204

src/main/java/supersymmetry/common/metatileentities/single/electric/SuSyMetaTileEntitySingleCombustion.java

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import net.minecraft.client.resources.I18n;
88
import net.minecraft.entity.player.EntityPlayer;
99
import net.minecraft.item.ItemStack;
10+
import net.minecraft.nbt.NBTTagCompound;
1011
import net.minecraft.util.ResourceLocation;
1112
import net.minecraft.world.World;
1213
import net.minecraftforge.fluids.FluidStack;
@@ -19,20 +20,20 @@
1920
import gregtech.api.capability.IEnergyContainer;
2021
import gregtech.api.capability.impl.FluidTankList;
2122
import gregtech.api.capability.impl.FuelRecipeLogic;
22-
import gregtech.api.capability.impl.NotifiableFilteredFluidHandler;
2323
import gregtech.api.capability.impl.NotifiableFluidTank;
2424
import gregtech.api.gui.GuiTextures;
2525
import gregtech.api.gui.ModularUI;
2626
import gregtech.api.gui.widgets.ImageWidget;
2727
import gregtech.api.gui.widgets.LabelWidget;
28-
import gregtech.api.gui.widgets.TankWidget;
2928
import gregtech.api.metatileentity.MetaTileEntity;
3029
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
3130
import gregtech.api.recipes.Recipe;
3231
import gregtech.api.recipes.RecipeMap;
3332
import gregtech.client.renderer.ICubeRenderer;
3433
import gregtech.common.metatileentities.electric.MetaTileEntitySingleCombustion;
3534
import supersymmetry.api.capability.impl.SuSyFluidFilters;
35+
import supersymmetry.api.fluids.FilteredTankWidget;
36+
import supersymmetry.api.fluids.SuSyFluidTankHandler;
3637
import supersymmetry.api.util.SuSyUtility;
3738

3839
public class SuSyMetaTileEntitySingleCombustion extends MetaTileEntitySingleCombustion {
@@ -45,8 +46,8 @@ public class SuSyMetaTileEntitySingleCombustion extends MetaTileEntitySingleComb
4546

4647
private boolean sufficientFluids;
4748

48-
private FluidTank lubricantTank;
49-
private FluidTank coolantTank;
49+
private SuSyFluidTankHandler lubricantTank;
50+
private SuSyFluidTankHandler coolantTank;
5051

5152
private FluidTankList displayedTankList;
5253

@@ -63,24 +64,43 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
6364
}
6465

6566
@Override
66-
// Handle fluid imports
67+
public NBTTagCompound writeToNBT(NBTTagCompound data) {
68+
super.writeToNBT(data);
69+
if (lubricantTank != null)
70+
data.setTag("LubricantTank", lubricantTank.writeToNBT(new NBTTagCompound()));
71+
if (coolantTank != null)
72+
data.setTag("CoolantTank", coolantTank.writeToNBT(new NBTTagCompound()));
73+
return data;
74+
}
75+
76+
@Override
77+
public void readFromNBT(NBTTagCompound data) {
78+
super.readFromNBT(data);
79+
if (lubricantTank != null && data.hasKey("LubricantTank"))
80+
lubricantTank.readFromNBT(data.getCompoundTag("LubricantTank"));
81+
if (coolantTank != null && data.hasKey("CoolantTank"))
82+
coolantTank.readFromNBT(data.getCompoundTag("CoolantTank"));
83+
}
84+
85+
@Override
6786
protected FluidTankList createImportFluidHandler() {
6887
if (workable == null) return new FluidTankList(false);
69-
FluidTank[] fluidImports = new FluidTank[workable.getRecipeMap().getMaxFluidInputs() + 2];
88+
89+
// Only recipe fluid inputs go here — no lubricant/coolant
90+
FluidTank[] fluidImports = new FluidTank[workable.getRecipeMap().getMaxFluidInputs()];
7091
FluidTank[] displayedTanks = new FluidTank[workable.getRecipeMap().getMaxFluidInputs()];
71-
for (int i = 0; i < fluidImports.length - 2; i++) {
72-
NotifiableFluidTank filteredFluidHandler = new NotifiableFluidTank(
92+
for (int i = 0; i < fluidImports.length; i++) {
93+
NotifiableFluidTank tank = new NotifiableFluidTank(
7394
this.getTankScalingFunction().apply(this.getTier()), this, false);
74-
fluidImports[i] = filteredFluidHandler;
75-
displayedTanks[i] = filteredFluidHandler;
95+
fluidImports[i] = tank;
96+
displayedTanks[i] = tank;
7697
}
7798

78-
this.lubricantTank = new NotifiableFilteredFluidHandler(1000, this, false)
99+
// Lubricant/coolant tanks are standalone — NOT part of the import handler
100+
this.lubricantTank = (SuSyFluidTankHandler) new SuSyFluidTankHandler(1000, this, false)
79101
.setFilter(SuSyFluidFilters.LUBRICANT);
80-
fluidImports[fluidImports.length - 2] = lubricantTank;
81-
82-
this.coolantTank = new NotifiableFilteredFluidHandler(1000, this, false).setFilter(SuSyFluidFilters.COOLANT);
83-
fluidImports[fluidImports.length - 1] = coolantTank;
102+
this.coolantTank = (SuSyFluidTankHandler) new SuSyFluidTankHandler(1000, this, false)
103+
.setFilter(SuSyFluidFilters.COOLANT);
84104

85105
this.displayedTankList = new FluidTankList(false, displayedTanks);
86106
return new FluidTankList(false, fluidImports);
@@ -97,7 +117,7 @@ public void update() {
97117
super.update();
98118
if (!getWorld().isRemote) {
99119
updateSufficientFluids();
100-
isFull = energyContainer.getEnergyStored() - energyContainer.getEnergyCapacity() == 0;
120+
isFull = energyContainer.getEnergyStored() >= energyContainer.getEnergyCapacity();
101121

102122
if (workable.isWorking() && !isFull) workCounter += 1;
103123
if (workCounter == 600) {
@@ -138,14 +158,14 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) {
138158
builder.widget(new LabelWidget(6, 6, getMetaFullName()))
139159
.bindPlayerInventory(player.inventory, GuiTextures.SLOT, yOffset);
140160

141-
builder.widget(new TankWidget(lubricantTank, 110, 21, 10, 54)
161+
builder.widget(new FilteredTankWidget(lubricantTank, 110, 21, 10, 54)
142162
.setBackgroundTexture(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(true))
143163
.setAlwaysShowFull(false)
144-
.setContainerClicking(true, true)); // Enable container clicking
145-
builder.widget(new TankWidget(coolantTank, 124, 21, 10, 54)
164+
.setContainerClicking(true, true)); // both directions, filter guards filling
165+
builder.widget(new FilteredTankWidget(coolantTank, 124, 21, 10, 54)
146166
.setBackgroundTexture(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(true))
147167
.setAlwaysShowFull(false)
148-
.setContainerClicking(true, true)); // Enable container clicking
168+
.setContainerClicking(true, true));
149169
builder.widget(new ImageWidget(152, 63 + yOffset, 17, 17,
150170
GTValues.XMAS.get() ? GuiTextures.GREGTECH_LOGO_XMAS : GuiTextures.GREGTECH_LOGO)
151171
.setIgnoreColor(true));
@@ -169,12 +189,12 @@ public CombustionRecipeLogic(SuSyMetaTileEntitySingleCombustion metaTileEntity,
169189

170190
@Override
171191
public boolean checkRecipe(@NotNull Recipe recipe) {
172-
return sufficientFluids;
192+
return sufficientFluids && !isFull;
173193
}
174194

175195
@Override
176196
public boolean isWorking() {
177-
return sufficientFluids && super.isWorking();
197+
return sufficientFluids && !isFull && super.isWorking();
178198
}
179199

180200
@Override

0 commit comments

Comments
 (0)