diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java index 051eee691a6..20f17eb56d1 100644 --- a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java +++ b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java @@ -1310,7 +1310,7 @@ public void run() { GTOreDictUnificator.get(OrePrefixes.cell, MaterialsUEVplus.Protomatter, 1L), ItemList.Cell_Empty.get(1L)); - GTFluidFactory.builder("InfinityPlasma") + GTFluidFactory.builder("plasma.infinity") .withLocalizedName("Infinity Plasma") .withStateAndTemperature(PLASMA, 10000) .buildAndRegister() diff --git a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java index 9e08460fb6e..180e8514f4a 100644 --- a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java +++ b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java @@ -43,6 +43,8 @@ public void run() { new Extractor().run(); new ResearchStationAssemblyLine().run(); new Godforge().run(); + } else { + Godforge.runDevEnvironmentRecipes(); } } } diff --git a/src/main/java/tectech/loader/recipe/Godforge.java b/src/main/java/tectech/loader/recipe/Godforge.java index 414756a036e..30e3a37f2ce 100644 --- a/src/main/java/tectech/loader/recipe/Godforge.java +++ b/src/main/java/tectech/loader/recipe/Godforge.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; @@ -301,8 +302,9 @@ public void run() { // Single step ItemStack[] solids_t2_1step = { MaterialsElements.STANDALONE.RHUGNOR.getDust(1), MaterialsElements.STANDALONE.DRAGON_METAL.getDust(1), - MaterialsElements.STANDALONE.CHRONOMATIC_GLASS.getDust(1), Materials.CosmicNeutronium.getDust(1), - Materials.Draconium.getDust(1), Materials.DraconiumAwakened.getDust(1), Materials.Ichorium.getDust(1) }; + MaterialsElements.STANDALONE.CHRONOMATIC_GLASS.getDust(1), Materials.Bedrockium.getDust(1), + Materials.CosmicNeutronium.getDust(1), Materials.Draconium.getDust(1), + Materials.DraconiumAwakened.getDust(1), Materials.Ichorium.getDust(1), }; FluidStack[] molten_t2_1step = convertToFluid(solids_t2_1step); @@ -310,8 +312,9 @@ public void run() { new FluidStack(MaterialsElements.STANDALONE.RHUGNOR.getPlasma(), 144), new FluidStack(MaterialsElements.STANDALONE.DRAGON_METAL.getPlasma(), 144), new FluidStack(MaterialsElements.STANDALONE.CHRONOMATIC_GLASS.getPlasma(), 144), - Materials.CosmicNeutronium.getPlasma(144), Materials.Draconium.getPlasma(144), - Materials.DraconiumAwakened.getPlasma(144), Materials.Ichorium.getPlasma(144) }; + Materials.Bedrockium.getPlasma(144), Materials.CosmicNeutronium.getPlasma(144), + Materials.Draconium.getPlasma(144), Materials.DraconiumAwakened.getPlasma(144), + Materials.Ichorium.getPlasma(144), }; for (int i = 0; i < solids_t2_1step.length; i++) { GTValues.RA.stdBuilder() @@ -340,14 +343,16 @@ public void run() { // Multi-step ItemStack[] solids_t2_xstep = { MaterialsElements.STANDALONE.HYPOGEN.getDust(1), - Materials.Tritanium.getDust(1), Materials.Flerovium.getDust(1), Materials.Neutronium.getDust(1) }; + Materials.Tritanium.getDust(1), Materials.Flerovium.getDust(1), Materials.Neutronium.getDust(1), + Materials.Infinity.getDust(1), MaterialsUEVplus.SixPhasedCopper.getDust(1), }; FluidStack[] molten_t2_xstep = convertToFluid(solids_t2_xstep); FluidStack[] solid_plasmas_t2_xstep = { new FluidStack(MaterialsElements.STANDALONE.HYPOGEN.getPlasma(), 144), Materials.Tritanium.getPlasma(144), Materials.Flerovium.getPlasma(144), - Materials.Neutronium.getPlasma(144), }; + Materials.Neutronium.getPlasma(144), Materials.Infinity.getPlasma(144), + MaterialsUEVplus.SixPhasedCopper.getPlasma(144), }; for (int i = 0; i < solids_t2_xstep.length; i++) { GTValues.RA.stdBuilder() @@ -459,7 +464,7 @@ public void run() { GTValues.RA.stdBuilder() .itemInputs(Materials.Iron.getDust(1)) .fluidInputs(Materials.Iron.getMolten(1), Materials.Bismuth.getMolten(1)) - .fluidOutputs(MaterialsUEVplus.MagMatter.getMolten(144)) + .fluidOutputs(MaterialsUEVplus.MagMatter.getMolten(576)) .duration(10 * SECONDS) .eut(TierEU.RECIPE_MAX) .metadata(FOG_EXOTIC_TIER, 1) @@ -653,6 +658,9 @@ public void run() { exoticModuleMagmatterItemMap.put(Materials.Ichorium.getDustTiny(1), 100000); exoticModuleMagmatterItemMap.put(Materials.Neutronium.getDustTiny(1), 100000); exoticModuleMagmatterItemMap.put(Materials.Flerovium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Bedrockium.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(Materials.Infinity.getDustTiny(1), 100000); + exoticModuleMagmatterItemMap.put(MaterialsUEVplus.SixPhasedCopper.getDustTiny(1), 100000); // GT++ materials exoticModuleMagmatterItemMap.put(MaterialsElements.STANDALONE.CELESTIAL_TUNGSTEN.getTinyDust(1), 100000); @@ -748,6 +756,17 @@ public void run() { } + public static void runDevEnvironmentRecipes() { + // put something in here to not crash the game in dev environment when opening the manual insertion window + godforgeUpgradeMats.put(0, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + godforgeUpgradeMats.put(5, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + godforgeUpgradeMats.put(7, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + godforgeUpgradeMats.put(11, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + godforgeUpgradeMats.put(26, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + godforgeUpgradeMats.put(29, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + godforgeUpgradeMats.put(30, new ItemStack[] { new ItemStack(Blocks.cobblestone) }); + } + public static void initMoltenModuleRecipes() { for (GTRecipe recipe : RecipeMaps.blastFurnaceRecipes.getAllRecipes()) { List itemOutputs = new ArrayList<>(1); diff --git a/src/main/java/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/tectech/thing/block/RenderForgeOfGods.java index 7a38b253ef0..9fca07d1f0c 100644 --- a/src/main/java/tectech/thing/block/RenderForgeOfGods.java +++ b/src/main/java/tectech/thing/block/RenderForgeOfGods.java @@ -429,6 +429,10 @@ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, fl 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 dfe4bab143a..49ab89de2b1 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 void setRotationSpeed(float speed) { } 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 void setColor(float r, float g, float b, float gamma) { 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 static float interpolate(float x0, float x1, float y0, float y1, float x) 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 void writeToNBT(NBTTagCompound compound) { 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 void readFromNBT(NBTTagCompound compound) { 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 f2774dc42fa..55cfbb42c40 100644 --- a/src/main/java/tectech/thing/gui/TecTechUITextures.java +++ b/src/main/java/tectech/thing/gui/TecTechUITextures.java @@ -84,6 +84,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 +210,6 @@ 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_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 d3ac3939272..df0f1ba82e4 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.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; @@ -38,13 +39,16 @@ 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 +57,7 @@ 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 +65,7 @@ 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 +104,6 @@ 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 +131,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 +149,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 ItemStack[] storedUpgradeWindowItems = new ItemStack[16]; public ArrayList moduleHatches = new ArrayList<>(); protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16); @@ -156,6 +171,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 +201,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 +232,8 @@ public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBu false, true); } - if (stackSize.stackSize > 2) { + + if (stackSize.stackSize > 2 && ringAmount < 3) { built += survivialBuildPiece( STRUCTURE_PIECE_THIRD_RING, stackSize, @@ -408,14 +441,8 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { if (ticker % (5 * SECONDS) == 0) { ticker = 0; startRecipeProcessing(); - FluidStack[] fluidInHatch = null; - boolean fuelDrained = false; - if (mInputHatches != null && mInputHatches.size() != 0) { - fluidInHatch = this.getStoredFluids() - .toArray(new FluidStack[0]); - } - int maxModuleCount = 8; + int maxModuleCount = 8; if (upgrades[26]) { maxModuleCount += 4; } @@ -451,37 +478,7 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { 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 +521,33 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { } } + 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 +617,10 @@ private void UpdateRenderer() { 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 +790,7 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont 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 +894,22 @@ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildCont .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 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 +1076,15 @@ protected ModularWindow createFuelConfigWindow(final EntityPlayer player) { .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 +1319,14 @@ protected ModularWindow createMilestoneWindow(final EntityPlayer player) { .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 +1403,7 @@ protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer playe .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 +1417,7 @@ protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer playe .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 +1426,10 @@ protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer playe .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 +1440,7 @@ protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer playe 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) { @@ -1859,6 +1913,31 @@ protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) { 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( @@ -2033,74 +2112,10 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) .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 +2142,88 @@ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) 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 +2280,23 @@ private Widget createUpgradeBox(int upgradeID, int colorCode, int milestone, int 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 +2372,12 @@ protected ModularWindow createManualInsertionWindow(final EntityPlayer player) { 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 columnList = Arrays.asList(column1, column2, column3, column4, column5, column6); ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT); builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT); @@ -2605,10 +2706,9 @@ protected ModularWindow createSpecialThanksWindow(final EntityPlayer player) { .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)) @@ -2677,6 +2777,269 @@ protected ModularWindow createSpecialThanksWindow(final EntityPlayer player) { 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(); + widget.getContext() + .closeWindow(STAR_COLOR_CONFIG_WINDOW_ID); + widget.getContext() + .openSyncedWindow(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"); @@ -2705,6 +3068,7 @@ public MultiblockTooltipBuilder createTooltip() { + 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 @@ -3090,11 +3454,55 @@ private Text gravitonShardAmountText(int milestoneID) { 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; @@ -3107,42 +3515,14 @@ private Text totalMilestoneProgress(int milestoneID) { 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); - } - } - } - 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); + default -> throw new IllegalArgumentException("Invalid Milestone ID"); } - + return new Text( + translateToLocal("gt.blockmachines.multimachine.FOG.totalprogress") + ": " + + EnumChatFormatting.GRAY + + formattingMode.format(progress) + + " " + + suffix); } private Text currentMilestone(int milestoneID) { @@ -3152,77 +3532,56 @@ private Text currentMilestone(int milestoneID) { + 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 - + "?"); + + // todo what is this for? + // if (noFormatting) { + // done = new Text( + // translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete") + 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() { @@ -3321,6 +3680,7 @@ public void setItemNBT(NBTTagCompound NBT) { 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(); @@ -3361,6 +3721,16 @@ public void saveNBTData(NBTTagCompound NBT) { 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(); @@ -3382,6 +3752,20 @@ public void saveNBTData(NBTTagCompound NBT) { } 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); } @@ -3401,6 +3785,16 @@ public void loadNBTData(NBTTagCompound NBT) { 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"); @@ -3416,6 +3810,18 @@ public void loadNBTData(NBTTagCompound NBT) { 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/MTEExoticModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEExoticModule.java index ee8b5396ad2..ae09e68764e 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 @@ -635,6 +635,11 @@ private void setMagmatterMode(boolean enabled) { magmatterMode = enabled; } + @Override + protected boolean filtersFluid() { + return false; + } + @Override public MultiblockTooltipBuilder createTooltip() { final MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); 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 08d99bde8c4..5f6bb2534dd 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 @@ protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { 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 @@ protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe .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/util/GodforgeMath.java b/src/main/java/tectech/util/GodforgeMath.java index a3105e08a12..3eecedfa384 100644 --- a/src/main/java/tectech/util/GodforgeMath.java +++ b/src/main/java/tectech/util/GodforgeMath.java @@ -21,12 +21,11 @@ public static double calculateFuelConsumption(MTEForgeOfGods godforge) { upgradeFactor = 0.8; } if (godforge.getFuelType() == 0) { - return Math - .max(godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor, 1); + return godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor; } if (godforge.getFuelType() == 1) { - return Math.max(godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor, 1); - } else return Math.max(godforge.getFuelFactor() / 25 * upgradeFactor, 1); + return godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor; + } else return godforge.getFuelFactor() / 25f * upgradeFactor; } public static int calculateStartupFuelConsumption(MTEForgeOfGods godforge) { diff --git a/src/main/java/tectech/util/TTUtility.java b/src/main/java/tectech/util/TTUtility.java index f552fde9848..d8f60a4c373 100644 --- a/src/main/java/tectech/util/TTUtility.java +++ b/src/main/java/tectech/util/TTUtility.java @@ -40,7 +40,14 @@ public static String toExponentForm(BigInteger number) { String strNum = abs.toString(); int exponent = strNum.length() - 1; return (number.signum() == -1 ? "-" : "") + strNum.charAt(0) + "." + strNum.substring(1, 3) + "e" + exponent; + } + public static String toExponentForm(long number) { + long abs = Math.abs(number); + String strNum = Long.toString(abs); + int exponent = strNum.length() - 1; + return (Long.signum(number) == -1 ? "-" : "") + strNum + .charAt(0) + "." + strNum.substring(1, 3) + "e" + exponent; } public static int bitStringToInt(String bits) { diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.infinityplasma.png b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.infinity.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.infinityplasma.png rename to src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.infinity.png diff --git a/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.infinityplasma.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.infinity.png.mcmeta similarity index 100% rename from src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.infinityplasma.png.mcmeta rename to src/main/resources/assets/gregtech/textures/blocks/fluids/fluid.plasma.infinity.png.mcmeta diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang index 768b8ccf81c..6097daa94f0 100644 --- a/src/main/resources/assets/tectech/lang/en_US.lang +++ b/src/main/resources/assets/tectech/lang/en_US.lang @@ -891,7 +891,7 @@ achievement.gt.stabilisation_field_generator.8=Gallifreyan Stabilisation Field G fog.upgrade.confirm=Construct fog.upgrade.respec=Respec -fog.upgrade.tt.0=upgrade start +fog.upgrade.tt.0=Forge of the Gods fog.upgrade.tt.1=Improved Gravitational Convection Coils fog.upgrade.tt.2=Spacetime Topology Expansion Modulator fog.upgrade.tt.3=Cosmic Fuel Chamber Expansion @@ -922,6 +922,7 @@ fog.upgrade.tt.27=Transfinite Stellar Existence fog.upgrade.tt.28=The Boundless Flow fog.upgrade.tt.29=Effortless Existence fog.upgrade.tt.30=Orion’s Arm Genesis Schema +fog.upgrade.tt.secret=Secret Upgrade fog.upgrade.tt.short.0=START fog.upgrade.tt.short.1=IGCC @@ -954,6 +955,7 @@ fog.upgrade.tt.short.27=TSE fog.upgrade.tt.short.28=TBF fog.upgrade.tt.short.29=EE fog.upgrade.tt.short.30=END +fog.upgrade.tt.short.secret=SECRET fog.upgrade.lore.0=The Forge of the Gods is an immensely powerful structure constructed around a stabilized neutron star – it is so advanced that its full capabilities are not yet understood. However, through continued use, one can slowly upgrade and expand the range of abilities of the Forge, and learn the power hidden in the most extreme parts of the universe: graviton shards. This esoteric material can only be found where conventional matter and degenerate neutronium crust matter on the surface of a neutron star meet. At this point in space, gravitons are far more common and irradiate this material mixture to create highly unstable graviton shards, which can be used to internally upgrade the Forge. While these shards cannot yet exist outside the extreme conditions of the Forge, with continued research and utilization it may be possible to eventually isolate and extract them outside the Forge – but for what purpose? fog.upgrade.lore.1=The first major upgrade of the Forge of the Gods has allowed for greater processing speeds as the heat increases, thanks to the gravitational warping effects of graviton shards. This is the first of many applications of the shards, which will be discovered through continuous use of the Forge. @@ -1006,7 +1008,7 @@ fog.upgrade.text.15=Allows the Heliothermal Plasma Fabricator to process multi s fog.upgrade.text.16=Allows the Helioflare Power Forge to receive the full benefits of the Helioflux Melting Core upgrade path. fog.upgrade.text.17=Increases the cap of EBF heat bonuses to 30,000K. fog.upgrade.text.18=Unlocks a multiplier to maximum parallel based on current heat. This bonus is calculated via this formula: Multiplier = 1 + Heat / 15000 -fog.upgrade.text.19=Improves the EBF energy reduction heat bonus from 5% to 8% and adds an energy discount based on the fill level of the internal battery. This bonus is calculated via this formula: Discount = (Current fill level / Max Capacity - 0.5)^2 * (-0,6) + 0,15 +fog.upgrade.text.19=Improves the EBF energy reduction heat bonus from 5% to 8% and adds an energy discount based on the fill level of the internal battery. This bonus is calculated via this formula: Discount = (Current fill level / Max Capacity - 0.5)^2 * (-0.6) + 0.15 fog.upgrade.text.20=EBF heat bonuses are granted above 30,000K, but the heat value used in heat bonus calculations is determined by this formula: Actual Heat = 30000 + (Current Heat - 30000)^0.85 fog.upgrade.text.21=Unlocks a multiplier to maximum parallel based on total amount of purchased upgrades. This bonus is calculated via this formula: Multiplier = 1 + Upgrade Amount / 5 fog.upgrade.text.22=Improves IGCC based on current maximum parallel. Improved Formula: Multiplier = (1 / Heat^0.01) / (Parallel^0.02) @@ -1043,7 +1045,11 @@ fog.button.exoticinputs.tooltip=Click to display expected inputs fog.button.reciperefresh.tooltip=Click to reset recipe fog.button.refreshtimer.tooltip=Reset ready in fog.button.seconds=Seconds -fog.button.thanks.tooltip=Open List of Contributors +fog.button.thanks.tooltip=List of Contributors +fog.button.color.tooltip=Cosmetics Menu +fog.button.updaterenderer.tooltip=Apply Changes +fog.button.resetcosmetics.tooltip=Reset Values +fog.button.rainbowmode.tooltip=Toggle Rainbow Mode achievement.gt.blockmachines.multimachine.em.forge_of_gods=Forge of the Gods @@ -1108,13 +1114,13 @@ gt.blockmachines.multimachine.FOG.milestones=Milestones gt.blockmachines.multimachine.FOG.fuelinfotext=Once the structure of the Forge is built and the multiblock is formed, just simply turning it on is not sufficient to make it functional. The Forge must be supplied with a certain amount of Star Fuel (the item) to actually boot up. The amount of Star Fuel needed depends on the current fuel consumption factor, which can be set in the fuel configuration menu. By default the maximum is 5, but it can be increased later on with upgrades. Star Fuel scaling is as follows: factor*25*1.2^factor. Star Fuel can be supplied via an input bus, it gets consumed periodically and stored internally. Once there is enough Star Fuel stored in the multi, it turns on for real (allowing modules to connect) and converts the consumed Star Fuel into stored Stellar Fuel. From this point onwards, the Forge must be fueled via one of the liquid fuels (type can be selected in the fuel config menu). If there isn't enough of the selected fuel present in the input hatch, the stored fuel amount will decrease and if it reaches 0, the Forge enters the previous 'off' state where modules disconnect and it has to be supplied with Star Fuel again. The amount of internally stored Stellar Fuel (liquid) can be increased by turning on battery charging, this will cause the fuel usage to double, but half of it will be stored in the internal battery. gt.blockmachines.multimachine.FOG.moduleinfotext=There are 4 types of modules that can be used in the Forge, the Helioflare Power Forge, Helioflux Melting Core, Heliothermal Plasma Fabricator and Heliofusion Exoticizer. These modules are separate multiblocks that have to be built into the Godforge structure at their designated spots. Once built, these modules have to connect to the Godforge, which happens automatically if all requirements for the respective module are met. Alternatively, there is a button to refresh their status without waiting for the timer. Each of these modules has its specialized functionality & requirements and is affected differently by certain upgrades. The first unlocked module is the §BHelioflare Power Forge§6, which simply put is a blast furnace even more powerful than the mega version. Additionally, this module has a furnace mode, turning it into a hyper powerful multi smelter. This module is unlocked by default and has 1024 base parallel. The second unlock is the §BHelioflux Melting Core§6, which also processes blast furnace recipes, but with a twist, the outputs are ejected in their molten form instead of hot/regular ingots. If an output does not have a molten form, it will output its regular form. This module has to be unlocked by an upgrade to function and has 512 base parallel. The third module is the §BHeliothermal Plasma Fabricator§6, which possesses a unique recipemap featuring direct material to plasma conversion recipes. These recipes are grouped by two properties, fusion tier and steps required, limiting which recipes can be processed before their respective upgrades are unlocked. Unlike regular fusion, these recipes produce the plasma of the input material. This module has 384 base parallel. The fourth and last module is the §BHeliofusion Exoticizer§6, a module capable of producing quark gluon plasma and later on magmatter. This module has unique automation challenges for both materials, so it is recommended to have two of these, as they have to be locked to either one of the materials. The common rule for both modes' automation challenges is as follows: the module outputs materials at the start of a recipe cycle and waits for the correct inputs to arrive before starting the actual processing of the output material. If producing quark-gluon plasma, the module outputs up to 7 different fluids/tiny piles with amounts between 1 and 64, and their corresponding plasmas and amounts have to be returned in order for the recipe to process. For each L of fluid, a bucket of plasma and for each tiny pile an ingot's worth of plasma must be returned for the recipe to work. If magmatter mode is active, the automation challenge changes. Now the module outputs 1-50L of tachyon rich temporal fluid, 51-100L of spatially enlarged fluid and one tiny pile of a high tier material. The challenge is to return both the tachyon rich and spatially enlarged fluids, plus as much plasma of the tiny pile's material (in ingots) as the difference between the amounts of spatially enlarged and tachyon rich fluid. Once all of these have been returned in the correct amounts, the recipe will start to process and output magmatter. This module has 64 base parallel. gt.blockmachines.multimachine.FOG.upgradeinfotext=Upgrades are the heart and soul of the Godforge, they unlock most of its functionality and processing power. The upgrade tree can be accessed via its button on the main gui and each upgrade node can be clicked for more information on its effects and unlock requirements. In general, each upgrade can only be unlocked if the prior one is unlocked and there are enough available graviton shards. One exception to this is the first upgrade, as that one has no prior upgrade. Some upgrades can also have extra material costs, which are denoted next to the unlock button if applicable. If an upgrade has more than 1 connected prior upgrade, then there are two options, either the upgrade requires ALL connected prior upgrades or AT LEAST ONE (indicated by the connection's color, red means ALL, blue means AT LEAST ONE). Upgrades can be refunded by simply pressing the unlock button again, but this only works if ALL connected later upgrades are not active/unlocked. The block of upgrades following the unlock of the Heliufusion Exoticizer module are special, as they are what is considered §Bthe Split§6. As the name suggests, only one path out of the three may be chosen at first, and the others will be locked. Each path has specialized buffs that are primarily targeted towards a specific module, and thus affect other module types with reduced effect (unless stated otherwise). The amount of unlockable paths depends on the amount of rings the Godforge has, which in turn are limited by later upgrades. -gt.blockmachines.multimachine.FOG.milestoneinfotext=Milestones are essential for upgrading the Godforge, as they are the source of graviton shards, the main currency needed for unlocking upgrades. In essence, milestones are just what their name suggests, thresholds that when reached, grant graviton shards. There are four types of milestones, Charge, Conversion, Catalyst and Composition, each referring to a stat of the Godforge. Each milestone has 7 tiers, each being harder to reach than the last, but also granting more graviton shards. The first tier grants 1 graviton shard, the second 2, etc. The §BCharge§6 milestone scales off total power consumption of all modules combined, the first tier being unlocked at 1e15 EU consumed, and each subsequent milestone scaling by 9x. The §BConversion§6 milestone scales off total recipes processed across all modules (excluding the Helioflare Power Forge's furnace mode) and its first tier is unlocked at 10M processed recipes. Following tiers scale by 6x. The §BCatalyst§6 milestone is based on the Forge's fuel consumption, counted in Stellar Fuel units (the number entered in the fuel config menu). Reaching the first tier requires 10,000 fuel units to be consumed, and each tier above scales by 3x. Last but not least, the §BComposition§6 milestone works a bit differently, as it scales off the Forge's structure. Milestone levels are granted for each unique type of module present in the structure (Helifusion Exoticizer modules on quark-gluon and magmatter mode count as unique) and for each additional ring built. Your research suggests that something strange might happen if all milestones reach their final tier... Make sure to check back! +gt.blockmachines.multimachine.FOG.milestoneinfotext=Milestones are essential for upgrading the Godforge, as they are the source of graviton shards, the main currency needed for unlocking upgrades. In essence, milestones are just what their name suggests, thresholds that when reached, grant graviton shards. There are four types of milestones, Charge, Conversion, Catalyst and Composition, each referring to a stat of the Godforge. Each milestone has 7 tiers, each being harder to reach than the last, but also granting more graviton shards. The first tier grants 1 graviton shard, the second 2, etc. The §BCharge§6 milestone scales off total power consumption of all modules combined, the first tier being unlocked at 1e15 EU consumed, and each subsequent milestone scaling by 9x. The §BConversion§6 milestone scales off total recipes processed across all modules (excluding the Helioflare Power Forge's furnace mode) and its first tier is unlocked at 10M processed recipes. Following tiers scale by 6x. The §BCatalyst§6 milestone is based on the Forge's fuel consumption, counted in Stellar Fuel units (the number entered in the fuel config menu). Reaching the first tier requires 10,000 fuel units to be consumed, and each tier above scales by 3x. Last but not least, the §BComposition§6 milestone works a bit differently, as it scales off the Forge's structure. Milestone levels are granted for each unique type of module present in the structure (Heliofusion Exoticizer modules on quark-gluon and magmatter mode count as unique) and for each additional ring built. Your research suggests that something strange might happen if all milestones reach their final tier... Make sure to check back! gt.blockmachines.multimachine.FOG.contributors=Contributors gt.blockmachines.multimachine.FOG.lead=Project Lead gt.blockmachines.multimachine.FOG.cloud=GDCloud gt.blockmachines.multimachine.FOG.programming=Programming gt.blockmachines.multimachine.FOG.teg=TheEpicGamer -gt.blockmachines.multimachine.FOG.serenybiss=§dSereni§5byss +gt.blockmachines.multimachine.FOG.serenibyss=§dSereni§5byss gt.blockmachines.multimachine.FOG.textures=Textures & Structure gt.blockmachines.multimachine.FOG.ant=Ant gt.blockmachines.multimachine.FOG.lore=Loremaster @@ -1124,6 +1130,19 @@ gt.blockmachines.multimachine.FOG.bucket=BucketBrigade gt.blockmachines.multimachine.FOG.playtesting=Playtesting gt.blockmachines.multimachine.FOG.misi=Misi gt.blockmachines.multimachine.FOG.thanks=A huge thank you to these incredible people for helping to make this a reality! -Cloud +gt.blockmachines.multimachine.FOG.cosmetics=Star Cosmetics +gt.blockmachines.multimachine.FOG.color=Color +gt.blockmachines.multimachine.FOG.misc=Miscellaneous +gt.blockmachines.multimachine.FOG.red=Red +gt.blockmachines.multimachine.FOG.green=Green +gt.blockmachines.multimachine.FOG.blue=Blue +gt.blockmachines.multimachine.FOG.gamma=Gamma +gt.blockmachines.multimachine.FOG.speed=Speed +gt.blockmachines.multimachine.FOG.spin=Spin +gt.blockmachines.multimachine.FOG.size=Size +gt.blockmachines.multimachine.FOG.apply=Apply +gt.blockmachines.multimachine.FOG.decimals=Accepts Decimals +gt.blockmachines.multimachine.FOG.integers=Accepts Integers gt.blockmachines.multimachine.FOG.hint.0=1 - Classic Hatches or Transcendentally Amplified Magnetic Confinement Casing gt.blockmachines.multimachine.FOG.hint.1=2 - Module Controllers or Singularity Reinforced Stellar Shielding Casing diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral.png new file mode 100644 index 00000000000..31645377f39 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral_off.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral_off.png new file mode 100644 index 00000000000..15e87444692 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral_off.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.png b/src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.png new file mode 100644 index 00000000000..545a44c4e5d Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.png differ