diff options
Diffstat (limited to 'src/main/java/tectech/thing/metaTileEntity/multi')
5 files changed, 709 insertions, 256 deletions
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) |
