diff options
Diffstat (limited to 'src/main/java/tectech/thing')
8 files changed, 787 insertions, 259 deletions
diff --git a/src/main/java/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/tectech/thing/block/RenderForgeOfGods.java index a911ab378f..498db3b9ed 100644 --- a/src/main/java/tectech/thing/block/RenderForgeOfGods.java +++ b/src/main/java/tectech/thing/block/RenderForgeOfGods.java @@ -429,6 +429,10 @@ public class RenderForgeOfGods extends TileEntitySpecialRenderer { long millis = System.currentTimeMillis() % (1000 * 36000); float timer = millis / (50f); // to ticks + if (forgeTile.getRainbowMode()) { + forgeTile.incrementRainbowColors(); + } + RenderEntireStar(forgeTile, x, y, z, timer); RenderRings(forgeTile, x, y, z, timer); diff --git a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java index dfe4bab143..49ab89de2b 100644 --- a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java +++ b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java @@ -17,6 +17,10 @@ public class TileEntityForgeOfGods extends TileEntity { private int ringCount = 1; private float colorR = .7f, colorG = .8f, colorB = 1f, gamma = 3f; private float rotAngle = 0, rotAxisX = 1, rotAxisY = 0, rotAxisZ = 0; + private int rainbowR = 255, rainbowG = 0, rainbowB = 0; + private int rainbowState = 0; + private boolean rainbowMode = false; + private int rainbowCycleSpeed = 1; private static final String NBT_TAG = "FOG:"; private static final String ROTATION_SPEED_NBT_TAG = NBT_TAG + "ROTATION"; @@ -30,6 +34,8 @@ public class TileEntityForgeOfGods extends TileEntity { private static final String ROT_AXIS_X_NBT_TAG = NBT_TAG + "ROT_AXIS_X"; private static final String ROT_AXIS_Y_NBT_TAG = NBT_TAG + "ROT_AXIS_Y"; private static final String ROT_AXIS_Z_NBT_TAG = NBT_TAG + "ROT_AXIS_Z"; + private static final String RAINBOW_MODE_NBT_TAG = NBT_TAG + "RAINBOW_MODE"; + private static final String RAINBOW_MODE_CYCLE_SPEED_NBT_TAG = NBT_TAG + "RAINBOW_MODE_CYCLE_SPEED"; public static final float BACK_PLATE_DISTANCE = -121.5f, BACK_PLATE_RADIUS = 13f; @@ -60,15 +66,15 @@ public class TileEntityForgeOfGods extends TileEntity { } public float getColorR() { - return colorR; + return rainbowMode ? rainbowR / 255f : colorR; } public float getColorG() { - return colorG; + return rainbowMode ? rainbowG / 255f : colorG; } public float getColorB() { - return colorB; + return rainbowMode ? rainbowB / 255f : colorB; } public float getGamma() { @@ -86,6 +92,15 @@ public class TileEntityForgeOfGods extends TileEntity { this.gamma = gamma; } + public void setRainbowMode(boolean state, int cycleSpeed) { + this.rainbowMode = state; + this.rainbowCycleSpeed = cycleSpeed; + } + + public boolean getRainbowMode() { + return rainbowMode; + } + public int getRingCount() { return ringCount; } @@ -157,6 +172,51 @@ public class TileEntityForgeOfGods extends TileEntity { return y0 + ((x - x0) * (y1 - y0)) / (x1 - x0); } + public void incrementRainbowColors() { + if (rainbowState == 0) { + rainbowG += rainbowCycleSpeed; + if (rainbowG >= 255) { + rainbowG = 255; + rainbowState = 1; + } + } + if (rainbowState == 1) { + rainbowR -= rainbowCycleSpeed; + if (rainbowR <= 0) { + rainbowR = 0; + rainbowState = 2; + } + } + if (rainbowState == 2) { + rainbowB += rainbowCycleSpeed; + if (rainbowB >= 255) { + rainbowB = 255; + rainbowState = 3; + } + } + if (rainbowState == 3) { + rainbowG -= rainbowCycleSpeed; + if (rainbowG <= 0) { + rainbowG = 0; + rainbowState = 4; + } + } + if (rainbowState == 4) { + rainbowR += rainbowCycleSpeed; + if (rainbowR >= 255) { + rainbowR = 255; + rainbowState = 5; + } + } + if (rainbowState == 5) { + rainbowB -= rainbowCycleSpeed; + if (rainbowB <= 0) { + rainbowB = 0; + rainbowState = 0; + } + } + } + @Override public void writeToNBT(NBTTagCompound compound) { super.writeToNBT(compound); @@ -171,6 +231,8 @@ public class TileEntityForgeOfGods extends TileEntity { compound.setFloat(ROT_AXIS_X_NBT_TAG, rotAxisX); compound.setFloat(ROT_AXIS_Y_NBT_TAG, rotAxisY); compound.setFloat(ROT_AXIS_Z_NBT_TAG, rotAxisZ); + compound.setBoolean(RAINBOW_MODE_NBT_TAG, rainbowMode); + compound.setInteger(RAINBOW_MODE_CYCLE_SPEED_NBT_TAG, rainbowCycleSpeed); } @Override @@ -190,6 +252,8 @@ public class TileEntityForgeOfGods extends TileEntity { rotAxisX = compound.getFloat(ROT_AXIS_X_NBT_TAG); rotAxisY = compound.getFloat(ROT_AXIS_Y_NBT_TAG); rotAxisZ = compound.getFloat(ROT_AXIS_Z_NBT_TAG); + rainbowMode = compound.getBoolean(RAINBOW_MODE_NBT_TAG); + rainbowCycleSpeed = compound.getInteger(RAINBOW_MODE_CYCLE_SPEED_NBT_TAG); } @Override diff --git a/src/main/java/tectech/thing/gui/TecTechUITextures.java b/src/main/java/tectech/thing/gui/TecTechUITextures.java index f2774dc42f..298d528e21 100644 --- a/src/main/java/tectech/thing/gui/TecTechUITextures.java +++ b/src/main/java/tectech/thing/gui/TecTechUITextures.java @@ -22,6 +22,7 @@ public class TecTechUITextures { public static final UITexture BACKGROUND_GLOW_PURPLE = UITexture.fullImage(MODID, "gui/background/purple_glow"); public static final UITexture BACKGROUND_GLOW_BLUE = UITexture.fullImage(MODID, "gui/background/blue_glow"); public static final UITexture BACKGROUND_GLOW_GREEN = UITexture.fullImage(MODID, "gui/background/green_glow"); + public static final UITexture BACKGROUND_GLOW_RED = UITexture.fullImage(MODID, "gui/background/red_glow"); public static final UITexture BACKGROUND_GLOW_WHITE = UITexture.fullImage(MODID, "gui/background/white_glow"); public static final UITexture BACKGROUND_GLOW_RAINBOW = UITexture.fullImage(MODID, "gui/background/rainbow_glow"); public static final UITexture BACKGROUND_SPACE = UITexture.fullImage(MODID, "gui/background/space"); @@ -84,6 +85,10 @@ public class TecTechUITextures { .fullImage(MODID, "gui/overlay_button/battery_off"); public static final UITexture OVERLAY_BUTTON_FLAG = UITexture.fullImage(MODID, "gui/overlay_button/flag"); public static final UITexture OVERLAY_BUTTON_HEART = UITexture.fullImage(MODID, "gui/overlay_button/heart"); + public static final UITexture OVERLAY_BUTTON_RAINBOW_SPIRAL = UITexture + .fullImage(MODID, "gui/overlay_button/rainbow_spiral"); + public static final UITexture OVERLAY_BUTTON_RAINBOW_SPIRAL_OFF = UITexture + .fullImage(MODID, "gui/overlay_button/rainbow_spiral_off"); public static final UITexture OVERLAY_CYCLIC_BLUE = UITexture.fullImage(MODID, "gui/overlay_button/cyclic_blue"); public static final UITexture OVERLAY_EJECTION_LOCKED = UITexture .fullImage(MODID, "gui/overlay_button/eject_disabled"); @@ -206,5 +211,7 @@ public class TecTechUITextures { public static final UITexture PICTURE_OVERLAY_ORANGE = UITexture.fullImage(MODID, "gui/picture/overlay_orange"); public static final UITexture PICTURE_OVERLAY_GREEN = UITexture.fullImage(MODID, "gui/picture/overlay_green"); public static final UITexture PICTURE_OVERLAY_PURPLE = UITexture.fullImage(MODID, "gui/picture/overlay_purple"); + public static final UITexture PICTURE_OVERLAY_RED = UITexture.fullImage(MODID, "gui/picture/overlay_red"); + public static final UITexture PICTURE_RAINBOW_SQUARE = UITexture.fullImage(MODID, "gui/picture/rainbow_square"); } diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java b/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java index c26322d11f..5157987628 100644 --- a/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java +++ b/src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java @@ -5,6 +5,7 @@ import static gregtech.api.enums.Mods.Avaritia; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.util.GTModHandler.getModItem; import static gregtech.api.util.GTRecipeBuilder.SECONDS; +import static gregtech.api.util.GTUtility.filterValidMTEs; import static gregtech.api.util.GTUtility.formatNumbers; import static java.lang.Math.floor; import static java.lang.Math.log; @@ -32,19 +33,24 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Supplier; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; import com.google.common.collect.ImmutableList; import com.google.common.math.LongMath; +import com.google.common.primitives.Booleans; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; @@ -53,6 +59,7 @@ import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.drawable.IDrawable; import com.gtnewhorizons.modularui.api.drawable.Text; import com.gtnewhorizons.modularui.api.drawable.UITexture; +import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle; import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable; import com.gtnewhorizons.modularui.api.forge.ItemStackHandler; import com.gtnewhorizons.modularui.api.math.Alignment; @@ -60,6 +67,7 @@ import com.gtnewhorizons.modularui.api.math.Color; import com.gtnewhorizons.modularui.api.math.MainAxisAlignment; import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; +import com.gtnewhorizons.modularui.api.screen.ModularUIContext; import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.api.screen.UIBuildContext; import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder; @@ -98,7 +106,6 @@ import gregtech.api.util.HatchElementBuilder; import gregtech.api.util.IGTHatchAdder; import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.tileentities.machines.MTEHatchInputBusME; -import gregtech.common.tileentities.machines.MTEHatchInputME; import gregtech.common.tileentities.machines.MTEHatchOutputBusME; import tectech.TecTech; import tectech.loader.ConfigHandler; @@ -126,6 +133,12 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private int ringAmount = 1; private int stellarFuelAmount = 0; private int neededStartupFuel = 0; + private int rendererColorRed = 179; + private int rendererColorGreen = 204; + private int rendererColorBlue = 255; + private int rotationSpeed = 5; + private int starSize = 20; + private int rainbowCycleSpeed = 1; private long fuelConsumption = 0; private long totalRecipesProcessed = 0; private long totalFuelConsumed = 0; @@ -138,12 +151,16 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private float invertedRecipeMilestonePercentage = 0; private float invertedFuelMilestonePercentage = 0; private float invertedStructureMilestonePercentage = 0; + private float rendererGamma = 3f; private BigInteger totalPowerConsumed = BigInteger.ZERO; private boolean batteryCharging = false; private boolean inversion = false; private boolean gravitonShardEjection = false; - private boolean noFormatting = false; + private FormattingMode formattingMode = FormattingMode.NONE; private boolean isRenderActive = false; + private boolean secretUpgrade = false; + private boolean rainbowMode = false; + private final ItemStack[] storedUpgradeWindowItems = new ItemStack[16]; public ArrayList<MTEBaseModule> moduleHatches = new ArrayList<>(); protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16); @@ -156,6 +173,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private static final int MANUAL_INSERTION_WINDOW_ID = 15; private static final int GENERAL_INFO_WINDOW_ID = 16; private static final int SPECIAL_THANKS_WINDOW_ID = 17; + private static final int STAR_COLOR_CONFIG_WINDOW_ID = 18; private static final int TEXTURE_INDEX = 960; private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 }; private static final Integer[] UPGRADE_MATERIAL_ID_CONVERSION = { 0, 5, 7, 11, 26, 29, 30 }; @@ -185,10 +203,26 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, : GTOreDictUnificator.get(OrePrefixes.block, Materials.CosmicNeutronium, 1); public int survivalConstruct(ItemStack stackSize, int elementBudget, ISurvivalBuildEnvironment env) { - int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5); // 1000 blocks max per placement. - int built = survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 63, 14, 1, realBudget, env, false, true); - if (stackSize.stackSize > 1) { + int realBudget = elementBudget >= 1000 ? elementBudget : Math.min(1000, elementBudget * 5); + + survivialBuildPiece(STRUCTURE_PIECE_SHAFT, stackSize, 63, 14, 1, realBudget, env, false, true); + + int built = 0; + if (stackSize.stackSize > 0 && ringAmount < 1) { + built += survivialBuildPiece( + STRUCTURE_PIECE_FIRST_RING, + stackSize, + 63, + 14, + -59, + realBudget, + env, + false, + true); + } + + if (stackSize.stackSize > 1 && ringAmount < 2) { built += survivialBuildPiece( STRUCTURE_PIECE_SECOND_RING, stackSize, @@ -200,7 +234,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, false, true); } - if (stackSize.stackSize > 2) { + + if (stackSize.stackSize > 2 && ringAmount < 3) { built += survivialBuildPiece( STRUCTURE_PIECE_THIRD_RING, stackSize, @@ -408,14 +443,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (ticker % (5 * SECONDS) == 0) { ticker = 0; startRecipeProcessing(); - FluidStack[] fluidInHatch = null; - boolean fuelDrained = false; - if (mInputHatches != null && !mInputHatches.isEmpty()) { - fluidInHatch = this.getStoredFluids() - .toArray(new FluidStack[0]); - } - int maxModuleCount = 8; + int maxModuleCount = 8; if (upgrades[26]) { maxModuleCount += 4; } @@ -451,37 +480,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, createRenderer(); } } else { - fuelConsumption = (long) calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1); - if (fluidInHatch != null && fuelConsumption < Integer.MAX_VALUE) { - for (FluidStack fluid : fluidInHatch) { - if (fluid.isFluidEqual(validFuelList.get(selectedFuelType))) { - FluidStack fluidNeeded = new FluidStack( - validFuelList.get(selectedFuelType), - (int) fuelConsumption); - FluidStack fluidReal; - if (mInputHatches.get(0) instanceof MTEHatchInputME meHatch) { - fluidReal = meHatch.drain(ForgeDirection.UNKNOWN, fluidNeeded, true); - } else { - fluidReal = mInputHatches.get(0) - .drain(fluidNeeded.amount, true); - } - if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) { - reduceBattery(fuelConsumptionFactor); - } else { - totalFuelConsumed += getFuelFactor(); - if (batteryCharging) { - increaseBattery(fuelConsumptionFactor); - } - } - fuelDrained = true; - } - } - if (!fuelDrained) { - reduceBattery(fuelConsumptionFactor); - } - } else { - reduceBattery(fuelConsumptionFactor); - } + drainFuel(); } } @@ -524,6 +523,33 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, } } + private void drainFuel() { + fuelConsumption = (long) Math.max(calculateFuelConsumption(this) * 5 * (batteryCharging ? 2 : 1), 1); + if (fuelConsumption >= Integer.MAX_VALUE) { + reduceBattery(fuelConsumptionFactor); + return; + } + + FluidStack fuelToDrain = new FluidStack(validFuelList.get(selectedFuelType), (int) fuelConsumption); + for (MTEHatchInput hatch : filterValidMTEs(mInputHatches)) { + FluidStack drained = hatch.drain(ForgeDirection.UNKNOWN, fuelToDrain, true); + if (drained == null) { + continue; + } + + fuelToDrain.amount -= drained.amount; + + if (fuelToDrain.amount == 0) { + totalFuelConsumed += getFuelFactor(); + if (batteryCharging) { + increaseBattery(fuelConsumptionFactor); + } + return; + } + } + reduceBattery(fuelConsumptionFactor); + } + public boolean addModuleToMachineList(IGregTechTileEntity tileEntity, int baseCasingIndex) { if (tileEntity == null) { return false; @@ -593,8 +619,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, if (tile == null) return; tile.setRingCount(ringAmount); - tile.setStarRadius(20); - tile.setRotationSpeed(5); + tile.setStarRadius(starSize); + tile.setRotationSpeed(rotationSpeed); + tile.setColor(rendererColorRed / 255f, rendererColorGreen / 255f, rendererColorBlue / 255f, rendererGamma); + tile.setRainbowMode(rainbowMode, rainbowCycleSpeed); tile.updateToClient(); } @@ -764,6 +792,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, buildContext.addSyncedWindow(MANUAL_INSERTION_WINDOW_ID, this::createManualInsertionWindow); buildContext.addSyncedWindow(GENERAL_INFO_WINDOW_ID, this::createGeneralInfoWindow); buildContext.addSyncedWindow(SPECIAL_THANKS_WINDOW_ID, this::createSpecialThanksWindow); + buildContext.addSyncedWindow(STAR_COLOR_CONFIG_WINDOW_ID, this::createStarColorConfigWindow); builder.widget( new ButtonWidget().setOnClick( (clickData, widget) -> { @@ -867,6 +896,22 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .addTooltip(translateToLocal("fog.button.thanks.tooltip")) .setBackground(TecTechUITextures.OVERLAY_BUTTON_HEART) .setPos(8, 69) + .setTooltipShowUpDelay(TOOLTIP_DELAY)) + .widget( + new ButtonWidget().setOnClick( + (clickData, widget) -> { + if (!widget.isClient()) widget.getContext() + .openSyncedWindow(STAR_COLOR_CONFIG_WINDOW_ID); + }) + .setSize(16, 16) + .addTooltip(translateToLocal("fog.button.color.tooltip")) + .setBackground(() -> { + List<UITexture> button = new ArrayList<>(); + button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32); + button.add(TecTechUITextures.OVERLAY_BUTTON_RAINBOW_SPIRAL); + return button.toArray(new IDrawable[0]); + }) + .setPos(152, 91) .setTooltipShowUpDelay(TOOLTIP_DELAY)); } @@ -1033,7 +1078,15 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setTextColor(Color.WHITE.normal) .setSize(70, 18) .setPos(4, 35) - .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD)) + .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD) + .attachSyncer( + new FakeSyncWidget.ListSyncer<>( + () -> Booleans.asList(upgrades), + val -> upgrades = Booleans.toArray(val), + PacketBuffer::writeBoolean, + PacketBuffer::readBoolean), + builder, + (widget, val) -> ((NumericWidget) widget).setMaxValue(calculateMaxFuelFactor(this)))) .widget( new DrawableWidget().setDrawable(ModularUITextures.ICON_INFO) .setPos(64, 24) @@ -1268,6 +1321,14 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(233, 215)) .widget( ButtonWidget.closeWindowButton(true) + .setOnClick((data, widget) -> { + if (!widget.isClient()) { + widget.getWindow() + .closeWindow(); + widget.getContext() + .closeWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); + } + }) .setPos(382, 6)); return builder.build(); } @@ -1344,7 +1405,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(5, 50) .setSize(140, 30)) .widget( - TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID, true)) + TextWidget.dynamicText(() -> milestoneProgressText(currentMilestoneID)) .setScale(0.7f) .setDefaultColor(EnumChatFormatting.WHITE) .setSize(140, 30) @@ -1358,7 +1419,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .widget(new ButtonWidget().setOnClick((clickData, widget) -> { TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click"); if (clickData.mouseButton == 0) { - noFormatting = !noFormatting; + formattingMode = formattingMode.cycle(); } }) .setSize(10, 10) @@ -1367,7 +1428,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(5, 135) .setTooltipShowUpDelay(TOOLTIP_DELAY) .attachSyncer( - new FakeSyncWidget.BooleanSyncer(() -> noFormatting, val -> noFormatting = val), + new FakeSyncWidget.ByteSyncer( + () -> (byte) formattingMode.ordinal(), + val -> formattingMode = FormattingMode.VALUES[MathHelper + .clamp_int(val, 0, FormattingMode.VALUES.length - 1)]), builder)); return builder.build(); @@ -1378,15 +1442,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, private Widget createMilestoneButton(int milestoneID, int width, int height, Pos2d pos) { return new ButtonWidget().setOnClick((clickData, widget) -> { currentMilestoneID = milestoneID; - if (!widget.isClient()) { - if (widget.getContext() - .isWindowOpen(INDIVIDUAL_MILESTONE_WINDOW_ID)) { - widget.getContext() - .closeWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); - } - widget.getContext() - .openSyncedWindow(INDIVIDUAL_MILESTONE_WINDOW_ID); - } + reopenWindow(widget, INDIVIDUAL_MILESTONE_WINDOW_ID); }) .setSize(width, height) .setBackground(() -> switch (milestoneID) { @@ -1563,7 +1619,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .widget( createUpgradeBox( 8, - 0, + 4, 0, new int[] { 4, 7 }, true, @@ -1589,7 +1645,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .widget( createUpgradeBox( 10, - 0, + 4, 1, new int[] { 6, 7 }, true, @@ -1859,6 +1915,31 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, 12, new Pos2d(126, 798), scrollable)) + .widget( + new MultiChildWidget().addChild( + new ButtonWidget().setOnClick(((clickData, widget) -> secretUpgrade = !secretUpgrade)) + .setSize(40, 15) + .setBackground(() -> { + if (secretUpgrade) { + return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_PRESSED_32x16 }; + } + return new IDrawable[0]; + }) + .addTooltip(translateToLocal("fog.upgrade.tt.secret")) + .setTooltipShowUpDelay(20)) + .addChild( + new TextWidget(translateToLocal("fog.upgrade.tt.short.secret")).setScale(0.8f) + .setDefaultColor(EnumChatFormatting.GOLD) + .setTextAlignment(Alignment.Center) + .setSize(34, 9) + .setPos(3, 4) + .setEnabled((widget -> secretUpgrade))) + .addChild( + new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE) + .setEnabled(widget -> secretUpgrade) + .setPos(40, 4) + .setSize(20, 6)) + .setPos(new Pos2d(66, 56))) .widget(new TextWidget("").setPos(0, 945)); builder.widget( @@ -1942,6 +2023,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, background = TecTechUITextures.BACKGROUND_GLOW_GREEN; overlay = TecTechUITextures.PICTURE_OVERLAY_GREEN; } + case 4 -> { + background = TecTechUITextures.BACKGROUND_GLOW_RED; + overlay = TecTechUITextures.PICTURE_OVERLAY_RED; + } default -> { background = TecTechUITextures.BACKGROUND_GLOW_BLUE; overlay = TecTechUITextures.PICTURE_OVERLAY_BLUE; @@ -1996,7 +2081,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setPos(9, 5)) .addChild( new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID))) - .setTextAlignment(Alignment.CenterLeft) + .setTextAlignment(Alignment.Center) .setDefaultColor(EnumChatFormatting.WHITE) .setSize(WIDTH - 15, LORE_POS - 30) .setPos(9, 30)) @@ -2033,74 +2118,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, .setSize(WIDTH, HEIGHT) .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> { - int unlockedPrereqUpgrades = 0; - int unlockedSplitUpgrades = 0; if (!upgrades[currentUpgradeID]) { - for (int prereqUpgrade : prereqUpgrades[currentUpgradeID]) { - if (upgrades[prereqUpgrade]) { - unlockedPrereqUpgrades++; - } - } - if (!doesCurrentUpgradeRequireExtraMats - || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) - .indexOf(currentUpgradeID)]) { - if (allPrereqRequired[currentUpgradeID]) { - if (unlockedPrereqUpgrades == prereqUpgrades[currentUpgradeID].length - && gravitonShardsAvailable >= gravitonShardCost) { - gravitonShardsAvailable -= gravitonShardCost; - gravitonShardsSpent += gravitonShardCost; - upgrades[currentUpgradeID] = true; - } - } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades[currentUpgradeID].length == 0) { - if (isUpradeSplitStart) { - for (int splitUpgrade : FIRST_SPLIT_UPGRADES) { - if (upgrades[splitUpgrade]) { - unlockedSplitUpgrades++; - } - } - unlockedSplitUpgrades -= (ringAmount - 1); - } - if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { - gravitonShardsAvailable -= gravitonShardCost; - gravitonShardsSpent += gravitonShardCost; - upgrades[currentUpgradeID] = true; - } - } - } + completeUpgrade(); } else { - int unlockedFollowupUpgrades = 0; - int unlockedNeighboringUpgrades = 0; - boolean doesFollowupRequireAllPrereqs = false; - boolean canFollowupSpareAConnection = true; - - for (int followupUpgrade : followupUpgrades) { - if (upgrades[followupUpgrade]) { - unlockedFollowupUpgrades++; - } - if (allPrereqRequired[followupUpgrade]) { - doesFollowupRequireAllPrereqs = true; - } - int[] currentPrereqs = prereqUpgrades[followupUpgrade]; - for (int prereqUpgrade : currentPrereqs) { - if (upgrades[prereqUpgrade]) { - unlockedNeighboringUpgrades++; - } - } - if (unlockedNeighboringUpgrades <= 1) { - canFollowupSpareAConnection = false; - } - unlockedNeighboringUpgrades = 0; - } - - if (!doesFollowupRequireAllPrereqs && followupUpgrades.length > 0 && canFollowupSpareAConnection) { - unlockedFollowupUpgrades = 0; - } - - if (unlockedFollowupUpgrades == 0) { - gravitonShardsAvailable += gravitonShardCost; - gravitonShardsSpent -= gravitonShardCost; - upgrades[currentUpgradeID] = false; - } + respecUpgrade(); } }) .setSize(40, 15) @@ -2127,15 +2148,88 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, return builder.build(); } + private void completeUpgrade() { + int unlockedPrereqUpgrades = 0; + int unlockedSplitUpgrades = 0; + if (!upgrades[currentUpgradeID]) { + for (int prereqUpgrade : prereqUpgrades[currentUpgradeID]) { + if (upgrades[prereqUpgrade]) { + unlockedPrereqUpgrades++; + } + } + if (!doesCurrentUpgradeRequireExtraMats + || materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION) + .indexOf(currentUpgradeID)]) { + if (allPrereqRequired[currentUpgradeID]) { + if (unlockedPrereqUpgrades == prereqUpgrades[currentUpgradeID].length + && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; + upgrades[currentUpgradeID] = true; + } + } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades[currentUpgradeID].length == 0) { + if (isUpradeSplitStart) { + for (int splitUpgrade : FIRST_SPLIT_UPGRADES) { + if (upgrades[splitUpgrade]) { + unlockedSplitUpgrades++; + } + } + unlockedSplitUpgrades -= (ringAmount - 1); + } + if (unlockedSplitUpgrades <= 0 && gravitonShardsAvailable >= gravitonShardCost) { + gravitonShardsAvailable -= gravitonShardCost; + gravitonShardsSpent += gravitonShardCost; + upgrades[currentUpgradeID] = true; + } + } + } + } + } + + private void respecUpgrade() { + int unlockedFollowupUpgrades = 0; + int unlockedNeighboringUpgrades = 0; + boolean doesFollowupRequireAllPrereqs = false; + boolean canFollowupSpareAConnection = true; + + for (int followupUpgrade : followupUpgrades) { + if (upgrades[followupUpgrade]) { + unlockedFollowupUpgrades++; + if (allPrereqRequired[followupUpgrade]) { + doesFollowupRequireAllPrereqs = true; + } + int[] currentPrereqs = prereqUpgrades[followupUpgrade]; + for (int prereqUpgrade : currentPrereqs) { + if (upgrades[prereqUpgrade]) { + unlockedNeighboringUpgrades++; + } + } + if (unlockedNeighboringUpgrades <= 1) { + canFollowupSpareAConnection = false; + } + } + + unlockedNeighboringUpgrades = 0; + } + + if (!doesFollowupRequireAllPrereqs && followupUpgrades.length > 0 && canFollowupSpareAConnection) { + unlockedFollowupUpgrades = 0; + } + + if (unlockedFollowupUpgrades == 0) { + gravitonShardsAvailable += gravitonShardCost; + gravitonShardsSpent -= gravitonShardCost; + upgrades[currentUpgradeID] = false; + } + } + private Widget createMaterialInputButton(int upgradeID, int xCoord, int yCoord, IWidgetBuilder<?> builder) { return new ButtonWidget().setOnClick((clickData, widget) -> { if (!widget.isClient() && doesCurrentUpgradeRequireExtraMats) { - widget.getContext() - .openSyncedWindow(MANUAL_INSERTION_WINDOW_ID); - widget.getContext() - .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID); - widget.getContext() - .closeWindow(UPGRADE_TREE_WINDOW_ID); + ModularUIContext ctx = widget.getContext(); + ctx.openSyncedWindow(MANUAL_INSERTION_W |
