aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/tectech/thing/metaTileEntity/multi
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/tectech/thing/metaTileEntity/multi')
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/MTEForgeOfGods.java921
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEBaseModule.java24
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEExoticModule.java7
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTEMoltenModule.java7
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge_modules/MTESmeltingModule.java6
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)