diff options
Diffstat (limited to 'src/main')
22 files changed, 851 insertions, 277 deletions
diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java index 051eee691a..20f17eb56d 100644 --- a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java +++ b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java @@ -1310,7 +1310,7 @@ public class LoaderGTBlockFluid implements Runnable { 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 9e08460fb6..180e8514f4 100644 --- a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java +++ b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java @@ -43,6 +43,8 @@ public class BaseRecipeLoader { 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 414756a036..30e3a37f2c 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.Arrays; 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 class Godforge implements Runnable { // 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 class Godforge implements Runnable { 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 class Godforge implements Runnable { // 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 class Godforge implements Runnable { 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 class Godforge implements Runnable { 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 class Godforge implements Runnable { } + 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<ItemStack> 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 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()); } diff --git a/src/main/java/tectech/util/GodforgeMath.java b/src/main/java/tectech/util/GodforgeMath.java index a3105e08a1..1a0fa96805 100644 --- a/src/main/java/tectech/util/GodforgeMath.java +++ b/src/main/java/tectech/util/GodforgeMath.java @@ -21,12 +21,11 @@ public class GodforgeMath { 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) { @@ -293,6 +292,6 @@ public class GodforgeMath { module.setPowerTally(BigInteger.ZERO); godforge.addTotalRecipesProcessed(module.getRecipeTally()); module.setRecipeTally(0); - + module.setInversionConfig(godforge.isInversionAvailable()); } } diff --git a/src/main/java/tectech/util/TTUtility.java b/src/main/java/tectech/util/TTUtility.java index f552fde984..d8f60a4c37 100644 --- a/src/main/java/tectech/util/TTUtility.java +++ b/src/main/java/tectech/util/TTUtility.java @@ -40,7 +40,14 @@ public final class TTUtility { 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 Binary files differindex 27571f5f9c..27571f5f9c 100644 --- 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 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 index eebd2d1c9f..eebd2d1c9f 100644 --- 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 diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang index 768b8ccf81..6097daa94f 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/background/red_glow.png b/src/main/resources/assets/tectech/textures/gui/background/red_glow.png Binary files differnew file mode 100644 index 0000000000..8d7ed5c853 --- /dev/null +++ b/src/main/resources/assets/tectech/textures/gui/background/red_glow.png diff --git a/src/main/resources/assets/tectech/textures/gui/button/celestial.png b/src/main/resources/assets/tectech/textures/gui/button/celestial.png Binary files differindex 5b9bc0688a..0e2dff6336 100644 --- a/src/main/resources/assets/tectech/textures/gui/button/celestial.png +++ b/src/main/resources/assets/tectech/textures/gui/button/celestial.png 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 Binary files differnew file mode 100644 index 0000000000..31645377f3 --- /dev/null +++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral.png 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 Binary files differnew file mode 100644 index 0000000000..15e8744469 --- /dev/null +++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/rainbow_spiral_off.png diff --git a/src/main/resources/assets/tectech/textures/gui/picture/overlay_red.png b/src/main/resources/assets/tectech/textures/gui/picture/overlay_red.png Binary files differnew file mode 100644 index 0000000000..9392c28959 --- /dev/null +++ b/src/main/resources/assets/tectech/textures/gui/picture/overlay_red.png 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 Binary files differnew file mode 100644 index 0000000000..545a44c4e5 --- /dev/null +++ b/src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.png |