package tectech.thing.metaTileEntity.multi.godforge; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; 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 static net.minecraft.util.StatCollector.translateToLocal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import org.jetbrains.annotations.NotNull; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.UITexture; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; import com.gtnewhorizons.modularui.api.widget.Widget; import com.gtnewhorizons.modularui.common.widget.ButtonWidget; import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; 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.RecipeMaps; 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.TecTech; import tectech.thing.gui.TecTechUITextures; public class MTESmeltingModule extends MTEBaseModule { private long EUt = 0; private long currentParallel = 0; private boolean furnaceMode = false; public MTESmeltingModule(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); } public MTESmeltingModule(String aName) { super(aName); } @Override public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { return new MTESmeltingModule(mName); } @Override public RecipeMap getRecipeMap() { return furnaceMode ? RecipeMaps.furnaceRecipes : RecipeMaps.blastFurnaceRecipes; } @NotNull @Override public Collection> getAvailableRecipeMaps() { return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes); } @Override public int getRecipeCatalystPriority() { return -10; } 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 CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) { if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) { return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration); } addToPowerTally( BigInteger.valueOf(calculatedEut) .multiply(BigInteger.valueOf(duration))); if (!furnaceMode) { addToRecipeTally(calculatedParallels); } currentParallel = calculatedParallels; EUt = calculatedEut; setCalculatedEut(0); 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()); } }; } @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 void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) { super.addUIWidgets(builder, buildContext); builder.widget(createFurnaceModeButton(builder)); } protected ButtonWidget createFurnaceModeButton(IWidgetBuilder builder) { Widget button = new ButtonWidget().setOnClick((clickData, widget) -> { TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); furnaceMode = !furnaceMode; widget.notifyTooltipChange(); }) .setPlayClickSound(false) .setBackground(() -> { List ret = new ArrayList<>(); ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); if (isFurnaceModeOn()) { ret.add(TecTechUITextures.OVERLAY_BUTTON_FURNACE_MODE); } else { ret.add(TecTechUITextures.OVERLAY_BUTTON_FURNACE_MODE_OFF); } return ret.toArray(new IDrawable[0]); }) .attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isFurnaceModeOn, this::setFurnaceMode), builder) .dynamicTooltip( () -> Collections.singletonList( translateToLocal( furnaceMode ? "fog.button.furnacemode.tooltip.02" : "fog.button.furnacemode.tooltip.01"))) .setTooltipShowUpDelay(TOOLTIP_DELAY) .setPos(174, 91) .setSize(16, 16); return (ButtonWidget) button; } private boolean isFurnaceModeOn() { return furnaceMode; } private void setFurnaceMode(boolean enabled) { furnaceMode = enabled; } @Override public void saveNBTData(NBTTagCompound NBT) { NBT.setBoolean("furnaceMode", furnaceMode); super.saveNBTData(NBT); } @Override public void loadNBTData(final NBTTagCompound NBT) { furnaceMode = NBT.getBoolean("furnaceMode"); super.loadNBTData(NBT); } @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 Furnace, Furnace") .addInfo("This is a module of the Godforge.") .addInfo("Must be part of a Godforge to function.") .addInfo("Used for basic smelting operations at various temperatures.") .addSeparator(EnumChatFormatting.AQUA, 74) .addInfo("As the first of the Godforge modules, this module performs the most basic") .addInfo("thermal processing, namely smelting materials identically to a furnace or blast furnace.") .addInfo("The desired method of processing can be selected in the gui.") .addInfo("This module is specialized towards speed and high heat levels.") .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 + " Hypogen Coil Block") .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; } }