aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-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
25 files changed, 2536 insertions, 1755 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;
+ }
+}