Skip to content
Merged
40 changes: 40 additions & 0 deletions src/main/java/supersymmetry/api/fluids/FilteredTankWidget.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package supersymmetry.api.fluids;

import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidTank;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import gregtech.api.gui.widgets.TankWidget;

public class FilteredTankWidget extends TankWidget {

public FilteredTankWidget(IFluidTank fluidTank, int x, int y, int width, int height) {
super(fluidTank, x, y, width, height);
}

@Override
@SideOnly(Side.CLIENT)
public boolean mouseClicked(int mouseX, int mouseY, int button) {
if (isMouseOverElement(mouseX, mouseY) && fluidTank instanceof IFluidHandler) {
ItemStack held = gui.entityPlayer.inventory.getItemStack();
if (!held.isEmpty()) {
IFluidHandlerItem itemHandler = held.getCapability(
CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null);
if (itemHandler != null) {
FluidStack heldFluid = itemHandler.drain(Integer.MAX_VALUE, false);
if (heldFluid != null && heldFluid.amount > 0) {
if (((IFluidHandler) fluidTank).fill(heldFluid, false) <= 0) {
return false;
}
}
}
}
}
return super.mouseClicked(mouseX, mouseY, button);
}
}
74 changes: 74 additions & 0 deletions src/main/java/supersymmetry/api/fluids/SuSyFluidTankHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package supersymmetry.api.fluids;

import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidTankProperties;

import gregtech.api.capability.impl.NotifiableFilteredFluidHandler;
import gregtech.api.metatileentity.MetaTileEntity;

