aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/gregtech/api/gui/modularui/GTUITextures.java1
-rw-r--r--src/main/java/gregtech/api/util/GTRecipeConstants.java6
-rw-r--r--src/main/java/tectech/loader/recipe/BaseRecipeLoader.java1
-rw-r--r--src/main/java/tectech/loader/recipe/Godforge.java220
-rw-r--r--src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java74
-rw-r--r--src/main/java/tectech/recipe/TecTechRecipeMaps.java12
-rw-r--r--src/main/java/tectech/thing/block/RenderForgeOfGods.java4
-rw-r--r--src/main/java/tectech/thing/block/TileEntityForgeOfGods.java2
-rw-r--r--src/main/java/tectech/thing/gui/TecTechUITextures.java3
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java1
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java178
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java2368
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java10
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java10
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java12
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java29
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java (renamed from src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java)2
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java (renamed from src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java)2
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java475
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java285
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java (renamed from src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java)361
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java (renamed from src/main/java/tectech/util/GodforgeMath.java)70
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java47
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java46
-rw-r--r--src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java72
-rw-r--r--src/main/resources/assets/gregtech/textures/gui/picture/arrow_gray.pngbin0 -> 195 bytes
-rw-r--r--src/main/resources/assets/tectech/lang/en_US.lang33
-rw-r--r--src/main/resources/assets/tectech/textures/gui/overlay_button/statistics.pngbin0 -> 445 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/green_checkmark.pngbin0 -> 212 bytes
-rw-r--r--src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.pngbin3493 -> 3665 bytes
30 files changed, 2564 insertions, 1760 deletions
diff --git a/src/main/java/gregtech/api/gui/modularui/GTUITextures.java b/src/main/java/gregtech/api/gui/modularui/GTUITextures.java
index 2e0fc114d9..499f043af1 100644
--- a/src/main/java/gregtech/api/gui/modularui/GTUITextures.java
+++ b/src/main/java/gregtech/api/gui/modularui/GTUITextures.java
@@ -537,6 +537,7 @@ public class GTUITextures {
public static final UITexture PICTURE_SLOTS_HOLO_3BY3 = UITexture
.fullImage(GregTech.ID, "gui/picture/slots_holo_3by3");
public static final UITexture PICTURE_ARROW_DOUBLE = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_double");
+ public static final UITexture PICTURE_ARROW_GRAY = UITexture.fullImage(GregTech.ID, "gui/picture/arrow_gray");
public static final UITexture PICTURE_SUPER_BUFFER = UITexture.fullImage(GregTech.ID, "gui/picture/super_buffer");
public static final UITexture PICTURE_SQUARE_LIGHT_GRAY = UITexture
.fullImage(GregTech.ID, "gui/picture/square_light_gray");
diff --git a/src/main/java/gregtech/api/util/GTRecipeConstants.java b/src/main/java/gregtech/api/util/GTRecipeConstants.java
index 883f1060ac..f0e4cacd65 100644
--- a/src/main/java/gregtech/api/util/GTRecipeConstants.java
+++ b/src/main/java/gregtech/api/util/GTRecipeConstants.java
@@ -130,6 +130,12 @@ public class GTRecipeConstants {
.create(Boolean.class, "fog_plasma_multistep");
/**
+ * FOG Shortened upgrade name.
+ */
+ public static final RecipeMetadataKey<String> FOG_UPGRADE_NAME_SHORT = SimpleRecipeMetadataKey
+ .create(String.class, "fog_plasma_upgrade_name_short");
+
+ /**
* DEFC Casing tier.
*/
public static final RecipeMetadataKey<Integer> DEFC_CASING_TIER = SimpleRecipeMetadataKey
diff --git a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java
index 180e8514f4..445dd9c069 100644
--- a/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java
+++ b/src/main/java/tectech/loader/recipe/BaseRecipeLoader.java
@@ -46,5 +46,6 @@ public class BaseRecipeLoader {
} else {
Godforge.runDevEnvironmentRecipes();
}
+ Godforge.addFakeUpgradeCostRecipes();
}
}
diff --git a/src/main/java/tectech/loader/recipe/Godforge.java b/src/main/java/tectech/loader/recipe/Godforge.java
index 981f6b139a..51be5b9e7f 100644
--- a/src/main/java/tectech/loader/recipe/Godforge.java
+++ b/src/main/java/tectech/loader/recipe/Godforge.java
@@ -11,9 +11,10 @@ import static gregtech.api.util.GTRecipeConstants.COIL_HEAT;
import static gregtech.api.util.GTRecipeConstants.FOG_EXOTIC_TIER;
import static gregtech.api.util.GTRecipeConstants.FOG_PLASMA_MULTISTEP;
import static gregtech.api.util.GTRecipeConstants.FOG_PLASMA_TIER;
+import static gregtech.api.util.GTRecipeConstants.FOG_UPGRADE_NAME_SHORT;
import static tectech.recipe.TecTechRecipeMaps.godforgeExoticMatterRecipes;
import static tectech.recipe.TecTechRecipeMaps.godforgePlasmaRecipes;
-import static tectech.util.GodforgeMath.getRandomIntInRange;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.getRandomIntInRange;
import java.util.ArrayList;
import java.util.Arrays;
@@ -26,6 +27,8 @@ import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.oredict.OreDictionary;
+import org.apache.commons.lang3.ArrayUtils;
+
import goodgenerator.items.GGMaterial;
import goodgenerator.util.ItemRefer;
import gregtech.api.enums.GTValues;
@@ -47,6 +50,7 @@ import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList;
import tectech.recipe.TecTechRecipeMaps;
import tectech.thing.CustomItemList;
+import tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade;
public class Godforge implements Runnable {
@@ -55,7 +59,6 @@ public class Godforge implements Runnable {
public static final HashMap<ItemStack, Integer> exoticModulePlasmaItemMap = new HashMap<>();
public static final HashMap<FluidStack, Integer> exoticModulePlasmaFluidMap = new HashMap<>();
public static final HashMap<ItemStack, Integer> exoticModuleMagmatterItemMap = new HashMap<>();
- public static final HashMap<Integer, ItemStack[]> godforgeUpgradeMats = new HashMap<>();
public static final List<ItemStack> quarkGluonFluidItemsForNEI = new ArrayList<>();
public static final List<ItemStack> quarkGluonItemsForNEI = new ArrayList<>();
public static final List<ItemStack> magmatterTimeFluidItemsForNEI = new ArrayList<>();
@@ -688,83 +691,154 @@ public class Godforge implements Runnable {
// Godforge upgrade materials
if (EternalSingularity.isModLoaded() && GalaxySpace.isModLoaded()) {
- godforgeUpgradeMats.put(
- 0,
- new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUIVBase, 64),
- ItemList.SuperconductorComposite.get(32),
- GGMaterial.metastableOganesson.get(OrePrefixes.gearGt, 16),
- getModItem(EternalSingularity.ID, "eternal_singularity", 8L), ItemList.Robot_Arm_UIV.get(64L),
- ItemList.Field_Generator_UEV.get(64L) });
-
- godforgeUpgradeMats.put(
- 5,
- new ItemStack[] { GregtechItemList.Mega_AlloyBlastSmelter.get(16L),
- ItemList.Casing_Coil_Hypogen.get(64L),
- CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(32L),
- getModItem(EternalSingularity.ID, "eternal_singularity", 16L),
- ItemRefer.Field_Restriction_Coil_T3.get(48), ItemList.Robot_Arm_UIV.get(64L),
- ItemList.Field_Generator_UEV.get(64L) });
-
- godforgeUpgradeMats.put(
- 7,
- new ItemStack[] { CustomItemList.Godforge_StellarEnergySiphonCasing.get(8),
- GregtechItemList.FusionComputer_UV3.get(8), GregtechItemList.Casing_Fusion_Internal2.get(64),
- getModItem(GalaxySpace.ID, "item.DysonSwarmParts", 64, 3), MaterialsAlloy.QUANTUM.getPlateDense(48),
- MaterialsElements.STANDALONE.RHUGNOR.getGear(32),
- getModItem(EternalSingularity.ID, "eternal_singularity", 16L), ItemList.Robot_Arm_UIV.get(64L),
- ItemList.Field_Generator_UEV.get(64L) });
-
- godforgeUpgradeMats.put(
- 11,
- new ItemStack[] { CustomItemList.Godforge_StellarEnergySiphonCasing.get(16),
- ItemRefer.Compact_Fusion_MK5.get(2), ItemRefer.Compact_Fusion_Coil_T4.get(64),
- CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(16),
- ItemList.Machine_Multi_TranscendentPlasmaMixer.get(4),
- MaterialsElements.STANDALONE.RHUGNOR.getGear(64),
- GTOreDictUnificator.get(OrePrefixes.gearGt, Materials.Ichorium, 64),
- getModItem(EternalSingularity.ID, "eternal_singularity", 32L), ItemList.Robot_Arm_UIV.get(64L),
- ItemList.Field_Generator_UEV.get(64L) });
-
- godforgeUpgradeMats.put(
- 26,
- new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 64),
- GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUMVBase, 64),
- MaterialsElements.STANDALONE.HYPOGEN.getFrameBox(64),
- MaterialsElements.STANDALONE.DRAGON_METAL.getFrameBox(64),
- CustomItemList.EOH_Reinforced_Spatial_Casing.get(64),
- CustomItemList.EOH_Infinite_Energy_Casing.get(8), ItemList.ZPM6.get(2),
- ItemList.Field_Generator_UMV.get(32) });
-
- godforgeUpgradeMats.put(
- 29,
- new ItemStack[] { GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 64),
- GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 64),
- GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Eternity, 16),
- GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Universium, 2),
- CustomItemList.EOH_Infinite_Energy_Casing.get(64),
- CustomItemList.StabilisationFieldGeneratorTier5.get(16), ItemList.ZPM6.get(6),
- ItemList.Field_Generator_UMV.get(64) });
-
- godforgeUpgradeMats.put(
- 30,
- new ItemStack[] { CustomItemList.Machine_Multi_QuarkGluonPlasmaModule.get(32),
- CustomItemList.Godforge_StellarEnergySiphonCasing.get(64),
- CustomItemList.StabilisationFieldGeneratorTier6.get(48),
- ItemList.Transdimensional_Alignment_Matrix.get(8), ItemList.ZPM6.get(16),
- ItemList.Robot_Arm_UMV.get(64), ItemList.Conveyor_Module_UMV.get(64) });
+ ForgeOfGodsUpgrade.START.addExtraCost(
+ GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUIVBase, 64),
+ ItemList.SuperconductorComposite.get(32),
+ GGMaterial.metastableOganesson.get(OrePrefixes.gearGt, 16),
+ getModItem(EternalSingularity.ID, "eternal_singularity", 8L),
+ ItemList.Robot_Arm_UIV.get(64L),
+ ItemList.Field_Generator_UEV.get(64L));
+
+ ForgeOfGodsUpgrade.FDIM.addExtraCost(
+ GregtechItemList.Mega_AlloyBlastSmelter.get(16L),
+ ItemList.Casing_Coil_Hypogen.get(64L),
+ CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(32L),
+ getModItem(EternalSingularity.ID, "eternal_singularity", 16L),
+ ItemRefer.Field_Restriction_Coil_T3.get(48),
+ ItemList.Robot_Arm_UIV.get(64L),
+ ItemList.Field_Generator_UEV.get(64L));
+
+ ForgeOfGodsUpgrade.GPCI.addExtraCost(
+ CustomItemList.Godforge_StellarEnergySiphonCasing.get(8),
+ GregtechItemList.FusionComputer_UV3.get(8),
+ GregtechItemList.Casing_Fusion_Internal2.get(64),
+ getModItem(GalaxySpace.ID, "item.DysonSwarmParts", 64, 3),
+ MaterialsAlloy.QUANTUM.getPlateDense(48),
+ MaterialsElements.STANDALONE.RHUGNOR.getGear(32),
+ getModItem(EternalSingularity.ID, "eternal_singularity", 16L),
+ ItemList.Robot_Arm_UIV.get(64L),
+ ItemList.Field_Generator_UEV.get(64L));
+
+ ForgeOfGodsUpgrade.QGPIU.addExtraCost(
+ CustomItemList.Godforge_StellarEnergySiphonCasing.get(16),
+ ItemRefer.Compact_Fusion_MK5.get(2),
+ ItemRefer.Compact_Fusion_Coil_T4.get(64),
+ CustomItemList.Godforge_HarmonicPhononTransmissionConduit.get(16),
+ ItemList.Machine_Multi_TranscendentPlasmaMixer.get(4),
+ MaterialsElements.STANDALONE.RHUGNOR.getGear(64),
+ GTOreDictUnificator.get(OrePrefixes.gearGt, Materials.Ichorium, 64),
+ getModItem(EternalSingularity.ID, "eternal_singularity", 32L),
+ ItemList.Robot_Arm_UIV.get(64L),
+ ItemList.Field_Generator_UEV.get(64L));
+
+ ForgeOfGodsUpgrade.CD.addExtraCost(
+ GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.SpaceTime, 64),
+ GTOreDictUnificator.get(OrePrefixes.frameGt, Materials.SuperconductorUMVBase, 64),
+ MaterialsElements.STANDALONE.HYPOGEN.getFrameBox(64),
+ MaterialsElements.STANDALONE.DRAGON_METAL.getFrameBox(64),
+ CustomItemList.EOH_Reinforced_Spatial_Casing.get(64),
+ CustomItemList.EOH_Infinite_Energy_Casing.get(8),
+ ItemList.ZPM6.get(2),
+ ItemList.Field_Generator_UMV.get(32));
+
+ ForgeOfGodsUpgrade.EE.addExtraCost(
+ GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.WhiteDwarfMatter, 64),
+ GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.BlackDwarfMatter, 64),
+ GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Eternity, 16),
+ GTOreDictUnificator.get(OrePrefixes.frameGt, MaterialsUEVplus.Universium, 2),
+ CustomItemList.EOH_Infinite_Energy_Casing.get(64),
+ CustomItemList.StabilisationFieldGeneratorTier5.get(16),
+ ItemList.ZPM6.get(6),
+ ItemList.Field_Generator_UMV.get(64));
+
+ ForgeOfGodsUpgrade.END.addExtraCost(
+ CustomItemList.Machine_Multi_QuarkGluonPlasmaModule.get(32),
+ CustomItemList.Godforge_StellarEnergySiphonCasing.get(64),
+ CustomItemList.StabilisationFieldGeneratorTier6.get(48),
+ ItemList.Transdimensional_Alignment_Matrix.get(8),
+ ItemList.ZPM6.get(16),
+ ItemList.Robot_Arm_UMV.get(64),
+ ItemList.Conveyor_Module_UMV.get(64));
}
}
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, 4) });
- godforgeUpgradeMats.put(5, new ItemStack[] { new ItemStack(Blocks.cobblestone, 8) });
- godforgeUpgradeMats.put(7, new ItemStack[] { new ItemStack(Blocks.cobblestone, 12) });
- godforgeUpgradeMats.put(11, new ItemStack[] { new ItemStack(Blocks.cobblestone, 16) });
- godforgeUpgradeMats.put(26, new ItemStack[] { new ItemStack(Blocks.cobblestone, 32) });
- godforgeUpgradeMats.put(29, new ItemStack[] { new ItemStack(Blocks.cobblestone, 48) });
- godforgeUpgradeMats.put(30, new ItemStack[] { new ItemStack(Blocks.cobblestone, 64) });
+ ForgeOfGodsUpgrade.START.addExtraCost(
+ new ItemStack(Blocks.cobblestone, 4),
+ new ItemStack(Blocks.dirt, 12),
+ new ItemStack(Blocks.diamond_block, 8),
+ new ItemStack(Blocks.gold_block, 32));
+ ForgeOfGodsUpgrade.FDIM.addExtraCost(new ItemStack(Blocks.cobblestone, 8));
+ ForgeOfGodsUpgrade.GPCI.addExtraCost(new ItemStack(Blocks.cobblestone, 12));
+ ForgeOfGodsUpgrade.QGPIU.addExtraCost(new ItemStack(Blocks.cobblestone, 16));
+ ForgeOfGodsUpgrade.CD.addExtraCost(new ItemStack(Blocks.cobblestone, 32));
+ ForgeOfGodsUpgrade.EE.addExtraCost(new ItemStack(Blocks.cobblestone, 48));
+ ForgeOfGodsUpgrade.END.addExtraCost(new ItemStack(Blocks.cobblestone, 64));
+ }
+
+ public static void addFakeUpgradeCostRecipes() {
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.START.getExtraCost()))
+ .itemOutputs(
+ CustomItemList.Godforge_GravitonFlowModulatorTier1.get(1),
+ CustomItemList.Machine_Multi_SmeltingModule.get(1))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.START.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.FDIM.getExtraCost()))
+ .itemOutputs(CustomItemList.Machine_Multi_MoltenModule.get(1))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.FDIM.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.GPCI.getExtraCost()))
+ .itemOutputs(CustomItemList.Machine_Multi_PlasmaModule.get(1))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.GPCI.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.QGPIU.getExtraCost()))
+ .itemOutputs(CustomItemList.Machine_Multi_QuarkGluonPlasmaModule.get(1))
+ .fluidOutputs(MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.QGPIU.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.CD.getExtraCost()))
+ .itemOutputs(CustomItemList.Godforge_GravitonFlowModulatorTier2.get(1))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.CD.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.EE.getExtraCost()))
+ .itemOutputs(CustomItemList.Godforge_GravitonFlowModulatorTier3.get(1))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.EE.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
+ GTValues.RA.stdBuilder()
+ .itemInputs(ArrayUtils.addAll(ForgeOfGodsUpgrade.END.getExtraCost()))
+ .itemOutputs(MaterialsUEVplus.GravitonShard.getGems(1))
+ .fluidOutputs(MaterialsUEVplus.MagMatter.getMolten(576), Materials.Neutronium.getPlasma(1000))
+ .duration(1)
+ .eut(1)
+ .metadata(FOG_UPGRADE_NAME_SHORT, ForgeOfGodsUpgrade.END.getShortNameText())
+ .fake()
+ .addTo(TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes);
}
public static void initMoltenModuleRecipes() {
diff --git a/src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java b/src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java
new file mode 100644
index 0000000000..aa81856171
--- /dev/null
+++ b/src/main/java/tectech/recipe/GodforgeUpgradeCostFrontend.java
@@ -0,0 +1,74 @@
+package tectech.recipe;
+
+import static gregtech.api.util.GTRecipeConstants.FOG_UPGRADE_NAME_SHORT;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.EnumChatFormatting;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.nei.RecipeDisplayInfo;
+import tectech.thing.gui.TecTechUITextures;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class GodforgeUpgradeCostFrontend extends RecipeMapFrontend {
+
+ public GodforgeUpgradeCostFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder, Pos2d windowOffset) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_LOGO)
+ .setSize(18, 18)
+ .setPos(new Pos2d(151, 63).add(windowOffset)));
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return UIHelper.getGridPositions(itemInputCount, 8, 17, 4);
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return UIHelper.getGridPositions(itemOutputCount, 116, 26, 1);
+ }
+
+ @Override
+ public List<Pos2d> getFluidOutputPositions(int fluidOutputCount) {
+ return UIHelper.getGridPositions(fluidOutputCount, 134, 26, 1);
+ }
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {}
+
+ @Override
+ protected void drawSpecialInfo(RecipeDisplayInfo recipeInfo) {
+ String upgradeName = recipeInfo.recipe.getMetadataOrDefault(FOG_UPGRADE_NAME_SHORT, "");
+ int width = Minecraft.getMinecraft().fontRenderer.getStringWidth(upgradeName);
+ if (width % 2 == 1) width -= 1;
+ int xOffset = 18 - width / 2 - 1;
+ recipeInfo.drawText(" ", 83, -76);
+ recipeInfo.drawText(
+ EnumChatFormatting.BLUE.toString() + EnumChatFormatting.UNDERLINE + EnumChatFormatting.BOLD + upgradeName,
+ 110 + xOffset,
+ 0);
+ }
+}
diff --git a/src/main/java/tectech/recipe/TecTechRecipeMaps.java b/src/main/java/tectech/recipe/TecTechRecipeMaps.java
index d4908df5b7..de98a2c274 100644
--- a/src/main/java/tectech/recipe/TecTechRecipeMaps.java
+++ b/src/main/java/tectech/recipe/TecTechRecipeMaps.java
@@ -85,4 +85,16 @@ public class TecTechRecipeMaps {
.logoPos(151, 63)
.build();
+ public static final RecipeMap<RecipeMapBackend> godforgeFakeUpgradeCostRecipes = RecipeMapBuilder
+ .of("gt.recipe.upgrade_costs")
+ .maxIO(12, 2, 0, 2)
+ .addSpecialTexture(83, 38, 30, 13, GTUITextures.PICTURE_ARROW_GRAY)
+ .dontUseProgressBar()
+ .neiTransferRect(83, 38, 30, 13)
+ .frontend(GodforgeUpgradeCostFrontend::new)
+ .neiHandlerInfo(
+ builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_ForgeOfGods.get(1))
+ .setHeight(100))
+ .build();
+
}
diff --git a/src/main/java/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/tectech/thing/block/RenderForgeOfGods.java
index 9091434490..af67c97d44 100644
--- a/src/main/java/tectech/thing/block/RenderForgeOfGods.java
+++ b/src/main/java/tectech/thing/block/RenderForgeOfGods.java
@@ -28,8 +28,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
import tectech.Reference;
-import tectech.thing.metaTileEntity.multi.godforge.ForgeOfGodsRingsStructureString;
-import tectech.thing.metaTileEntity.multi.godforge.ForgeOfGodsStructureString;
+import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsRingsStructureString;
+import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsStructureString;
import tectech.util.StructureVBO;
import tectech.util.TextureUpdateRequester;
diff --git a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java
index a8a8992a63..0e18b08667 100644
--- a/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java
+++ b/src/main/java/tectech/thing/block/TileEntityForgeOfGods.java
@@ -200,7 +200,7 @@ public class TileEntityForgeOfGods extends TileEntity {
cycleStep = 0;
} else {
// update interp values to the next set, reset cycleStep then interpolate
- cycleStep = -255;
+ cycleStep -= 255;
cycleStarColors();
interpolateColors();
}
diff --git a/src/main/java/tectech/thing/gui/TecTechUITextures.java b/src/main/java/tectech/thing/gui/TecTechUITextures.java
index 89fb7c5b11..f8e6bbe59b 100644
--- a/src/main/java/tectech/thing/gui/TecTechUITextures.java
+++ b/src/main/java/tectech/thing/gui/TecTechUITextures.java
@@ -123,6 +123,8 @@ public class TecTechUITextures {
.fullImage(MODID, "gui/overlay_button/furnace_mode_on");
public static final UITexture OVERLAY_BUTTON_FURNACE_MODE_OFF = UITexture
.fullImage(MODID, "gui/overlay_button/furnace_mode_off");
+ public static final UITexture OVERLAY_BUTTON_STATISTICS = UITexture
+ .fullImage(MODID, "gui/overlay_button/statistics");
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");
@@ -226,6 +228,7 @@ public class TecTechUITextures {
.fullImage(MODID, "gui/picture/connector_red_opaque");
public static final UITexture SLOT_OUTLINE_GREEN = UITexture.fullImage(MODID, "gui/picture/green_selector");
public static final UITexture UNSELECTED_OPTION = UITexture.fullImage(MODID, "gui/picture/unselected_option");
+ public static final UITexture GREEN_CHECKMARK_11x9 = UITexture.fullImage(MODID, "gui/picture/green_checkmark");
public static final UITexture PICTURE_GODFORGE_MILESTONE_CHARGE = UITexture
.fullImage(MODID, "gui/picture/milestone_charge");
public static final UITexture PICTURE_GODFORGE_MILESTONE_CONVERSION = UITexture
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java
index 8b432d2ce8..85cc5b11b5 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEBaseModule.java
@@ -57,6 +57,7 @@ import gregtech.api.util.GTStructureUtility;
import tectech.TecTech;
import tectech.thing.gui.TecTechUITextures;
import tectech.thing.metaTileEntity.multi.base.TTMultiblockBase;
+import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI;
public class MTEBaseModule extends TTMultiblockBase {
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java
index d30f9402d9..e14a40f863 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEExoticModule.java
@@ -1,5 +1,6 @@
package tectech.thing.metaTileEntity.multi.godforge;
+import static gregtech.api.enums.Mods.NewHorizonsCoreMod;
import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
import static gregtech.api.util.GTRecipeBuilder.INGOTS;
import static gregtech.api.util.GTRecipeBuilder.SECONDS;
@@ -22,8 +23,6 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
-import javax.annotation.Nonnull;
-
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@@ -42,6 +41,8 @@ import com.gtnewhorizons.modularui.api.drawable.IDrawable;
import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
import com.gtnewhorizons.modularui.api.fluids.FluidTanksHandler;
import com.gtnewhorizons.modularui.api.fluids.IFluidTanksHandler;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
import com.gtnewhorizons.modularui.api.math.Alignment;
import com.gtnewhorizons.modularui.api.math.Pos2d;
import com.gtnewhorizons.modularui.api.math.Size;
@@ -53,6 +54,7 @@ import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
import com.gtnewhorizons.modularui.common.widget.TextWidget;
import gregtech.api.enums.MaterialsUEVplus;
@@ -69,13 +71,15 @@ import gregtech.api.recipe.check.SimpleCheckRecipeResult;
import gregtech.api.util.GTOreDictUnificator;
import gregtech.api.util.GTRecipe;
import gregtech.api.util.GTStreamUtil;
+import gregtech.api.util.GTUtility;
import gregtech.api.util.MultiblockTooltipBuilder;
import gregtech.api.util.OverclockCalculator;
import tectech.TecTech;
import tectech.recipe.TecTechRecipeMaps;
import tectech.thing.CustomItemList;
import tectech.thing.gui.TecTechUITextures;
-import tectech.util.GodforgeMath;
+import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI;
+import tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath;
public class MTEExoticModule extends MTEBaseModule {
@@ -93,6 +97,7 @@ public class MTEExoticModule extends MTEBaseModule {
private BigInteger powerForRecipe = BigInteger.ZERO;
private static final int NUMBER_OF_INPUTS = 7;
private static final int INPUT_LIST_WINDOW_ID = 11;
+ private static final int POSSIBLE_INPUTS_WINDOW_ID = 12;
public MTEExoticModule(int aID, String aName, String aNameRegional) {
super(aID, aName, aNameRegional);
@@ -126,7 +131,7 @@ public class MTEExoticModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) {
if (!recipeInProgress || recipeRegenerated) {
powerForRecipe = BigInteger.valueOf(getProcessingVoltage())
.multiply(BigInteger.valueOf(recipe.mDuration * actualParallel));
@@ -155,7 +160,8 @@ public class MTEExoticModule extends MTEBaseModule {
}
for (FluidStack stack : recipe.mFluidInputs) {
- if (!ArrayUtils.contains(inputFluids, stack)) {
+ if (!ArrayUtils.contains(inputFluids, stack)
+ || inputFluids[ArrayUtils.indexOf(inputFluids, stack)].amount != stack.amount) {
return SimpleCheckRecipeResult.ofFailure("waiting_for_inputs");
}
}
@@ -164,7 +170,7 @@ public class MTEExoticModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) {
EUt = calculatedEut;
powerForRecipe = BigInteger.valueOf(EUt)
.multiply(BigInteger.valueOf(duration * actualParallel));
@@ -181,9 +187,9 @@ public class MTEExoticModule extends MTEBaseModule {
return CheckRecipeResultRegistry.SUCCESSFUL;
}
- @Nonnull
+ @NotNull
@Override
- protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) {
+ protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) {
return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
.setDurationDecreasePerOC(getOverclockTimeFactor());
}
@@ -369,7 +375,7 @@ public class MTEExoticModule extends MTEBaseModule {
@Override
public boolean supportsBatchMode() {
- return false;
+ return true;
}
@Override
@@ -465,6 +471,7 @@ public class MTEExoticModule extends MTEBaseModule {
.setTooltipShowUpDelay(TOOLTIP_DELAY));
super.addUIWidgets(builder, buildContext);
buildContext.addSyncedWindow(INPUT_LIST_WINDOW_ID, this::createInputListWindow);
+ buildContext.addSyncedWindow(POSSIBLE_INPUTS_WINDOW_ID, this::createPossibleInputsWindow);
builder.widget(createMagmatterSwitch(builder));
builder.widget(createExpectedInputsButton());
builder.widget(
@@ -548,6 +555,10 @@ public class MTEExoticModule extends MTEBaseModule {
builder,
(widget, val) -> widget.notifyTooltipChange()));
+ if (NewHorizonsCoreMod.isModLoaded()) {
+ builder.widget(createPossibleInputsButton());
+ }
+
return builder.build();
}
@@ -563,6 +574,155 @@ public class MTEExoticModule extends MTEBaseModule {
.setPos(8, 69);
}
+ protected ModularWindow createPossibleInputsWindow(final EntityPlayer player) {
+ final int WIDTH = 300;
+ final int HEIGHT = 143;
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.setDraggable(true);
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(284, 4));
+
+ int QGPItemMapSize = exoticModulePlasmaItemMap.size();
+ int QGPFluidMapSize = exoticModulePlasmaFluidMap.size();
+
+ IItemHandlerModifiable QGPItemHandler = new ItemStackHandler(QGPItemMapSize);
+ IFluidTanksHandler QGPFluidHandler = new FluidTanksHandler(QGPFluidMapSize, 128000);
+
+ List<Map.Entry<ItemStack, Integer>> itemEntryList = new ArrayList<>(exoticModulePlasmaItemMap.entrySet());
+ List<Map.Entry<FluidStack, Integer>> fluidEntryList = new ArrayList<>(exoticModulePlasmaFluidMap.entrySet());
+
+ int slotYQGP = 0;
+
+ for (int i = 0; i < QGPItemMapSize + QGPFluidMapSize; i++) {
+
+ int slotXQGP = 6 + i % 16 * 18;
+ slotYQGP = 17 + i / 16 * 18;
+
+ if (i < QGPItemMapSize) {
+ QGPItemHandler.setStackInSlot(
+ i,
+ GTUtility.copyAmount(
+ 1,
+ itemEntryList.get(i)
+ .getKey()));
+ builder.widget(
+ new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_PRESSED)
+ .setPos(slotXQGP, slotYQGP)
+ .setSize(18, 18));
+ builder.widget(
+ new SlotWidget(QGPItemHandler, i).setAccess(false, false)
+ .setRenderStackSize(false)
+ .disableInteraction()
+ .setPos(slotXQGP, slotYQGP)
+ .setSize(18, 18));
+ } else {
+ QGPFluidHandler.setFluidInTank(
+ i - QGPItemMapSize,
+ fluidEntryList.get(i - QGPItemMapSize)
+ .getKey()
+ .getFluid(),
+ 1);
+ builder.widget(
+ new DrawableWidget().setDrawable(ModularUITextures.FLUID_SLOT)
+ .setSize(18, 18)
+ .setPos(slotXQGP, slotYQGP))
+ .widget(
+ new FluidSlotWidget(QGPFluidHandler, i - QGPItemMapSize).setInteraction(false, false)
+ .setSize(18, 18)
+ .setPos(slotXQGP, slotYQGP));
+ }
+ }
+
+ int magMatterItemMapSize = exoticModuleMagmatterItemMap.size();
+
+ IItemHandlerModifiable magMatterItemHandler = new ItemStackHandler(magMatterItemMapSize);
+ IFluidTanksHandler magMatterFluidHandler = new FluidTanksHandler(2, 128000);
+ magMatterFluidHandler.setFluidInTank(
+ 0,
+ MaterialsUEVplus.Space.getMolten(1)
+ .getFluid(),
+ 1);
+ magMatterFluidHandler.setFluidInTank(
+ 1,
+ MaterialsUEVplus.Time.getMolten(1)
+ .getFluid(),
+ 1);
+
+ List<Map.Entry<ItemStack, Integer>> magMatteritemEntryList = new ArrayList<>(
+ exoticModuleMagmatterItemMap.entrySet());
+
+ int slotXMagmatter;
+ int slotYMagmatter;
+
+ for (int i = 0; i < magMatterItemMapSize + 2; i++) {
+ slotXMagmatter = 6 + i % 16 * 18;
+ slotYMagmatter = slotYQGP + 30 + i / 16 * 18;
+
+ if (i < magMatterItemMapSize) {
+ magMatterItemHandler.setStackInSlot(
+ i,
+ GTUtility.copyAmount(
+ 1,
+ magMatteritemEntryList.get(i)
+ .getKey()));
+ builder.widget(
+ new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_PRESSED)
+ .setPos(slotXMagmatter, slotYMagmatter)
+ .setSize(18, 18));
+ builder.widget(
+ new SlotWidget(magMatterItemHandler, i).setAccess(false, false)
+ .setRenderStackSize(false)
+ .disableInteraction()
+ .setPos(slotXMagmatter, slotYMagmatter)
+ .setSize(18, 18));
+ } else {
+ builder.widget(
+ new DrawableWidget().setDrawable(ModularUITextures.FLUID_SLOT)
+ .setSize(18, 18)
+ .setPos(slotXMagmatter, slotYMagmatter))
+ .widget(
+ new FluidSlotWidget(magMatterFluidHandler, i - magMatterItemMapSize)
+ .setInteraction(false, false)
+ .setSize(18, 18)
+ .setPos(slotXMagmatter, slotYMagmatter));
+ }
+ }
+
+ builder.widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.possibleinputsqgp"))
+ .setDefaultColor(EnumChatFormatting.BLACK)
+ .setTextAlignment(Alignment.Center)
+ .setSize(300, 9)
+ .setPos(0, 6));
+
+ builder.widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.possibleinputsmagmatter"))
+ .setDefaultColor(EnumChatFormatting.BLACK)
+ .setTextAlignment(Alignment.Center)
+ .setSize(300, 9)
+ .setPos(0, slotYQGP + 21));
+
+ return builder.build();
+ }
+
+ private Widget createPossibleInputsButton() {
+ return new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(POSSIBLE_INPUTS_WINDOW_ID);
+ }
+ })
+ .setPlayClickSound(true)
+ .setBackground(ModularUITextures.ICON_INFO)
+ .addTooltip(translateToLocal("fog.button.possibleexoticinputs.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setSize(16, 16)
+ .setPos(79, 37);
+ }
+
protected ButtonWidget createMagmatterSwitch(IWidgetBuilder<?> builder) {
Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
if (isMagmatterCapable) {
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java
index c7d52215c9..a5f833d830 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEForgeOfGods.java
@@ -1,6 +1,9 @@
package tectech.thing.metaTileEntity.multi.godforge;
import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static gregtech.api.enums.HatchElement.InputBus;
+import static gregtech.api.enums.HatchElement.InputHatch;
+import static gregtech.api.enums.HatchElement.OutputBus;
import static gregtech.api.enums.Mods.Avaritia;
import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
import static gregtech.api.util.GTModHandler.getModItem;
@@ -11,21 +14,20 @@ import static java.lang.Math.floor;
import static java.lang.Math.log;
import static java.lang.Math.max;
import static net.minecraft.util.StatCollector.translateToLocal;
-import static tectech.loader.recipe.Godforge.godforgeUpgradeMats;
import static tectech.thing.casing.TTCasingsContainer.GodforgeCasings;
import static tectech.thing.casing.TTCasingsContainer.forgeOfGodsRenderBlock;
-import static tectech.util.GodforgeMath.allowModuleConnection;
-import static tectech.util.GodforgeMath.calculateEnergyDiscountForModules;
-import static tectech.util.GodforgeMath.calculateFuelConsumption;
-import static tectech.util.GodforgeMath.calculateMaxFuelFactor;
-import static tectech.util.GodforgeMath.calculateMaxHeatForModules;
-import static tectech.util.GodforgeMath.calculateMaxParallelForModules;
-import static tectech.util.GodforgeMath.calculateProcessingVoltageForModules;
-import static tectech.util.GodforgeMath.calculateSpeedBonusForModules;
-import static tectech.util.GodforgeMath.calculateStartupFuelConsumption;
-import static tectech.util.GodforgeMath.queryMilestoneStats;
-import static tectech.util.GodforgeMath.setMiscModuleParameters;
-import static tectech.util.TTUtility.toExponentForm;
+import static tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade.*;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.allowModuleConnection;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateEnergyDiscountForModules;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateFuelConsumption;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateMaxFuelFactor;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateMaxHeatForModules;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateMaxParallelForModules;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateProcessingVoltageForModules;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateSpeedBonusForModules;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.calculateStartupFuelConsumption;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.queryMilestoneStats;
+import static tectech.thing.metaTileEntity.multi.godforge.util.GodforgeMath.setMiscModuleParameters;
import java.awt.Desktop;
import java.awt.Toolkit;
@@ -36,7 +38,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.Objects;
import java.util.function.Function;
import javax.annotation.Nullable;
@@ -46,8 +47,9 @@ 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.ChatComponentText;
+import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraftforge.common.util.ForgeDirection;
@@ -55,7 +57,6 @@ 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;
@@ -65,22 +66,17 @@ 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;
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;
import com.gtnewhorizons.modularui.api.widget.Widget;
import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
-import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
-import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow;
import com.gtnewhorizons.modularui.common.widget.DynamicTextWidget;
import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget;
@@ -88,7 +84,6 @@ import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
import com.gtnewhorizons.modularui.common.widget.ProgressBar;
import com.gtnewhorizons.modularui.common.widget.Scrollable;
import com.gtnewhorizons.modularui.common.widget.SlotGroup;
-import com.gtnewhorizons.modularui.common.widget.SlotWidget;
import com.gtnewhorizons.modularui.common.widget.TextWidget;
import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
@@ -109,6 +104,7 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.MTEHatchInput;
import gregtech.api.metatileentity.implementations.MTEHatchInputBus;
+import gregtech.api.recipe.RecipeMap;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GTOreDictUnificator;
import gregtech.api.util.HatchElementBuilder;
@@ -118,57 +114,80 @@ import gregtech.common.tileentities.machines.MTEHatchInputBusME;
import gregtech.common.tileentities.machines.MTEHatchOutputBusME;
import tectech.TecTech;
import tectech.loader.ConfigHandler;
+import tectech.recipe.TecTechRecipeMaps;
import tectech.thing.block.BlockGodforgeGlass;
import tectech.thing.block.TileEntityForgeOfGods;
import tectech.thing.gui.TecTechUITextures;
import tectech.thing.metaTileEntity.multi.base.TTMultiblockBase;
-import tectech.thing.metaTileEntity.multi.godforge.ForgeOfGodsUI.StarColorRGBM;
import tectech.thing.metaTileEntity.multi.godforge.color.ForgeOfGodsStarColor;
import tectech.thing.metaTileEntity.multi.godforge.color.StarColorSetting;
import tectech.thing.metaTileEntity.multi.godforge.color.StarColorStorage;
+import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsRingsStructureString;
+import tectech.thing.metaTileEntity.multi.godforge.structure.ForgeOfGodsStructureString;
+import tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade;
+import tectech.thing.metaTileEntity.multi.godforge.upgrade.UpgradeStorage;
+import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI;
+import tectech.thing.metaTileEntity.multi.godforge.util.ForgeOfGodsUI.StarColorRGBM;
+import tectech.thing.metaTileEntity.multi.godforge.util.MilestoneFormatter;
+import tectech.thing.metaTileEntity.multi.godforge.util.MilestoneIcon;
+import tectech.thing.metaTileEntity.multi.godforge.util.UpgradeColor;
public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable, ISurvivalConstructable {
+ // Field default values for non-zero value defaults for item NBT checks
+ private static final int DEFAULT_FUEL_CONSUMPTION_FACTOR = 1;
+ private static final int DEFAULT_MAX_BATTERY_CHARGE = 100;
+ private static final int DEFAULT_RING_AMOUNT = 1;
+ private static final int DEFAULT_ROTATION_SPEED = 5;
+ private static final int DEFAULT_STAR_SIZE = 20;
+ private static final String DEFAULT_STAR_COLOR = ForgeOfGodsStarColor.DEFAULT.getName();
+ private static final MilestoneFormatter DEFAULT_FORMATTING_MODE = MilestoneFormatter.COMMA;
+ private static final BigInteger DEFAULT_TOTAL_POWER = BigInteger.ZERO;
+
private static Textures.BlockIcons.CustomIcon ScreenON;
- private int fuelConsumptionFactor = 1;
- private int selectedFuelType = 0;
- private int internalBattery = 0;
- private int maxBatteryCharge = 100;
- private int gravitonShardsAvailable = 0;
- private int gravitonShardsSpent = 0;
- private int ringAmount = 1;
- private int stellarFuelAmount = 0;
- private int neededStartupFuel = 0;
- private long fuelConsumption = 0;
- private long totalRecipesProcessed = 0;
- private long totalFuelConsumed = 0;
- private float totalExtensionsBuilt = 0;
- private float powerMilestonePercentage = 0;
- private float recipeMilestonePercentage = 0;
- private float fuelMilestonePercentage = 0;
- private float structureMilestonePercentage = 0;
- private float invertedPowerMilestonePercentage = 0;
- private float invertedRecipeMilestonePercentage = 0;
- private float invertedFuelMilestonePercentage = 0;
- private float invertedStructureMilestonePercentage = 0;
- private BigInteger totalPowerConsumed = BigInteger.ZERO;
- private boolean batteryCharging = false;
- private boolean inversion = false;
- private boolean gravitonShardEjection = false;
- private FormattingMode formattingMode = FormattingMode.NONE;
- private boolean isRenderActive = false;
- private boolean secretUpgrade = false;
+ private int fuelConsumptionFactor = DEFAULT_FUEL_CONSUMPTION_FACTOR;
+ private int selectedFuelType;
+ private int internalBattery;
+ private int maxBatteryCharge = DEFAULT_MAX_BATTERY_CHARGE;
+ private int gravitonShardsAvailable;
+ private int gravitonShardsSpent;
+ private int ringAmount = DEFAULT_RING_AMOUNT;
+ private int stellarFuelAmount;
+ private int neededStartupFuel;
+ private long fuelConsumption;
+ private long totalRecipesProcessed;
+ private long totalFuelConsumed;
+ private float totalExtensionsBuilt;
+ private float powerMilestonePercentage;
+ private float recipeMilestonePercentage;
+ private float fuelMilestonePercentage;
+ private float structureMilestonePercentage;
+ private float invertedPowerMilestonePercentage;
+ private float invertedRecipeMilestonePercentage;
+ private float invertedFuelMilestonePercentage;
+ private float invertedStructureMilestonePercentage;
+ private BigInteger totalPowerConsumed = DEFAULT_TOTAL_POWER;
+ private boolean batteryCharging;
+ private boolean inversion;
+ private boolean gravitonShardEjection;
+ private MilestoneFormatter formattingMode = DEFAULT_FORMATTING_MODE;
+ private boolean isRenderActive;
+ private boolean secretUpgrade;
+ private boolean isRendererDisabled;
private final ItemStack[] storedUpgradeWindowItems = new ItemStack[16];
public ArrayList<MTEBaseModule> moduleHatches = new ArrayList<>();
protected ItemStackHandler inputSlotHandler = new ItemStackHandler(16);
+ private final UpgradeStorage upgrades = new UpgradeStorage();
+ private ForgeOfGodsUpgrade currentUpgradeWindow;
+
// Star cosmetics fields
// actual star cosmetics
private final StarColorStorage starColors = new StarColorStorage();
- private String selectedStarColor = ForgeOfGodsStarColor.DEFAULT.getName();
- private int rotationSpeed = 5;
- private int starSize = 20;
+ private String selectedStarColor = DEFAULT_STAR_COLOR;
+ private int rotationSpeed = DEFAULT_ROTATION_SPEED;
+ private int starSize = DEFAULT_STAR_SIZE;
// editing star color
private ForgeOfGodsStarColor newStarColor = starColors.newTemplateColor();
private int starColorR, starColorG, starColorB;
@@ -189,9 +208,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
private static final int STAR_COSMETICS_WINDOW_ID = 18;
private static final int STAR_CUSTOM_COLOR_WINDOW_ID = 19;
private static final int STAR_CUSTOM_COLOR_IMPORT_WINDOW_ID = 20;
+ private static final int STATISTICS_WINDOW_ID = 21;
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 };
private static final long POWER_MILESTONE_CONSTANT = LongMath.pow(10, 15);
private static final long RECIPE_MILESTONE_CONSTANT = LongMath.pow(10, 7);
private static final long FUEL_MILESTONE_CONSTANT = 10_000;
@@ -307,7 +325,13 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.addShape(STRUCTURE_PIECE_SECOND_RING_AIR, ForgeOfGodsRingsStructureString.SECOND_RING_AIR)
.addShape(STRUCTURE_PIECE_THIRD_RING, ForgeOfGodsRingsStructureString.THIRD_RING)
.addShape(STRUCTURE_PIECE_THIRD_RING_AIR, ForgeOfGodsRingsStructureString.THIRD_RING_AIR)
- .addElement('A', classicHatches(TEXTURE_INDEX + 3, 1, GodforgeCasings, 3))
+ .addElement(
+ 'A',
+ HatchElementBuilder.<MTEForgeOfGods>builder()
+ .atLeast(InputBus, InputHatch, OutputBus)
+ .casingIndex(TEXTURE_INDEX + 3)
+ .dot(1)
+ .buildAndChain(GodforgeCasings, 3))
.addElement('B', ofBlock(GodforgeCasings, 0))
.addElement('C', ofBlock(GodforgeCasings, 1))
.addElement('D', ofBlock(GodforgeCasings, 2))
@@ -400,7 +424,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
return false;
}
- if (internalBattery != 0 && !isRenderActive) {
+ if (internalBattery != 0 && !isRenderActive && !isRendererDisabled) {
createRenderer();
}
// Check there is 1 input bus
@@ -434,7 +458,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
return false;
}
- if (isUpgradeActive(26)) {
+ if (isUpgradeActive(CD)) {
if (checkPiece(STRUCTURE_PIECE_SECOND_RING, 55, 11, -67)) {
ringAmount = 2;
destroySecondRing();
@@ -454,7 +478,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
}
- if (isUpgradeActive(29)) {
+ if (isUpgradeActive(EE)) {
if (checkPiece(STRUCTURE_PIECE_THIRD_RING, 47, 13, -76)) {
ringAmount = 3;
destroyThirdRing();
@@ -487,21 +511,19 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
startRecipeProcessing();
int maxModuleCount = 8;
- if (upgrades[26]) {
+ if (isUpgradeActive(CD)) {
maxModuleCount += 4;
}
- if (upgrades[29]) {
+ if (isUpgradeActive(EE)) {
maxModuleCount += 4;
}
- boolean isFinalUpgradeUnlocked = upgrades[30];
-
if (!mInputBusses.isEmpty()) {
- if (internalBattery == 0 || isFinalUpgradeUnlocked) {
+ if (internalBattery == 0 || isUpgradeActive(END)) {
MTEHatchInputBus inputBus = mInputBusses.get(0);
ItemStack[] inputBusInventory = inputBus.getRealInventory();
ItemStack itemToAbsorb = STELLAR_FUEL;
- if (isFinalUpgradeUnlocked && internalBattery != 0) {
+ if (isUpgradeActive(END) && internalBattery != 0) {
itemToAbsorb = GTOreDictUnificator.get(OrePrefixes.gem, MaterialsUEVplus.GravitonShard, 1);
}
if (inputBusInventory != null) {
@@ -531,7 +553,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
if (stellarFuelAmount >= neededStartupFuel) {
stellarFuelAmount -= neededStartupFuel;
increaseBattery(neededStartupFuel);
- createRenderer();
+ if (!isRendererDisabled) createRenderer();
}
}
}
@@ -547,7 +569,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
if (!ConfigHandler.debug.DEBUG_MODE) {
determineGravitonShardAmount();
}
- if (upgrades[30] && gravitonShardEjection) {
+ if (isUpgradeActive(END) && gravitonShardEjection) {
ejectGravitonShards();
}
@@ -562,7 +584,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
calculateEnergyDiscountForModules(module, this);
setMiscModuleParameters(module, this);
queryMilestoneStats(module, this);
- if (!upgrades[28]) {
+ if (!isUpgradeActive(TBF)) {
calculateProcessingVoltageForModules(module, this);
}
} else {
@@ -651,19 +673,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
private TileEntityForgeOfGods getRenderer() {
- IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
-
- int x = gregTechTileEntity.getXCoord();
- int y = gregTechTileEntity.getYCoord();
- int z = gregTechTileEntity.getZCoord();
-
- double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX;
- double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
- double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY;
-
+ ChunkCoordinates renderPos = getRenderPos();
TileEntity tile = this.getBaseMetaTileEntity()
.getWorld()
- .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset));
+ .getTileEntity(renderPos.posX, renderPos.posY, renderPos.posZ);
if (tile instanceof TileEntityForgeOfGods forgeTile) {
return forgeTile;
@@ -684,26 +697,17 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
private void createRenderer() {
-
- IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
-
- int x = gregTechTileEntity.getXCoord();
- int y = gregTechTileEntity.getYCoord();
- int z = gregTechTileEntity.getZCoord();
-
- double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX;
- double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
- double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+ ChunkCoordinates renderPos = getRenderPos();
this.getBaseMetaTileEntity()
.getWorld()
- .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air);
+ .setBlock(renderPos.posX, renderPos.posY, renderPos.posZ, Blocks.air);
this.getBaseMetaTileEntity()
.getWorld()
- .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), forgeOfGodsRenderBlock);
+ .setBlock(renderPos.posX, renderPos.posY, renderPos.posZ, forgeOfGodsRenderBlock);
TileEntityForgeOfGods rendererTileEntity = (TileEntityForgeOfGods) this.getBaseMetaTileEntity()
.getWorld()
- .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset));
+ .getTileEntity(renderPos.posX, renderPos.posY, renderPos.posZ);
switch (ringAmount) {
case 2 -> {
@@ -715,9 +719,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
destroySecondRing();
destroyThirdRing();
}
- default -> {
- destroyFirstRing();
- }
+ default -> destroyFirstRing();
}
rendererTileEntity.setRenderRotation(getRotation(), getDirection());
@@ -727,20 +729,10 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
private void destroyRenderer() {
-
- IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
-
- int x = gregTechTileEntity.getXCoord();
- int y = gregTechTileEntity.getYCoord();
- int z = gregTechTileEntity.getZCoord();
-
- double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX;
- double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
- double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY;
-
+ ChunkCoordinates renderPos = getRenderPos();
this.getBaseMetaTileEntity()
.getWorld()
- .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air);
+ .setBlock(renderPos.posX, renderPos.posY, renderPos.posZ, Blocks.air);
switch (ringAmount) {
case 2 -> {
@@ -752,14 +744,23 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
buildSecondRing();
buildThirdRing();
}
- default -> {
- buildFirstRing();
- }
+ default -> buildFirstRing();
}
isRenderActive = false;
}
+ private ChunkCoordinates getRenderPos() {
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+ double xOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double yOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+ double zOffset = 122 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ return new ChunkCoordinates((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset));
+ }
+
private void destroyFirstRing() {
buildPiece(STRUCTURE_PIECE_FIRST_RING_AIR, null, false, 63, 14, -59);
}
@@ -786,15 +787,15 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
@Override
public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
- if (!ConfigHandler.debug.DEBUG_MODE) return;
- if (isRenderActive) {
- destroyRenderer();
- isRenderActive = false;
+ if (isRendererDisabled) {
+ isRendererDisabled = false;
+ // let the renderer automatically rebuild itself as needed through normal logic
} else {
- ringAmount = 3;
- createRenderer();
- isRenderActive = true;
+ isRendererDisabled = true;
+ if (isRenderActive) destroyRenderer();
}
+ aPlayer.addChatMessage(
+ new ChatComponentText("Animations are now " + (isRendererDisabled ? "disabled" : "enabled") + "."));
}
@Override
@@ -840,6 +841,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
buildContext.addSyncedWindow(STAR_COSMETICS_WINDOW_ID, this::createStarCosmeticsWindow);
buildContext.addSyncedWindow(STAR_CUSTOM_COLOR_WINDOW_ID, this::createStarCustomColorWindow);
buildContext.addSyncedWindow(STAR_CUSTOM_COLOR_IMPORT_WINDOW_ID, this::createStarColorImportWindow);
+ buildContext.addSyncedWindow(STATISTICS_WINDOW_ID, this::createStatisticsWindow);
builder.widget(
new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE)
@@ -858,7 +860,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
button.add(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP);
return button.toArray(new IDrawable[0]);
})
- .addTooltip("Path of Celestial Transcendence")
+ .addTooltip(translateToLocal("fog.button.upgradetree.tooltip"))
.setPos(174, 167)
.setTooltipShowUpDelay(TOOLTIP_DELAY))
.widget(
@@ -882,11 +884,15 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.setPos(174, 110)
.setTooltipShowUpDelay(TOOLTIP_DELAY))
.widget(
- TextWidget.dynamicText(this::storedFuel)
+ TextWidget.dynamicText(this::storedFuelHeaderText)
.setDefaultColor(EnumChatFormatting.WHITE)
.setPos(6, 8)
- .setSize(74, 34))
- .widget(createPowerSwitchButton())
+ .setSize(185, 10))
+ .widget(
+ TextWidget.dynamicText(this::storedFuel)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setPos(6, 20)
+ .setSize(185, 10))
.widget(createBatteryButton(builder))
.widget(createEjectionSwitch(builder))
.widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> {
@@ -955,7 +961,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
if (!widget.isClient()) widget.getContext()
.openSyncedWindow(STAR_COSMETICS_WINDOW_ID);
})
- .setSize(16, 16)
.addTooltip(translateToLocal("fog.button.color.tooltip"))
.setBackground(() -> {
List<UITexture> button = new ArrayList<>();
@@ -963,8 +968,25 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
button.add(TecTechUITextures.OVERLAY_BUTTON_RAINBOW_SPIRAL);
return button.toArray(new IDrawable[0]);
})
- .setPos(152, 91)
- .setTooltipShowUpDelay(TOOLTIP_DELAY));
+ .setPos(174, 148)
+ .setSize(16, 16)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (!widget.isClient()) {
+ widget.getContext()
+ .openSyncedWindow(STATISTICS_WINDOW_ID);
+ }
+ })
+ .addTooltip(translateToLocal("fog.button.statistics.tooltip"))
+ .setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_BUTTON_STATISTICS);
+ return button.toArray(new IDrawable[0]);
+ })
+ .setPos(26, 91)
+ .setSize(16, 16)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY));
}
@Override
@@ -975,42 +997,24 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.setPos(172, 67));
}
- @Override
- protected ButtonWidget createPowerSwitchButton() {
- return ForgeOfGodsUI.createPowerSwitchButton(getBaseMetaTileEntity());
- }
-
protected ButtonWidget createEjectionSwitch(IWidgetBuilder<?> builder) {
Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
- if (upgrades[30]) {
- gravitonShardEjection = !gravitonShardEjection;
- }
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ gravitonShardEjection = !gravitonShardEjection;
})
- .setPlayClickSound(upgrades[30])
- .setBackground(() -> {
- List<UITexture> ret = new ArrayList<>();
- if (!upgrades[30]) {
- return ret.toArray(new IDrawable[0]);
- }
- if (gravitonShardEjection) {
- ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
- ret.add(TecTechUITextures.OVERLAY_EJECTION_ON);
- } else {
- ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
- ret.add(TecTechUITextures.OVERLAY_EJECTION_LOCKED);
- }
- return ret.toArray(new IDrawable[0]);
- })
+ .setBackground(
+ () -> new UITexture[] { TecTechUITextures.BUTTON_CELESTIAL_32x32,
+ gravitonShardEjection ? TecTechUITextures.OVERLAY_EJECTION_ON
+ : TecTechUITextures.OVERLAY_EJECTION_LOCKED })
+ .addTooltip(translateToLocal("fog.button.ejection.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
.attachSyncer(
new FakeSyncWidget.BooleanSyncer(() -> gravitonShardEjection, val -> gravitonShardEjection = val),
builder)
- .setPos(26, 91)
+ .setPos(44, 91)
.setSize(16, 16)
- .attachSyncer(new FakeSyncWidget.BooleanSyncer(() -> upgrades[30], val -> upgrades[30] = val), builder);
- if (upgrades[30]) {
- button.addTooltip(translateToLocal("fog.button.ejection.tooltip"));
- button.setTooltipShowUpDelay(TOOLTIP_DELAY);
- }
+ .setEnabled($ -> isUpgradeActive(END))
+ .attachSyncer(upgrades.getSyncer(END), builder);
return (ButtonWidget) button;
}
@@ -1019,7 +1023,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
if (clickData.mouseButton == 0) {
batteryCharging = !batteryCharging;
- } else if (clickData.mouseButton == 1 && !widget.isClient() && upgrades[8]) {
+ } else if (clickData.mouseButton == 1 && !widget.isClient() && isUpgradeActive(REC)) {
widget.getContext()
.openSyncedWindow(BATTERY_CONFIG_WINDOW_ID);
}
@@ -1080,53 +1084,63 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
protected ModularWindow createFuelConfigWindow(final EntityPlayer player) {
- final int WIDTH = 78;
- final int HEIGHT = 130;
- final int PARENT_WIDTH = getGUIWidth();
- final int PARENT_HEIGHT = getGUIHeight();
- ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ final int w = 78;
+ final int h = 130;
+ final int parentW = getGUIWidth();
+ final int parentH = getGUIHeight();
+
+ ModularWindow.Builder builder = ModularWindow.builder(w, h);
builder.setBackground(GTUITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
builder.setGuiTint(getGUIColorization());
builder.setDraggable(true);
builder.setPos(
- (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT))
+ (size, window) -> Alignment.Center.getAlignedPos(size, new Size(parentW, parentH))
.add(
- Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))
- .add(WIDTH - 3, 0)));
+ Alignment.TopRight.getAlignedPos(new Size(parentW, parentH), new Size(w, h))
+ .add(w - 3, 0)));
+
+ // Window header
builder.widget(
TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelconsumption")
.setPos(3, 2)
- .setSize(74, 34))
- .widget(
- new NumericWidget().setSetter(val -> fuelConsumptionFactor = (int) val)
- .setGetter(() -> fuelConsumptionFactor)
- .setBounds(1, calculateMaxFuelFactor(this))
- .setDefaultValue(1)
- .setScrollValues(1, 4, 64)
- .setTextAlignment(Alignment.Center)
- .setTextColor(Color.WHITE.normal)
- .setSize(70, 18)
- .setPos(4, 35)
- .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)
- .setSize(10, 10)
- .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.0"))
- .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.1"))
- .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.2"))
- .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.3"))
- .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.4"))
- .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.5"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .setSize(74, 34));
+
+ // Fuel factor textbox
+ NumericWidget fuelFactor = new NumericWidget();
+ fuelFactor.setSetter(val -> fuelConsumptionFactor = (int) val)
+ .setGetter(() -> fuelConsumptionFactor)
+ .setBounds(1, calculateMaxFuelFactor(this))
+ .setDefaultValue(1)
+ .setScrollValues(1, 4, 64)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(70, 18)
+ .setPos(4, 35)
+ .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD);
+ builder.widget(fuelFactor);
+
+ // Syncers for max fuel factor
+ builder.widget(
+ upgrades.getSyncer(CFCE)
+ .setOnClientUpdate($ -> fuelFactor.setMaxValue(calculateMaxFuelFactor(this))));
+ builder.widget(
+ upgrades.getSyncer(GEM)
+ .setOnClientUpdate($ -> fuelFactor.setMaxValue(calculateMaxFuelFactor(this))));
+ builder.widget(
+ upgrades.getSyncer(TSE)
+ .setOnClientUpdate($ -> fuelFactor.setMaxValue(calculateMaxFuelFactor(this))));
+
+ builder.widget(
+ new DrawableWidget().setDrawable(ModularUITextures.ICON_INFO)
+ .setPos(64, 24)
+ .setSize(10, 10)
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.0"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.1"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.2"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.3"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.4"))
+ .addTooltip(translateToLocal("gt.blockmachines.multimachine.FOG.fuelinfo.5"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
.widget(
TextWidget.localised("gt.blockmachines.multimachine.FOG.fueltype")
.setPos(3, 57)
@@ -1204,8 +1218,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
})
.setSize(18, 18))
.setPos(29, 82)
- .setSize(18, 18)
- .attachSyncer(new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType), builder))
+ .setSize(18, 18))
.widget(
new MultiChildWidget().addChild(
new FluidNameHolderWidget(
@@ -1354,8 +1367,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
if (!widget.isClient()) {
widget.getWindow()
.closeWindow();
- widget.getContext()
- .closeWindow(INDIVIDUAL_MILESTONE_WINDOW_ID);
+ ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_MILESTONE_WINDOW_ID);
}
})
.setPos(382, 6));
@@ -1363,52 +1375,24 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
protected ModularWindow createIndividualMilestoneWindow(final EntityPlayer player) {
- final int WIDTH = 150;
- final int HEIGHT = 150;
- int symbol_width;
- int symbol_height;
- String milestoneType;
- ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
- UITexture symbol;
- switch (currentMilestoneID) {
- case 1 -> {
- symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION;
- symbol_width = 54;
- symbol_height = 75;
- milestoneType = "recipe";
- }
- case 2 -> {
- symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST;
- symbol_width = 75;
- symbol_height = 75;
- milestoneType = "fuel";
- }
- case 3 -> {
- symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION;
- symbol_width = 75;
- symbol_height = 75;
- milestoneType = "purchasable";
- }
- default -> {
- symbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE;
- symbol_width = 60;
- symbol_height = 75;
- milestoneType = "power";
- }
- }
+ final int w = 150;
+ final int h = 150;
+ final MilestoneIcon icon = MilestoneIcon.VALUES[currentMilestoneID];
+ final Size iconSize = icon.getSize();
+ ModularWindow.Builder builder = ModularWindow.builder(w, h);
builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE);
builder.setDraggable(true);
+
builder.widget(
ButtonWidget.closeWindowButton(true)
.setPos(134, 4))
.widget(
- new DrawableWidget().setDrawable(symbol)
- .setSize(symbol_width, symbol_height)
- .setPos((WIDTH - symbol_width) / 2, (HEIGHT - symbol_height) / 2))
+ new DrawableWidget().setDrawable(icon.getSymbol())
+ .setSize(iconSize)
+ .setPos((w - iconSize.width) / 2, (h - iconSize.height) / 2))
.widget(
- TextWidget.localised("gt.blockmachines.multimachine.FOG." + milestoneType + "milestone")
- .setDefaultColor(EnumChatFormatting.GOLD)
+ new TextWidget(icon.getNameText()).setDefaultColor(EnumChatFormatting.GOLD)
.setTextAlignment(Alignment.Center)
.setPos(0, 8)
.setSize(150, 15))
@@ -1459,8 +1443,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.attachSyncer(
new FakeSyncWidget.ByteSyncer(
() -> (byte) formattingMode.ordinal(),
- val -> formattingMode = FormattingMode.VALUES[MathHelper
- .clamp_int(val, 0, FormattingMode.VALUES.length - 1)]),
+ val -> formattingMode = MilestoneFormatter.VALUES[MathHelper
+ .clamp_int(val, 0, MilestoneFormatter.VALUES.length - 1)]),
builder));
return builder.build();
@@ -1485,490 +1469,79 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.setTooltipShowUpDelay(TOOLTIP_DELAY);
}
- private int currentUpgradeID = 0;
- private int currentColorCode = 0;
- private int currentMilestoneBG = 0;
- private int gravitonShardCost = 0;
- private final int[][] prereqUpgrades = new int[31][];
- private int[] followupUpgrades = new int[] {};
- private boolean isUpradeSplitStart = false;
- private boolean doesCurrentUpgradeRequireExtraMats = false;
- private final boolean[] allPrereqRequired = new boolean[31];
- private boolean[] upgrades = new boolean[31];
- private boolean[] materialPaidUpgrades = new boolean[7];
-
protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) {
- final Scrollable scrollable = new Scrollable().setVerticalScroll();
- final int PARENT_WIDTH = 300;
- final int PARENT_HEIGHT = 300;
- ModularWindow.Builder builder = ModularWindow.builder(PARENT_WIDTH, PARENT_HEIGHT);
-
- scrollable.widget(createUpgradeConnectorLine(new Pos2d(143, 71), 45, 0, 0, 0, 1))
- .widget(createUpgradeConnectorLine(new Pos2d(124, 124), 60, 27, 0, 1, 2))
- .widget(createUpgradeConnectorLine(new Pos2d(162, 124), 60, 333, 0, 1, 3))
- .widget(createUpgradeConnectorLine(new Pos2d(94, 184), 60, 27, 0, 2, 4))
- .widget(createUpgradeConnectorLine(new Pos2d(130, 184), 60, 336, 0, 2, 5))
- .widget(createUpgradeConnectorLine(new Pos2d(156, 184), 60, 24, 0, 3, 5))
- .widget(createUpgradeConnectorLine(new Pos2d(192, 184), 60, 333, 0, 3, 6))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 251), 45, 0, 0, 5, 7))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 311), 45, 0, 0, 7, 9))
- .widget(createUpgradeConnectorLine(new Pos2d(78, 250), 110, 5, 4, 4, 8))
- .widget(createUpgradeConnectorLine(new Pos2d(110, 290), 80, 40, 4, 7, 8))
- .widget(createUpgradeConnectorLine(new Pos2d(208, 250), 110, 355, 4, 6, 10))
- .widget(createUpgradeConnectorLine(new Pos2d(176, 290), 80, 320, 4, 7, 10))
- .widget(createUpgradeConnectorLine(new Pos2d(100, 355), 80, 313, 0, 8, 11))
- .widget(createUpgradeConnectorLine(new Pos2d(186, 355), 80, 47, 0, 10, 11))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 430), 48, 0, 2, 11, 13))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 490), 48, 0, 2, 13, 18))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 550), 48, 0, 2, 18, 21))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 610), 48, 0, 2, 21, 23))
- .widget(createUpgradeConnectorLine(new Pos2d(110, 410), 80, 40, 1, 11, 12))
- .widget(createUpgradeConnectorLine(new Pos2d(83, 490), 48, 0, 1, 12, 17))
- .widget(createUpgradeConnectorLine(new Pos2d(83, 550), 48, 0, 1, 17, 20))
- .widget(createUpgradeConnectorLine(new Pos2d(101, 590), 80, 320, 1, 20, 23))
- .widget(createUpgradeConnectorLine(new Pos2d(53, 536), 35, 45, 1, 17, 16))
- .widget(createUpgradeConnectorLine(new Pos2d(176, 410), 80, 320, 3, 11, 14))
- .widget(createUpgradeConnectorLine(new Pos2d(203, 490), 48, 0, 3, 14, 19))
- .widget(createUpgradeConnectorLine(new Pos2d(203, 550), 48, 0, 3, 19, 22))
- .widget(createUpgradeConnectorLine(new Pos2d(185, 590), 80, 40, 3, 22, 23))
- .widget(createUpgradeConnectorLine(new Pos2d(233, 476), 35, 315, 3, 14, 15))
- .widget(createUpgradeConnectorLine(new Pos2d(143, 670), 48, 0, 0, 23, 24))
- .widget(createUpgradeConnectorLine(new Pos2d(101, 707), 75, 62.3f, 0, 24, 25))
- .widget(createUpgradeConnectorLine(new Pos2d(53, 772), 78, 0, 0, 25, 26))
- .widget(createUpgradeConnectorLine(new Pos2d(95, 837), 75, 297.7f, 0, 26, 27))
- .widget(createUpgradeConnectorLine(new Pos2d(191, 837), 75, 62.3f, 0, 27, 28))
- .widget(createUpgradeConnectorLine(new Pos2d(233, 772), 78, 0, 0, 28, 29))
- .widget(createUpgradeConnectorLine(new Pos2d(191, 747), 75, 62.3f, 0, 29, 30));
+ ModularWindow.Builder builder = ModularWindow.builder(300, 300);
+ Scrollable scrollable = new Scrollable().setVerticalScroll();
+ // spotless:off
scrollable
- .widget(
- createUpgradeBox(
- 0,
- 0,
- 3,
- new int[] {},
- false,
- new int[] { 1 },
- false,
- true,
- 0,
- new Pos2d(126, 56),
- scrollable))
- .widget(
- createUpgradeBox(
- 1,
- 0,
- 1,
- new int[] { 0 },
- false,
- new int[] { 2, 3 },
- false,
- false,
- 1,
- new Pos2d(126, 116),
- scrollable))
- .widget(
- createUpgradeBox(
- 2,
- 0,
- 2,
- new int[] { 1 },
- false,
- new int[] { 4, 5 },
- false,
- false,
- 1,
- new Pos2d(96, 176),
- scrollable))
- .widget(
- createUpgradeBox(
- 3,
- 0,
- 2,
- new int[] { 1 },
- false,
- new int[] { 5, 6 },
- false,
- false,
- 1,
- new Pos2d(156, 176),
- scrollable))
- .widget(
- createUpgradeBox(
- 4,
- 0,
- 0,
- new int[] { 2 },
- false,
- new int[] { 8 },
- false,
- false,
- 1,
- new Pos2d(66, 236),
- scrollable))
- .widget(
- createUpgradeBox(
- 5,
- 0,
- 3,
- new int[] { 2, 3 },
- false,
- new int[] { 7 },
- false,
- true,
- 1,
- new Pos2d(126, 236),
- scrollable))
- .widget(
- createUpgradeBox(
- 6,
- 0,
- 1,
- new int[] { 3 },
- false,
- new int[] { 10 },
- false,
- false,
- 1,
- new Pos2d(186, 236),
- scrollable))
- .widget(
- createUpgradeBox(
- 7,
- 0,
- 3,
- new int[] { 5 },
- false,
- new int[] { 8, 9, 10 },
- false,
- true,
- 2,
- new Pos2d(126, 296),
- scrollable))
- .widget(
- createUpgradeBox(
- 8,
- 4,
- 0,
- new int[] { 4, 7 },
- true,
- new int[] { 11 },
- false,
- false,
- 2,
- new Pos2d(56, 356),
- scrollable))
- .widget(
- createUpgradeBox(
- 9,
- 0,
- 2,
- new int[] { 7 },
- false,
- new int[] {},
- false,
- false,
- 2,
- new Pos2d(126, 356),
- scrollable))
- .widget(
- createUpgradeBox(
- 10,
- 4,
- 1,
- new int[] { 6, 7 },
- true,
- new int[] { 11 },
- false,
- false,
- 2,
- new Pos2d(196, 356),
- scrollable))
- .widget(
- createUpgradeBox(
- 11,
- 0,
- 3,
- new int[] { 8, 10 },
- false,
- new int[] { 12, 13, 14 },
- false,
- true,
- 2,
- new Pos2d(126, 416),
- scrollable))
- .widget(
- createUpgradeBox(
- 12,
- 1,
- 2,
- new int[] { 11 },
- false,
- new int[] { 17 },
- true,
- false,
- 3,
- new Pos2d(66, 476),
- scrollable))
- .widget(
- createUpgradeBox(
- 13,
- 2,
- 1,
- new int[] { 11 },
- false,
- new int[] { 18 },
- true,
- false,
- 3,
- new Pos2d(126, 476),
- scrollable))
- .widget(
- createUpgradeBox(
- 14,
- 3,
- 0,
- new int[] { 11 },
- false,
- new int[] { 15, 19 },
- true,
- false,
- 3,
- new Pos2d(186, 476),
- scrollable))
- .widget(
- createUpgradeBox(
- 15,
- 3,
- 1,
- new int[] { 14 },
- false,
- new int[] {},
- false,
- false,
- 4,
- new Pos2d(246, 496),
- scrollable))
- .widget(
- createUpgradeBox(
- 16,
- 1,
- 1,
- new int[] { 17 },
- false,
- new int[] {},
- false,
- false,
- 4,
- new Pos2d(6, 556),
- scrollable))
- .widget(
- createUpgradeBox(
- 17,
- 1,
- 0,
- new int[] { 12 },
- false,
- new int[] { 16, 20 },
- false,
- false,
- 3,
- new Pos2d(66, 536),
- scrollable))
- .widget(
- createUpgradeBox(
- 18,
- 2,
- 1,
- new int[] { 13 },
- false,
- new int[] { 21 },
- false,
- false,
- 3,
- new Pos2d(126, 536),
- scrollable))
- .widget(
- createUpgradeBox(
- 19,
- 3,
- 0,
- new int[] { 14 },
- false,
- new int[] { 22 },
- false,
- false,
- 3,
- new Pos2d(186, 536),
- scrollable))
- .widget(
- createUpgradeBox(
- 20,
- 1,
- 0,
- new int[] { 17 },
- false,
- new int[] { 23 },
- false,
- false,
- 3,
- new Pos2d(66, 596),
- scrollable))
- .widget(
- createUpgradeBox(
- 21,
- 2,
- 1,
- new int[] { 18 },
- false,
- new int[] { 23 },
- false,
- false,
- 3,
- new Pos2d(126, 596),
- scrollable))
- .widget(
- createUpgradeBox(
- 22,
- 3,
- 1,
- new int[] { 19 },
- false,
- new int[] { 23 },
- false,
- false,
- 3,
- new Pos2d(186, 596),
- scrollable))
- .widget(
- createUpgradeBox(
- 23,
- 0,
- 0,
- new int[] { 20, 21, 22 },
- false,
- new int[] { 24 },
- false,
- false,
- 4,
- new Pos2d(126, 656),
- scrollable))
- .widget(
- createUpgradeBox(
- 24,
- 0,
- 1,
- new int[] { 23 },
- false,
- new int[] { 25 },
- false,
- false,
- 5,
- new Pos2d(126, 718),
- scrollable))
- .widget(
- createUpgradeBox(
- 25,
- 0,
- 1,
- new int[] { 24 },
- false,
- new int[] { 26 },
- false,
- false,
- 6,
- new Pos2d(36, 758),
- scrollable))
- .widget(
- createUpgradeBox(
- 26,
- 0,
- 3,
- new int[] { 25 },
- false,
- new int[] { 27 },
- false,
- true,
- 7,
- new Pos2d(36, 848),
- scrollable))
- .widget(
- createUpgradeBox(
- 27,
- 0,
- 2,
- new int[] { 26 },
- false,
- new int[] { 28 },
- false,
- false,
- 8,
- new Pos2d(126, 888),
- scrollable))
- .widget(
- createUpgradeBox(
- 28,
- 0,
- 0,
- new int[] { 27 },
- false,
- new int[] { 29 },
- false,
- false,
- 9,
- new Pos2d(216, 848),
- scrollable))
- .widget(
- createUpgradeBox(
- 29,
- 0,
- 3,
- new int[] { 28 },
- false,
- new int[] { 30 },
- false,
- true,
- 10,
- new Pos2d(216, 758),
- scrollable))
- .widget(
- createUpgradeBox(
- 30,
- 0,
- 3,
- new int[] { 29 },
- false,
- new int[] {},
- false,
- true,
- 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(createUpgradeConnectorLine(new Pos2d(143, 71), 45, 0, UpgradeColor.BLUE, START, IGCC))
+ .widget(createUpgradeConnectorLine(new Pos2d(124, 124), 60, 27, UpgradeColor.BLUE, IGCC, STEM))
+ .widget(createUpgradeConnectorLine(new Pos2d(162, 124), 60, 333, UpgradeColor.BLUE, IGCC, CFCE))
+ .widget(createUpgradeConnectorLine(new Pos2d(94, 184), 60, 27, UpgradeColor.BLUE, STEM, GISS))
+ .widget(createUpgradeConnectorLine(new Pos2d(130, 184), 60, 336, UpgradeColor.BLUE, STEM, FDIM))
+ .widget(createUpgradeConnectorLine(new Pos2d(156, 184), 60, 24, UpgradeColor.BLUE, CFCE, FDIM))
+ .widget(createUpgradeConnectorLine(new Pos2d(192, 184), 60, 333, UpgradeColor.BLUE, CFCE, SA))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 251), 45, 0, UpgradeColor.BLUE, FDIM, GPCI))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 311), 45, 0, UpgradeColor.BLUE, GPCI, GEM))
+ .widget(createUpgradeConnectorLine(new Pos2d(78, 250), 110, 5, UpgradeColor.RED, GISS, REC))
+ .widget(createUpgradeConnectorLine(new Pos2d(110, 290), 80, 40, UpgradeColor.RED, GPCI, REC))
+ .widget(createUpgradeConnectorLine(new Pos2d(208, 250), 110, 355, UpgradeColor.RED, SA, CTCDD))
+ .widget(createUpgradeConnectorLine(new Pos2d(176, 290), 80, 320, UpgradeColor.RED, GPCI, CTCDD))
+ .widget(createUpgradeConnectorLine(new Pos2d(100, 355), 80, 313, UpgradeColor.BLUE, REC, QGPIU))
+ .widget(createUpgradeConnectorLine(new Pos2d(186, 355), 80, 47, UpgradeColor.BLUE, CTCDD, QGPIU))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 430), 48, 0, UpgradeColor.ORANGE, QGPIU, TCT))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 490), 48, 0, UpgradeColor.ORANGE, TCT, EPEC))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 550), 48, 0, UpgradeColor.ORANGE, EPEC, POS))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 610), 48, 0, UpgradeColor.ORANGE, POS, NGMS))
+ .widget(createUpgradeConnectorLine(new Pos2d(110, 410), 80, 40, UpgradeColor.PURPLE, QGPIU, SEFCP))
+ .widget(createUpgradeConnectorLine(new Pos2d(83, 490), 48, 0, UpgradeColor.PURPLE, SEFCP, CNTI))
+ .widget(createUpgradeConnectorLine(new Pos2d(83, 550), 48, 0, UpgradeColor.PURPLE, CNTI, NDPE))
+ .widget(createUpgradeConnectorLine(new Pos2d(101, 590), 80, 320, UpgradeColor.PURPLE, NDPE, NGMS))
+ .widget(createUpgradeConnectorLine(new Pos2d(53, 536), 35, 45, UpgradeColor.PURPLE, CNTI, DOP))
+ .widget(createUpgradeConnectorLine(new Pos2d(176, 410), 80, 320, UpgradeColor.GREEN, QGPIU, GGEBE))
+ .widget(createUpgradeConnectorLine(new Pos2d(203, 490), 48, 0, UpgradeColor.GREEN, GGEBE, IMKG))
+ .widget(createUpgradeConnectorLine(new Pos2d(203, 550), 48, 0, UpgradeColor.GREEN, IMKG, DOR))
+ .widget(createUpgradeConnectorLine(new Pos2d(185, 590), 80, 40, UpgradeColor.GREEN, DOR, NGMS))
+ .widget(createUpgradeConnectorLine(new Pos2d(233, 476), 35, 315, UpgradeColor.GREEN, GGEBE, TPTP))
+ .widget(createUpgradeConnectorLine(new Pos2d(143, 670), 48, 0, UpgradeColor.BLUE, NGMS, SEDS))
+ .widget(createUpgradeConnectorLine(new Pos2d(101, 707), 75, 62.3f, UpgradeColor.BLUE, SEDS, PA))
+ .widget(createUpgradeConnectorLine(new Pos2d(53, 772), 78, 0, UpgradeColor.BLUE, PA, CD))
+ .widget(createUpgradeConnectorLine(new Pos2d(95, 837), 75, 297.7f, UpgradeColor.BLUE, CD, TSE))
+ .widget(createUpgradeConnectorLine(new Pos2d(191, 837), 75, 62.3f, UpgradeColor.BLUE, TSE, TBF))
+ .widget(createUpgradeConnectorLine(new Pos2d(233, 772), 78, 0, UpgradeColor.BLUE, TBF, EE))
+ .widget(createUpgradeConnectorLine(new Pos2d(191, 747), 75, 62.3f, UpgradeColor.BLUE, EE, END));
+ // spotless:on
+
+ for (ForgeOfGodsUpgrade upgrade : upgrades.getAllUpgrades()) {
+ scrollable.widget(createUpgradeBox(upgrade, scrollable));
+ }
+
+ 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(
@@ -1984,440 +1557,178 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
if (!widget.isClient()) {
widget.getWindow()
.closeWindow();
- widget.getContext()
- .closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID);
+ ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID);
}
})
.setPos(282, 4));
if (ConfigHandler.debug.DEBUG_MODE) {
- builder.widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
- upgrades = new boolean[31];
- materialPaidUpgrades = new boolean[7];
- })
- .setSize(40, 15)
- .setBackground(GTUITextures.BUTTON_STANDARD)
- .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY))
- .addChild(
- new TextWidget(translateToLocal("fog.debug.resetbutton.text")).setTextAlignment(Alignment.Center)
- .setScale(0.57f)
- .setMaxWidth(36)
- .setPos(3, 3))
- .addChild(
- new NumericWidget().setSetter(val -> gravitonShardsAvailable = (int) val)
- .setGetter(() -> gravitonShardsAvailable)
- .setBounds(0, 112)
- .setDefaultValue(0)
- .setScrollValues(1, 4, 64)
- .setTextAlignment(Alignment.Center)
- .setTextColor(Color.WHITE.normal)
- .setSize(25, 18)
- .setPos(4, 16)
- .addTooltip(translateToLocal("fog.debug.gravitonshardsetter.tooltip"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY)
- .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD))
- .addChild(
- new ButtonWidget().setOnClick((clickData, widget) -> Arrays.fill(upgrades, true))
- .setSize(40, 15)
- .setBackground(GTUITextures.BUTTON_STANDARD)
- .addTooltip(translateToLocal("fog.debug.unlockall.text"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY)
- .setPos(0, 35))
- .addChild(
- new TextWidget(translateToLocal("fog.debug.unlockall.text")).setTextAlignment(Alignment.Center)
- .setScale(0.57f)
- .setMaxWidth(36)
- .setPos(3, 38))
- .setPos(4, 4));
-
- }
- return builder.build();
- }
-
- protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) {
- UITexture background;
- UITexture overlay;
- UITexture milestoneSymbol;
- float widthRatio;
- switch (currentColorCode) {
- case 1 -> {
- background = TecTechUITextures.BACKGROUND_GLOW_PURPLE;
- overlay = TecTechUITextures.PICTURE_OVERLAY_PURPLE;
- }
- case 2 -> {
- background = TecTechUITextures.BACKGROUND_GLOW_ORANGE;
- overlay = TecTechUITextures.PICTURE_OVERLAY_ORANGE;
- }
- case 3 -> {
- 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;
- }
- }
- switch (currentMilestoneBG) {
- case 1 -> {
- milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION;
- widthRatio = 0.72f;
- }
- case 2 -> {
- milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST;
- widthRatio = 1f;
- }
- case 3 -> {
- milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION;
- widthRatio = 1f;
- }
- default -> {
- milestoneSymbol = TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE;
- widthRatio = 0.8f;
- }
- }
- int WIDTH = 250;
- int HEIGHT = 250;
- int LORE_POS = 110;
- if (currentUpgradeID == 0 || currentUpgradeID == 30) {
- WIDTH = 300;
- HEIGHT = 300;
- LORE_POS = 85;
- }
- ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT)
- .setBackground(background)
- .widget(
- ButtonWidget.closeWindowButton(true)
- .setPos(WIDTH - 15, 3))
- .widget(
- new DrawableWidget().setDrawable(milestoneSymbol)
- .setPos((int) ((1 - widthRatio / 2) * WIDTH / 2), HEIGHT / 4)
- .setSize((int) (WIDTH / 2 * widthRatio), HEIGHT / 2))
- .widget(
- new DrawableWidget().setDrawable(overlay)
- .setPos(WIDTH / 4, HEIGHT / 4)
- .setSize(WIDTH / 2, HEIGHT / 2))
- .widget(
+ builder.widget(
new MultiChildWidget()
.addChild(
- new TextWidget(translateToLocal("fog.upgrade.tt." + (currentUpgradeID)))
- .setTextAlignment(Alignment.Center)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setSize(WIDTH - 15, 30)
- .setPos(9, 5))
+ new ButtonWidget().setOnClick((clickData, widget) -> upgrades.resetAll())
+ .setSize(40, 15)
+ .setBackground(GTUITextures.BUTTON_STANDARD)
+ .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
.addChild(
- new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID)))
+ new TextWidget(translateToLocal("fog.debug.resetbutton.text"))
.setTextAlignment(Alignment.Center)
- .setDefaultColor(EnumChatFormatting.WHITE)
- .setSize(WIDTH - 15, LORE_POS - 30)
- .setPos(9, 30))
- .addChild(
- new TextWidget(
- EnumChatFormatting.ITALIC + translateToLocal("fog.upgrade.lore." + (currentUpgradeID)))
- .setTextAlignment(Alignment.Center)
- .setDefaultColor(0xbbbdbd)
- .setSize(WIDTH - 15, (int) (HEIGHT * 0.9) - LORE_POS)
- .setPos(9, LORE_POS))
- .addChild(
- new TextWidget(
- translateToLocal("gt.blockmachines.multimachine.FOG.shardcost") + " "
- + EnumChatFormatting.BLUE
- + gravitonShardCost).setTextAlignment(Alignment.Center)
- .setScale(0.7f)
- .setMaxWidth(70)
- .setDefaultColor(0x9c9c9c)
- .setPos(11, HEIGHT - 25))
+ .setScale(0.57f)
+ .setMaxWidth(36)
+ .setPos(3, 3))
.addChild(
- new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.availableshards"))
+ new NumericWidget().setSetter(val -> gravitonShardsAvailable = (int) val)
+ .setGetter(() -> gravitonShardsAvailable)
+ .setBounds(0, 112)
+ .setDefaultValue(0)
+ .setScrollValues(1, 4, 64)
.setTextAlignment(Alignment.Center)
- .setScale(0.7f)
- .setMaxWidth(90)
- .setDefaultColor(0x9c9c9c)
- .setPos(WIDTH - 87, HEIGHT - 25))
+ .setTextColor(Color.WHITE.normal)
+ .setSize(25, 18)
+ .setPos(4, 16)
+ .addTooltip(translateToLocal("fog.debug.gravitonshardsetter.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD))
.addChild(
- TextWidget.dynamicText(this::gravitonShardAmount)
- .setTextAlignment(Alignment.Center)
- .setScale(0.7f)
- .setMaxWidth(90)
- .setDefaultColor(0x9c9c9c)
- .setPos(WIDTH - 27, HEIGHT - 18)))
- .setSize(WIDTH, HEIGHT)
-
- .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
- if (!upgrades[currentUpgradeID]) {
- completeUpgrade();
- } else {
- respecUpgrade();
- }
- })
- .setSize(40, 15)
- .setBackground(() -> {
- if (upgrades[currentUpgradeID]) {
- return new IDrawable[] { GTUITextures.BUTTON_STANDARD_PRESSED };
- } else {
- return new IDrawable[] { GTUITextures.BUTTON_STANDARD };
- }
- })
- .dynamicTooltip(this::constructionStatus)
- .setTooltipShowUpDelay(TOOLTIP_DELAY))
- .addChild(
- TextWidget.dynamicText(this::constructionStatusText)
- .setTextAlignment(Alignment.Center)
- .setScale(0.7f)
- .setMaxWidth(36)
- .setPos(3, 5))
- .setPos(WIDTH / 2 - 21, (int) (HEIGHT * 0.9)));
- if (Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION)
- .contains(currentUpgradeID)) {
- builder.widget(createMaterialInputButton(currentUpgradeID, WIDTH / 2 - 40, (int) (HEIGHT * 0.9), builder));
+ new ButtonWidget().setOnClick((clickData, widget) -> upgrades.unlockAll())
+ .setSize(40, 15)
+ .setBackground(GTUITextures.BUTTON_STANDARD)
+ .addTooltip(translateToLocal("fog.debug.unlockall.text"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(0, 35))
+ .addChild(
+ new TextWidget(translateToLocal("fog.debug.unlockall.text")).setTextAlignment(Alignment.Center)
+ .setScale(0.57f)
+ .setMaxWidth(36)
+ .setPos(3, 38))
+ .setPos(4, 4));
+
}
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;
- }
- }
- }
- }
- }
+ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) {
+ ForgeOfGodsUpgrade upgrade = currentUpgradeWindow;
- private void respecUpgrade() {
- int unlockedFollowupUpgrades = 0;
- int unlockedNeighboringUpgrades = 0;
- boolean doesFollowupRequireAllPrereqs = false;
- boolean canFollowupSpareAConnection = true;
+ ModularWindow.Builder builder = ModularWindow.builder(upgrade.getWindowSize());
+ builder.setBackground(upgrade.getBackground());
- 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;
- }
- }
+ // Syncers
+ builder.widget(
+ new FakeSyncWidget.IntegerSyncer(() -> gravitonShardsAvailable, val -> gravitonShardsAvailable = val));
+ builder.widget(upgrades.getSyncer(upgrade));
- unlockedNeighboringUpgrades = 0;
+ builder.widget(
+ ForgeOfGodsUI.getIndividualUpgradeGroup(
+ upgrade,
+ () -> gravitonShardsAvailable,
+ () -> completeUpgrade(upgrade),
+ () -> respecUpgrade(upgrade),
+ () -> isUpgradeActive(upgrade)));
+
+ if (upgrade.hasExtraCost()) {
+ builder.widget(
+ ForgeOfGodsUI
+ .createMaterialInputButton(upgrade, () -> upgrades.isCostPaid(upgrade), (clickData, widget) -> {
+ ForgeOfGodsUI.reopenWindow(widget, MANUAL_INSERTION_WINDOW_ID);
+ ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID);
+ ForgeOfGodsUI.closeWindow(widget, UPGRADE_TREE_WINDOW_ID);
+ }));
}
- if (!doesFollowupRequireAllPrereqs && followupUpgrades.length > 0 && canFollowupSpareAConnection) {
- unlockedFollowupUpgrades = 0;
- }
+ return builder.build();
+ }
- if (unlockedFollowupUpgrades == 0) {
- gravitonShardsAvailable += gravitonShardCost;
- gravitonShardsSpent -= gravitonShardCost;
- upgrades[currentUpgradeID] = false;
+ // todo ringAmount is not client synced, causing a UI desync when unlocking split upgrades
+ private void completeUpgrade(ForgeOfGodsUpgrade upgrade) {
+ if (isUpgradeActive(upgrade)) return;
+ if (!upgrades.checkPrerequisites(upgrade)) return;
+ if (!upgrades.checkSplit(upgrade, ringAmount)) return;
+ if (!upgrades.checkCost(upgrade, gravitonShardsAvailable)) return;
- if (currentUpgradeID == 30) {
- gravitonShardEjection = false;
- }
- }
+ upgrades.unlockUpgrade(upgrade);
+ gravitonShardsAvailable -= upgrade.getShardCost();
+ gravitonShardsSpent += upgrade.getShardCost();
}
- private Widget createMaterialInputButton(int upgradeID, int xCoord, int yCoord, IWidgetBuilder<?> builder) {
- return new ButtonWidget().setOnClick((clickData, widget) -> {
- if (!widget.isClient() && doesCurrentUpgradeRequireExtraMats) {
- ModularUIContext ctx = widget.getContext();
- ctx.openSyncedWindow(MANUAL_INSERTION_WINDOW_ID);
- ctx.closeWindow(INDIVIDUAL_UPGRADE_WINDOW_ID);
- ctx.closeWindow(UPGRADE_TREE_WINDOW_ID);
- }
- })
- .setPlayClickSound(doesCurrentUpgradeRequireExtraMats)
- .setBackground(() -> {
- if (doesCurrentUpgradeRequireExtraMats) {
- if (materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION)
- .indexOf(upgradeID)]) {
- return new IDrawable[] { TecTechUITextures.BUTTON_BOXED_CHECKMARK_18x18 };
- } else {
- return new IDrawable[] { TecTechUITextures.BUTTON_BOXED_EXCLAMATION_POINT_18x18 };
- }
- } else {
- return new IDrawable[] { GTUITextures.TRANSPARENT };
- }
- })
- .setPos(xCoord, yCoord)
- .setSize(15, 15)
- .dynamicTooltip(this::upgradeMaterialRequirements)
- .addTooltip(EnumChatFormatting.GRAY + translateToLocal("fog.button.materialrequirements.tooltip.clickhere"))
- .attachSyncer(
- new FakeSyncWidget.BooleanSyncer(
- () -> materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION)
- .indexOf(upgradeID)],
- val -> materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION)
- .indexOf(upgradeID)] = val),
- builder);
+ private void respecUpgrade(ForgeOfGodsUpgrade upgrade) {
+ if (!isUpgradeActive(upgrade)) return;
+ if (!upgrades.checkDependents(upgrade)) return;
+
+ upgrades.respecUpgrade(upgrade);
+ gravitonShardsAvailable += upgrade.getShardCost();
+ gravitonShardsSpent -= upgrade.getShardCost();
+
+ if (upgrade == END) {
+ gravitonShardEjection = false;
+ }
}
- /**
- * @param upgradeID ID of the upgrade
- * @param colorCode Number deciding which colored background to use, 0 for blue, 1 for purple, 2 for
- * orange and 3 for green
- * @param milestone Number deciding which milestone symbol to display in the background, 0 for charge,
- * 1 for conversion, 2 for catalyst and 3 for composition
- * @param prerequisiteUpgradeIDs IDs of the prior upgrades directly connected to the current one
- * @param requireAllPrerequisites Decides how many connected prerequisite upgrades have to be unlocked to be able to
- * unlock this one. True means ALL, False means AT LEAST ONE
- * @param followingUpgradeIDs IDs of the following upgrades directly connected to the current one
- * @param isStartOfSplit Whether this upgrade is one of the initial split upgrades
- * @param requiresExtraMaterials Whether this upgrade requires materials other than graviton shards to unlock
- * @param shardCost How many graviton shards are needed to unlock this upgrade
- * @param pos Position of the upgrade inside the scrollableWidget
- */
- private Widget createUpgradeBox(int upgradeID, int colorCode, int milestone, int[] prerequisiteUpgradeIDs,
- boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit,
- boolean requiresExtraMaterials, int shardCost, Pos2d pos, IWidgetBuilder<?> builder) {
- prereqUpgrades[upgradeID] = prerequisiteUpgradeIDs;
- allPrereqRequired[upgradeID] = requireAllPrerequisites;
+ private Widget createUpgradeBox(ForgeOfGodsUpgrade upgrade, IWidgetBuilder<?> builder) {
return new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
- currentUpgradeID = upgradeID;
- currentColorCode = colorCode;
- currentMilestoneBG = milestone;
- gravitonShardCost = shardCost;
- followupUpgrades = followingUpgradeIDs;
- isUpradeSplitStart = isStartOfSplit;
- doesCurrentUpgradeRequireExtraMats = requiresExtraMaterials;
+ currentUpgradeWindow = upgrade;
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);
+ if (!upgrade.hasExtraCost() || upgrades.isCostPaid(upgrade)) {
+ completeUpgrade(upgrade);
+ } else {
+ ForgeOfGodsUI.reopenWindow(widget, MANUAL_INSERTION_WINDOW_ID);
+ ForgeOfGodsUI.closeWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID);
+ ForgeOfGodsUI.closeWindow(widget, UPGRADE_TREE_WINDOW_ID);
}
} else {
ForgeOfGodsUI.reopenWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID);
}
} else if (clickData.mouseButton == 1) {
- respecUpgrade();
+ respecUpgrade(upgrade);
}
})
.setSize(40, 15)
.setBackground(() -> {
- if (upgrades[upgradeID]) {
+ if (isUpgradeActive(upgrade)) {
return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_PRESSED_32x16 };
} else {
return new IDrawable[] { TecTechUITextures.BUTTON_SPACE_32x16 };
}
})
- .addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID))
+ .addTooltip(upgrade.getNameText())
.setTooltipShowUpDelay(TOOLTIP_DELAY))
.addChild(
- new TextWidget(translateToLocal("fog.upgrade.tt.short." + upgradeID)).setScale(0.8f)
+ new TextWidget(upgrade.getShortNameText()).setScale(0.8f)
.setDefaultColor(EnumChatFormatting.GOLD)
.setTextAlignment(Alignment.Center)
.setSize(34, 9)
.setPos(3, 4))
- .setPos(pos)
- .attachSyncer(
- new FakeSyncWidget.BooleanSyncer(() -> upgrades[upgradeID], val -> upgrades[upgradeID] = val),
- builder);
+ .setPos(upgrade.getTreePos())
+ .attachSyncer(upgrades.getSyncer(upgrade), builder);
}
- private Widget createUpgradeConnectorLine(Pos2d pos, int length, float rotationAngle, int colorCode,
- int startUpgradeID, int endUpgradeID) {
- return new DrawableWidget()
- .setDrawable(
- () -> (upgrades[startUpgradeID] && upgrades[endUpgradeID])
- ? coloredLine(colorCode, true).withRotationDegree(rotationAngle)
- : coloredLine(colorCode, false).withRotationDegree(rotationAngle))
+ private Widget createUpgradeConnectorLine(Pos2d pos, int length, float rotationAngle, UpgradeColor color,
+ ForgeOfGodsUpgrade startUpgrade, ForgeOfGodsUpgrade endUpgrade) {
+ return new DrawableWidget().setDrawable(() -> {
+ UITexture texture = color.getConnector();
+ if (isUpgradeActive(startUpgrade) && isUpgradeActive(endUpgrade)) {
+ texture = color.getOpaqueConnector();
+ }
+ return texture.withRotationDegree(rotationAngle);
+ })
.setPos(pos)
.setSize(6, length);
}
- private IDrawable coloredLine(int colorCode, boolean opaque) {
- IDrawable line;
- switch (colorCode) {
- case 1 -> {
- line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE_OPAQUE
- : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE;
- }
- case 2 -> {
- line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE_OPAQUE
- : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE;
- }
- case 3 -> {
- line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN_OPAQUE
- : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN;
- }
- case 4 -> {
- line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED_OPAQUE
- : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED;
- }
- default -> {
- line = opaque ? TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE
- : TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE;
- }
- }
- return line;
- }
-
protected ModularWindow createManualInsertionWindow(final EntityPlayer player) {
- ItemStack[] inputs = godforgeUpgradeMats.get(currentUpgradeID);
+ ForgeOfGodsUpgrade upgrade = currentUpgradeWindow;
+ ItemStack[] inputs = upgrade.getExtraCost();
final int WIDTH = 189;
final int HEIGHT = 106;
final int PARENT_WIDTH = getGUIWidth();
final int PARENT_HEIGHT = getGUIHeight();
- final MultiChildWidget columns = new MultiChildWidget();
- final DynamicPositionedColumn column1 = new DynamicPositionedColumn();
- final DynamicPositionedColumn column2 = new DynamicPositionedColumn();
- final DynamicPositionedColumn column3 = new DynamicPositionedColumn();
- 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);
builder.setGuiTint(getGUIColorization());
@@ -2427,6 +1738,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.add(Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT)))
.subtract(5, 0)
.add(0, 4));
+ builder.widget(upgrades.getSyncer(upgrade));
builder.widget(
SlotGroup.ofItemHandler(inputSlotHandler, 4)
.startFromSlot(0)
@@ -2439,10 +1751,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
if (!widget.isClient()) {
widget.getWindow()
.closeWindow();
- widget.getContext()
- .openSyncedWindow(UPGRADE_TREE_WINDOW_ID);
- widget.getContext()
- .openSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID);
+ ForgeOfGodsUI.reopenWindow(widget, UPGRADE_TREE_WINDOW_ID);
+ ForgeOfGodsUI.reopenWindow(widget, INDIVIDUAL_UPGRADE_WINDOW_ID);
}
})
.setBackground(ModularUITextures.VANILLA_BACKGROUND, new Text("x"))
@@ -2450,26 +1760,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.setSize(10, 10));
builder.widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
if (!widget.isClient()) {
- ArrayList<ItemStack> list = new ArrayList<>(inputSlotHandler.getStacks());
- list.removeIf(Objects::isNull);
- int foundInputs = 0;
- int[] foundInputIndices = new int[inputs.length];
- for (ItemStack inputStack : list) {
- for (ItemStack requiredStack : inputs) {
- if (ItemStack.areItemStacksEqual(requiredStack, inputStack)) {
- foundInputIndices[foundInputs] = inputSlotHandler.getStacks()
- .indexOf(inputStack);
- foundInputs++;
- }
- }
- }
- if (foundInputs == inputs.length) {
- for (int index : foundInputIndices) {
- inputSlotHandler.extractItem(index, inputSlotHandler.getStackInSlot(index).stackSize, false);
- }
- materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION)
- .indexOf(currentUpgradeID)] = true;
- }
+ upgrades.payCost(upgrade, inputSlotHandler);
+ ForgeOfGodsUI.reopenWindow(widget, MANUAL_INSERTION_WINDOW_ID);
}
})
.setPlayClickSound(true)
@@ -2484,59 +1776,17 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
.setPos(5, 82)
.setSize(179, 16));
- IItemHandlerModifiable upgradeMatsHandler = new ItemStackHandler(12);
- int uniqueItems = inputs.length;
for (int i = 0; i < 12; i++) {
- int cleanDiv4 = i / 4;
- if (i < uniqueItems) {
- ItemStack stack = inputs[i];
- if (stack != null) {
- upgradeMatsHandler.setStackInSlot(i, stack.copy());
- }
- builder.widget(
- new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_PRESSED)
- .setPos(5 + cleanDiv4 * 36, 6 + i % 4 * 18)
- .setSize(18, 18));
- columnList.get(cleanDiv4)
- .addChild(
- new SlotWidget(upgradeMatsHandler, i).setAccess(false, false)
- .setRenderStackSize(false)
- .disableInteraction());
- columnList.get(cleanDiv4 + 3)
- .addChild(
- new TextWidget("x" + inputs[i].stackSize).setTextAlignment(Alignment.CenterLeft)
- .setScale(0.8f)
- .setSize(18, 8));
- } else {
- builder.widget(
- new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_DISABLED)
- .setPos(5 + cleanDiv4 * 36, 6 + i % 4 * 18)
- .setSize(18, 18));
- }
- }
-
- int counter = 0;
- for (DynamicPositionedColumn column : columnList) {
- int spacing = 0;
- int xCord = counter * 36;
- int yCord = 0;
- if (counter > 2) {
- spacing = 10;
- xCord = 19 + (counter - 3) * 36;
- yCord = 5;
+ final int ii = i;
+ ItemStack stack = null;
+ if (i < inputs.length) {
+ stack = inputs[i];
}
- columns.addChild(
- column.setSpace(spacing)
- .setAlignment(MainAxisAlignment.SPACE_BETWEEN)
- .setSize(16, 72)
- .setPos(xCord, yCord));
- counter++;
+ Widget costWidget = ForgeOfGodsUI.createExtraCostWidget(stack, () -> upgrades.getPaidCosts(upgrade)[ii]);
+ costWidget.setPos(5 + (36 * (i / 4)), 6 + (18 * (i % 4)));
+ builder.widget(costWidget);
}
- builder.widget(
- columns.setSize(108, 72)
- .setPos(5, 6));
-
return builder.build();
}
@@ -2545,119 +1795,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
protected ModularWindow createSpecialThanksWindow(final EntityPlayer player) {
- final int WIDTH = 200;
- final int HEIGHT = 200;
- ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
-
- builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_RAINBOW);
- builder.setDraggable(true);
- builder.widget(
- ButtonWidget.closeWindowButton(true)
- .setPos(184, 4))
- .widget(
- new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_THANKS)
- .setPos(50, 50)
- .setSize(100, 100))
- .widget(
- new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.contributors"))
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.Center)
- .setScale(1f)
- .setPos(0, 5)
- .setSize(200, 15))
- .widget(
- new TextWidget(
- EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lead"))
- .setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 30)
- .setSize(60, 10))
- .widget(
- new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.cloud")).setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.AQUA)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 40)
- .setSize(60, 10))
- .widget(
- new TextWidget(
- EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.programming"))
- .setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 55)
- .setSize(60, 10))
- .widget(
- new TextWidget(
- 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))
- .widget(
- new TextWidget(
- EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.textures"))
- .setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 85)
- .setSize(100, 10))
- .widget(
- new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.ant")).setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GREEN)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 95)
- .setSize(60, 10))
- .widget(
- new TextWidget(
- EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.rendering"))
- .setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 110)
- .setSize(100, 10))
- .widget(
- new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.bucket")).setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.WHITE)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 120)
- .setSize(60, 10))
- .widget(
- new TextWidget(
- EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lore"))
- .setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 135)
- .setSize(100, 10))
- .widget(
- delenoName().setSpace(-1)
- .setAlignment(MainAxisAlignment.SPACE_BETWEEN)
- .setPos(7, 145)
- .setSize(60, 10))
- .widget(
- new TextWidget(
- EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.playtesting"))
- .setScale(0.8f)
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 160)
- .setSize(100, 10))
- .widget(
- new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.misi")).setScale(0.8f)
- .setDefaultColor(0xffc26f)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(7, 170)
- .setSize(60, 10))
- .widget(
- new TextWidget(EnumChatFormatting.ITALIC + translateToLocal("gt.blockmachines.multimachine.FOG.thanks"))
- .setScale(0.8f)
- .setDefaultColor(0xbbbdbd)
- .setTextAlignment(Alignment.Center)
- .setPos(90, 140)
- .setSize(100, 60));
- return builder.build();
+ return ForgeOfGodsUI.createSpecialThanksWindow();
}
protected ModularWindow createStarCosmeticsWindow(final EntityPlayer player) {
@@ -2669,8 +1807,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
// Syncers
builder.widget(new FakeSyncWidget.StringSyncer(() -> selectedStarColor, val -> selectedStarColor = val));
- builder.widget(new FakeSyncWidget.IntegerSyncer(() -> rotationSpeed, val -> rotationSpeed = val));
- builder.widget(new FakeSyncWidget.IntegerSyncer(() -> starSize, val -> starSize = val));
builder.widget(new FakeSyncWidget.IntegerSyncer(() -> editingStarIndex, val -> editingStarIndex = val));
builder.widget(starColors.getSyncer());
@@ -2740,50 +1876,73 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
builder.widget(newPreset);
- // Miscellaneous options not related to color settings
- builder
- .widget(
- new TextWidget(EnumChatFormatting.UNDERLINE + translateToLocal("fog.cosmetics.misc"))
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(120, 25)
- .setSize(80, 10))
- .widget(
- TextWidget.localised("fog.cosmetics.spin")
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(120, 45)
- .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(155, 45)
- .addTooltip(translateToLocal("fog.cosmetics.onlyintegers"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY)
- .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD))
- .widget(
- TextWidget.localised("fog.cosmetics.size")
- .setDefaultColor(EnumChatFormatting.GOLD)
- .setTextAlignment(Alignment.CenterLeft)
- .setPos(120, 65)
- .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(155, 65)
- .addTooltip(translateToLocal("fog.cosmetics.onlyintegers"))
- .setTooltipShowUpDelay(TOOLTIP_DELAY)
- .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD));
+ // Misc Section
+
+ // Header
+ builder.widget(
+ new TextWidget(EnumChatFormatting.UNDERLINE + translateToLocal("fog.cosmetics.misc"))
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(120, 25)
+ .setSize(80, 10));
+
+ // Spin Textbox
+ builder.widget(
+ TextWidget.localised("fog.cosmetics.spin")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(120, 45)
+ .setSize(60, 18));
+
+ NumericWidget rotationWidget = new NumericWidget();
+ rotationWidget.setGetter(() -> rotationSpeed)
+ .setSetter(val -> {
+ if (rotationSpeed != (int) val) {
+ rotationSpeed = (int) val;
+ if (!rotationWidget.isClient()) {
+ updateRenderer();
+ }
+ }
+ })
+ .setBounds(0, 100)
+ .setDefaultValue(5)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(35, 18)
+ .setPos(155, 45)
+ .addTooltip(translateToLocal("fog.cosmetics.onlyintegers"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD);
+ builder.widget(rotationWidget);
+
+ // Size Textbox
+ builder.widget(
+ TextWidget.localised("fog.cosmetics.size")
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(120, 65)
+ .setSize(60, 18));
+
+ NumericWidget spinWidget = new NumericWidget();
+ spinWidget.setGetter(() -> starSize)
+ .setSetter(val -> {
+ if (starSize != (int) val) {
+ starSize = (int) val;
+ if (!spinWidget.isClient()) {
+ updateRenderer();
+ }
+ }
+ })
+ .setBounds(1, 40)
+ .setDefaultValue(20)
+ .setTextAlignment(Alignment.Center)
+ .setTextColor(Color.WHITE.normal)
+ .setSize(35, 18)
+ .setPos(155, 65)
+ .addTooltip(translateToLocal("fog.cosmetics.onlyintegers"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(GTUITextures.BACKGROUND_TEXT_FIELD);
+ builder.widget(spinWidget);
return builder.build();
}
@@ -3315,18 +2474,199 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
}
- private DynamicPositionedRow delenoName() {
- DynamicPositionedRow nameRow = new DynamicPositionedRow();
- String deleno = translateToLocal("gt.blockmachines.multimachine.FOG.deleno");
- int[] colors = new int[] { 0xffffff, 0xf6fff5, 0xecffec, 0xe3ffe2, 0xd9ffd9, 0xd0ffcf };
+ protected ModularWindow createStatisticsWindow(final EntityPlayer player) {
+ final int WIDTH = 300;
+ final int HEIGHT = 300;
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+ builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_WHITE);
+ builder.setDraggable(true);
- for (int i = 0; i < 6; i++) {
- nameRow.addChild(
- new TextWidget(Character.toString(deleno.charAt(i))).setDefaultColor(colors[i])
- .setScale(0.8f)
- .setTextAlignment(Alignment.CenterLeft));
+ builder
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.modulestats"))
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setScale(1f)
+ .setPos(0, 8)
+ .setSize(300, 15))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.heat")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(12, 56)
+ .setSize(69, 30)
+ .addTooltip(translateToLocal("fog.text.tooltip.heat"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.effectiveheat")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(12, 86)
+ .setSize(69, 30)
+ .addTooltip(translateToLocal("fog.text.tooltip.effectiveheat"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.parallel")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(12, 116)
+ .setSize(69, 30)
+ .addTooltip(translateToLocal("fog.text.tooltip.parallel"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.speedbonus")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(12, 146)
+ .setSize(69, 30)
+ .addTooltip(translateToLocal("fog.text.tooltip.speedbonus"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.energydiscount")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(12, 176)
+ .setSize(69, 30)
+ .addTooltip(translateToLocal("fog.text.tooltip.energydiscount"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.ocdivisor")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(12, 206)
+ .setSize(69, 30)
+ .addTooltip(translateToLocal("fog.text.tooltip.ocdivisor"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.powerforge")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(88, 40)
+ .setSize(40, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.meltingcore")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(141, 40)
+ .setSize(40, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.plasmafab")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(193, 40)
+ .setSize(44, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.exoticizer")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setPos(246, 43)
+ .setSize(40, 10));
+
+ // Vertical grid lines
+ for (int i = 0; i < 4; i++) {
+ builder.widget(
+ new DrawableWidget().setDrawable(new Rectangle().setColor(Color.rgb(190, 200, 0)))
+ .setSize(1, 197)
+ .setPos(81 + 53 * i, 38));
+ }
+
+ // Horizontal grid lines
+ for (int i = 0; i < 7; i++) {
+ builder.widget(
+ new DrawableWidget().setDrawable(new Rectangle().setColor(Color.rgb(0, 170, 170)))
+ .setSize(276, 1)
+ .setPos(12, 55 + 30 * i));
+ }
+
+ MTESmeltingModule smelting = new MTESmeltingModule("smelting");
+ MTEMoltenModule molten = new MTEMoltenModule("molten");
+ MTEPlasmaModule plasma = new MTEPlasmaModule("plasma");
+ MTEExoticModule exotic = new MTEExoticModule("exotic");
+
+ builder.widget(
+ new FakeSyncWidget.ByteSyncer(
+ () -> (byte) formattingMode.ordinal(),
+ val -> formattingMode = MilestoneFormatter.VALUES[MathHelper
+ .clamp_int(val, 0, MilestoneFormatter.VALUES.length - 1)]));
+ builder
+ .widget(new FakeSyncWidget.IntegerSyncer(() -> fuelConsumptionFactor, val -> fuelConsumptionFactor = val));
+ builder.widget(upgrades.getFullSyncer());
+
+ for (int i = 0; i < 24; i++) {
+ MTEBaseModule module;
+ switch (i % 4) {
+ case 1 -> {
+ module = molten;
+ }
+ case 2 -> {
+ module = plasma;
+ }
+ case 3 -> {
+ module = exotic;
+ }
+ default -> {
+ module = smelting;
+ }
+ }
+
+ int cleanDiv4 = i / 4;
+ String relevantInfo;
+ switch (cleanDiv4) {
+ case 1 -> {
+ calculateMaxHeatForModules(module, this);
+ relevantInfo = String.valueOf(formattingMode.format(module.getHeatForOC()));
+ }
+ case 2 -> {
+ calculateMaxParallelForModules(module, this);
+ relevantInfo = String.valueOf(formattingMode.format(module.getMaxParallel()));
+ }
+ case 3 -> {
+ calculateSpeedBonusForModules(module, this);
+ relevantInfo = String.valueOf(formatNumbers(module.getSpeedBonus()));
+ }
+ case 4 -> {
+ calculateEnergyDiscountForModules(module, this);
+ relevantInfo = String.valueOf(formatNumbers(module.getEnergyDiscount()));
+ }
+ case 5 -> {
+ setMiscModuleParameters(module, this);
+ relevantInfo = String.valueOf(formatNumbers(module.getOverclockTimeFactor()));
+ }
+ default -> {
+ calculateMaxHeatForModules(module, this);
+ relevantInfo = String.valueOf(formattingMode.format(module.getHeat()));
+ }
+ }
+
+ builder.widget(
+ new MultiChildWidget().addChild(
+ new ButtonWidget().setOnClick((clickData, widget) -> {})
+ .setSize(53, 30))
+ .addChild(
+ new DynamicTextWidget(() -> new Text(relevantInfo)).setScale(1f)
+ .setDefaultColor(EnumChatFormatting.GREEN)
+ .setTextAlignment(Alignment.Center)
+ .setSize(53, 30))
+ .setPos(81 + (i % 4) * 53, 55 + (i / 4 * 30)));
}
- return nameRow;
+
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(284, 4))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (clickData.mouseButton == 0) {
+ formattingMode = formattingMode.cycle();
+ ForgeOfGodsUI.reopenWindow(widget, STATISTICS_WINDOW_ID);
+ }
+ })
+ .setSize(20, 20)
+ .addTooltip(translateToLocal("fog.button.formatting.tooltip"))
+ .setBackground(TecTechUITextures.OVERLAY_CYCLIC_BLUE)
+ .setPos(8, 272)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY));
+
+ return builder.build();
}
@Override
@@ -3368,101 +2708,16 @@ 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.")
.beginStructureBlock(127, 29, 186, false)
+ .addStructureInfo("Total blocks needed for the structure with " + getRingText("1", "2", "3") + "rings:")
.addStructureInfo(
- "Total blocks needed for the structure with " + EnumChatFormatting.DARK_PURPLE
- + "1"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "2"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "3"
- + EnumChatFormatting.GRAY
- + " rings:")
+ getRingText("3943", "7279", "11005") + "Transcendentally Amplified Magnetic Confinement Casing")
+ .addStructureInfo(getRingText("2819", "4831", "6567") + "Singularity Reinforced Stellar Shielding Casing")
+ .addStructureInfo(getRingText("272", "512", "824") + "Celestial Matter Guidance Casing")
+ .addStructureInfo(getRingText("130", "144", "158") + "Boundless Gravitationally Severed Structure Casing")
+ .addStructureInfo(getRingText("9", "54", "155") + "Spatially Transcendent Gravitational Lens Block")
.addStructureInfo(
- EnumChatFormatting.DARK_PURPLE + "3943"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "7279"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "11005"
- + EnumChatFormatting.GRAY
- + " Transcendentally Amplified Magnetic Confinement Casing")
- .addStructureInfo(
- EnumChatFormatting.DARK_PURPLE + "2819"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "4831"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "6567"
- + EnumChatFormatting.GRAY
- + " Singularity Reinforced Stellar Shielding Casing")
- .addStructureInfo(
- EnumChatFormatting.DARK_PURPLE + "272"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "512"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "824"
- + EnumChatFormatting.GRAY
- + " Celestial Matter Guidance Casing")
- .addStructureInfo(
- EnumChatFormatting.DARK_PURPLE + "130"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "144"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "158"
- + EnumChatFormatting.GRAY
- + " Boundless Gravitationally Severed Structure Casing")
- .addStructureInfo(
- EnumChatFormatting.DARK_PURPLE + "9"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "54"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "155"
- + EnumChatFormatting.GRAY
- + " Spatially Transcendent Gravitational Lens Block")
- .addStructureInfo(
- EnumChatFormatting.DARK_PURPLE + "345"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "357"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "397"
- + EnumChatFormatting.DARK_PURPLE
- + " Remote"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.DARK_GREEN
- + "Medial"
- + EnumChatFormatting.GRAY
- + "/"
- + EnumChatFormatting.AQUA
- + "Central"
- + EnumChatFormatting.GRAY
- + " Graviton Flow Modulator")
+ getRingText("345", "357", "397") + getRingText("Remote", "Medial", "Central")
+ + "Graviton Flow Modulator")
.addStructureInfo(
EnumChatFormatting.GOLD + "36" + EnumChatFormatting.GRAY + " Stellar Energy Siphon Casing")
.addStructureInfoSeparator()
@@ -3473,6 +2728,20 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
return tt;
}
+ private static String getRingText(String oneRing, String twoRings, String threeRings) {
+ return EnumChatFormatting.DARK_PURPLE + oneRing
+ + EnumChatFormatting.GRAY
+ + "/"
+ + EnumChatFormatting.DARK_GREEN
+ + twoRings
+ + EnumChatFormatting.GRAY
+ + "/"
+ + EnumChatFormatting.AQUA
+ + threeRings
+ + EnumChatFormatting.GRAY
+ + " ";
+ }
+
@Override
public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) {
return true;
@@ -3497,8 +2766,8 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
return fuelConsumptionFactor;
}
- public boolean isUpgradeActive(int upgradeID) {
- return upgrades[upgradeID];
+ public boolean isUpgradeActive(ForgeOfGodsUpgrade upgrade) {
+ return upgrades.isUpgradeActive(upgrade);
}
public int getRingAmount() {
@@ -3506,41 +2775,25 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
public int getTotalActiveUpgrades() {
- int totalUpgrades = 0;
- for (boolean upgrade : upgrades) {
- if (upgrade) {
- totalUpgrades++;
- }
- }
- return totalUpgrades;
+ return upgrades.getTotalActiveUpgrades();
}
private Text fuelUsage() {
return new Text(fuelConsumption + " L/5s");
}
- private Text gravitonShardAmount() {
- EnumChatFormatting enoughGravitonShards = EnumChatFormatting.RED;
- if (gravitonShardsAvailable >= gravitonShardCost) {
- enoughGravitonShards = EnumChatFormatting.GREEN;
+ private Text storedFuel() {
+ if (internalBattery == 0) {
+ return new Text(stellarFuelAmount + "/" + neededStartupFuel);
}
- return new Text(enoughGravitonShards + Integer.toString(gravitonShardsAvailable));
-
+ return new Text(internalBattery + "/" + maxBatteryCharge);
}
- private Text storedFuel() {
+ private Text storedFuelHeaderText() {
if (internalBattery == 0) {
- return new Text(
- translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel") + " "
- + stellarFuelAmount
- + "/"
- + neededStartupFuel);
+ return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.storedstartupfuel"));
}
- return new Text(
- translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " "
- + internalBattery
- + "/"
- + maxBatteryCharge);
+ return new Text(translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel"));
}
private void checkInversionStatus() {
@@ -3730,47 +2983,6 @@ 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) {
Number progress;
String suffix;
@@ -3815,7 +3027,7 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
String progressText = translateToLocal("gt.blockmachines.multimachine.FOG.progress");
Text done = new Text(
translateToLocal("gt.blockmachines.multimachine.FOG.milestonecomplete")
- + (formattingMode != FormattingMode.NONE ? EnumChatFormatting.DARK_RED + "?" : ""));
+ + (formattingMode != DEFAULT_FORMATTING_MODE ? EnumChatFormatting.DARK_RED + "?" : ""));
if (milestoneProgress[milestoneID] >= 7 && !inversion) {
return done;
@@ -3856,26 +3068,6 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
return new Text(progressText + ": " + EnumChatFormatting.GRAY + formattingMode.format(max) + " " + suffix);
}
- private Text constructionStatusText() {
- return upgrades[currentUpgradeID] ? new Text(translateToLocal("fog.upgrade.respec"))
- : new Text(translateToLocal("fog.upgrade.confirm"));
- }
-
- private List<String> constructionStatus() {
- if (upgrades[currentUpgradeID]) {
- return ImmutableList.of(translateToLocal("fog.upgrade.respec"));
- }
- return ImmutableList.of(translateToLocal("fog.upgrade.confirm"));
- }
-
- private List<String> upgradeMaterialRequirements() {
- if (materialPaidUpgrades[Arrays.asList(UPGRADE_MATERIAL_ID_CONVERSION)
- .indexOf(currentUpgradeID)]) {
- return ImmutableList.of(translateToLocal("fog.button.materialrequirementsmet.tooltip"));
- }
- return ImmutableList.of(translateToLocal("fog.button.materialrequirements.tooltip"));
- }
-
private void increaseBattery(int amount) {
if ((internalBattery + amount) <= maxBatteryCharge) {
internalBattery += amount;
@@ -3921,87 +3113,22 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
protected void setHatchRecipeMap(MTEHatchInput hatch) {}
@Override
- public void setItemNBT(NBTTagCompound NBT) {
- NBT.setInteger("selectedFuelType", selectedFuelType);
- NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor);
- NBT.setInteger("internalBattery", internalBattery);
- NBT.setBoolean("batteryCharging", batteryCharging);
- NBT.setInteger("batterySize", maxBatteryCharge);
- NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable);
- NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent);
- NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray());
- NBT.setLong("totalRecipesProcessed", totalRecipesProcessed);
- 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();
-
- int upgradeIndex = 0;
- for (Boolean upgrade : upgrades) {
- upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade);
- upgradeIndex++;
- }
-
- NBT.setTag("upgrades", upgradeBooleanArrayNBTTag);
-
- NBTTagCompound upgradeMaterialBooleanArrayNBTTag = new NBTTagCompound();
-
- int upgradeMaterialIndex = 0;
- for (Boolean upgrade : materialPaidUpgrades) {
- upgradeBooleanArrayNBTTag.setBoolean("upgradeMaterial" + upgradeMaterialIndex, upgrade);
- upgradeMaterialIndex++;
- }
-
- NBT.setTag("upgradeMaterials", upgradeMaterialBooleanArrayNBTTag);
-
- starColors.serializeToNBT(NBT);
+ public RecipeMap<?> getRecipeMap() {
+ return TecTechRecipeMaps.godforgeFakeUpgradeCostRecipes;
+ }
+ @Override
+ public void setItemNBT(NBTTagCompound NBT) {
+ saveGeneralNBT(NBT, false);
super.saveNBTData(NBT);
}
@Override
public void saveNBTData(NBTTagCompound NBT) {
- NBT.setInteger("selectedFuelType", selectedFuelType);
- NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor);
- NBT.setInteger("internalBattery", internalBattery);
- NBT.setBoolean("batteryCharging", batteryCharging);
- NBT.setInteger("batterySize", maxBatteryCharge);
- NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable);
- NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent);
- NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray());
- NBT.setLong("totalRecipesProcessed", totalRecipesProcessed);
- NBT.setLong("totalFuelConsumed", totalFuelConsumed);
- NBT.setInteger("starFuelStored", stellarFuelAmount);
- NBT.setBoolean("gravitonShardEjection", gravitonShardEjection);
- NBT.setInteger("ringAmount", ringAmount);
- NBT.setBoolean("secretUpgrade", secretUpgrade);
-
- // Store booleanArray of all upgrades
- NBTTagCompound upgradeBooleanArrayNBTTag = new NBTTagCompound();
-
- int upgradeIndex = 0;
- for (boolean upgrade : upgrades) {
- upgradeBooleanArrayNBTTag.setBoolean("upgrade" + upgradeIndex, upgrade);
- upgradeIndex++;
- }
-
- NBT.setTag("upgrades", upgradeBooleanArrayNBTTag);
-
- NBTTagCompound upgradeMaterialBooleanArrayNBTTag = new NBTTagCompound();
-
- int upgradeMaterialIndex = 0;
- for (boolean upgrade : materialPaidUpgrades) {
- upgradeMaterialBooleanArrayNBTTag.setBoolean("upgradeMaterial" + upgradeMaterialIndex, upgrade);
- upgradeMaterialIndex++;
- }
-
- NBT.setTag("upgradeMaterials", upgradeMaterialBooleanArrayNBTTag);
+ saveGeneralNBT(NBT, true);
+ // Upgrade window stored items
NBTTagCompound upgradeWindowStorageNBTTag = new NBTTagCompound();
-
int storageIndex = 0;
for (ItemStack itemStack : inputSlotHandler.getStacks()) {
if (itemStack != null) {
@@ -4011,69 +3138,96 @@ public class MTEForgeOfGods extends TTMultiblockBase implements IConstructable,
}
storageIndex++;
}
-
NBT.setTag("upgradeWindowStorage", upgradeWindowStorageNBTTag);
// Renderer information
NBT.setInteger("rotationSpeed", rotationSpeed);
NBT.setInteger("starSize", starSize);
NBT.setString("selectedStarColor", selectedStarColor);
+ NBT.setInteger("ringAmount", ringAmount);
NBT.setBoolean("isRenderActive", isRenderActive);
-
- starColors.serializeToNBT(NBT);
+ NBT.setBoolean("isRendererDisabled", isRendererDisabled);
super.saveNBTData(NBT);
}
+ private void saveGeneralNBT(NBTTagCompound NBT, boolean force) {
+ if (force || selectedFuelType != 0) NBT.setInteger("selectedFuelType", selectedFuelType);
+ if (force || internalBattery != 0) NBT.setInteger("internalBattery", internalBattery);
+ if (force || batteryCharging) NBT.setBoolean("batteryCharging", batteryCharging);
+ if (force || gravitonShardsAvailable != 0) NBT.setInteger("gravitonShardsAvailable", gravitonShardsAvailable);
+ if (force || gravitonShardsSpent != 0) NBT.setInteger("gravitonShardsSpent", gravitonShardsSpent);
+ if (force || totalRecipesProcessed != 0) NBT.setLong("totalRecipesProcessed", totalRecipesProcessed);
+ if (force || totalFuelConsumed != 0) NBT.setLong("totalFuelConsumed", totalFuelConsumed);
+ if (force || stellarFuelAmount != 0) NBT.setInteger("starFuelStored", stellarFuelAmount);
+ if (force || gravitonShardEjection) NBT.setBoolean("gravitonShardEjection", gravitonShardEjection);
+ if (force || secretUpgrade) NBT.setBoolean("secretUpgrade", secretUpgrade);
+
+ // Fields with non-zero defaults
+ if (force || fuelConsumptionFactor != DEFAULT_FUEL_CONSUMPTION_FACTOR) {
+ NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor);
+ }
+ if (force || maxBatteryCharge != DEFAULT_MAX_BATTERY_CHARGE) {
+ NBT.setInteger("batterySize", maxBatteryCharge);
+ }
+ if (force || !DEFAULT_TOTAL_POWER.equals(totalPowerConsumed)) {
+ NBT.setByteArray("totalPowerConsumed", totalPowerConsumed.toByteArray());
+ }
+ if (force || formattingMode != DEFAULT_FORMATTING_MODE) {
+ NBT.setInteger("formattingMode", formattingMode.ordinal());
+ }
+
+ upgrades.serializeToNBT(NBT, force);
+ starColors.serializeToNBT(NBT);
+ }
+
@Override
public void loadNBTData(NBTTagCompound NBT) {
selectedFuelType = NBT.getInteger("selectedFuelType");
- fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor");
internalBattery = NBT.getInteger("internalBattery");
batteryCharging = NBT.getBoolean("batteryCharging");
- maxBatteryCharge = NBT.getInteger("batterySize");
gravitonShardsAvailable = NBT.getInteger("gravitonShardsAvailable");
gravitonShardsSpent = NBT.getInteger("gravitonShardsSpent");
- totalPowerConsumed = new BigInteger(NBT.getByteArray("totalPowerConsumed"));
totalRecipesProcessed = NBT.getLong("totalRecipesProcessed");
totalFuelConsumed = NBT.getLong("totalFuelConsumed");
stellarFuelAmount = NBT.getInteger("starFuelStored");
gravitonShardEjection = NBT.getBoolean("gravitonShardEjection");
- ringAmount = NBT.getInteger("ringAmount");
secretUpgrade = NBT.getBoolean("secretUpgrade");
- NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades");
-
- for (int upgradeIndex = 0; upgradeIndex < 31; upgradeIndex++) {
- boolean upgrade = tempBooleanTag.getBoolean("upgrade" + upgradeIndex);
- upgrades[upgradeIndex] = upgrade;
+ // Fields with non-zero defaults
+ if (NBT.hasKey("fuelConsumptionFactor")) {
+ fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor");
}
-
- tempBooleanTag = NBT.getCompoundTag("upgradeMaterials");
-
- for (int upgradeIndex = 0; upgradeIndex < 7; upgradeIndex++) {
- boolean upgrade = tempBooleanTag.getBoolean("upgradeMaterial" + upgradeIndex);
- materialPaidUpgrades[upgradeIndex] = upgrade;
+ if (NBT.hasKey("batterySize")) {
+ maxBatteryCharge = NBT.getInteger("batterySize");
+ }
+ if (NBT.hasKey("totalPowerConsumed")) {
+ totalPowerConsumed = new BigInteger(NBT.getByteArray("totalPowerConsumed"));
+ }
+ if (NBT.hasKey("formattingMode")) {
+ int index = MathHelper.clamp_int(NBT.getInteger("formattingMode"), 0, MilestoneFormatter.VALUES.length);
+ formattingMode = MilestoneFormatter.VALUES[index];
}
+ // Stored items
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);
}
}
// Renderer information
- rotationSpeed = NBT.getInteger("rotationSpeed");
- starSize = NBT.getInteger("starSize");
- selectedStarColor = NBT.getString("selectedStarColor");
+ if (NBT.hasKey("rotationSpeed")) rotationSpeed = NBT.getInteger("rotationSpeed");
+ if (NBT.hasKey("starSize")) starSize = NBT.getInteger("starSize");
+ if (NBT.hasKey("selectedStarColor")) selectedStarColor = NBT.getString("selectedStarColor");
+ if (NBT.hasKey("ringAmount")) ringAmount = NBT.getInteger("ringAmount");
isRenderActive = NBT.getBoolean("isRenderActive");
+ isRendererDisabled = NBT.getBoolean("isRendererDisabled");
+ upgrades.rebuildFromNBT(NBT);
starColors.rebuildFromNBT(NBT);
super.loadNBTData(NBT);
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java
index 51bfe51ac0..eace01bb6a 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEMoltenModule.java
@@ -11,8 +11,6 @@ import static net.minecraft.util.EnumChatFormatting.YELLOW;
import java.math.BigInteger;
import java.util.ArrayList;
-import javax.annotation.Nonnull;
-
import net.minecraft.util.EnumChatFormatting;
import org.jetbrains.annotations.NotNull;
@@ -54,7 +52,7 @@ public class MTEMoltenModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) {
if (recipe.mSpecialValue > getHeat()) {
return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
}
@@ -70,9 +68,9 @@ public class MTEMoltenModule extends MTEBaseModule {
return CheckRecipeResultRegistry.SUCCESSFUL;
}
- @Nonnull
+ @NotNull
@Override
- protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) {
+ protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) {
return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
.setRecipeHeat(recipe.mSpecialValue)
.setHeatOC(true)
@@ -85,7 +83,7 @@ public class MTEMoltenModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) {
if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration);
}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java
index 29675ae5ce..05ae43e341 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTEPlasmaModule.java
@@ -14,8 +14,6 @@ import static net.minecraft.util.EnumChatFormatting.YELLOW;
import java.math.BigInteger;
import java.util.ArrayList;
-import javax.annotation.Nonnull;
-
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumChatFormatting;
@@ -77,7 +75,7 @@ public class MTEPlasmaModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) {
wirelessEUt = (long) recipe.mEUt * getMaxParallel();
if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
@@ -91,7 +89,7 @@ public class MTEPlasmaModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) {
wirelessEUt = (long) recipe.mEUt * maxParallel;
if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
@@ -106,9 +104,9 @@ public class MTEPlasmaModule extends MTEBaseModule {
return CheckRecipeResultRegistry.SUCCESSFUL;
}
- @Nonnull
+ @NotNull
@Override
- protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) {
+ protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) {
return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
.setDurationDecreasePerOC(getOverclockTimeFactor());
}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java
index ba8e5f2666..1e499b3507 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/MTESmeltingModule.java
@@ -17,8 +17,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import javax.annotation.Nonnull;
-
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
@@ -70,7 +68,7 @@ public class MTESmeltingModule extends MTEBaseModule {
return furnaceMode ? RecipeMaps.furnaceRecipes : RecipeMaps.blastFurnaceRecipes;
}
- @Nonnull
+ @NotNull
@Override
public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes);
@@ -89,7 +87,7 @@ public class MTESmeltingModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) {
if (recipe.mSpecialValue > getHeat()) {
return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
@@ -108,7 +106,7 @@ public class MTESmeltingModule extends MTEBaseModule {
@NotNull
@Override
- protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) {
+ protected CheckRecipeResult onRecipeStart(@NotNull GTRecipe recipe) {
if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration);
}
@@ -124,9 +122,9 @@ public class MTESmeltingModule extends MTEBaseModule {
return CheckRecipeResultRegistry.SUCCESSFUL;
}
- @Nonnull
+ @NotNull
@Override
- protected OverclockCalculator createOverclockCalculator(@Nonnull GTRecipe recipe) {
+ protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) {
return super.createOverclockCalculator(recipe).setEUt(getProcessingVoltage())
.setRecipeHeat(recipe.mSpecialValue)
.setHeatOC(true)
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java
index 9593c1db95..900ef76f63 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/color/ForgeOfGodsStarColor.java
@@ -11,9 +11,9 @@ import net.minecraft.network.PacketBuffer;
import org.jetbrains.annotations.Nullable;
-import com.cleanroommc.modularui.utils.Color;
import com.gtnewhorizons.modularui.api.drawable.IDrawable;
import com.gtnewhorizons.modularui.api.drawable.shapes.Rectangle;
+import com.gtnewhorizons.modularui.api.math.Color;
import tectech.thing.gui.TecTechUITextures;
@@ -29,6 +29,7 @@ public class ForgeOfGodsStarColor {
public static final int DEFAULT_GREEN = 204;
public static final int DEFAULT_BLUE = 255;
public static final float DEFAULT_GAMMA = 3.0f;
+ public static final int DEFAULT_CYCLE_SPEED = 1;
public static final ForgeOfGodsStarColor DEFAULT = new ForgeOfGodsStarColor("Default")
.addColor(DEFAULT_RED, DEFAULT_GREEN, DEFAULT_BLUE, DEFAULT_GAMMA)
@@ -43,15 +44,29 @@ public class ForgeOfGodsStarColor {
.setCustomDrawable(TecTechUITextures.PICTURE_RAINBOW_SQUARE)
.registerPreset();
- public static final ForgeOfGodsStarColor CLOUD_PICK = new ForgeOfGodsStarColor("Cloud's Pick")
- .addColor(DEFAULT_RED, DEFAULT_GREEN, DEFAULT_BLUE, DEFAULT_GAMMA) // todo @cloud
+ public static final ForgeOfGodsStarColor CLOUDS_PICK = new ForgeOfGodsStarColor("Cloud's Pick")
+ .addColor(255, 255, 0, 0.8f)
+ .addColor(0, 0, 0, 0)
+ .addColor(0, 255, 255, 0.4f)
+ .addColor(0, 0, 0, 0)
+ .setCycleSpeed(1)
+ .setCustomDrawable(
+ new Rectangle()
+ .setColor(Color.rgb(255, 255, 0), Color.rgb(0, 0, 0), Color.rgb(0, 0, 0), Color.rgb(0, 255, 255)))
.registerPreset();
- public static final ForgeOfGodsStarColor MAYA_PICK = new ForgeOfGodsStarColor("Maya's Pick")
- .addColor(91, 206, 250, 3.0f)
- .addColor(245, 169, 184, 3.0f)
+ public static final ForgeOfGodsStarColor MAYAS_PICK = new ForgeOfGodsStarColor("Maya's Pick")
+ .addColor(0, 0, 0, 0.0f)
+ .addColor(109, 201, 225, 1.0f)
.addColor(255, 255, 255, 3.0f)
+ .addColor(255, 172, 210, 1.0f)
.setCycleSpeed(1)
+ .setCustomDrawable(
+ new Rectangle().setColor(
+ Color.rgb(255, 172, 210),
+ Color.rgb(255, 255, 255),
+ Color.rgb(0, 0, 0),
+ Color.rgb(109, 201, 225)))
.registerPreset();
public static List<ForgeOfGodsStarColor> getDefaultColors() {
@@ -68,7 +83,7 @@ public class ForgeOfGodsStarColor {
// Star render settings
private final List<StarColorSetting> settings = new ArrayList<>();
- private int cycleSpeed = 1;
+ private int cycleSpeed = DEFAULT_CYCLE_SPEED;
protected ForgeOfGodsStarColor(String name) {
this(name, LATEST_VERSION);
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java
index fcff5c7026..116dc7b5ba 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsRingsStructureString.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsRingsStructureString.java
@@ -1,4 +1,4 @@
-package tectech.thing.metaTileEntity.multi.godforge;
+package tectech.thing.metaTileEntity.multi.godforge.structure;
import static tectech.util.TTUtility.replaceLetters;
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java
index 1780be0079..277db1d1e1 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsStructureString.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/structure/ForgeOfGodsStructureString.java
@@ -1,4 +1,4 @@
-package tectech.thing.metaTileEntity.multi.godforge;
+package tectech.thing.metaTileEntity.multi.godforge.structure;
import static tectech.util.TTUtility.appendStringArrays;
import static tectech.util.TTUtility.replaceLetters;
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java
new file mode 100644
index 0000000000..05b5f491d7
--- /dev/null
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/ForgeOfGodsUpgrade.java
@@ -0,0 +1,475 @@
+package tectech.thing.metaTileEntity.multi.godforge.upgrade;
+
+import static tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade.BGWindowSize.*;
+import static tectech.thing.metaTileEntity.multi.godforge.util.MilestoneIcon.*;
+import static tectech.thing.metaTileEntity.multi.godforge.util.UpgradeColor.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Set;
+import java.util.function.UnaryOperator;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
+
+import com.google.common.collect.ImmutableSet;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import it.unimi.dsi.fastutil.objects.ObjectList;
+import tectech.thing.metaTileEntity.multi.godforge.util.MilestoneIcon;
+import tectech.thing.metaTileEntity.multi.godforge.util.UpgradeColor;
+
+public enum ForgeOfGodsUpgrade {
+
+ START,
+ IGCC,
+ STEM,
+ CFCE,
+ GISS,
+ FDIM,
+ SA,
+ GPCI,
+ REC,
+ GEM,
+ CTCDD,
+ QGPIU,
+ SEFCP,
+ TCT,
+ GGEBE,
+ TPTP,
+ DOP,
+ CNTI,
+ EPEC,
+ IMKG,
+ NDPE,
+ POS,
+ DOR,
+ NGMS,
+ SEDS,
+ PA,
+ CD,
+ TSE,
+ TBF,
+ EE,
+ END,
+
+ ;
+
+ public static final ForgeOfGodsUpgrade[] VALUES = values();
+
+ static final Set<ForgeOfGodsUpgrade> SPLIT_UPGRADES;
+
+ static {
+ // Build upgrade data. Done here due to potential forward references
+
+ // spotless:off
+
+ START.build(b -> b
+ .background(BLUE, COMPOSITION)
+ .windowSize(LARGE)
+ .treePos(126, 56));
+
+ IGCC.build(b -> b
+ .prereqs(START)
+ .cost(1)
+ .background(BLUE, CONVERSION)
+ .treePos(126, 116));
+
+ STEM.build(b -> b
+ .prereqs(IGCC)
+ .cost(1)
+ .background(BLUE, CATALYST)
+ .treePos(96, 176));
+
+ CFCE.build(b -> b
+ .prereqs(IGCC)
+ .cost(1)
+ .background(BLUE, CATALYST)
+ .treePos(156, 176));
+
+ GISS.build(b -> b
+ .prereqs(STEM)
+ .cost(1)
+ .background(BLUE, CHARGE)
+ .treePos(66, 236));
+
+ FDIM.build(b -> b
+ .prereqs(STEM, CFCE)
+ .cost(1)
+ .background(BLUE, COMPOSITION)
+ .treePos(126, 236));
+
+ SA.build(b -> b
+ .prereqs(CFCE)
+ .cost(1)
+ .background(BLUE, CONVERSION)
+ .treePos(186, 236));
+
+ GPCI.build(b -> b
+ .prereqs(FDIM)
+ .cost(2)
+ .background(BLUE, COMPOSITION)
+ .treePos(126, 296));
+
+ REC.build(b -> b
+ .prereqs(GISS, FDIM)
+ .requireAllPrereqs()
+ .cost(2)
+ .background(RED, CHARGE)
+ .treePos(56, 356));
+
+ GEM.build(b -> b
+ .prereqs(GPCI)
+ .cost(2)
+ .background(BLUE, CATALYST)
+ .treePos(126, 356));
+
+ CTCDD.build(b -> b
+ .prereqs(GPCI, SA)
+ .requireAllPrereqs()
+ .cost(2)
+ .background(RED, CONVERSION)
+ .treePos(196, 356));
+
+ QGPIU.build(b -> b
+ .prereqs(REC, CTCDD)
+ .cost(2)
+ .background(BLUE, CATALYST)
+ .treePos(126, 416));
+
+ SEFCP.build(b -> b
+ .prereqs(QGPIU)
+ .cost(3)
+ .background(PURPLE, CATALYST)
+ .treePos(66, 476));
+
+ TCT.build(b -> b
+ .prereqs(QGPIU)
+ .cost(3)
+ .background(ORANGE, CONVERSION)
+ .treePos(126, 476));
+
+ GGEBE.build(b -> b
+ .prereqs(QGPIU)
+ .cost(3)
+ .background(GREEN, CHARGE)
+ .treePos(186, 476));
+
+ TPTP.build(b -> b
+ .prereqs(GGEBE)
+ .cost(4)
+ .background(GREEN, CONVERSION)
+ .treePos(246, 496));
+
+ DOP.build(b -> b
+ .prereqs(CNTI)
+ .cost(4)
+ .background(PURPLE, CONVERSION)
+ .treePos(6, 556));
+
+ CNTI.build(b -> b
+ .prereqs(SEFCP)
+ .cost(3)
+ .background(PURPLE, CHARGE)
+ .treePos(66, 536));
+
+ EPEC.build(b -> b
+ .prereqs(TCT)
+ .cost(3)
+ .background(ORANGE, CONVERSION)
+ .treePos(126, 536));
+
+ IMKG.build(b -> b
+ .prereqs(GGEBE)
+ .cost(3)
+ .background(GREEN, CHARGE)
+ .treePos(186, 536));
+
+ NDPE.build(b -> b
+ .prereqs(CNTI)
+ .cost(3)
+ .background(PURPLE, CHARGE)
+ .treePos(66, 596));
+
+ POS.build(b -> b
+ .prereqs(EPEC)
+ .cost(3)
+ .background(ORANGE, CONVERSION)
+ .treePos(126, 596));
+
+ DOR.build(b -> b
+ .prereqs(IMKG)
+ .cost(3)
+ .background(GREEN, CONVERSION)
+ .treePos(186, 596));
+
+ NGMS.build(b -> b
+ .prereqs(NDPE, POS, DOR)
+ .cost(4)
+ .background(BLUE, CHARGE)
+ .treePos(126, 656));
+
+ SEDS.build(b -> b
+ .prereqs(NGMS)
+ .cost(5)
+ .background(BLUE, CONVERSION)
+ .treePos(126, 718));
+
+ PA.build(b -> b
+ .prereqs(SEDS)
+ .cost(6)
+ .background(BLUE, CONVERSION)
+ .treePos(36, 758));
+
+ CD.build(b -> b
+ .prereqs(PA)
+ .cost(7)
+ .background(BLUE, COMPOSITION)
+ .treePos(36, 848));
+
+ TSE.build(b -> b
+ .prereqs(CD)
+ .cost(8)
+ .background(BLUE, CATALYST)
+ .treePos(126, 888));
+
+ TBF.build(b -> b
+ .prereqs(TSE)
+ .cost(9)
+ .background(BLUE, CHARGE)
+ .treePos(216, 848));
+
+ EE.build(b -> b
+ .prereqs(TBF)
+ .cost(10)
+ .background(BLUE, COMPOSITION)
+ .treePos(216, 758));
+
+ END.build(b -> b
+ .prereqs(EE)
+ .cost(12)
+ .background(BLUE, COMPOSITION)
+ .windowSize(LARGE)
+ .treePos(126, 798));
+
+ // spotless:on
+
+ // Build split upgrade set
+ SPLIT_UPGRADES = ImmutableSet.of(SEFCP, TCT, GGEBE);
+
+ // Build inverse dependents mapping
+ EnumMap<ForgeOfGodsUpgrade, List<ForgeOfGodsUpgrade>> dependencies = new EnumMap<>(ForgeOfGodsUpgrade.class);
+ for (ForgeOfGodsUpgrade upgrade : VALUES) {
+ for (ForgeOfGodsUpgrade prerequisite : upgrade.prerequisites) {
+ dependencies.computeIfAbsent(prerequisite, $ -> new ArrayList<>())
+ .add(upgrade);
+ }
+ }
+ for (var entry : dependencies.entrySet()) {
+ ForgeOfGodsUpgrade upgrade = entry.getKey();
+ List<ForgeOfGodsUpgrade> deps = entry.getValue();
+ if (deps != null) {
+ upgrade.dependents = deps.toArray(new ForgeOfGodsUpgrade[0]);
+ }
+ }
+ }
+
+ // Static tree linking
+ private ForgeOfGodsUpgrade[] prerequisites;
+ private boolean requireAllPrerequisites;
+
+ // Cost
+ private int shardCost;
+ private final List<ItemStack> extraCost = new ArrayList<>();
+
+ // UI
+ private UpgradeColor color;
+ private MilestoneIcon icon;
+ private BGWindowSize windowSize;
+ private Pos2d treePos;
+
+ // Pre-generated data
+ private ForgeOfGodsUpgrade[] dependents = new ForgeOfGodsUpgrade[0];
+ private final String name;
+ private final String nameShort;
+ private final String bodyText;
+ private final String loreText;
+
+ ForgeOfGodsUpgrade() {
+ this.name = "fog.upgrade.tt." + ordinal();
+ this.nameShort = "fog.upgrade.tt.short." + ordinal();
+ this.bodyText = "fog.upgrade.text." + ordinal();
+ this.loreText = "fog.upgrade.lore." + ordinal();
+ }
+
+ private void build(UnaryOperator<Builder> u) {
+ Builder b = u.apply(new Builder());
+
+ this.prerequisites = b.prerequisites != null ? b.prerequisites.toArray(new ForgeOfGodsUpgrade[0])
+ : new ForgeOfGodsUpgrade[0];
+ this.requireAllPrerequisites = b.requireAllPrerequisites;
+ this.shardCost = b.shardCost;
+ this.color = b.color;
+ this.icon = b.icon;
+ this.windowSize = b.windowSize;
+ this.treePos = b.treePos;
+ }
+
+ public void addExtraCost(ItemStack... cost) {
+ if (extraCost.size() + cost.length > 12) {
+ throw new IllegalArgumentException("Too many inputs for Godforge upgrade cost, cannot be more than 12!");
+ }
+ extraCost.addAll(Arrays.asList(cost));
+ }
+
+ public ForgeOfGodsUpgrade[] getPrerequisites() {
+ return prerequisites;
+ }
+
+ public boolean requiresAllPrerequisites() {
+ return requireAllPrerequisites;
+ }
+
+ public ForgeOfGodsUpgrade[] getDependents() {
+ return dependents;
+ }
+
+ public int getShardCost() {
+ return shardCost;
+ }
+
+ public boolean hasExtraCost() {
+ return !extraCost.isEmpty();
+ }
+
+ public ItemStack[] getExtraCost() {
+ return extraCost.toArray(new ItemStack[0]);
+ }
+
+ public UITexture getBackground() {
+ return color.getBackground();
+ }
+
+ public UITexture getOverlay() {
+ return color.getOverlay();
+ }
+
+ public UITexture getSymbol() {
+ return icon.getSymbol();
+ }
+
+ public float getSymbolWidthRatio() {
+ return icon.getWidthRatio();
+ }
+
+ public Size getWindowSize() {
+ return windowSize.getWindowSize();
+ }
+
+ public int getLoreYPos() {
+ return windowSize.getLoreY();
+ }
+
+ public Pos2d getTreePos() {
+ return treePos;
+ }
+
+ public String getNameText() {
+ return StatCollector.translateToLocal(name);
+ }
+
+ public String getShortNameText() {
+ return StatCollector.translateToLocal(nameShort);
+ }
+
+ public String getBodyText() {
+ return StatCollector.translateToLocal(bodyText);
+ }
+
+ public String getLoreText() {
+ return StatCollector.translateToLocal(loreText);
+ }
+
+ public static class Builder {
+
+ // Tree linking
+ private ObjectList<ForgeOfGodsUpgrade> prerequisites;
+ private boolean requireAllPrerequisites;
+
+ // Cost
+ private int shardCost;
+
+ // UI
+ private UpgradeColor color = BLUE;
+ private MilestoneIcon icon = CHARGE;
+ private BGWindowSize windowSize = STANDARD;
+ private Pos2d treePos = new Pos2d(0, 0);
+
+ private Builder() {}
+
+ public Builder prereqs(ForgeOfGodsUpgrade... prereqs) {
+ if (this.prerequisites != null) {
+ throw new IllegalArgumentException("Cannot repeat calls to ForgeOfGodsUpgrade$Builder#prereqs");
+ }
+ this.prerequisites = new ObjectArrayList<>(prereqs);
+ return this;
+ }
+
+ public Builder requireAllPrereqs() {
+ this.requireAllPrerequisites = true;
+ return this;
+ }
+
+ // Cost
+ public Builder cost(int shards) {
+ this.shardCost = shards;
+ return this;
+ }
+
+ // UI
+ public Builder background(UpgradeColor color, MilestoneIcon icon) {
+ this.color = color;
+ this.icon = icon;
+ return this;
+ }
+
+ public Builder windowSize(BGWindowSize windowSize) {
+ this.windowSize = windowSize;
+ return this;
+ }
+
+ public Builder treePos(int x, int y) {
+ this.treePos = new Pos2d(x, y);
+ return this;
+ }
+ }
+
+ enum BGWindowSize {
+
+ STANDARD(250, 250, 110),
+ LARGE(300, 300, 85),
+
+ ;
+
+ private final Size size;
+ private final int loreY;
+
+ BGWindowSize(int width, int height, int loreY) {
+ this.size = new Size(width, height);
+ this.loreY = loreY;
+ }
+
+ public Size getWindowSize() {
+ return size;
+ }
+
+ public int getLoreY() {
+ return loreY;
+ }
+ }
+}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java
new file mode 100644
index 0000000000..a473cc15ed
--- /dev/null
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/upgrade/UpgradeStorage.java
@@ -0,0 +1,285 @@
+package tectech.thing.metaTileEntity.multi.godforge.upgrade;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumMap;
+import java.util.stream.Stream;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.PacketBuffer;
+
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+
+import gregtech.api.util.GTUtility;
+
+public class UpgradeStorage {
+
+ private final EnumMap<ForgeOfGodsUpgrade, UpgradeData> unlockedUpgrades = new EnumMap<>(ForgeOfGodsUpgrade.class);
+
+ public UpgradeStorage() {
+ for (ForgeOfGodsUpgrade upgrade : ForgeOfGodsUpgrade.VALUES) {
+ unlockedUpgrades.put(upgrade, new UpgradeData());
+ }
+ }
+
+ /** Whether the passed upgrade is already unlocked (purchased). */
+ public boolean isUpgradeActive(ForgeOfGodsUpgrade upgrade) {
+ return getData(upgrade).isActive();
+ }
+
+ public boolean isCostPaid(ForgeOfGodsUpgrade upgrade) {
+ return getData(upgrade).isCostPaid();
+ }
+
+ public short[] getPaidCosts(ForgeOfGodsUpgrade upgrade) {
+ return getData(upgrade).amountsPaid;
+ }
+
+ /** Handles consuming items and updating state if successful. Does NOT handle graviton shards! */
+ public void payCost(ForgeOfGodsUpgrade upgrade, ItemStackHandler handler) {
+ UpgradeData data = getData(upgrade);
+
+ if (!upgrade.hasExtraCost()) {
+ data.costPaid = true;
+ return;
+ }
+
+ ItemStack[] extraCost = upgrade.getExtraCost();
+ for (int i = 0; i < handler.getSlots(); i++) {
+ ItemStack inputStack = handler.getStackInSlot(i);
+ if (inputStack == null) continue;
+
+ for (int j = 0; j < extraCost.length; j++) {
+ ItemStack costStack = extraCost[j];
+ int alreadyPaid = data.amountsPaid[j];
+ if (alreadyPaid >= costStack.stackSize) continue;
+
+ if (GTUtility.areStacksEqual(inputStack, costStack)) {
+ int maxExtract = costStack.stackSize - alreadyPaid;
+ ItemStack extractedStack = handler.extractItem(i, maxExtract, false);
+ if (extractedStack != null) {
+ data.amountsPaid[j] += extractedStack.stackSize;
+ }
+ }
+ }
+ }
+
+ // Check if all costs are paid
+ for (int i = 0; i < extraCost.length; i++) {
+ ItemStack costStack = extraCost[i];
+ if (costStack == null) continue;
+ if (data.amountsPaid[i] < costStack.stackSize) {
+ return;
+ }
+ }
+ data.costPaid = true;
+ }
+
+ public void unlockUpgrade(ForgeOfGodsUpgrade upgrade) {
+ getData(upgrade).active = true;
+ }
+
+ public void respecUpgrade(ForgeOfGodsUpgrade upgrade) {
+ getData(upgrade).active = false;
+ }
+
+ /**
+ * Whether the passed upgrade can be unlocked, checking that the prerequisites are satisfied.
+ */
+ public boolean checkPrerequisites(ForgeOfGodsUpgrade upgrade) {
+ ForgeOfGodsUpgrade[] prereqs = upgrade.getPrerequisites();
+ if (prereqs.length == 0) return true;
+
+ Stream<UpgradeData> prereqStream = Arrays.stream(prereqs)
+ .map(unlockedUpgrades::get);
+
+ if (upgrade.requiresAllPrerequisites()) {
+ return prereqStream.allMatch(UpgradeData::isActive);
+ }
+ return prereqStream.anyMatch(UpgradeData::isActive);
+ }
+
+ public boolean checkSplit(ForgeOfGodsUpgrade upgrade, int maxSplitUpgrades) {
+ if (ForgeOfGodsUpgrade.SPLIT_UPGRADES.contains(upgrade)) {
+ return ForgeOfGodsUpgrade.SPLIT_UPGRADES.stream()
+ .map(unlockedUpgrades::get)
+ .filter(UpgradeData::isActive)
+ .count() < maxSplitUpgrades;
+ }
+ return true;
+ }
+
+ public boolean checkCost(ForgeOfGodsUpgrade upgrade, int availableShards) {
+ if (upgrade.getShardCost() > availableShards) return false;
+ return !upgrade.hasExtraCost() || isCostPaid(upgrade);
+ }
+
+ /** @return true if any dependent upgrades are currently unlocked. */
+ public boolean checkDependents(ForgeOfGodsUpgrade upgrade) {
+ for (ForgeOfGodsUpgrade dependent : upgrade.getDependents()) {
+ if (!isUpgradeActive(dependent)) continue;
+
+ // Check failed, this dependent strictly requires the passed upgrade
+ if (dependent.requiresAllPrerequisites()) return false;
+
+ // Check for some other prerequisite upgrade of the dependent to make sure that
+ // if the passed upgrade is removed, that upgrade is still valid
+ if (Arrays.stream(dependent.getPrerequisites())
+ .map(unlockedUpgrades::get)
+ .filter(UpgradeData::isActive)
+ .count() <= 1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private UpgradeData getData(ForgeOfGodsUpgrade upgrade) {
+ return unlockedUpgrades.computeIfAbsent(upgrade, $ -> new UpgradeData());
+ }
+
+ private boolean hasAnyProgress() {
+ if (isUpgradeActive(ForgeOfGodsUpgrade.START)) return true;
+
+ // Check if any costs have been paid in any upgrades
+ for (var entry : unlockedUpgrades.entrySet()) {
+ ForgeOfGodsUpgrade upgrade = entry.getKey();
+ if (upgrade.hasExtraCost()) {
+ UpgradeData data = entry.getValue();
+ if (data.isCostPaid()) return true;
+ for (int i = 0; i < data.amountsPaid.length; i++) {
+ if (data.amountsPaid[i] != 0) return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public int getTotalActiveUpgrades() {
+ return (int) unlockedUpgrades.values()
+ .stream()
+ .map(UpgradeData::isActive)
+ .count();
+ }
+
+ public Collection<ForgeOfGodsUpgrade> getAllUpgrades() {
+ return unlockedUpgrades.keySet();
+ }
+
+ public void resetAll() {
+ for (UpgradeData data : unlockedUpgrades.values()) {
+ data.active = false;
+ data.costPaid = false;
+ }
+ }
+
+ public void unlockAll() {
+ for (UpgradeData data : unlockedUpgrades.values()) {
+ data.active = true;
+ }
+ }
+
+ public void serializeToNBT(NBTTagCompound NBT, boolean force) {
+ if (!force && !hasAnyProgress()) return;
+
+ NBTTagCompound upgradeTag = new NBTTagCompound();
+ for (ForgeOfGodsUpgrade upgrade : ForgeOfGodsUpgrade.VALUES) {
+ UpgradeData data = unlockedUpgrades.get(upgrade);
+ upgradeTag.setBoolean("upgrade" + upgrade.ordinal(), data.isActive());
+ if (upgrade.hasExtraCost()) {
+ NBTTagCompound costTag = new NBTTagCompound();
+ costTag.setBoolean("paid", data.isCostPaid());
+ for (int i = 0; i < data.amountsPaid.length; i++) {
+ costTag.setShort("costPaid" + i, data.amountsPaid[i]);
+ }
+ upgradeTag.setTag("extraCost" + upgrade.ordinal(), costTag);
+ }
+ }
+ NBT.setTag("upgrades", upgradeTag);
+ }
+
+ public void rebuildFromNBT(NBTTagCompound NBT) {
+ if (!NBT.hasKey("upgrades")) return;
+
+ NBTTagCompound upgradeTag = NBT.getCompoundTag("upgrades");
+ for (int i = 0; i < ForgeOfGodsUpgrade.VALUES.length; i++) {
+ ForgeOfGodsUpgrade upgrade = ForgeOfGodsUpgrade.VALUES[i];
+ UpgradeData data = unlockedUpgrades.get(upgrade);
+ data.active = upgradeTag.getBoolean("upgrade" + upgrade.ordinal());
+ if (upgrade.hasExtraCost() && upgradeTag.hasKey("extraCost" + upgrade.ordinal())) {
+ NBTTagCompound costTag = upgradeTag.getCompoundTag("extraCost" + upgrade.ordinal());
+ data.costPaid = costTag.getBoolean("paid");
+ for (int j = 0; j < data.amountsPaid.length; j++) {
+ data.amountsPaid[j] = costTag.getShort("costPaid" + j);
+ }
+ }
+ }
+ }
+
+ /** Sync widget to sync a single upgrade. */
+ public FakeSyncWidget<?> getSyncer(ForgeOfGodsUpgrade upgrade) {
+ return new FakeSyncWidget<>(
+ () -> unlockedUpgrades.get(upgrade),
+ val -> unlockedUpgrades.put(upgrade, val),
+ UpgradeData::writeToBuffer,
+ UpgradeData::readFromBuffer);
+ }
+
+ /** Sync widget to sync the full upgrade tree. */
+ public FakeSyncWidget<?> getFullSyncer() {
+ return new FakeSyncWidget.ListSyncer<>(() -> new ArrayList<>(unlockedUpgrades.values()), val -> {
+ for (int i = 0; i < val.size(); i++) {
+ unlockedUpgrades.put(ForgeOfGodsUpgrade.VALUES[i], val.get(i));
+ }
+ }, UpgradeData::writeToBuffer, UpgradeData::readFromBuffer);
+ }
+
+ private static class UpgradeData {
+
+ private boolean active;
+ private boolean costPaid;
+ private final short[] amountsPaid = new short[12];
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public boolean isCostPaid() {
+ return costPaid;
+ }
+
+ private static void writeToBuffer(PacketBuffer buf, UpgradeData data) {
+ buf.writeBoolean(data.isActive());
+ buf.writeBoolean(data.isCostPaid());
+ for (int i = 0; i < data.amountsPaid.length; i++) {
+ buf.writeShort(data.amountsPaid[i]);
+ }
+ }
+
+ private static UpgradeData readFromBuffer(PacketBuffer buf) {
+ UpgradeData data = new UpgradeData();
+ data.active = buf.readBoolean();
+ data.costPaid = buf.readBoolean();
+ for (int i = 0; i < data.amountsPaid.length; i++) {
+ data.amountsPaid[i] = buf.readShort();
+ }
+ return data;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ UpgradeData that = (UpgradeData) o;
+
+ if (active != that.active) return false;
+ if (costPaid != that.costPaid) return false;
+ return Arrays.equals(amountsPaid, that.amountsPaid);
+ }
+ }
+}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java
index a63ba81d7e..d6f9be6633 100644
--- a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/ForgeOfGodsUI.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/ForgeOfGodsUI.java
@@ -1,4 +1,4 @@
-package tectech.thing.metaTileEntity.multi.godforge;
+package tectech.thing.metaTileEntity.multi.godforge.util;
import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
import static net.minecraft.util.StatCollector.translateToLocal;
@@ -13,13 +13,17 @@ import java.util.function.DoubleConsumer;
import java.util.function.DoubleSupplier;
import java.util.function.Supplier;
+import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
+import com.google.common.collect.ImmutableList;
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.forge.ItemStackHandler;
import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.MainAxisAlignment;
import com.gtnewhorizons.modularui.api.math.Size;
import com.gtnewhorizons.modularui.api.screen.ModularUIContext;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
@@ -27,14 +31,18 @@ import com.gtnewhorizons.modularui.api.widget.IWidgetBuilder;
import com.gtnewhorizons.modularui.api.widget.Widget;
import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow;
import com.gtnewhorizons.modularui.common.widget.DynamicTextWidget;
import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
import com.gtnewhorizons.modularui.common.widget.Scrollable;
import com.gtnewhorizons.modularui.common.widget.SliderWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
import com.gtnewhorizons.modularui.common.widget.TextWidget;
import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+import codechicken.nei.recipe.GuiCraftingRecipe;
+import codechicken.nei.recipe.GuiUsageRecipe;
import gregtech.api.enums.VoidingMode;
import gregtech.api.gui.modularui.GTUITextures;
import gregtech.api.interfaces.modularui.IControllerWithOptionalFeatures;
@@ -42,6 +50,7 @@ import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import tectech.TecTech;
import tectech.thing.gui.TecTechUITextures;
import tectech.thing.metaTileEntity.multi.godforge.color.ForgeOfGodsStarColor;
+import tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade;
/**
* Holds UI element builders and other conveniences shared between the primary Forge of the Gods and its modules.
@@ -419,6 +428,15 @@ public class ForgeOfGodsUI {
}
}
+ public static void closeWindow(Widget widget, int windowId) {
+ if (!widget.isClient()) {
+ ModularUIContext ctx = widget.getContext();
+ if (ctx.isWindowOpen(windowId)) {
+ ctx.closeWindow(windowId);
+ }
+ }
+ }
+
public enum StarColorRGBM {
RED(EnumChatFormatting.RED, RED_ARGB, 0, 255, ForgeOfGodsStarColor.DEFAULT_RED),
@@ -546,4 +564,345 @@ public class ForgeOfGodsUI {
return widget;
}
+
+ public static Widget getIndividualUpgradeGroup(ForgeOfGodsUpgrade upgrade, Supplier<Integer> shardGetter,
+ Runnable complete, Runnable respec, Supplier<Boolean> check) {
+ MultiChildWidget widget = new MultiChildWidget();
+ widget.setSize(upgrade.getWindowSize());
+
+ Size windowSize = upgrade.getWindowSize();
+ int w = windowSize.width;
+ int h = windowSize.height;
+
+ // Close window button
+ widget.addChild(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(w - 15, 3));
+
+ // Background symbol
+ widget.addChild(
+ new DrawableWidget().setDrawable(upgrade.getSymbol())
+ .setPos((int) ((1 - upgrade.getSymbolWidthRatio() / 2) * w / 2), h / 4)
+ .setSize((int) (w / 2 * upgrade.getSymbolWidthRatio()), h / 2));
+
+ // Background overlay
+ widget.addChild(
+ new DrawableWidget().setDrawable(upgrade.getOverlay())
+ .setPos(w / 4, h / 4)
+ .setSize(w / 2, h / 2));
+
+ // Upgrade name title
+ widget.addChild(
+ new TextWidget(upgrade.getNameText()).setTextAlignment(Alignment.Center)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setSize(w - 15, 30)
+ .setPos(9, 5));
+
+ // Upgrade body text
+ widget.addChild(
+ new TextWidget(upgrade.getBodyText()).setTextAlignment(Alignment.Center)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setSize(w - 15, upgrade.getLoreYPos() - 30)
+ .setPos(9, 30));
+
+ // Lore Text
+ widget.addChild(
+ new TextWidget(EnumChatFormatting.ITALIC + upgrade.getLoreText()).setTextAlignment(Alignment.Center)
+ .setDefaultColor(0xbbbdbd)
+ .setSize(w - 15, (int) (h * 0.9) - upgrade.getLoreYPos())
+ .setPos(9, upgrade.getLoreYPos()));
+
+ // Shard cost text
+ String costStr = " " + EnumChatFormatting.BLUE + upgrade.getShardCost();
+ widget.addChild(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.shardcost") + costStr)
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(70)
+ .setDefaultColor(0x9c9c9c)
+ .setPos(11, h - 25));
+
+ // Available shards text
+ widget.addChild(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.availableshards"))
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(90)
+ .setDefaultColor(0x9c9c9c)
+ .setPos(w - 87, h - 25));
+
+ // Available shards amount
+ widget.addChild(
+ TextWidget.dynamicText(() -> getAvailableShardsText(upgrade, shardGetter))
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(90)
+ .setDefaultColor(0x9c9c9c)
+ .setPos(w - 27, h - 18));
+
+ // Complete button group
+ MultiChildWidget completeGroup = new MultiChildWidget();
+ completeGroup.setPos(w / 2 - 21, (int) (h * 0.9));
+
+ // Complete button
+ completeGroup.addChild(new ButtonWidget().setOnClick(($, $$) -> {
+ if (check.get()) {
+ respec.run();
+ } else {
+ complete.run();
+ }
+ })
+ .setSize(40, 15)
+ .setBackground(
+ () -> new IDrawable[] {
+ check.get() ? GTUITextures.BUTTON_STANDARD_PRESSED : GTUITextures.BUTTON_STANDARD })
+ .dynamicTooltip(() -> constructionStatusString(check))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY));
+
+ // Complete text overlay
+ completeGroup.addChild(
+ TextWidget.dynamicText(() -> constructionStatusText(check))
+ .setTextAlignment(Alignment.Center)
+ .setScale(0.7f)
+ .setMaxWidth(36)
+ .setPos(3, 5));
+
+ widget.addChild(completeGroup);
+
+ return widget;
+ }
+
+ public static Widget createMaterialInputButton(ForgeOfGodsUpgrade upgrade, Supplier<Boolean> check,
+ BiConsumer<Widget.ClickData, Widget> clickAction) {
+ Size windowSize = upgrade.getWindowSize();
+ int w = windowSize.width;
+ int h = windowSize.height;
+
+ return new ButtonWidget().setOnClick(clickAction)
+ .setPlayClickSound(true)
+ .setBackground(
+ () -> new IDrawable[] { check.get() ? TecTechUITextures.BUTTON_BOXED_CHECKMARK_18x18
+ : TecTechUITextures.BUTTON_BOXED_EXCLAMATION_POINT_18x18 })
+ .setPos(w / 2 - 40, (int) (h * 0.9))
+ .setSize(15, 15)
+ .dynamicTooltip(() -> upgradeMaterialRequirements(check))
+ .addTooltip(
+ EnumChatFormatting.GRAY + translateToLocal("fog.button.materialrequirements.tooltip.clickhere"));
+ }
+
+ private static Text getAvailableShardsText(ForgeOfGodsUpgrade upgrade, Supplier<Integer> shardGetter) {
+ EnumChatFormatting enoughShards = EnumChatFormatting.RED;
+ if (shardGetter.get() >= upgrade.getShardCost()) {
+ enoughShards = EnumChatFormatting.GREEN;
+ }
+ return new Text(enoughShards + Integer.toString(shardGetter.get()));
+ }
+
+ private static List<String> constructionStatusString(Supplier<Boolean> check) {
+ if (check.get()) {
+ return ImmutableList.of(translateToLocal("fog.upgrade.respec"));
+ }
+ return ImmutableList.of(translateToLocal("fog.upgrade.confirm"));
+ }
+
+ private static Text constructionStatusText(Supplier<Boolean> check) {
+ if (check.get()) {
+ return new Text(translateToLocal("fog.upgrade.respec"));
+ }
+ return new Text(translateToLocal("fog.upgrade.confirm"));
+ }
+
+ private static List<String> upgradeMaterialRequirements(Supplier<Boolean> check) {
+ if (check.get()) {
+ return ImmutableList.of(translateToLocal("fog.button.materialrequirementsmet.tooltip"));
+ }
+ return ImmutableList.of(translateToLocal("fog.button.materialrequirements.tooltip"));
+ }
+
+ public static Widget createExtraCostWidget(final ItemStack costStack, Supplier<Short> paidAmount) {
+ MultiChildWidget widget = new MultiChildWidget();
+ widget.setSize(36, 18);
+
+ if (costStack == null) {
+ // Nothing to pay, so just create a simple disabled slot drawable
+ widget.addChild(
+ new DrawableWidget().setDrawable(GTUITextures.BUTTON_STANDARD_DISABLED)
+ .setSize(18, 18));
+ return widget;
+ }
+
+ // Item slot
+ ItemStackHandler handler = new ItemStackHandler(1);
+ ItemStack handlerStack = costStack.copy();
+ handlerStack.stackSize = Math.max(1, handlerStack.stackSize - paidAmount.get());
+ handler.setStackInSlot(0, handlerStack);
+ widget.addChild(
+ new SlotWidget(handler, 0).setAccess(false, false)
+ .setRenderStackSize(false)
+ .disableInteraction()
+ .setBackground(GTUITextures.BUTTON_STANDARD_PRESSED))
+ .addChild(new ButtonWidget().setOnClick((clickData, w) -> {
+ if (widget.isClient()) {
+ if (clickData.mouseButton == 0) {
+ GuiCraftingRecipe.openRecipeGui("item", handlerStack.copy());
+ } else if (clickData.mouseButton == 1) {
+ GuiUsageRecipe.openRecipeGui("item", handlerStack.copy());
+ }
+ }
+ })
+ .setSize(16, 16)
+ .setPos(1, 1));
+
+ // Progress text
+ widget.addChild(new DynamicTextWidget(() -> {
+ short paid = paidAmount.get();
+ EnumChatFormatting color = EnumChatFormatting.YELLOW;
+ if (paid == 0) color = EnumChatFormatting.RED;
+ else if (paid == costStack.stackSize) color = EnumChatFormatting.GREEN;
+ return new Text(color + "x" + (costStack.stackSize - paid));
+ }).setTextAlignment(Alignment.Center)
+ .setScale(0.8f)
+ .setPos(18, 5)
+ .setSize(18, 9)
+ .setEnabled(w -> paidAmount.get() < costStack.stackSize));
+
+ // Completed checkmark
+ widget.addChild(
+ new DrawableWidget().setDrawable(TecTechUITextures.GREEN_CHECKMARK_11x9)
+ .setPos(21, 5)
+ .setSize(11, 9)
+ .setEnabled(w -> paidAmount.get() >= costStack.stackSize));
+
+ return widget;
+ }
+
+ public static ModularWindow createSpecialThanksWindow() {
+ final int WIDTH = 200;
+ final int HEIGHT = 200;
+ ModularWindow.Builder builder = ModularWindow.builder(WIDTH, HEIGHT);
+
+ builder.setBackground(TecTechUITextures.BACKGROUND_GLOW_RAINBOW);
+ builder.setDraggable(true);
+ builder.widget(
+ ButtonWidget.closeWindowButton(true)
+ .setPos(184, 4))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_GODFORGE_THANKS)
+ .setPos(50, 50)
+ .setSize(100, 100))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.contributors"))
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.Center)
+ .setScale(1f)
+ .setPos(0, 5)
+ .setSize(200, 15))
+ .widget(
+ new TextWidget(
+ EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lead"))
+ .setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 30)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.cloud")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.AQUA)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 40)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(
+ EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.programming"))
+ .setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 55)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(
+ 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))
+ .widget(
+ new TextWidget(
+ EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.textures"))
+ .setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 85)
+ .setSize(100, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.ant")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GREEN)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 95)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(
+ EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.rendering"))
+ .setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 110)
+ .setSize(100, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.bucket")).setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.WHITE)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 120)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(
+ EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.lore"))
+ .setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 135)
+ .setSize(100, 10))
+ .widget(
+ delenoName().setSpace(-1)
+ .setAlignment(MainAxisAlignment.SPACE_BETWEEN)
+ .setPos(7, 145)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(
+ EnumChatFormatting.UNDERLINE + translateToLocal("gt.blockmachines.multimachine.FOG.playtesting"))
+ .setScale(0.8f)
+ .setDefaultColor(EnumChatFormatting.GOLD)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 160)
+ .setSize(100, 10))
+ .widget(
+ new TextWidget(translateToLocal("gt.blockmachines.multimachine.FOG.misi")).setScale(0.8f)
+ .setDefaultColor(0xffc26f)
+ .setTextAlignment(Alignment.CenterLeft)
+ .setPos(7, 170)
+ .setSize(60, 10))
+ .widget(
+ new TextWidget(EnumChatFormatting.ITALIC + translateToLocal("gt.blockmachines.multimachine.FOG.thanks"))
+ .setScale(0.8f)
+ .setDefaultColor(0xbbbdbd)
+ .setTextAlignment(Alignment.Center)
+ .setPos(90, 140)
+ .setSize(100, 60));
+ return builder.build();
+ }
+
+ private static DynamicPositionedRow delenoName() {
+ DynamicPositionedRow nameRow = new DynamicPositionedRow();
+ String deleno = translateToLocal("gt.blockmachines.multimachine.FOG.deleno");
+ int[] colors = new int[] { 0xffffff, 0xf6fff5, 0xecffec, 0xe3ffe2, 0xd9ffd9, 0xd0ffcf };
+
+ for (int i = 0; i < 6; i++) {
+ nameRow.addChild(
+ new TextWidget(Character.toString(deleno.charAt(i))).setDefaultColor(colors[i])
+ .setScale(0.8f)
+ .setTextAlignment(Alignment.CenterLeft));
+ }
+ return nameRow;
+ }
}
diff --git a/src/main/java/tectech/util/GodforgeMath.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java
index d4d43f01cf..e0f059167b 100644
--- a/src/main/java/tectech/util/GodforgeMath.java
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/GodforgeMath.java
@@ -1,4 +1,6 @@
-package tectech.util;
+package tectech.thing.metaTileEntity.multi.godforge.util;
+
+import static tectech.thing.metaTileEntity.multi.godforge.upgrade.ForgeOfGodsUpgrade.*;
import java.math.BigInteger;
@@ -17,7 +19,7 @@ public class GodforgeMath {
public static double calculateFuelConsumption(MTEForgeOfGods godforge) {
double upgradeFactor = 1;
- if (godforge.isUpgradeActive(2)) {
+ if (godforge.isUpgradeActive(STEM)) {
upgradeFactor = 0.8;
}
if (godforge.getFuelType() == 0) {
@@ -34,13 +36,13 @@ public class GodforgeMath {
public static int calculateMaxFuelFactor(MTEForgeOfGods godforge) {
int fuelCap = 5;
- if (godforge.isUpgradeActive(27)) {
+ if (godforge.isUpgradeActive(TSE)) {
fuelCap = Integer.MAX_VALUE;
} else {
- if (godforge.isUpgradeActive(9)) {
+ if (godforge.isUpgradeActive(GEM)) {
fuelCap += godforge.getTotalActiveUpgrades();
}
- if (godforge.isUpgradeActive(3)) {
+ if (godforge.isUpgradeActive(CFCE)) {
fuelCap *= 1.2;
}
}
@@ -59,7 +61,7 @@ public class GodforgeMath {
public static void calculateMaxHeatForModules(MTEBaseModule module, MTEForgeOfGods godforge) {
double logBase = 1.5;
int baseHeat = 12601;
- if (godforge.isUpgradeActive(12)) {
+ if (godforge.isUpgradeActive(SEFCP)) {
if (module instanceof MTESmeltingModule) {
logBase = 1.12;
} else {
@@ -74,7 +76,7 @@ public class GodforgeMath {
public static int calculateOverclockHeat(MTEBaseModule module, MTEForgeOfGods godforge, Integer recipeHeat) {
int actualHeat;
double exponent;
- if (godforge.isUpgradeActive(20)) {
+ if (godforge.isUpgradeActive(NDPE)) {
if (module instanceof MTESmeltingModule) {
exponent = 0.85;
} else {
@@ -85,7 +87,7 @@ public class GodforgeMath {
} else {
actualHeat = recipeHeat;
}
- } else if (godforge.isUpgradeActive(17)) {
+ } else if (godforge.isUpgradeActive(CNTI)) {
actualHeat = Math.min(recipeHeat, 30000);
} else {
actualHeat = Math.min(recipeHeat, 15000);
@@ -96,11 +98,11 @@ public class GodforgeMath {
public static void calculateSpeedBonusForModules(MTEBaseModule module, MTEForgeOfGods godforge) {
double speedBonus = 1;
- if (godforge.isUpgradeActive(1)) {
+ if (godforge.isUpgradeActive(IGCC)) {
speedBonus = Math.pow(module.getHeat(), -0.01);
}
- if (godforge.isUpgradeActive(22)) {
+ if (godforge.isUpgradeActive(DOR)) {
if (module instanceof MTEPlasmaModule) {
speedBonus /= Math.pow(module.getMaxParallel(), 0.02);
} else {
@@ -109,7 +111,7 @@ public class GodforgeMath {
}
if (module instanceof MTEExoticModule) {
- if (godforge.isUpgradeActive(25)) {
+ if (godforge.isUpgradeActive(PA)) {
speedBonus = Math.sqrt(speedBonus);
} else {
speedBonus = 1;
@@ -141,17 +143,17 @@ public class GodforgeMath {
}
if (module instanceof MTEMoltenModule
- || (module instanceof MTESmeltingModule && godforge.isUpgradeActive(16))) {
+ || (module instanceof MTESmeltingModule && godforge.isUpgradeActive(DOP))) {
isMoltenOrSmeltingWithUpgrade = true;
}
- if (godforge.isUpgradeActive(10)) {
+ if (godforge.isUpgradeActive(CTCDD)) {
node53 = 2;
}
- if (godforge.isUpgradeActive(6)) {
+ if (godforge.isUpgradeActive(SA)) {
fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f;
- if (godforge.isUpgradeActive(13)) {
+ if (godforge.isUpgradeActive(TCT)) {
if (isMoltenOrSmeltingWithUpgrade) {
fuelFactorMultiplier *= 3;
} else {
@@ -160,7 +162,7 @@ public class GodforgeMath {
}
}
- if (godforge.isUpgradeActive(18)) {
+ if (godforge.isUpgradeActive(EPEC)) {
if (isMoltenOrSmeltingWithUpgrade) {
heatMultiplier = 1 + module.getHeat() / 15000f;
} else {
@@ -168,7 +170,7 @@ public class GodforgeMath {
}
}
- if (godforge.isUpgradeActive(21)) {
+ if (godforge.isUpgradeActive(POS)) {
if (isMoltenOrSmeltingWithUpgrade) {
upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 5f;
} else {
@@ -179,7 +181,7 @@ public class GodforgeMath {
float totalBonuses = node53 * fuelFactorMultiplier * heatMultiplier * upgradeAmountMultiplier;
if (module instanceof MTEExoticModule) {
- if (godforge.isUpgradeActive(25)) {
+ if (godforge.isUpgradeActive(PA)) {
totalBonuses = (float) Math.sqrt(totalBonuses);
} else {
totalBonuses = 1;
@@ -195,11 +197,11 @@ public class GodforgeMath {
double fillRatioDiscount = 1;
double maxBatteryDiscount = 1;
- if (godforge.isUpgradeActive(8)) {
+ if (godforge.isUpgradeActive(REC)) {
maxBatteryDiscount = 1 - (1 - Math.pow(1.05, -0.05 * godforge.getMaxBatteryCharge())) / 20;
}
- if (godforge.isUpgradeActive(19)) {
+ if (godforge.isUpgradeActive(IMKG)) {
double fillRatioMinusZeroPointFive = (double) godforge.getBatteryCharge() / godforge.getMaxBatteryCharge()
- 0.5;
if (module instanceof MTEPlasmaModule) {
@@ -210,7 +212,7 @@ public class GodforgeMath {
}
if (module instanceof MTEExoticModule) {
- if (godforge.isUpgradeActive(25)) {
+ if (godforge.isUpgradeActive(PA)) {
fillRatioDiscount = Math.sqrt(fillRatioDiscount);
maxBatteryDiscount = Math.sqrt(maxBatteryDiscount);
} else {
@@ -225,11 +227,11 @@ public class GodforgeMath {
public static void calculateProcessingVoltageForModules(MTEBaseModule module, MTEForgeOfGods godforge) {
long voltage = 2_000_000_000;
- if (godforge.isUpgradeActive(4)) {
+ if (godforge.isUpgradeActive(GISS)) {
voltage += calculateEffectiveFuelFactor(godforge) * 100_000_000L;
}
- if (godforge.isUpgradeActive(23)) {
+ if (godforge.isUpgradeActive(NGMS)) {
voltage *= Math.pow(4, godforge.getRingAmount());
}
@@ -240,20 +242,20 @@ public class GodforgeMath {
int plasmaTier = 0;
double overclockTimeFactor = 2;
- if (godforge.isUpgradeActive(30)) {
+ if (godforge.isUpgradeActive(END)) {
plasmaTier = 2;
- } else if (godforge.isUpgradeActive(24)) {
+ } else if (godforge.isUpgradeActive(SEDS)) {
plasmaTier = 1;
}
- if (godforge.isUpgradeActive(14)) {
+ if (godforge.isUpgradeActive(GGEBE)) {
if (module instanceof MTEPlasmaModule) {
overclockTimeFactor = 2.3;
} else {
overclockTimeFactor = 2.15;
}
if (module instanceof MTEExoticModule) {
- if (godforge.isUpgradeActive(25)) {
+ if (godforge.isUpgradeActive(PA)) {
overclockTimeFactor = 2 + Math.pow(overclockTimeFactor - 2, 2);
} else {
overclockTimeFactor = 2;
@@ -261,25 +263,25 @@ public class GodforgeMath {
}
}
- module.setUpgrade83(godforge.isUpgradeActive(19));
- module.setMultiStepPlasma(godforge.isUpgradeActive(15));
+ module.setUpgrade83(godforge.isUpgradeActive(IMKG));
+ module.setMultiStepPlasma(godforge.isUpgradeActive(TPTP));
module.setPlasmaTier(plasmaTier);
- module.setMagmatterCapable(godforge.isUpgradeActive(30));
- module.setVoltageConfig(godforge.isUpgradeActive(28));
+ module.setMagmatterCapable(godforge.isUpgradeActive(END));
+ module.setVoltageConfig(godforge.isUpgradeActive(TBF));
module.setOverclockTimeFactor(overclockTimeFactor);
}
public static boolean allowModuleConnection(MTEBaseModule module, MTEForgeOfGods godforge) {
- if (module instanceof MTEMoltenModule && godforge.isUpgradeActive(5)) {
+ if (module instanceof MTEMoltenModule && godforge.isUpgradeActive(FDIM)) {
return true;
}
- if (module instanceof MTEPlasmaModule && godforge.isUpgradeActive(7)) {
+ if (module instanceof MTEPlasmaModule && godforge.isUpgradeActive(GPCI)) {
return true;
}
- if (module instanceof MTEExoticModule && godforge.isUpgradeActive(11)) {
+ if (module instanceof MTEExoticModule && godforge.isUpgradeActive(QGPIU)) {
return true;
}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java
new file mode 100644
index 0000000000..a1b4a9c968
--- /dev/null
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneFormatter.java
@@ -0,0 +1,47 @@
+package tectech.thing.metaTileEntity.multi.godforge.util;
+
+import static gregtech.api.util.GTUtility.formatNumbers;
+import static tectech.util.TTUtility.toExponentForm;
+
+import java.math.BigInteger;
+
+public enum MilestoneFormatter {
+
+ NONE,
+ COMMA,
+ EXPONENT;
+
+ public static final MilestoneFormatter[] VALUES = values();
+
+ public MilestoneFormatter cycle() {
+ return switch (this) {
+ case NONE -> COMMA;
+ case COMMA -> EXPONENT;
+ case EXPONENT -> NONE;
+ };
+ }
+
+ public 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);
+ }
+ }
+ };
+ }
+}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java
new file mode 100644
index 0000000000..41af5b0e18
--- /dev/null
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/MilestoneIcon.java
@@ -0,0 +1,46 @@
+package tectech.thing.metaTileEntity.multi.godforge.util;
+
+import net.minecraft.util.StatCollector;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Size;
+
+import tectech.thing.gui.TecTechUITextures;
+
+public enum MilestoneIcon {
+
+ CHARGE(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CHARGE, 60, 75, "power"),
+ CONVERSION(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CONVERSION, 54, 75, "recipe"),
+ CATALYST(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_CATALYST, 75, 75, "fuel"),
+ COMPOSITION(TecTechUITextures.PICTURE_GODFORGE_MILESTONE_COMPOSITION, 75, 75, "purchasable"),
+
+ ;
+
+ public static final MilestoneIcon[] VALUES = values();
+
+ private final UITexture symbol;
+ private final Size size;
+ private final String name;
+
+ MilestoneIcon(UITexture symbol, int width, int height, String shortName) {
+ this.symbol = symbol;
+ this.size = new Size(width, height);
+ this.name = "gt.blockmachines.multimachine.FOG." + shortName + "milestone";
+ }
+
+ public UITexture getSymbol() {
+ return symbol;
+ }
+
+ public Size getSize() {
+ return size;
+ }
+
+ public float getWidthRatio() {
+ return 1.0f * size.width / size.height;
+ }
+
+ public String getNameText() {
+ return StatCollector.translateToLocal(name);
+ }
+}
diff --git a/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java
new file mode 100644
index 0000000000..7bcab73f26
--- /dev/null
+++ b/src/main/java/tectech/thing/metaTileEntity/multi/godforge/util/UpgradeColor.java
@@ -0,0 +1,72 @@
+package tectech.thing.metaTileEntity.multi.godforge.util;
+
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+
+import tectech.thing.gui.TecTechUITextures;
+
+public enum UpgradeColor {
+
+ // spotless:off
+
+ BLUE(
+ TecTechUITextures.BACKGROUND_GLOW_BLUE,
+ TecTechUITextures.PICTURE_OVERLAY_BLUE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE_OPAQUE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_BLUE),
+
+ PURPLE(
+ TecTechUITextures.BACKGROUND_GLOW_PURPLE,
+ TecTechUITextures.PICTURE_OVERLAY_PURPLE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE_OPAQUE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_PURPLE),
+
+ ORANGE(
+ TecTechUITextures.BACKGROUND_GLOW_ORANGE,
+ TecTechUITextures.PICTURE_OVERLAY_ORANGE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE_OPAQUE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_ORANGE),
+
+ GREEN(
+ TecTechUITextures.BACKGROUND_GLOW_GREEN,
+ TecTechUITextures.PICTURE_OVERLAY_GREEN,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN_OPAQUE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_GREEN),
+
+ RED(
+ TecTechUITextures.BACKGROUND_GLOW_RED,
+ TecTechUITextures.PICTURE_OVERLAY_RED,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED_OPAQUE,
+ TecTechUITextures.PICTURE_UPGRADE_CONNECTOR_RED),
+
+ ;
+
+ // spotless:on
+
+ private final UITexture background;
+ private final UITexture overlay;
+ private final UITexture opaqueConnector;
+ private final UITexture connector;
+
+ UpgradeColor(UITexture background, UITexture overlay, UITexture opaqueConnector, UITexture connector) {
+ this.background = background;
+ this.overlay = overlay;
+ this.opaqueConnector = opaqueConnector;
+ this.connector = connector;
+ }
+
+ public UITexture getBackground() {
+ return background;
+ }
+
+ public UITexture getOverlay() {
+ return overlay;
+ }
+
+ public UITexture getOpaqueConnector() {
+ return opaqueConnector;
+ }
+
+ public UITexture getConnector() {
+ return connector;
+ }
+}
diff --git a/src/main/resources/assets/gregtech/textures/gui/picture/arrow_gray.png b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_gray.png
new file mode 100644
index 0000000000..392add3320
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/gui/picture/arrow_gray.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang
index c72f8c1ddf..58e7f7d518 100644
--- a/src/main/resources/assets/tectech/lang/en_US.lang
+++ b/src/main/resources/assets/tectech/lang/en_US.lang
@@ -990,7 +990,7 @@ fog.upgrade.text.0=Unlocks the base functionality of the Forge of the Gods, mean
fog.upgrade.text.1=Unlocks a recipe time reduction multiplier based on the current heat the multi is running at. This bonus is calculated via following formula: Multiplier = 1 / (Heat^0.01)
fog.upgrade.text.2=Increases fuel efficiency by multiplying the actual fuel consumption by 0.8
fog.upgrade.text.3=Multiplies the maximum fuel consumption by 1.2
-fog.upgrade.text.4=Increases the base processing voltage of the multi by: Stellar Fuel Units/sec * 10^8 EU/t
+fog.upgrade.text.4=Increases the base processing voltage of all modules by: Stellar Fuel Units/sec * 10^8 EU/t
fog.upgrade.text.5=Unlocks the Helioflux Melting Core module.
fog.upgrade.text.6=Unlocks a multiplier to maximum parallel based on fuel consumption rate. This bonus is calculated via this formula: Multiplier = 1 + (Stellar Fuel Units/sec) / 15
fog.upgrade.text.7=Unlocks the Heliothermal Plasma Fabricator module and basic element -> plasma processing (1 step plasmas, T3 fusion maximum).
@@ -998,14 +998,14 @@ fog.upgrade.text.8=Unlocks a configuration window for maximum battery size and i
fog.upgrade.text.9=Increases maximum fuel consumption by 1 Stellar Fuel Unit/sec for every purchased upgrade.
fog.upgrade.text.10=Adds a x2 multiplier to maximum parallel.
fog.upgrade.text.11=Unlocks the Heliofusion Exoticizer module and quark gluon plasma creation. At this point this module is not affected by any other multipliers or bonuses from other upgrades.
-fog.upgrade.text.12=Improves the fuel consumption -> heat conversion formula. Improved formula: Heat = log1.12(Stellar Fuel Units/sec) * 1000 + 12601
+fog.upgrade.text.12=Improves the fuel consumption -> heat conversion formula. Improved formula: Power Forge Heat = log1.12(Stellar Fuel Units/sec) * 1000 + 12601, Melting Core Heat = log1.18(Stellar Fuel Units/sec) * 1000 + 12601
fog.upgrade.text.13=Improves the formula of SA to: Multiplier = 1 + (Stellar Fuel Units/sec) / 5
fog.upgrade.text.14=Improves the OC formula from 4/2 OCs to 4/2.3 OCs.
fog.upgrade.text.15=Allows the Heliothermal Plasma Fabricator to process multi step plasmas. Tier restriction still applies.
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 the formula: Discount = (Current fill level / Max Capacity - 0.5)^2 * (-0.6) + 0.15, multiplied by 2/3 for modules other than the Plasma Fabricator
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)
@@ -1021,9 +1021,10 @@ fog.upgrade.text.30=Unlocks Magmatter production in the Heliofusion Exoticizer,
fog.debug.resetbutton.text=Reset
fog.debug.resetbutton.tooltip=Resets all upgrades to zero
fog.debug.unlockall.text=Unlock all upgrades
-fog.debug.gravitonshardsetter.tooltip=Set the amount of availabe graviton shards
+fog.debug.gravitonshardsetter.tooltip=Set the amount of available graviton shards
fog.button.fuelconfig.tooltip=Fuel Configuration Menu
+fog.button.upgradetree.tooltip=Path of Celestial Transcendence
fog.button.furnacemode.tooltip.01=Blast Mode
fog.button.furnacemode.tooltip.02=Furnace Mode
fog.button.magmattermode.tooltip.01=Quark-Gluon Plasma Mode
@@ -1041,11 +1042,19 @@ fog.button.materialrequirements.tooltip.clickhere=Click to open material inserti
fog.button.ejection.tooltip=Toggle Graviton Shard Ejection
fog.button.formatting.tooltip=Toggle Number Formatting
fog.button.exoticinputs.tooltip=Click to display expected inputs
+fog.button.possibleexoticinputs.tooltip=Click to display all possible inputs
fog.button.reciperefresh.tooltip=Click to reset recipe
fog.button.refreshtimer.tooltip=Reset ready in
fog.button.seconds=Seconds
fog.button.thanks.tooltip=List of Contributors
fog.button.color.tooltip=Cosmetics Menu
+fog.button.statistics.tooltip=Stats Overview
+fog.text.tooltip.heat=Heat value used for checking if a recipe can run
+fog.text.tooltip.effectiveheat=Heat value used for calculating bonuses
+fog.text.tooltip.parallel=Maximum parallel amount
+fog.text.tooltip.speedbonus=Multiplier for base recipe time, making it shorter
+fog.text.tooltip.energydiscount=Multiplier for base energy usage, reducing it
+fog.text.tooltip.ocdivisor=Divisor for recipe time reduction per overclock (does not affect perfect OCs)
achievement.gt.blockmachines.multimachine.em.forge_of_gods=Forge of the Gods
@@ -1088,6 +1097,8 @@ gt.blockmachines.multimachine.FOG.milestoneinfo=View Milestone Progress
gt.blockmachines.multimachine.FOG.inversionactive=Inversion Active
gt.blockmachines.multimachine.FOG.inversion=Inversion
gt.blockmachines.multimachine.FOG.expectedinputs=Expected Inputs
+gt.blockmachines.multimachine.FOG.possibleinputsqgp=Possible Input Materials for QGP
+gt.blockmachines.multimachine.FOG.possibleinputsmagmatter=Possible Input Materials for Magmatter
gt.blockmachines.multimachine.FOG.inversioninfotext=Once all milestones of the Forge reach tier 7, inversion activates. This uncaps the maximum tier of all milestones and allows to scale infinitely. The scaling of each milestone changes from exponential to linear, but the granted graviton shard amount keeps increasing. The amount of progress needed for each subsequent milestone is as much as needed for the 7th tier of each milestone. The Composition milestone is once again an exception, as that continues to scale by 1 each tier, with it's own formula for calculating progress. Each module type is given a value, ranging from 1 for the Helioflare Power Forge to 5 for the Heliofusion Exoticizer in magmatter mode, then the amount of each module present is substracted by 1 and multiplied by its value. These values are added up and divided by 5, this is the final milestone tier on top of the base 7.
gt.blockmachines.multimachine.FOG.powermilestone=Charge
gt.blockmachines.multimachine.FOG.recipemilestone=Conversion
@@ -1098,7 +1109,7 @@ gt.blockmachines.multimachine.FOG.recipes=Recipes Processed
gt.blockmachines.multimachine.FOG.fuelconsumed=Fuel Units Consumed
gt.blockmachines.multimachine.FOG.extensions=Extensions Built
gt.blockmachines.multimachine.FOG.shardgain=Graviton Shards gained
-gt.blockmachines.multimachine.FOG.consumeUpgradeMats=Click to consume upgrade materials, supply §4exact§r stacksizes
+gt.blockmachines.multimachine.FOG.consumeUpgradeMats=Click to consume upgrade materials
gt.blockmachines.multimachine.FOG.clickhere=Confused? Click here for some general info
gt.blockmachines.multimachine.FOG.introduction=§NIntroduction
gt.blockmachines.multimachine.FOG.introductioninfotext=There's a lot going on in the Forge of the Gods, which can be quite confusing at first. This menu aims to explain everything that is happening and all the capabilities/mechanics of the forge.
@@ -1126,6 +1137,17 @@ 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.modulestats=Module Statistics
+gt.blockmachines.multimachine.FOG.powerforge=Power Forge
+gt.blockmachines.multimachine.FOG.meltingcore=Melting Core
+gt.blockmachines.multimachine.FOG.plasmafab=Plasma Fabricator
+gt.blockmachines.multimachine.FOG.exoticizer=Exoticizer
+gt.blockmachines.multimachine.FOG.heat=Heat
+gt.blockmachines.multimachine.FOG.effectiveheat=Effective Heat
+gt.blockmachines.multimachine.FOG.speedbonus=Speed Bonus
+gt.blockmachines.multimachine.FOG.energydiscount=Energy Discount
+gt.blockmachines.multimachine.FOG.ocdivisor=OC Divisor
+gt.blockmachines.multimachine.FOG.clickstat=Click to view value breakdown
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
@@ -1317,6 +1339,7 @@ gt.recipe.researchStation=Research Station
gt.recipe.fog_plasma=Heliothermal Plasma Fabricator
gt.recipe.fog_exotic=Heliofusion Exoticizer
gt.recipe.fog_molten=Helioflux Melting Core
+gt.recipe.upgrade_costs=Godforge Upgrades
# NEI
diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/statistics.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/statistics.png
new file mode 100644
index 0000000000..bee81de488
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/overlay_button/statistics.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/green_checkmark.png b/src/main/resources/assets/tectech/textures/gui/picture/green_checkmark.png
new file mode 100644
index 0000000000..3816be66b2
--- /dev/null
+++ b/src/main/resources/assets/tectech/textures/gui/picture/green_checkmark.png
Binary files differ
diff --git a/src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.png b/src/main/resources/assets/tectech/textures/gui/picture/rainbow_square.png
index 545a44c4e5..fe2b63b50e 100644
--- 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 differ