diff options
author | Maya <10861407+serenibyss@users.noreply.github.com> | 2024-10-03 17:14:28 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-03 22:14:28 +0000 |
commit | e16f7ac07662fc1c1d9dc169620acaec062ef939 (patch) | |
tree | c8ca20bc922caca89edcc1ca65e92be414c7f9a4 /src/main/java/tectech/thing | |
parent | 2f5a7889650e0fcaf8c95e95b37737af82a40798 (diff) | |
download | GT5-Unofficial-e16f7ac07662fc1c1d9dc169620acaec062ef939.tar.gz GT5-Unofficial-e16f7ac07662fc1c1d9dc169620acaec062ef939.tar.bz2 GT5-Unofficial-e16f7ac07662fc1c1d9dc169620acaec062ef939.zip |
Godforge encore (#3213)
Co-authored-by: GDCloud <gdcloudstrike@gmail.com>
Diffstat (limited to 'src/main/java/tectech/thing')
8 files changed, 787 insertions, 259 deletions
diff --git a/src/main/java/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/tectech/thing/block/RenderForgeOfGods.java index a911ab378f..498db3b9ed 100644 --- a/src/main/java/tectech/thing/block/RenderForgeOfGods.java +++ b/src/main/java/tectech/thing/block/RenderForgeOfGods.java @@ -429,6 +429,10 @@ public class RenderForgeOfGods extends TileEntitySpecialRenderer { long millis = System.currentTimeMillis() % (1000 * 36000); float timer = millis / (50f); // to ticks + if (forgeTile.getRainbowMode()) { + forgeTile.incrementRainbowColors(); + } + RenderEntireStar(forgeTile, x, y, z, timer); RenderRings(forgeTile, x, y, z, timer); diff --git a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java index dfe4bab143..49ab89de2b 100644 --- a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java +++ b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java @@ -17,6 +17,10 @@ public class TileEntityForgeOfGods extends TileEntity { private int ringCount = 1; private float colorR = .7f, colorG = .8f, colorB = 1f, gamma = 3f; private float rotAngle = 0, rotAxisX = 1, rotAxisY = 0, rotAxisZ = 0; + private int rainbowR = 255, rainbowG = 0, rainbowB = 0; + private int rainbowState = 0; + private boolean rainbowMode = false; + private int rainbowCycleSpeed = 1; private static final String NBT_TAG = "FOG:"; private static final String ROTATION_SPEED_NBT_TAG = NBT_TAG + "ROTATION"; @@ -30,6 +34,8 @@ public class TileEntityForgeOfGods extends TileEntity { private static final String ROT_AXIS_X_NBT_TAG = NBT_TAG + "ROT_AXIS_X"; private static final String ROT_AXIS_Y_NBT_TAG = NBT_TAG + "ROT_AXIS_Y"; private static final String ROT_AXIS_Z_NBT_TAG = NBT_TAG + "ROT_AXIS_Z"; + private static final String RAINBOW_MODE_NBT_TAG = NBT_TAG + "RAINBOW_MODE"; + private static final String RAINBOW_MODE_CYCLE_SPEED_NBT_TAG = NBT_TAG + "RAINBOW_MODE_CYCLE_SPEED"; public static final float BACK_PLATE_DISTANCE = -121.5f, BACK_PLATE_RADIUS = 13f; @@ -60,15 +66,15 @@ public class TileEntityForgeOfGods extends TileEntity { } public float getColorR() { - return colorR; + return rainbowMode ? rainbowR / 255f : colorR; } public float getColorG() { - return colorG; + return rainbowMode ? rainbowG / 255f : colorG; } public float getColorB() { - return colorB; + return rainbowMode ? rainbowB / 255f : colorB; } public float getGamma() { @@ -86,6 +92,15 @@ public class TileEntityForgeOfGods extends TileEntity { this.gamma = gamma; } + public void setRainbowMode(boolean state, int cycleSpeed) { + this.rainbowMode = state; + this.rainbowCycleSpeed = cycleSpeed; + } + + public boolean getRainbowMode() { + return rainbowMode; + } + public int getRingCount() { return ringCount; } @@ -157,6 +172,51 @@ public class TileEntityForgeOfGods extends TileEntity { return y0 + ((x - x0) * (y1 - y0)) / (x1 - x0); } + public void incrementRainbowColors() { + if (rainbowState == 0) { + rainbowG += rainbowCycleSpeed; + if (rainbowG >= 255) { + rainbowG = 255; + rainbowState = 1; + } + } + if (rainbowState == 1) { + rainbowR -= rainbowCycleSpeed; + if (rainbowR <= 0) { + rainbowR = 0; + rainbowState = 2; + } + } + if (rainbowState == 2) { + rainbowB += rainbowCycleSpeed; + if (rainbowB >= 255) { + rainbowB = 255; + rainbowState = 3; + } + } + if (rainbowState == 3) { + rainbowG -= rainbowCycleSpeed; + if (rainbowG <= 0) { + rainbowG = 0; + rainbowState = 4; + } + } + if (rainbowState == 4) { + rainbowR += rainbowCycleSpeed; + if (rainbowR >= 255) { + rainbowR = 255; + rainbowState = 5; + } + } + if (rainbowState == 5) { + rainbowB -= rainbowCycleSpeed; + if (rainbowB <= 0) { + rainbowB = 0; + rainbowState = 0; + } + } + } + @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); @@ -171,6 +231,8 @@ public class TileEntityForgeOfGods extends TileEntity { compound.setFloat(ROT_AXIS_X_NBT_TAG, rotAxisX); compound.setFloat(ROT_AXIS_Y_NBT_TAG, rotAxisY); compound.setFloat(ROT_AXIS_Z_NBT_TAG, rotAxisZ); + compound.setBoolean(RAINBOW_MODE_NBT_TAG, rainbowMode); + compound.setInteger(RAINBOW_MODE_CYCLE_SPEED_NBT_TAG, rainbowCycleSpeed); } @Override @@ -190,6 +252,8 @@ public class TileEntityForgeOfGods extends TileEntity { rotAxisX = compound.getFloat(ROT_AXIS_X_NBT_TAG); rotAxisY = compound.getFloat(ROT_AXIS_Y_NBT_TAG); rotAxisZ = compound.getFloat(ROT_AXIS_Z_NBT_TAG); + rainbowMode = compound.getBoolean(RAINBOW_MODE_NBT_TAG); + rainbowCycleSpeed = compound.getInteger(RAINBOW_MODE_CYCLE_SPEED_NBT_TAG); } @Override diff --git a/src/main/java/tectech/thing/gui/TecTechUITextures.java b/src/main/java/tectech/thing/gui/TecTechUITextures.java index f2774dc42f..298d528e21 100644 --- a/src/main/java/tectech/thing/gui/TecTechUITextures.java +++ b/src/main/java/tectech/thing/gui/TecTechUITextures.java @@ -22,6 +22,7 @@ public class TecTechUITextures { public static final UITexture BACKGROUND_GLOW_PURPLE = UITexture.fullImage(MODID, "gui/background/purple_glow"); public static final UITexture BACKGROUND_GLOW_BLUE = UITexture.fullImage(MODID, "gui/background/blue_glow"); public static final UITexture BACKGROUND_GLOW_GREEN = UITexture.fullImage(MODID, "gui/background/green_glow"); + public static final UITexture BACKGROUND_GLOW_RED = UITexture.fullImage(MODID, "gui/background/red_glow"); public static final UITexture BACKGROUND_GLOW_WHITE = UITexture.fullImage(MODID, "gui/background/white_glow"); public static final UITexture BACKGROUND_GLOW_RAINBOW = UITexture.fullImage(MODID, "gui/background/rainbow_glow"); public static final UITexture BACKGROUND_SPACE = UITexture.fullImage(MODID, "gui/background/space"); @@ -84,6 +85,10 @@ public class TecTechUITextures { .fullImage(MODID, "gui/overlay_button/battery_off"); public static final UITexture OVERLAY_BUTTON_FLAG = UITexture.fullImage(MODID, "gui/overlay_button/flag"); public static final UITexture OVERLAY_BUTTON_HEART = UITexture.fullImage(MODID, "gui/overlay_button/heart"); + public static final UITexture OVERLAY_BUTTON_RAINBOW_SPIRAL = UITexture + .fullImage(MODID, "gui/overlay_button/rainbow_spiral"); + public static final UITexture OVERLAY_BUTTON_RAINBOW_SPIRAL_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/rainbow_spiral_off"); public static final UITexture OVERLAY_CYCLIC_BLUE = UITexture.fullImage(MODID, "gui/overlay_button/cyclic_blue"); public static final UITexture OVERLAY_EJECTION_LOCKED = UITexture .fullImage(MODID, "gui/overlay_button/eject_disabled"); @@ -206,5 +211,7 @@ public class TecTechUITextures { public static final UITexture PICTURE_OVERLAY_ORANGE = UITexture.fullImage(MODID, "gui/picture/overlay_orange"); public static final UITexture PICTURE_OVERLAY_GREEN = UITexture.fullImage(MODID, "gui/picture/overlay_green"); public static final UITexture PICTURE_OVERLAY_PURPLE = UITexture.fullImage(MODID, "gui/picture/overlay_purple"); + public static final UITexture PICTURE_OVERLAY_RED = UITexture.fullImage(MODID, "gui/picture/overlay_red"); + public static final UITexture PICTURE_RAINBOW_SQUARE = UITexture.fullImage(MODID, "gui/picture/rainbow_square"); } diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java b/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java index c26322d11f..5157987628 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java @@ -5,6 +5,7 @@ import static gregtech.api.enums.Mods.Avaritia; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GTModHandler.getModItem; import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTUtility.filterValidMTEs; import static gregtech.api.util.GTUtility.formatNumbers; import static java.lang.Math.floor; import static java.lang.Math.log; @@ -32,19 +33,24 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; import com.google.common.collect.ImmutableList; import com.google.common.math.LongMath; +import com.google.common.primitives.Booleans; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; @@ -53,6 +59,7 @@ import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.Text; import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle; import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; import com.gtnewhorizons.modularui.api.math.Alignment; @@ -60,6 +67,7 @@ import com.gtnewhorizons.modularui.api.math.Color; import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; @@ -98,7 +106,6 @@ import gregtech.api.util.HatchElementBuilder; import gregtech.api.util.IGTHatchAdder; import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.tileentities.machines.MTEHatchInputBusME; -import gregtech.common.tileentities.machines.MTEHatchInputME; import gregtech.common.tileentities.machines.MTEHatchOutputBusME; import tectech.TecTech; import tectech.loader.ConfigHandler; @@ -126,6 +133,12 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private int ringAmount = 1; private int stellarFuelAmount = 0; private int neededStartupFuel = 0; + private int rendererColorRed = 179; + private int rendererColorGreen = 204; + private int rendererColorBlue = 255; + private int rotationSpeed = 5; + private int starSize = 20; + private int rainbowCycleSpeed = 1; private long fuelConsumption = 0; private long totalRecipesProcessed = 0; private long totalFuelConsumed = 0; @@ -138,12 +151,16 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private float invertedRecipeMilestonePercentage = 0; private float invertedFuelMilestonePercentage = 0; private float invertedStructureMilestonePercentage = 0; + private float rendererGamma = 3f; private BigInteger totalPowerConsumed = BigInteger.ZERO; private boolean batteryCharging = false; private boolean inversion = false; private boolean gravitonShardEjection = false; - private boolean noFormatting = false; + private FormattingMode formattingMode = FormattingMode.NONE; private boolean isRenderActive = false; + private boolean secretUpgrade = false; + private boolean rainbowMode = false; + private final ItemStack[] storedUpgradeWindowItems = new ItemStack[16]; public ArrayList<MTEBaseModule> moduleHatches = new ArrayList<>(); protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16); @@ -156,6 +173,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private static final int MANUAL_INSERTION_WINDOW_ID = 15; private static final int GENERAL_INFO_WINDOW_ID = 16; private static final int SPECIAL_THANKS_WINDOW_ID = 17; + private static final int STAR_COLOR_CONFIG_WINDOW_ID = 18; private static final int TEXTURE_INDEX = 960; private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 }; private static final Integer[] UPGRADE_MATERIAL_ID_CONVERSION = { 0, 5, 7, 11, 26, 29, 30 }; @@ -185,10 +203,26 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, : GTOreDictUnificator.get(OrePrefixes.block, Materials.CosmicNeutronium, 1); public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5); // 1000 blocks max per placement. - int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 63, 14, 1, realBudget, env, false, true); - if (stackSize.stackSize > 1) { + int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5); + + survivialBuildPiece(STRUCTURE_PIECE_SHAFT, stackSize, 63, 14, 1, realBudget, env, false, true); + + int built = 0; + if (stackSize.stackSize > 0 && ringAmount < 1) { + built += survivialBuildPiece( + STRUCTURE_PIECE_FIRST_RING, + stackSize, + 63, + 14, + -59, + realBudget, + env, + false, + true); + } + + if (stackSize.stackSize > 1 && ringAmount < 2) { built += survivialBuildPiece( STRUCTURE_PIECE_SECOND_RING, stackSize, @@ -200,7 +234,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, false, true); } - if (stackSize.stackSize > 2) { + + if (stackSize.stackSize > 2 && ringAmount < 3) { built += survivialBuildPiece( STRUCTURE_PIECE_THIRD_RING, stackSize, @@ -408,14 +443,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (ticker % (5 * SECONDS) == 0) { ticker = 0; startRecipeProcessing(); - FluidStack[] fluidInHatch = null; - boolean fuelDrained = false; - if (mInputHatches != null && !mInputHatches.isEmpty()) { - fluidInHatch = this.getStoredFluids() - .toArray(new FluidStack[0]); - } - int maxModuleCount = 8; + int maxModuleCount = 8; if (upgrades[26]) { maxModuleCount += 4; } @@ -451,37 +480,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, createRenderer(); } } else { - fuelConsumption = (long) calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1); - if (fluidInHatch != null && fuelConsumption < Integer.MAX_VALUE) { - for (FluidStack fluid : fluidInHatch) { - if (fluid.isFluidEqual(validFuelList.get(selectedFuelType))) { - FluidStack fluidNeeded = new FluidStack( - validFuelList.get(selectedFuelType), - (int) fuelConsumption); - FluidStack fluidReal; - if (mInputHatches.get(0) instanceof MTEHatchInputME meHatch) { - fluidReal = meHatch.drain(ForgeDirection.UNKNOWN, fluidNeeded, true); - } else { - fluidReal = mInputHatches.get(0) - .drain(fluidNeeded.amount, true); - } - if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) { - reduceBattery(fuelConsumptionFactor); - } else { - totalFuelConsumed += getFuelFactor(); - if (batteryCharging) { - increaseBattery(fuelConsumptionFactor); - } - } - fuelDrained = true; - } - } - if (!fuelDrained) { - reduceBattery(fuelConsumptionFactor); - } - } else { - reduceBattery(fuelConsumptionFactor); - } + drainFuel(); } } @@ -524,6 +523,33 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } } + private void drainFuel() { + fuelConsumption = (long) Math.max(calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1), 1); + if (fuelConsumption >= Integer.MAX_VALUE) { + reduceBattery(fuelConsumptionFactor); + return; + } + + FluidStack fuelToDrain = new FluidStack(validFuelList.get(selectedFuelType), (int) fuelConsumption); + for (MTEHatchInput hatch : filterValidMTEs(mInputHatches)) { + FluidStack drained = hatch.drain(ForgeDirection.UNKNOWN, fuelToDrain, true); + if (drained == null) { + continue; + } + + fuelToDrain.amount -= drained.amount; + + if (fuelToDrain.amount == 0) { + totalFuelConsumed += getFuelFactor(); + if (batteryCharging) { + increaseBattery(fuelConsumptionFactor); + } + return; + } + } + reduceBattery(fuelConsumptionFactor); + } + public boolean addModuleToMachineList(IGregTechTileEntity tileEntity, int baseCasingIndex) { if (tileEntity == null) { return false; @@ -593,8 +619,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (tile == null) return; tile.setRingCount(ringAmount); - tile.setStarRadius(20); - tile.setRotationSpeed(5); + tile.setStarRadius(starSize); + tile.setRotationSpeed(rotationSpeed); + tile.setColor(rendererColorRed / 255f, rendererColorGreen / 255f, rendererColorBlue / 255f, rendererGamma); + tile.setRainbowMode(rainbowMode, rainbowCycleSpeed); tile.updateToClient(); } @@ -764,6 +792,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, buildContext.addSyncedWindow(MANUAL_INSERTION_WINDOW_ID, this::createManualInsertionWindow); buildContext.addSyncedWindow(GENERAL_INFO_WINDOW_ID, this::createGeneralInfoWindow); buildContext.addSyncedWindow(SPECIAL_THANKS_WINDOW_ID, this::createSpecialThanksWindow); + buildContext.addSyncedWindow(STAR_COLOR_CONFIG_WINDOW_ID, this::createStarColorConfigWindow); builder.widget( new ButtonWidget().setOnClick( (clickData, widget) -> { @@ -867,6 +896,22 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .addTooltip(translateToLocal("fog.button.thanks.tooltip")) .setBackground(TecTechUITextures.OVERLAY_BUTTON_HEART) .setPos(8, 69) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ButtonWidget().setOnClick( + (clickData, widget) -> { + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(STAR_COLOR_CONFIG_WINDOW_ID); + }) + .setSize(16, 16) + .addTooltip(translateToLocal("fog.button.color.tooltip")) + .setBackground(() -> { + List<UITexture> button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_RAINBOW_SPIRAL); + return button.toArray(new IDrawable[0]); + }) + .setPos(152, 91) .setTooltipShowUpDelay(TOOLTIP_DELAY)); } @@ -1033,7 +1078,15 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setTextColor(Color.WHITE.normal) .setSize(70, 18) .setPos(4, 35) - .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.ListSyncer<>( + () -> Booleans.asList(upgrades), + val -> upgrades = Booleans.toArray(val), + PacketBuffer::writeBoolean, + PacketBuffer::readBoolean), + builder, + (widget, val) -> ((NumericWidget) widget).setMaxValue(calculateMaxFuelFactor(this)))) .widget( new DrawableWidget().setDrawable(ModularUITextures.ICON_INFO) .setPos(64, 24) @@ -1268,6 +1321,14 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(233, 215)) .widget( ButtonWidget.closeWindowButton(true) + .setOnClick((data, widget) -> { + if (!widget.isClient()) { + widget.getWindow() + .closeWindow(); + widget.getContext() + .closeWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); + } + }) .setPos(382, 6)); return builder.build(); } @@ -1344,7 +1405,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(5, 50) .setSize(140, 30)) .widget( - TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID, true)) + TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID)) .setScale(0.7f) .setDefaultColor(EnumChatFormatting.WHITE) .setSize(140, 30) @@ -1358,7 +1419,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .widget(new ButtonWidget().setOnClick((clickData, widget) -> { TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); if (clickData.mouseButton == 0) { - noFormatting = !noFormatting; + formattingMode = formattingMode.cycle(); } }) .setSize(10, 10) @@ -1367,7 +1428,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(5, 135) .setTooltipShowUpDelay(TOOLTIP_DELAY) .attachSyncer( - new FakeSyncWidget.BooleanSyncer(() -> noFormatting, val -> noFormatting = val), + new FakeSyncWidget.ByteSyncer( + () -> (byte) formattingMode.ordinal(), + val -> formattingMode = FormattingMode.VALUES[MathHelper + .clamp_int(val, 0, FormattingMode.VALUES.length - 1)]), builder)); return builder.build(); @@ -1378,15 +1442,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private Widget createMilestoneButton(int milestoneID, int width, int height, Pos2d pos) { return new ButtonWidget().setOnClick((clickData, widget) -> { currentMilestoneID = milestoneID; - if (!widget.isClient()) { - if (widget.getContext() - .isWindowOpen(INDIVIDUAL_MILESTONE_WINDOW_ID)) { - widget.getContext() - .closeWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); - } - widget.getContext() - .openSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); - } + reopenWindow(widget, INDIVIDUAL_MILESTONE_WINDOW_ID); }) .setSize(width, height) .setBackground(() -> switch (milestoneID) { @@ -1563,7 +1619,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .widget( createUpgradeBox( 8, - 0, + 4, 0, new int[] { 4, 7 }, true, @@ -1589,7 +1645,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .widget( createUpgradeBox( 10, - 0, + 4, 1, new int[] { 6, 7 }, true, @@ -1859,6 +1915,31 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, 12, new Pos2d(126, 798), scrollable)) + .widget( + new MultiChildWidget().addChild( + new ButtonWidget().setOnClick(((clickData, widget) -> secretUpgrade = !secretUpgrade)) + .setSize(40, 15) + .setBackground(() -> { + if (secretUpgrade) { + return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_PRESSED_32x16 }; + } + return new IDrawable[0]; + }) + .addTooltip(translateToLocal("fog.upgrade.tt.secret")) + .setTooltipShowUpDelay(20)) + .addChild( + new TextWidget(translateToLocal("fog.upgrade.tt.short.secret")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setSize(34, 9) + .setPos(3, 4) + .setEnabled((widget -> secretUpgrade))) + .addChild( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE) + .setEnabled(widget -> secretUpgrade) + .setPos(40, 4) + .setSize(20, 6)) + .setPos(new Pos2d(66, 56))) .widget(new TextWidget("").setPos(0, 945)); builder.widget( @@ -1942,6 +2023,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, background = TecTechUITextures.BACKGROUND_GLOW_GREEN; overlay = TecTechUITextures.PICTURE_OVERLAY_GREEN; } + case 4 -> { + background = TecTechUITextures.BACKGROUND_GLOW_RED; + overlay = TecTechUITextures.PICTURE_OVERLAY_RED; + } default -> { background = TecTechUITextures.BACKGROUND_GLOW_BLUE; overlay = TecTechUITextures.PICTURE_OVERLAY_BLUE; @@ -1996,7 +2081,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(9, 5)) .addChild( new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID))) - .setTextAlignment(Alignment.CenterLeft) + .setTextAlignment(Alignment.Center) .setDefaultColor(EnumChatFormatting.WHITE) .setSize(WIDTH - 15, LORE_POS - 30) .setPos(9, 30)) @@ -2033,74 +2118,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setSize(WIDTH, HEIGHT) .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { - int unlockedPrereqUpgrades = 0; - int unlockedSplitUpgrades = 0; if (!upgrades[currentUpgradeID]) { - for (int prereqUpgrade : prereqUpgrades[currentUpgradeID]) { - if (upgrades[prereqUpgrade]) { - unlockedPrereqUpgrades++; - } - } - if (!doesCurrentUpgradeRequireExtraMats - || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(currentUpgradeID)]) { - if (allPrereqRequired[currentUpgradeID]) { - if (unlockedPrereqUpgrades == prereqUpgrades[currentUpgradeID].length - && gravitonShardsAvailable >= gravitonShardCost) { - gravitonShardsAvailable -= gravitonShardCost; - gravitonShardsSpent += gravitonShardCost; - upgrades[currentUpgradeID] = true; - } - } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades[currentUpgradeID].length == 0) { - if (isUpradeSplitStart) { - for (int splitUpgrade : FIRST_SPLIT_UPGRADES) { - if (upgrades[splitUpgrade]) { - unlockedSplitUpgrades++; - } - } - unlockedSplitUpgrades -= (ringAmount - 1); - } - if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { - gravitonShardsAvailable -= gravitonShardCost; - gravitonShardsSpent += gravitonShardCost; - upgrades[currentUpgradeID] = true; - } - } - } + completeUpgrade(); } else { - int unlockedFollowupUpgrades = 0; - int unlockedNeighboringUpgrades = 0; - boolean doesFollowupRequireAllPrereqs = false; - boolean canFollowupSpareAConnection = true; - - for (int followupUpgrade : followupUpgrades) { - if (upgrades[followupUpgrade]) { - unlockedFollowupUpgrades++; - } - if (allPrereqRequired[followupUpgrade]) { - doesFollowupRequireAllPrereqs = true; - } - int[] currentPrereqs = prereqUpgrades[followupUpgrade]; - for (int prereqUpgrade : currentPrereqs) { - if (upgrades[prereqUpgrade]) { - unlockedNeighboringUpgrades++; - } - } - if (unlockedNeighboringUpgrades <= 1) { - canFollowupSpareAConnection = false; - } - unlockedNeighboringUpgrades = 0; - } - - if (!doesFollowupRequireAllPrereqs && followupUpgrades.length > 0 && canFollowupSpareAConnection) { - unlockedFollowupUpgrades = 0; - } - - if (unlockedFollowupUpgrades == 0) { - gravitonShardsAvailable += gravitonShardCost; - gravitonShardsSpent -= gravitonShardCost; - upgrades[currentUpgradeID] = false; - } + respecUpgrade(); } }) .setSize(40, 15) @@ -2127,15 +2148,88 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return builder.build(); } + private void completeUpgrade() { + int unlockedPrereqUpgrades = 0; + int unlockedSplitUpgrades = 0; + if (!upgrades[currentUpgradeID]) { + for (int prereqUpgrade : prereqUpgrades[currentUpgradeID]) { + if (upgrades[prereqUpgrade]) { + unlockedPrereqUpgrades++; + } + } + if (!doesCurrentUpgradeRequireExtraMats + || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) + .indexOf(currentUpgradeID)]) { + if (allPrereqRequired[currentUpgradeID]) { + if (unlockedPrereqUpgrades == prereqUpgrades[currentUpgradeID].length + && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; + upgrades[currentUpgradeID] = true; + } + } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades[currentUpgradeID].length == 0) { + if (isUpradeSplitStart) { + for (int splitUpgrade : FIRST_SPLIT_UPGRADES) { + if (upgrades[splitUpgrade]) { + unlockedSplitUpgrades++; + } + } + unlockedSplitUpgrades -= (ringAmount - 1); + } + if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; + upgrades[currentUpgradeID] = true; + } + } + } + } + } + + private void respecUpgrade() { + int unlockedFollowupUpgrades = 0; + int unlockedNeighboringUpgrades = 0; + boolean doesFollowupRequireAllPrereqs = false; + boolean canFollowupSpareAConnection = true; + + for (int followupUpgrade : followupUpgrades) { + if (upgrades[followupUpgrade]) { + unlockedFollowupUpgrades++; + if (allPrereqRequired[followupUpgrade]) { + doesFollowupRequireAllPrereqs = true; + } + int[] currentPrereqs = prereqUpgrades[followupUpgrade]; + for (int prereqUpgrade : currentPrereqs) { + if (upgrades[prereqUpgrade]) { + unlockedNeighboringUpgrades++; + } + } + if (unlockedNeighboringUpgrades <= 1) { + canFollowupSpareAConnection = false; + } + } + + unlockedNeighboringUpgrades = 0; + } + + if (!doesFollowupRequireAllPrereqs && followupUpgrades.length > 0 && canFollowupSpareAConnection) { + unlockedFollowupUpgrades = 0; + } + + if (unlockedFollowupUpgrades == 0) { + gravitonShardsAvailable += gravitonShardCost; + gravitonShardsSpent -= gravitonShardCost; + upgrades[currentUpgradeID] = false; + } + } + private Widget createMaterialInputButton(int upgradeID, int xCoord, int yCoord, IWidgetBuilder<?> builder) { return new ButtonWidget().setOnClick((clickData, widget) -> { if (!widget.isClient() && doesCurrentUpgradeRequireExtraMats) { - widget.getContext() - .openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); - widget.getContext() - .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); - widget.getContext() - .closeWindow(UPGRADE_TREE_WINDOW_ID); + ModularUIContext ctx = widget.getContext(); + ctx.openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); + ctx.closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + ctx.closeWindow(UPGRADE_TREE_WINDOW_ID); } }) .setPlayClickSound(doesCurrentUpgradeRequireExtraMats) @@ -2192,16 +2286,23 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, followupUpgrades = followingUpgradeIDs; isUpradeSplitStart = isStartOfSplit; doesCurrentUpgradeRequireExtraMats = requiresExtraMaterials; - if (!widget.isClient()) { - // unfortunately this is the easiest way to prevent this window desyncing. it causes the window to - // reposition itself on the screen which would be a good thing to not do. - if (widget.getContext() - .isWindowOpen(INDIVIDUAL_UPGRADE_WINDOW_ID)) { - widget.getContext() - .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + if (clickData.mouseButton == 0) { + if (clickData.shift) { + if (!doesCurrentUpgradeRequireExtraMats + || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) + .indexOf(currentUpgradeID)]) { + completeUpgrade(); + } else if (!widget.isClient()) { + ModularUIContext ctx = widget.getContext(); + ctx.openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); + ctx.closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + ctx.closeWindow(UPGRADE_TREE_WINDOW_ID); + } + } else { + reopenWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID); } - widget.getContext() - .openSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); + } else if (clickData.mouseButton == 1) { + respecUpgrade(); } }) .setSize(40, 15) @@ -2277,6 +2378,12 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, final DynamicPositionedColumn column4 = new DynamicPositionedColumn(); final DynamicPositionedColumn column5 = new DynamicPositionedColumn(); final DynamicPositionedColumn column6 = new DynamicPositionedColumn(); + + for (int i = 0; i < 16; i++) { + inputSlotHandler.insertItem(i, storedUpgradeWindowItems[i], false); + storedUpgradeWindowItems[i] = null; + } + List<DynamicPositionedColumn> columnList = Arrays.asList(column1, column2, column3, column4, column5, column6); ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); @@ -2402,6 +2509,13 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } protected ModularWindow createGeneralInfoWindow(final EntityPlayer player) { + return createGeneralInfoWindow(() -> inversion, val -> inversion = val); + } + + // because modularui1 creates its synced windows following a specific interface spec, so we have to create a + // second method in order to pass a parameter :( + public static ModularWindow createGeneralInfoWindow(Supplier<Boolean> inversionGetter, + Consumer<Boolean> inversionSetter) { final Scrollable scrollable = new Scrollable().setVerticalScroll(); final int WIDTH = 300; final int HEIGHT = 300; @@ -2463,20 +2577,20 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(7, 140) .setSize(150, 15)) .widget( - TextWidget.dynamicText(this::inversionHeaderText) + TextWidget.dynamicText(() -> inversionInfoText(inversionGetter.get())) .setDefaultColor(EnumChatFormatting.WHITE) .setTextAlignment(Alignment.CenterLeft) .setPos(7, 155) .setSize(150, 15)) .widget(new ButtonWidget().setOnClick((clickData, widget) -> { - if (inversion) { + if (inversionGetter.get()) { scrollable.setVerticalScrollOffset(1766); } }) - .setPlayClickSound(inversion) + .setPlayClickSound(inversionGetter.get()) .setPos(7, 155) .setSize(150, 15) - .attachSyncer(new FakeSyncWidget.BooleanSyncer(() -> inversion, (val) -> inversion = val), scrollable)) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(inversionGetter, inversionSetter), scrollable)) .widget( new TextWidget( EnumChatFormatting.BOLD + "§N" + translateToLocal("gt.blockmachines.multimachine.FOG.fuel")) @@ -2530,13 +2644,13 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(7, 1439) .setSize(280, 320)) .widget( - TextWidget.dynamicText(this::inversionHeaderText) + TextWidget.dynamicText(() -> inversionHeaderText(inversionGetter.get())) .setDefaultColor(EnumChatFormatting.WHITE) .setTextAlignment(Alignment.TopCenter) .setPos(7, 1776) .setSize(280, 15)) .widget( - TextWidget.dynamicText(this::inversionInfoText) + TextWidget.dynamicText(() -> inversionInfoText(inversionGetter.get())) .setDefaultColor(EnumChatFormatting.GOLD) .setTextAlignment(Alignment.CenterLeft) .setPos(7, 1793) @@ -2604,10 +2718,9 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setSize(60, 10)) .widget( new TextWidget( - EnumChatFormatting.DARK_AQUA + translateToLocal("gt.blockmachines.multimachine.FOG.teg") - + " " - + EnumChatFormatting.RESET - + translateToLocal("gt.blockmachines.multimachine.FOG.serenybiss")).setScale(0.8f) + translateToLocal("gt.blockmachines.multimachine.FOG.serenibyss") + " " + + EnumChatFormatting.DARK_AQUA + + translateToLocal("gt.blockmachines.multimachine.FOG.teg")).setScale(0.8f) .setTextAlignment(Alignment.CenterLeft) .setPos(7, 67) .setSize(60, 10)) @@ -2676,6 +2789,266 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return builder.build(); } + protected ModularWindow createStarColorConfigWindow(final EntityPlayer player) { + final int WIDTH = 200; + final int HEIGHT = 200; + ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); + builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE); + builder.setDraggable(true); + builder.widget( + ButtonWidget.closeWindowButton(true) + .setPos(184, 4)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.cosmetics")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setScale(1f) + .setPos(0, 5) + .setSize(200, 15)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.color")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 25) + .setSize(60, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.red")) + .setDefaultColor(EnumChatFormatting.RED) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 45) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> rendererColorRed = (int) val) + .setGetter(() -> rendererColorRed) + .setBounds(0, 255) + .setDefaultValue(179) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(40, 45) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.integers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> rendererColorRed, val -> rendererColorRed = val), + builder)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.green")) + .setDefaultColor(EnumChatFormatting.GREEN) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 65) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> rendererColorGreen = (int) val) + .setGetter(() -> rendererColorGreen) + .setBounds(0, 255) + .setDefaultValue(204) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(40, 65) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.integers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> rendererColorGreen, val -> rendererColorGreen = val), + builder)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.blue")) + .setDefaultColor(EnumChatFormatting.DARK_BLUE) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 85) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> rendererColorBlue = (int) val) + .setGetter(() -> rendererColorBlue) + .setBounds(0, 255) + .setDefaultValue(255) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(40, 85) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.integers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> rendererColorBlue, val -> rendererColorBlue = val), + builder)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.gamma")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 105) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> rendererGamma = (float) val) + .setGetter(() -> rendererGamma) + .setBounds(0, 100) + .setDefaultValue(3) + .setIntegerOnly(false) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(40, 105) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.decimals")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.FloatSyncer(() -> rendererGamma, val -> rendererGamma = val), + builder)) + .widget( + new DrawableWidget().setDrawable( + () -> new Rectangle().setColor(Color.rgb(rendererColorRed, rendererColorGreen, rendererColorBlue))) + .setSize(80, 80) + .setPos(100, 45)) + .widget( + new DrawableWidget().setDrawable(() -> rainbowMode ? TecTechUITextures.PICTURE_RAINBOW_SQUARE : null) + .setSize(80, 80) + .setPos(100, 45)) + .widget(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + rainbowMode = !rainbowMode; + } + }) + .setPlayClickSound(true) + .setBackground(() -> { + if (rainbowMode) { + return new IDrawable[] { TecTechUITextures.BUTTON_CELESTIAL_32x32, + TecTechUITextures.OVERLAY_BUTTON_RAINBOW_SPIRAL }; + } else { + return new IDrawable[] { TecTechUITextures.BUTTON_CELESTIAL_32x32, + TecTechUITextures.OVERLAY_BUTTON_RAINBOW_SPIRAL_OFF }; + } + }) + .addTooltip(translateToLocal("fog.button.rainbowmode.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(100, 130) + .setSize(16, 16) + .attachSyncer(new FakeSyncWidget.BooleanSyncer(() -> rainbowMode, (val) -> rainbowMode = val), builder)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.speed")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(120, 129) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> rainbowCycleSpeed = (int) val) + .setGetter(() -> rainbowCycleSpeed) + .setBounds(0, 100) + .setDefaultValue(1) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(28, 18) + .setPos(152, 129) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.integers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> rainbowCycleSpeed, val -> rainbowCycleSpeed = val), + builder)) + .widget( + new TextWidget( + EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.misc")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 130) + .setSize(80, 10)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.spin")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 150) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> rotationSpeed = (int) val) + .setGetter(() -> rotationSpeed) + .setBounds(0, 100) + .setDefaultValue(5) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(40, 150) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.integers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.IntegerSyncer(() -> rotationSpeed, val -> rotationSpeed = val), + builder)) + .widget( + new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.size")) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.CenterLeft) + .setPos(8, 170) + .setSize(60, 18)) + .widget( + new NumericWidget().setSetter(val -> starSize = (int) val) + .setGetter(() -> starSize) + .setBounds(1, 40) + .setDefaultValue(20) + .setTextAlignment(Alignment.Center) + .setTextColor(Color.WHITE.normal) + .setSize(35, 18) + .setPos(40, 170) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.integers")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer(new FakeSyncWidget.IntegerSyncer(() -> starSize, val -> starSize = val), builder)) + .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + UpdateRenderer(); + reopenWindow(widget, STAR_COLOR_CONFIG_WINDOW_ID); + } + }) + .setSize(35, 15) + .setBackground(GTUITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal("fog.button.updaterenderer.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(0, 0)) + .addChild( + TextWidget.localised("gt.blockmachines.multimachine.FOG.apply") + .setTextAlignment(Alignment.Center) + .setPos(0, 0) + .setSize(35, 15)) + .setSize(35, 15) + .setPos(157, 177)) + .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { + if (!widget.isClient()) { + rendererColorRed = 179; + rendererColorGreen = 204; + rendererColorBlue = 255; + rendererGamma = 3f; + rotationSpeed = 5; + starSize = 20; + rainbowMode = false; + rainbowCycleSpeed = 1; + } + }) + .setSize(35, 15) + .setBackground(GTUITextures.BUTTON_STANDARD) + .addTooltip(translateToLocal("fog.button.resetcosmetics.tooltip")) + .setTooltipShowUpDelay(TOOLTIP_DELAY) + .setPos(0, 0)) + .addChild( + TextWidget.localised("fog.debug.resetbutton.text") + .setTextAlignment(Alignment.Center) + .setPos(0, 0) + .setSize(35, 15)) + .setSize(35, 15) + .setPos(120, 177)); + return builder.build(); + } + + private void reopenWindow(Widget widget, int windowId) { + if (!widget.isClient()) { + ModularUIContext ctx = widget.getContext(); + if (ctx.isWindowOpen(windowId)) { + ctx.closeWindow(windowId); + } + ctx.openSyncedWindow(windowId); + } + } + private DynamicPositionedRow delenoName() { DynamicPositionedRow nameRow = new DynamicPositionedRow(); String deleno = translateToLocal("gt.blockmachines.multimachine.FOG.deleno"); @@ -2704,6 +3077,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, + EnumChatFormatting.GRAY + "which utilize the star to energize materials") .addInfo("to varying degrees, ranging from regular smelting to matter degeneration.") + .addInfo("EU requirements for all modules are handled via wireless energy directly.") .addInfo(TOOLTIP_BAR) .addInfo( "This multiblock has an " + EnumChatFormatting.GOLD @@ -2728,7 +3102,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, + "Clicking on the logo in the controller gui opens an extensive information window,") .addInfo("explaining everything there is to know about this multiblock.") .addInfo(TOOLTIP_BAR) - .beginStructureBlock(126, 29, 186, false) + .beginStructureBlock(127, 29, 186, false) .addStructureInfo("The structure is too complex! See schematic for details.") .addStructureInfo( "Total blocks needed for the structure with " + EnumChatFormatting.DARK_PURPLE @@ -2917,6 +3291,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, inversion = inversionChecker == 4; } + public boolean isInversionAvailable() { + return inversion; + } + private Text inversionStatusText() { String inversionStatus = ""; if (inversion) { @@ -3089,11 +3467,55 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, translateToLocal("gt.blockmachines.multimachine.FOG.shardgain") + ": " + EnumChatFormatting.GRAY + sum); } + private enum FormattingMode { + + NONE, + COMMA, + EXPONENT; + + static final FormattingMode[] VALUES = values(); + + FormattingMode cycle() { + return switch (this) { + case NONE -> COMMA; + case COMMA -> EXPONENT; + case EXPONENT -> NONE; + }; + } + + String format(Number number) { + return switch (this) { + case NONE -> number.toString(); + case COMMA -> { + if (number instanceof BigInteger bi) yield formatNumbers(bi); + else yield formatNumbers(number.longValue()); + } + case EXPONENT -> { + if (number instanceof BigInteger bi) { + if (bi.compareTo(BigInteger.valueOf(1_000L)) > 0) { + yield toExponentForm(bi); + } + yield bi.toString(); + } else { + long value = number.longValue(); + if (value > 1_000L) { + yield toExponentForm(value); + } + yield Long.toString(value); + } + } + }; + } + } + private Text totalMilestoneProgress(int milestoneID) { - long progress; - BigInteger bigProgress; + Number progress; String suffix; switch (milestoneID) { + case 0 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); + progress = totalPowerConsumed; + } case 1 -> { suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); progress = totalRecipesProcessed; @@ -3106,42 +3528,14 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); progress = milestoneProgress[3]; } - default -> { - suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); - bigProgress = totalPowerConsumed; - if (!noFormatting && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) { - return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " - + EnumChatFormatting.GRAY - + toExponentForm(bigProgress) - + " " - + suffix); - } else { - return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " - + EnumChatFormatting.GRAY - + bigProgress - + " " - + suffix); - } - } + default -> throw new IllegalArgumentException("Invalid Milestone ID"); } - if (!noFormatting) { - return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " - + EnumChatFormatting.GRAY - + formatNumbers(progress) - + " " - + suffix); - } else { - return new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " - + EnumChatFormatting.GRAY - + progress - + " " - + suffix); - } - + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + formattingMode.format(progress) + + " " + + suffix); } private Text currentMilestone(int milestoneID) { @@ -3151,80 +3545,54 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, + milestoneProgress[milestoneID]); } - private Text milestoneProgressText(int milestoneID, boolean formatting) { - long max; - BigInteger bigMax; + private Text milestoneProgressText(int milestoneID) { + Number max; String suffix; String progressText = translateToLocal("gt.blockmachines.multimachine.FOG.progress"); - Text done = new Text(translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete")); - if (noFormatting) { - formatting = false; - done = new Text( - translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") + EnumChatFormatting.DARK_RED - + "?"); + Text done = new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") + + (formattingMode != FormattingMode.NONE ? EnumChatFormatting.DARK_RED + "?" : "")); + + if (milestoneProgress[milestoneID] >= 7 && !inversion) { + return done; } + switch (milestoneID) { - case 0: - if (milestoneProgress[0] < 7 || inversion) { - suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); - if (inversion) { - bigMax = POWER_MILESTONE_T7_CONSTANT.multiply(BigInteger.valueOf(milestoneProgress[0] - 5)); - } else { - bigMax = BigInteger.valueOf(LongMath.pow(9, milestoneProgress[0])) - .multiply(BigInteger.valueOf(LongMath.pow(10, 15))); - } - if (formatting && (totalPowerConsumed.compareTo(BigInteger.valueOf(1_000L)) > 0)) { - return new Text( - progressText + ": " + EnumChatFormatting.GRAY + toExponentForm(bigMax) + " " + suffix); - } else { - return new Text(progressText + ": " + EnumChatFormatting.GRAY + bigMax + " " + suffix); - } - } else { - return done; - } - case 1: - if (milestoneProgress[1] < 7 || inversion) { - suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); - if (inversion) { - max = RECIPE_MILESTONE_T7_CONSTANT * (milestoneProgress[1] - 5); - } else { - max = LongMath.pow(6, milestoneProgress[1]) * LongMath.pow(10, 7); - } - break; + case 0 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.power"); + if (inversion) { + max = POWER_MILESTONE_T7_CONSTANT.multiply(BigInteger.valueOf(milestoneProgress[0] - 5)); } else { - return done; + max = BigInteger.valueOf(LongMath.pow(9, milestoneProgress[0])) + .multiply(BigInteger.valueOf(LongMath.pow(10, 15))); } - case 2: - if (milestoneProgress[2] < 7 || inversion) { - suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuelconsumed"); - if (inversion) { - max = FUEL_MILESTONE_T7_CONSTANT * (milestoneProgress[2] - 5); - } else { - max = LongMath.pow(3, milestoneProgress[2]) * LongMath.pow(10, 4); - } - break; + } + case 1 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.recipes"); + if (inversion) { + max = RECIPE_MILESTONE_T7_CONSTANT * (milestoneProgress[1] - 5); } else { - return done; + max = LongMath.pow(6, milestoneProgress[1]) * LongMath.pow(10, 7); } - case 3: - if (milestoneProgress[3] < 7 || inversion) { - suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); - max = milestoneProgress[3] + 1; - break; + } + case 2 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.fuelconsumed"); + if (inversion) { + max = FUEL_MILESTONE_T7_CONSTANT * (milestoneProgress[2] - 5); } else { - return done; + max = LongMath.pow(3, milestoneProgress[2]) * LongMath.pow(10, 4); } - default: - return new Text("Error"); - } - if (formatting) { - return new Text(progressText + ": " + EnumChatFormatting.GRAY + formatNumbers(max) + " " + suffix); - } else { - return new Text(progressText + ": " + EnumChatFormatting.GRAY + max + " " + suffix); + } + case 3 -> { + suffix = translateToLocal("gt.blockmachines.multimachine.FOG.extensions"); + max = milestoneProgress[3] + 1; + } + default -> throw new IllegalArgumentException("Invalid Milestone ID"); } + return new Text(progressText + ": " + EnumChatFormatting.GRAY + formattingMode.format(max) + " " + suffix); } - private Text inversionHeaderText() { + private static Text inversionHeaderText(boolean inversion) { return inversion ? new Text( EnumChatFormatting.BOLD + "§k2" @@ -3237,7 +3605,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, : new Text(""); } - private Text inversionInfoText() { + private static Text inversionInfoText(boolean inversion) { return inversion ? new Text(translateToLocal("gt.blockmachines.multimachine.FOG.inversioninfotext")) : new Text(""); } @@ -3320,6 +3688,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, NBT.setLong("totalFuelConsumed", totalFuelConsumed); NBT.setInteger("starFuelStored", stellarFuelAmount); NBT.setBoolean("gravitonShardEjection", gravitonShardEjection); + NBT.setBoolean("secretUpgrde", secretUpgrade); // Store booleanArrays of all upgrades NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); @@ -3360,6 +3729,16 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, NBT.setBoolean("gravitonShardEjection", gravitonShardEjection); NBT.setBoolean("isRenderActive", isRenderActive); NBT.setInteger("ringAmount", ringAmount); + NBT.setBoolean("secretUpgrade", secretUpgrade); + NBT.setInteger("rendererColorRed", rendererColorRed); + NBT.setInteger("rendererColorGreen", rendererColorGreen); + NBT.setInteger("rendererColorBlue", rendererColorBlue); + NBT.setFloat("rendererGamma", rendererGamma); + NBT.setInteger("rotationSpeed", rotationSpeed); + NBT.setInteger("starSize", starSize); + NBT.setBoolean("rainbowMode", rainbowMode); + NBT.setInteger("rainbowCycleSpeed", rainbowCycleSpeed); + NBT.setBoolean("isRenderActive", isRenderActive); // Store booleanArray of all upgrades NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound(); @@ -3381,6 +3760,20 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } NBT.setTag("upgradeMaterials", upgradeMaterialBooleanArrayNBTTag); + + NBTTagCompound upgradeWindowStorageNBTTag = new NBTTagCompound(); + + int storageIndex = 0; + for (ItemStack itemStack : inputSlotHandler.getStacks()) { + if (itemStack != null) { + upgradeWindowStorageNBTTag + .setInteger(storageIndex + "stacksizeOfStoredUpgradeItems", itemStack.stackSize); + NBT.setTag(storageIndex + "storedUpgradeItem", itemStack.writeToNBT(new NBTTagCompound())); + } + storageIndex++; + } + + NBT.setTag("upgradeWindowStorage", upgradeWindowStorageNBTTag); super.saveNBTData(NBT); } @@ -3400,6 +3793,16 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, gravitonShardEjection = NBT.getBoolean("gravitonShardEjection"); isRenderActive = NBT.getBoolean("isRenderActive"); ringAmount = NBT.getInteger("ringAmount"); + secretUpgrade = NBT.getBoolean("secretUpgrade"); + rendererColorRed = NBT.getInteger("rendererColorRed"); + rendererColorGreen = NBT.getInteger("rendererColorGreen"); + rendererColorBlue = NBT.getInteger("rendererColorBlue"); + rendererGamma = NBT.getFloat("rendererGamma"); + rotationSpeed = NBT.getInteger("rotationSpeed"); + starSize = NBT.getInteger("starSize"); + rainbowMode = NBT.getBoolean("rainbowMode"); + rainbowCycleSpeed = NBT.getInteger("rainbowCycleSpeed"); + isRenderActive = NBT.getBoolean("isRenderActive"); NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades"); @@ -3415,6 +3818,18 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, materialPaidUpgrades[upgradeIndex] = upgrade; } + NBTTagCompound tempItemTag = NBT.getCompoundTag("upgradeWindowStorage"); + + for (int index = 0; index < 16; index++) { + + int stackSize = tempItemTag.getInteger(index + "stacksizeOfStoredUpgradeItems"); + ItemStack itemStack = ItemStack.loadItemStackFromNBT(NBT.getCompoundTag(index + "storedUpgradeItem")); + + if (itemStack != null) { + storedUpgradeWindowItems[index] = itemStack.splitStack(stackSize); + } + } + super.loadNBTData(NBT); } diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEBaseModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEBaseModule.java index 24e570f9b5..f8920d4f78 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEBaseModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEBaseModule.java @@ -55,6 +55,7 @@ import gregtech.api.recipe.RecipeMaps; import gregtech.api.render.TextureFactory; import gregtech.api.util.GTStructureUtility; import tectech.thing.gui.TecTechUITextures; +import tectech.thing.metaTileEntity.multi.MTEForgeOfGods; import tectech.thing.metaTileEntity.multi.base.TTMultiblockBase; public class MTEBaseModule extends TTMultiblockBase { @@ -66,6 +67,7 @@ public class MTEBaseModule extends TTMultiblockBase { protected boolean isMultiStepPlasmaCapable = false; protected boolean isMagmatterCapable = false; private boolean isVoltageConfigUnlocked = false; + private boolean isInversionUnlocked = false; protected UUID userUUID; protected int machineHeat = 0; protected int overclockHeat = 0; @@ -81,6 +83,7 @@ public class MTEBaseModule extends TTMultiblockBase { private static final String STRUCTURE_PIECE_MAIN = "main"; private static final int VOLTAGE_WINDOW_ID = 9; + private static final int GENERAL_INFO_WINDOW_ID = 10; private static final int TEXTURE_INDEX = 960; protected static final String TOOLTIP_BAR = EnumChatFormatting.AQUA + "--------------------------------------------------------------------------"; @@ -216,6 +219,10 @@ public class MTEBaseModule extends TTMultiblockBase { isVoltageConfigUnlocked = unlocked; } + public void setInversionConfig(boolean inversion) { + isInversionUnlocked = inversion; + } + public void setPowerTally(BigInteger amount) { powerTally = amount; } @@ -315,6 +322,19 @@ public class MTEBaseModule extends TTMultiblockBase { .setPos(75, 94) .setSize(100, 10)); + builder.widget( + new ButtonWidget().setOnClick( + (data, widget) -> { + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(GENERAL_INFO_WINDOW_ID); + }) + .setSize(18, 18) + .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.clickhere")) + .setPos(172, 67) + .setTooltipShowUpDelay(TOOLTIP_DELAY)); + + buildContext.addSyncedWindow(GENERAL_INFO_WINDOW_ID, this::createGeneralInfoWindow); + builder.widget(createPowerSwitchButton(builder)) .widget(createVoidExcessButton(builder)) .widget(createInputSeparationButton(builder)) @@ -393,6 +413,10 @@ public class MTEBaseModule extends TTMultiblockBase { return builder.build(); } + protected ModularWindow createGeneralInfoWindow(final EntityPlayer player) { + return MTEForgeOfGods.createGeneralInfoWindow(() -> isInversionUnlocked, val -> isInversionUnlocked = val); + } + @Override public void addGregTechLogo(ModularWindow.Builder builder) { builder.widget( diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEExoticModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEExoticModule.java index 94c4c1b8fa..c09f497e62 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEExoticModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEExoticModule.java @@ -96,7 +96,7 @@ public class MTEExoticModule extends MTEBaseModule { .disableRegisterNEI() .build(); private static final int NUMBER_OF_INPUTS = 7; - private static final int INPUT_LIST_WINDOW_ID = 10; + private static final int INPUT_LIST_WINDOW_ID = 11; public MTEExoticModule(int aID, String aName, String aNameRegional) { super(aID, aName, aNameRegional); @@ -636,6 +636,11 @@ public class MTEExoticModule extends MTEBaseModule { } @Override + protected boolean filtersFluid() { + return false; + } + + @Override public MultiblockTooltipBuilder createTooltip() { final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); tt.addMachineType("Exotic Matter Producer") diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEMoltenModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEMoltenModule.java index e9907a8626..3f42d34f0a 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEMoltenModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEMoltenModule.java @@ -59,6 +59,11 @@ public class MTEMoltenModule extends MTEBaseModule { 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); @@ -73,7 +78,7 @@ public class MTEMoltenModule extends MTEBaseModule { .setRecipeHeat(recipe.mSpecialValue) .setHeatOC(true) .setHeatDiscount(true) - .setMachineHeat(getHeatForOC()) + .setMachineHeat(Math.max(recipe.mSpecialValue, getHeatForOC())) .setHeatDiscountMultiplier(getHeatEnergyDiscount()) .setDurationDecreasePerOC(getOverclockTimeFactor()); diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTESmeltingModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTESmeltingModule.java index 08d99bde8c..5f6bb2534d 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTESmeltingModule.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTESmeltingModule.java @@ -94,6 +94,10 @@ public class MTESmeltingModule extends MTEBaseModule { 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); @@ -126,7 +130,7 @@ public class MTESmeltingModule extends MTEBaseModule { .setRecipeHeat(recipe.mSpecialValue) .setHeatOC(true) .setHeatDiscount(true) - .setMachineHeat(getHeatForOC()) + .setMachineHeat(Math.max(recipe.mSpecialValue, getHeatForOC())) .setHeatDiscountMultiplier(getHeatEnergyDiscount()) .setDurationDecreasePerOC(getOverclockTimeFactor()); } |