public class SuSyFluidTankHandler extends NotifiableFilteredFluidHandler {

public SuSyFluidTankHandler(int capacity, MetaTileEntity entityToNotify, boolean isExport) {
super(capacity, entityToNotify, isExport);
}

@Override
public int fill(FluidStack resource, boolean doFill) {
if (resource == null || !canFillFluidType(resource)) {
return 0;
}
return super.fill(resource, doFill);
}

@Override
public boolean canFillFluidType(FluidStack fluid) {
boolean result = super.canFillFluidType(fluid);
System.out.println("[SuSyFilteredFluidTank] canFillFluidType() called with: " +
(fluid != null ? fluid.getFluid().getName() : "null") + ", result: " + result);
return result;
}

@Override
public IFluidTankProperties[] getTankProperties() {
IFluidTankProperties[] properties = super.getTankProperties();
return new IFluidTankProperties[] {
new IFluidTankProperties() {

@Override
public FluidStack getContents() {
return properties[0].getContents();
}

@Override
public int getCapacity() {
return properties[0].getCapacity();
}

@Override
public boolean canFill() {
return properties[0].canFill();
}

@Override
public boolean canDrain() {
return properties[0].canDrain();
}

@Override
public boolean canFillFluidType(FluidStack fluidStack) {
boolean result = fluidStack != null && SuSyFluidTankHandler.this.canFillFluidType(fluidStack);
System.out.println("[SuSyFilteredFluidTank] getTankProperties().canFillFluidType() with: " +
(fluidStack != null ? fluidStack.getFluid().getName() : "null") + ", result: " +
result);
return result;
}

@Override
public boolean canDrainFluidType(FluidStack fluidStack) {
return properties[0].canDrainFluidType(fluidStack);
}
}
// gross
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,11 @@ public boolean checkRecipe(@NotNull Recipe recipe) {
if (proposedEUt > getMaximumAllowedVoltage()) {
return false;
}
// Prevent recipe from starting if energy buffer is full, and we're not voiding energy
if (isFull && !voidEnergy) {
return false;
}

return sufficientFluids;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
Expand All @@ -19,20 +20,20 @@
import gregtech.api.capability.IEnergyContainer;
import gregtech.api.capability.impl.FluidTankList;
import gregtech.api.capability.impl.FuelRecipeLogic;
import gregtech.api.capability.impl.NotifiableFilteredFluidHandler;
import gregtech.api.capability.impl.NotifiableFluidTank;
import gregtech.api.gui.GuiTextures;
import gregtech.api.gui.ModularUI;
import gregtech.api.gui.widgets.ImageWidget;
import gregtech.api.gui.widgets.LabelWidget;
import gregtech.api.gui.widgets.TankWidget;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.recipes.Recipe;
import gregtech.api.recipes.RecipeMap;
import gregtech.client.renderer.ICubeRenderer;
import gregtech.common.metatileentities.electric.MetaTileEntitySingleCombustion;
import supersymmetry.api.capability.impl.SuSyFluidFilters;
import supersymmetry.api.fluids.FilteredTankWidget;
import supersymmetry.api.fluids.SuSyFluidTankHandler;
import supersymmetry.api.util.SuSyUtility;

public class SuSyMetaTileEntitySingleCombustion extends MetaTileEntitySingleCombustion {
Expand All @@ -45,8 +46,8 @@ public class SuSyMetaTileEntitySingleCombustion extends MetaTileEntitySingleComb

private boolean sufficientFluids;

private FluidTank lubricantTank;
private FluidTank coolantTank;
private SuSyFluidTankHandler lubricantTank;
private SuSyFluidTankHandler coolantTank;

private FluidTankList displayedTankList;

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

@Override
// Handle fluid imports
public NBTTagCompound writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
if (lubricantTank != null)
data.setTag("LubricantTank", lubricantTank.writeToNBT(new NBTTagCompound()));
if (coolantTank != null)
data.setTag("CoolantTank", coolantTank.writeToNBT(new NBTTagCompound()));
return data;
}

@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
if (lubricantTank != null && data.hasKey("LubricantTank"))
lubricantTank.readFromNBT(data.getCompoundTag("LubricantTank"));
if (coolantTank != null && data.hasKey("CoolantTank"))
coolantTank.readFromNBT(data.getCompoundTag("CoolantTank"));
}

@Override
protected FluidTankList createImportFluidHandler() {
if (workable == null) return new FluidTankList(false);
FluidTank[] fluidImports = new FluidTank[workable.getRecipeMap().getMaxFluidInputs() + 2];

// Only recipe fluid inputs go here — no lubricant/coolant
FluidTank[] fluidImports = new FluidTank[workable.getRecipeMap().getMaxFluidInputs()];
FluidTank[] displayedTanks = new FluidTank[workable.getRecipeMap().getMaxFluidInputs()];
for (int i = 0; i < fluidImports.length - 2; i++) {
NotifiableFluidTank filteredFluidHandler = new NotifiableFluidTank(
for (int i = 0; i < fluidImports.length; i++) {
NotifiableFluidTank tank = new NotifiableFluidTank(
this.getTankScalingFunction().apply(this.getTier()), this, false);
fluidImports[i] = filteredFluidHandler;
displayedTanks[i] = filteredFluidHandler;
fluidImports[i] = tank;
displayedTanks[i] = tank;
}

this.lubricantTank = new NotifiableFilteredFluidHandler(1000, this, false)
// Lubricant/coolant tanks are standalone — NOT part of the import handler
this.lubricantTank = (SuSyFluidTankHandler) new SuSyFluidTankHandler(1000, this, false)
.setFilter(SuSyFluidFilters.LUBRICANT);
fluidImports[fluidImports.length - 2] = lubricantTank;

this.coolantTank = new NotifiableFilteredFluidHandler(1000, this, false).setFilter(SuSyFluidFilters.COOLANT);
fluidImports[fluidImports.length - 1] = coolantTank;
this.coolantTank = (SuSyFluidTankHandler) new SuSyFluidTankHandler(1000, this, false)
.setFilter(SuSyFluidFilters.COOLANT);

this.displayedTankList = new FluidTankList(false, displayedTanks);
return new FluidTankList(false, fluidImports);
Expand All @@ -97,7 +117,7 @@ public void update() {
super.update();
if (!getWorld().isRemote) {
updateSufficientFluids();
isFull = energyContainer.getEnergyStored() - energyContainer.getEnergyCapacity() == 0;
isFull = energyContainer.getEnergyStored() >= energyContainer.getEnergyCapacity();

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

builder.widget(new TankWidget(lubricantTank, 110, 21, 10, 54)
builder.widget(new FilteredTankWidget(lubricantTank, 110, 21, 10, 54)
.setBackgroundTexture(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(true))
.setAlwaysShowFull(false)
.setContainerClicking(true, true)); // Enable container clicking
builder.widget(new TankWidget(coolantTank, 124, 21, 10, 54)
.setContainerClicking(true, true)); // both directions, filter guards filling
builder.widget(new FilteredTankWidget(coolantTank, 124, 21, 10, 54)
.setBackgroundTexture(GuiTextures.PROGRESS_BAR_BOILER_EMPTY.get(true))
.setAlwaysShowFull(false)
.setContainerClicking(true, true)); // Enable container clicking
.setContainerClicking(true, true));
builder.widget(new ImageWidget(152, 63 + yOffset, 17, 17,
GTValues.XMAS.get() ? GuiTextures.GREGTECH_LOGO_XMAS : GuiTextures.GREGTECH_LOGO)
.setIgnoreColor(true));
Expand All @@ -169,12 +189,12 @@ public CombustionRecipeLogic(SuSyMetaTileEntitySingleCombustion metaTileEntity,

@Override
public boolean checkRecipe(@NotNull Recipe recipe) {
return sufficientFluids;
return sufficientFluids && !isFull;
}

@Override
public boolean isWorking() {
return sufficientFluids && super.isWorking();
return sufficientFluids && !isFull && super.isWorking();
}

@Override
Expand Down
Loading