diff --git a/src/main/java/supersymmetry/api/fluids/FilteredTankWidget.java b/src/main/java/supersymmetry/api/fluids/FilteredTankWidget.java new file mode 100644 index 000000000..2a605c84b --- /dev/null +++ b/src/main/java/supersymmetry/api/fluids/FilteredTankWidget.java @@ -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); + } +} diff --git a/src/main/java/supersymmetry/api/fluids/SuSyFluidTankHandler.java b/src/main/java/supersymmetry/api/fluids/SuSyFluidTankHandler.java new file mode 100644 index 000000000..e4ffe0e9c --- /dev/null +++ b/src/main/java/supersymmetry/api/fluids/SuSyFluidTankHandler.java @@ -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 + }; + } +} diff --git a/src/main/java/supersymmetry/common/metatileentities/multi/electric/RotationGeneratorController.java b/src/main/java/supersymmetry/common/metatileentities/multi/electric/RotationGeneratorController.java index 87c6d8dcd..606c36df9 100644 --- a/src/main/java/supersymmetry/common/metatileentities/multi/electric/RotationGeneratorController.java +++ b/src/main/java/supersymmetry/common/metatileentities/multi/electric/RotationGeneratorController.java @@ -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; } diff --git a/src/main/java/supersymmetry/common/metatileentities/single/electric/SuSyMetaTileEntitySingleCombustion.java b/src/main/java/supersymmetry/common/metatileentities/single/electric/SuSyMetaTileEntitySingleCombustion.java index d117ab133..b0f90fd08 100644 --- a/src/main/java/supersymmetry/common/metatileentities/single/electric/SuSyMetaTileEntitySingleCombustion.java +++ b/src/main/java/supersymmetry/common/metatileentities/single/electric/SuSyMetaTileEntitySingleCombustion.java @@ -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; @@ -19,13 +20,11 @@ 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; @@ -33,6 +32,8 @@ 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 { @@ -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; @@ -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); @@ -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) { @@ -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)); @@ -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