2025-11-17 22:19:49 +01:00

108 lines
3.4 KiB
Java

package com.hbm.module.machine;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.recipes.FusionRecipes;
import com.hbm.inventory.recipes.loader.GenericRecipe;
import com.hbm.inventory.recipes.loader.GenericRecipes;
import api.hbm.energymk2.IEnergyHandlerMK2;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
public class ModuleMachineFusion extends ModuleMachineBase {
public double processSpeed = 1D;
public double bonusSpeed = 0D;
public double bonus;
public ModuleMachineFusion(int index, IEnergyHandlerMK2 battery, ItemStack[] slots) {
super(index, battery, slots);
this.inputSlots = new int[0];
this.outputSlots = new int[1];
this.inputTanks = new FluidTank[3];
this.outputTanks = new FluidTank[1];
}
@Override
public GenericRecipes getRecipeSet() {
return FusionRecipes.INSTANCE;
}
public ModuleMachineFusion itemOutput(int slot) { outputSlots[0] = slot; return this; }
public ModuleMachineFusion fluidInput(FluidTank a, FluidTank b, FluidTank c) { inputTanks[0] = a; inputTanks[1] = b; inputTanks[2] = c; return this; }
public ModuleMachineFusion fluidOutput(FluidTank a) { outputTanks[0] = a; return this; }
// setup needs to run before update, used to keep track of things that ModuleMachineBase doesn't handle
public void preUpdate(double processSpeed, double bonusSpeed) {
this.processSpeed = processSpeed;
this.bonusSpeed = bonusSpeed;
}
@Override
protected boolean hasInput(GenericRecipe recipe) {
if(processSpeed <= 0) return false;
if(recipe.inputFluid != null) {
for(int i = 0; i < Math.min(recipe.inputFluid.length, inputTanks.length); i++) {
if(inputTanks[i].getFill() > 0 && inputTanks[i].getFill() < (int) Math.ceil(recipe.inputFluid[i].fill * processSpeed)) return false;
}
}
return true;
}
@Override
public void process(GenericRecipe recipe, double speed, double power) {
this.battery.setPower(this.battery.getPower() - (long) Math.ceil((power == 1 ? recipe.power : (long) (recipe.power * power)) * processSpeed));
double step = Math.min(speed / recipe.duration * processSpeed, 1D); // can't do more than one recipe per tick, might look into that later
this.progress += step;
this.bonus += step * this.bonusSpeed;
this.bonus = Math.min(this.bonus, 1.5D); // bonus might not be used immediately in rare circumstances, allow 50% buffer
// fusion reactor is the only machine as of now that consumes input while not having finished the output
if(recipe.inputFluid != null) {
for(int i = 0; i < Math.min(recipe.inputFluid.length, inputTanks.length); i++) {
inputTanks[i].setFill(inputTanks[i].getFill() - (int) Math.ceil(recipe.inputFluid[i].fill * processSpeed));
}
}
if(this.progress >= 1D) {
produceItem(recipe);
if(this.canProcess(recipe, speed, power)) this.progress -= 1D;
else this.progress = 0D;
}
if(this.bonus >= 1D && this.canFitOutput(recipe)) {
produceItem(recipe);
this.bonus -= 1D;
}
}
@Override
public void serialize(ByteBuf buf) {
super.serialize(buf);
buf.writeDouble(bonus);
}
@Override
public void deserialize(ByteBuf buf) {
super.deserialize(buf);
this.bonus = buf.readDouble();
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.bonus = nbt.getDouble("bonus" + index);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setDouble("bonus" + index, bonus);
}
}