diff --git a/src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleEnergyContainerList.java b/src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleEnergyContainerList.java new file mode 100644 index 00000000..2ff19953 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/gregtech/mixinhelper/AccessibleEnergyContainerList.java @@ -0,0 +1,8 @@ +package com.nomiceu.nomilabs.gregtech.mixinhelper; + +public interface AccessibleEnergyContainerList { + /** + * The total amperage of all the containers with the highest input voltage. + */ + long getTotalHighestInputAmperage(); +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/EnergyContainerListMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/EnergyContainerListMixin.java new file mode 100644 index 00000000..5bf8bc56 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/EnergyContainerListMixin.java @@ -0,0 +1,41 @@ +package com.nomiceu.nomilabs.mixin.gregtech; + +import com.nomiceu.nomilabs.gregtech.mixinhelper.AccessibleEnergyContainerList; +import gregtech.api.capability.IEnergyContainer; +import gregtech.api.capability.impl.EnergyContainerList; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(value = EnergyContainerList.class, remap = false) +public class EnergyContainerListMixin implements AccessibleEnergyContainerList { + @Shadow + @Final + private long highestInputVoltage; + + /** + * The total amperage of all the containers with the highest input voltage. + */ + @Unique + private long totalHighestInputAmperage = 0; + + @Inject(method = "", at = @At("TAIL")) + public void initTotalHighestInputAmp(List energyContainerList, CallbackInfo ci) { + for (IEnergyContainer container : energyContainerList) { + if (container.getInputVoltage() == highestInputVoltage) { + totalHighestInputAmperage += container.getInputAmperage(); + } + } + } + + @Override + public long getTotalHighestInputAmperage() { + return totalHighestInputAmperage; + } +} diff --git a/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/MultiblockRecipeLogicMixin.java b/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/MultiblockRecipeLogicMixin.java new file mode 100644 index 00000000..2bce2698 --- /dev/null +++ b/src/main/java/com/nomiceu/nomilabs/mixin/gregtech/MultiblockRecipeLogicMixin.java @@ -0,0 +1,52 @@ +package com.nomiceu.nomilabs.mixin.gregtech; + +import com.nomiceu.nomilabs.gregtech.mixinhelper.AccessibleEnergyContainerList; +import gregtech.api.GTValues; +import gregtech.api.capability.IEnergyContainer; +import gregtech.api.capability.impl.AbstractRecipeLogic; +import gregtech.api.capability.impl.EnergyContainerList; +import gregtech.api.capability.impl.MultiblockRecipeLogic; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.recipes.RecipeMap; +import gregtech.api.util.GTUtility; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = MultiblockRecipeLogic.class, remap = false) +public abstract class MultiblockRecipeLogicMixin extends AbstractRecipeLogic { + @Shadow public abstract IEnergyContainer getEnergyContainer(); + + /** + * Default Ignored Constructor + */ + public MultiblockRecipeLogicMixin(MetaTileEntity tileEntity, RecipeMap recipeMap) { + super(tileEntity, recipeMap); + } + + @Inject(method = "getMaxVoltage", at = @At("HEAD"), cancellable = true) + public void getCorrectMaxVoltage(CallbackInfoReturnable cir) { + if (!consumesEnergy()) return; + + IEnergyContainer energyContainer = getEnergyContainer(); + if (energyContainer instanceof EnergyContainerList energyList) { + long highestVoltage = energyList.getHighestInputVoltage(); + if (energyList.getNumHighestInputContainers() > 1) { + // allow tier + 1 if there are multiple hatches present at the highest tier + int tier = GTUtility.getTierByVoltage(highestVoltage); + cir.setReturnValue(GTValues.V[Math.min(tier + 1, GTValues.MAX)]); + } else { + var amp = ((AccessibleEnergyContainerList) energyList).getTotalHighestInputAmperage(); + if (amp >= 4) highestVoltage = highestVoltage * 4; + cir.setReturnValue(highestVoltage); + } + } else { + var amp = energyContainer.getInputAmperage(); + var voltage = energyContainer.getInputVoltage(); + if (amp >= 4) voltage = voltage * 4; + cir.setReturnValue(voltage); + } + } +} diff --git a/src/main/resources/mixins.nomilabs.gregtech.json b/src/main/resources/mixins.nomilabs.gregtech.json index 83cb3530..be580ec2 100644 --- a/src/main/resources/mixins.nomilabs.gregtech.json +++ b/src/main/resources/mixins.nomilabs.gregtech.json @@ -7,12 +7,14 @@ "mixins": [ "AccessibleDecompositionRecipeHandler", "AccessibleMaterialInfo", + "EnergyContainerListMixin", "FluidStorageKeyMixin", "GTRecipeWrapperMixin", "MaterialFlagsMixin", "MaterialMixin", "MaterialStackMixin", "MetaItemsMixin", + "MultiblockRecipeLogicMixin", "RecipeBuilderMixin", "RecipeMapMixin", "VirtualizedRecipeMapMixin"