package tectech.thing.metaTileEntity.multi.godforge; import static gregtech.api.util.GTUtility.formatNumbers; import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap; import static gregtech.common.misc.WirelessNetworkManager.getUserEU; import static net.minecraft.util.EnumChatFormatting.GREEN; import static net.minecraft.util.EnumChatFormatting.RED; import static net.minecraft.util.EnumChatFormatting.RESET; import static net.minecraft.util.EnumChatFormatting.YELLOW; import java.math.BigInteger; import java.util.ArrayList; import net.minecraft.util.EnumChatFormatting; import org.jetbrains.annotations.NotNull; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.check.CheckRecipeResult; import gregtech.api.recipe.check.CheckRecipeResultRegistry; import gregtech.api.util.GTRecipe; import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.api.util.OverclockCalculator; import tectech.recipe.TecTechRecipeMaps; public class MTEMoltenModule extends MTEBaseModule { private long EUt = 0; private int currentParallel = 0; public MTEMoltenModule(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); } public MTEMoltenModule(String aName) { super(aName); } @Override public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { return new MTEMoltenModule(mName); } long wirelessEUt = 0; @Override protected ProcessingLogic createProcessingLogic() { return new ProcessingLogic() { @NotNull @Override protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { if (recipe.mSpecialValue > getHeat()) { return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue); } if (recipe.mEUt > getProcessingVoltage()) { return CheckRecipeResultRegistry.insufficientPower(recipe.mEUt); } wirelessEUt = (long) recipe.mEUt * getMaxParallel(); if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) { return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration); } return CheckRecipeResultRegistry.SUCCESSFUL; } @NotNull @Override protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage()) .setRecipeHeat(recipe.mSpecialValue) .setHeatOC(true) .setHeatDiscount(true) .setMachineHeat(Math.max(recipe.mSpecialValue, getHeatForOC())) .setHeatDiscountMultiplier(getHeatEnergyDiscount()) .setDurationDecreasePerOC(getOverclockTimeFactor()); } @NotNull @Override protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); } addToPowerTally( BigInteger.valueOf(calculatedEut) .multiply(BigInteger.valueOf(duration))); addToRecipeTally(calculatedParallels); currentParallel = calculatedParallels; EUt = calculatedEut; setCalculatedEut(0); return CheckRecipeResultRegistry.SUCCESSFUL; } }; } @Override protected void setProcessingLogicPower(ProcessingLogic logic) { logic.setAvailableVoltage(Long.MAX_VALUE); logic.setAvailableAmperage(Integer.MAX_VALUE); logic.setAmperageOC(false); logic.setMaxParallel(getMaxParallel()); logic.setSpeedBonus(getSpeedBonus()); logic.setEuModifier(getEnergyDiscount()); } @Override public RecipeMap getRecipeMap() { return TecTechRecipeMaps.godforgeMoltenRecipes; } @Override public String[] getInfoData() { ArrayList str = new ArrayList<>(); str.add( "Progress: " + GREEN + formatNumbers(mProgresstime / 20) + RESET + " s / " + YELLOW + formatNumbers(mMaxProgresstime / 20) + RESET + " s"); str.add( "Currently using: " + RED + (getBaseMetaTileEntity().isActive() ? formatNumbers(EUt) : "0") + RESET + " EU/t"); str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel())); str.add( YELLOW + "Current Parallel: " + RESET + (getBaseMetaTileEntity().isActive() ? formatNumbers(currentParallel) : "0")); str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat())); str.add(YELLOW + "Effective Heat Capacity: " + RESET + formatNumbers(getHeatForOC())); str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus())); str.add(YELLOW + "Energy multiplier: " + RESET + formatNumbers(getEnergyDiscount())); str.add(YELLOW + "Recipe time divisor per non-perfect OC: " + RESET + formatNumbers(getOverclockTimeFactor())); return str.toArray(new String[0]); } @Override public MultiblockTooltipBuilder createTooltip() { final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); tt.addMachineType("Blast Smelter") .addInfo("This is a module of the Godforge.") .addInfo("Must be part of a Godforge to function.") .addInfo("Used for high temperature material liquefaction.") .addSeparator(EnumChatFormatting.AQUA, 74) .addInfo("The second module of the Godforge, this module melts materials directly into") .addInfo("their liquid form. If an output material does not have a liquid form, it will be output") .addInfo("as a regular solid instead.") .addInfo("This module is specialized towards parallel processing.") .beginStructureBlock(7, 7, 13, false) .addStructureInfo( EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Singularity Reinforced Stellar Shielding Casing") .addStructureInfo( EnumChatFormatting.GOLD + "20" + EnumChatFormatting.GRAY + " Boundless Gravitationally Severed Structure Casing") .addStructureInfo( EnumChatFormatting.GOLD + "5" + EnumChatFormatting.GRAY + " Harmonic Phonon Transmission Conduit") .addStructureInfo( EnumChatFormatting.GOLD + "5" + EnumChatFormatting.GRAY + " Celestial Matter Guidance Casing") .addStructureInfo(EnumChatFormatting.GOLD + "1" + EnumChatFormatting.GRAY + " Stellar Energy Siphon Casing") .toolTipFinisher(EnumChatFormatting.AQUA, 74); return tt; } }