aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGDCloud <93287602+GDCloudstrike@users.noreply.github.com>2024-03-12 00:19:29 +0100
committerGitHub <noreply@github.com>2024-03-12 00:19:29 +0100
commitb03e63865a93ff13800da93cfa425989222b554f (patch)
tree452cbe81a70aafd5d1aea9f2a074787cffd0c33a /src/main/java/com
parent5d8119a6ae3831c973c4b2e8efd1ca6c23d0196b (diff)
downloadGT5-Unofficial-b03e63865a93ff13800da93cfa425989222b554f.tar.gz
GT5-Unofficial-b03e63865a93ff13800da93cfa425989222b554f.tar.bz2
GT5-Unofficial-b03e63865a93ff13800da93cfa425989222b554f.zip
Forge of the Gods (#225)
* Initial commit * Graviton Modulation Casings * It forms * testing cursed things, will rework soon * test better recipe check * get rid of cursed stuff * fix OC * parameter shenanigans * fuel input hatch * redo fuel drain * fluid output * add blocks * run on preload * dependency bump * preliminary structure works * fix some misc things * New class * Fix build issue * 1 hatch * Cleaning up code with seperate class for structure string * start on modules * Spotless + Smelting Module Class + BaseModule Changes * Remove useless import * ... * protected * trying module things * add checkRecipe, remove some redundant stuff * Initial commit * Graviton Modulation Casings * It forms * testing cursed things, will rework soon * test better recipe check * get rid of cursed stuff * fix OC * parameter shenanigans * fuel input hatch * redo fuel drain * fluid output * add blocks * run on preload * preliminary structure works * fix some misc things * New class * 1 hatch * start on modules * Fix build issue * Cleaning up code with seperate class for structure string * Spotless + Smelting Module Class + BaseModule Changes * Remove useless import * protected * trying module things * add checkRecipe, remove some redundant stuff * ... * New Classes + Modules * Recipe Maps * fix deps * recipe map fixes * make modules connect * spotless * remove recipe functionality + misc cleanup * parallel parameter * remove unneeded check * fix item to fluid conversion + remove parameter * outputs appear now * remove parallel param * improve scanner info * parameter adjustment + add onRemoval * parameter followup * plasma module (almost) fully works * attempt at fixing param * Fixes & stuff * Recommendation fixes * tooltip upgrade * Spotless for clean * plasma recipe map * recipe adder * first recipes * use new recipe map * Recipe map change stuff * recipe map fixes * some quick fixes * Spotless * fix null checks * batch size * add input separation * add batch mode parameter and functionality * spotless * first recipe addition loops * start on ui (add button) * spotless * add rendering block * render tile * more rendering * summon render block * spotless again * greyscale * lighter * why is rendering a pain * fix merge conflicts * is this the conflict? * spotless * merge conflict again :pensib: * start on upgrade gui * more upgrade gui things * saving * resolve merge conflicts & crashes * redo added blocks + add new ones + some tooltip stuff * more tooltip stuff * one more casing * forgot this * redo module processing logic * migrate to wirelessNetworkManager * quark gluon -> exotic * forgot achievements * adjust plasma module recipemap to prepare for upgrades * migrate to nice mui gui * some more plasma recipemap changes * eve more plasma recipemap changes, yay * everyone loves plasma recipemap changes * they never end, do they * exotic module recipes (wip) * exotic module recipe processing (mostly works) * prevent duplicate materials * make input sizes random * fix gt++ material conversions * nbt data things * start on magmatter mode + misc stuff * more magmatter work * no need for putIfAbsent + added awdr and runite * load recipemap from nbt * getFluidsStored -> inputFluids * add upgrades and make them scrollable * assign window colors to upgrades * green background * green background * redo upgrade IDs and add boolean array for storing whether they are active * implement system to restrict the order which upgrades can be bought in * add split functionality * switch to constants * reset button tooltip + change texture of upgrade if active * some cleanup + new fuel config * button BGs, altered power switch + localisation * fuel config window + save everything to nbt + random stuff * new helper class + fuel calculations * heat calculations + some molten module logic adjustments * more calculations, fuel hatch removal, transfer values to modules, internal fuel battery * use values in module processing * switch to UUID * switch to numericWidget * fix speedbonus being infinite sometimes * move method over to godforgeMath + very minor exotic module changes * remove this so it actually loads * new texture * switch to processInitialSettings * remove wireless energy things * add furnace mode * mode localisation * remove author tag * scala bad (switch away from scala arrays) * nuke all star imports (& godforge recipemap) * minor wording changes * add mod checks * mod check * revert star textures * return widget * dont return object types * forgot I even enabled debug, whoops * remove unnecessary GL11 calls --------- Co-authored-by: TheEpicGamer274 <102255081+TheEpicGamer274@users.noreply.github.com> Co-authored-by: GTNH-Colen <54497873+GTNH-Colen@users.noreply.github.com> Co-authored-by: BlueWeabo <76872108+BlueWeabo@users.noreply.github.com>
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/github/technus/tectech/TecTech.java2
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java3
-rw-r--r--src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java428
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java25
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java21
-rw-r--r--src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java10
-rw-r--r--src/main/java/com/github/technus/tectech/proxy/ClientProxy.java11
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java51
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java64
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java87
-rw-r--r--src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java9
-rw-r--r--src/main/java/com/github/technus/tectech/thing/CustomItemList.java16
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java70
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java107
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java30
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java116
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java125
-rw-r--r--src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java77
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java119
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java125
-rw-r--r--src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java4
-rw-r--r--src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java14
-rw-r--r--src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java88
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java2933
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java1178
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java252
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java498
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java229
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java217
-rw-r--r--src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java243
-rw-r--r--src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java0
-rw-r--r--src/main/java/com/github/technus/tectech/util/CommonValues.java1
-rw-r--r--src/main/java/com/github/technus/tectech/util/GodforgeMath.java145
33 files changed, 7296 insertions, 2 deletions
diff --git a/src/main/java/com/github/technus/tectech/TecTech.java b/src/main/java/com/github/technus/tectech/TecTech.java
index 0845e02736..ea5a23558d 100644
--- a/src/main/java/com/github/technus/tectech/TecTech.java
+++ b/src/main/java/com/github/technus/tectech/TecTech.java
@@ -8,6 +8,7 @@ import net.minecraftforge.common.MinecraftForge;
import com.github.technus.tectech.loader.MainLoader;
import com.github.technus.tectech.loader.TecTechConfig;
import com.github.technus.tectech.loader.gui.CreativeTabTecTech;
+import com.github.technus.tectech.loader.thing.MuTeLoader;
import com.github.technus.tectech.mechanics.enderStorage.EnderWorldSavedData;
import com.github.technus.tectech.proxy.CommonProxy;
import com.github.technus.tectech.recipe.EyeOfHarmonyRecipeStorage;
@@ -87,6 +88,7 @@ public class TecTech {
TecTechRecipeMaps.init();
MainLoader.preLoad();
+ new MuTeLoader().run();
}
@Mod.EventHandler
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java b/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java
index d50f7d4102..e9df999e87 100644
--- a/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/BaseRecipeLoader.java
@@ -34,7 +34,7 @@ public class BaseRecipeLoader {
}
public void run() {
-
+ new Godforge().run();
// todo: Move those recipes in NHCore
if (NewHorizonsCoreMod.isModLoaded()) {
new Assembler().run();
@@ -44,6 +44,5 @@ public class BaseRecipeLoader {
new Extractor().run();
new ResearchStationAssemblyLine().run();
}
-
}
}
diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java b/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java
new file mode 100644
index 0000000000..ca5f719aa8
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/recipe/Godforge.java
@@ -0,0 +1,428 @@
+package com.github.technus.tectech.loader.recipe;
+
+import static gregtech.api.enums.Mods.GTPlusPlus;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+
+import com.github.technus.tectech.recipe.TT_recipeAdder;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gtPlusPlus.core.material.ELEMENT;
+
+public class Godforge implements Runnable {
+
+ public static final ArrayList<Materials> plasmaGTMaterialList = new ArrayList<>();
+ public static final ArrayList<Integer> plasmaGTWeightList = new ArrayList<>();
+ 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<FluidStack, Integer> exoticModuleMagmatterFluidMap = new HashMap<>();
+
+ @Override
+ public void run() {
+
+ if (GTPlusPlus.isModLoaded()) {
+ // Solid to plasma recipes
+ {
+ // Fusion tier 1-3
+ {
+ // Single step
+ ItemStack[] solids_t0_1step = { Materials.Aluminium.getDust(1), Materials.Iron.getDust(1) };
+ FluidStack[] solid_plasmas_t0_1step = { Materials.Aluminium.getPlasma(144),
+ Materials.Iron.getPlasma(144) };
+
+ for (int i = 0; i < solids_t0_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t0_1step[i] },
+ new FluidStack[] { solid_plasmas_t0_1step[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 0);
+ }
+
+ // Multi-step
+ ItemStack[] solids_t0_xstep = { Materials.Force.getDust(1), Materials.Bismuth.getDust(1),
+ ELEMENT.STANDALONE.ADVANCED_NITINOL.getDust(1) };
+ FluidStack[] solid_plasmas_t0_xstep = { new FluidStack(ELEMENT.STANDALONE.FORCE.getPlasma(), 144),
+ Materials.Bismuth.getPlasma(144),
+ new FluidStack(ELEMENT.STANDALONE.ADVANCED_NITINOL.getPlasma(), 144) };
+
+ for (int i = 0; i < solids_t0_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t0_xstep[i] },
+ new FluidStack[] { solid_plasmas_t0_xstep[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 0);
+ }
+ }
+ // Fusion tier 4-5
+ {
+ // Single step
+ ItemStack[] solids_t1_1step = { Materials.Lead.getDust(1) };
+ FluidStack[] solid_plasmas_t1_1step = { Materials.Lead.getPlasma(144) };
+
+ for (int i = 0; i < solids_t1_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t1_1step[i] },
+ new FluidStack[] { solid_plasmas_t1_1step[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 1);
+ }
+
+ // Multi-step
+ ItemStack[] solids_t1_xstep = { ELEMENT.getInstance().NEPTUNIUM.getDust(1),
+ ELEMENT.getInstance().FERMIUM.getDust(1) };
+ FluidStack[] solid_plasmas_t1_xstep = {
+ new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getPlasma(), 144),
+ new FluidStack(ELEMENT.getInstance().FERMIUM.getPlasma(), 144) };
+
+ for (int i = 0; i < solids_t1_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t1_xstep[i] },
+ new FluidStack[] { solid_plasmas_t1_xstep[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 1);
+ }
+ }
+ // Exotic Plasmas
+ {
+ // Single step
+ ItemStack[] solids_t2_1step = { ELEMENT.STANDALONE.RHUGNOR.getDust(1) };
+ FluidStack[] solid_plasmas_t2_1step = {
+ new FluidStack(ELEMENT.STANDALONE.RHUGNOR.getPlasma(), 144) };
+
+ for (int i = 0; i < solids_t2_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t2_1step[i] },
+ new FluidStack[] { solid_plasmas_t2_1step[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 2);
+ }
+
+ // Multi-step
+ ItemStack[] solids_t2_xstep = { ELEMENT.STANDALONE.HYPOGEN.getDust(1),
+ Materials.Tritanium.getDust(1) };
+ FluidStack[] solid_plasmas_t2_xstep = { new FluidStack(ELEMENT.STANDALONE.HYPOGEN.getPlasma(), 144),
+ Materials.Tritanium.getPlasma(144) };
+
+ for (int i = 0; i < solids_t2_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new ItemStack[] { solids_t2_xstep[i] },
+ new FluidStack[] { solid_plasmas_t2_xstep[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 2);
+ }
+
+ }
+
+ }
+
+ // Fluid to plasma recipes
+ {
+ // Fusion tier 1-3
+ {
+ // Single step
+ FluidStack[] fluids_t0_1step = { Materials.Helium.getGas(1000) };
+ FluidStack[] fluid_plasmas_t0_1step = { Materials.Helium.getPlasma(1000) };
+
+ for (int i = 0; i < fluids_t0_1step.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new FluidStack[] { fluids_t0_1step[i] },
+ new FluidStack[] { fluid_plasmas_t0_1step[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ false,
+ 0);
+ }
+
+ // Multi-step
+ FluidStack[] fluids_t0_xstep = { ELEMENT.getInstance().NEON.getFluidStack(1000) };
+ FluidStack[] fluid_plasmas_t0_xstep = {
+ new FluidStack(ELEMENT.getInstance().NEON.getPlasma(), 1000) };
+
+ for (int i = 0; i < fluids_t0_xstep.length; i++) {
+ TT_recipeAdder.addFOGPlasmaRecipe(
+ new FluidStack[] { fluids_t0_xstep[i] },
+ new FluidStack[] { fluid_plasmas_t0_xstep[i] },
+ 1 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ true,
+ 0);
+ }
+ }
+ // Fusion tier 4-5
+ {
+ // Single step
+ // None yet
+
+ // Multi-step
+ // None yet
+ }
+ // Exotic
+ {
+ // None yet
+ }
+ }
+
+ // Exotic module fake recipes
+ {
+ TT_recipeAdder.addFOGExoticFakeRecipe(
+ new Object[] { Materials.Iron.getDust(1), Materials.Bismuth.getDust(1),
+ Materials.Tritanium.getDust(1) },
+ new Object[] { Materials.Helium.getGas(1000), ELEMENT.getInstance().NEON.getFluidStack(1000),
+ ELEMENT.getInstance().XENON.getFluidStack(1000) },
+ new FluidStack[] { Materials.Titanium.getMolten(1000) },
+ 10 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ 1);
+ }
+ }
+
+ // Exotic module plasma material maps
+ // GT materials
+ plasmaGTMaterialList.addAll(
+ Arrays.asList(
+ Materials.Aluminium,
+ Materials.Americium,
+ Materials.Antimony,
+ Materials.Ardite,
+ Materials.Argon,
+ Materials.Arsenic,
+ Materials.Barium,
+ Materials.Beryllium,
+ Materials.Bismuth,
+ Materials.Boron,
+ Materials.Caesium,
+ Materials.Calcium,
+ Materials.Cadmium,
+ Materials.Carbon,
+ Materials.Cerium,
+ Materials.Chlorine,
+ Materials.Chrome,
+ Materials.Cobalt,
+ Materials.Copper,
+ Materials.Desh,
+ Materials.Deuterium,
+ Materials.Dysprosium,
+ Materials.Erbium,
+ Materials.Europium,
+ Materials.Fluorine,
+ Materials.Gadolinium,
+ Materials.Gallium,
+ Materials.Gold,
+ Materials.Helium,
+ Materials.Holmium,
+ Materials.Hydrogen,
+ Materials.Indium,
+ Materials.Iridium,
+ Materials.Iron,
+ Materials.Lanthanum,
+ Materials.Lead,
+ Materials.Lithium,
+ Materials.Lutetium,
+ Materials.Magnesium,
+ Materials.Manganese,
+ Materials.MeteoricIron,
+ Materials.Molybdenum,
+ Materials.Naquadah,
+ Materials.Neodymium,
+ Materials.Nickel,
+ Materials.Niobium,
+ Materials.Nitrogen,
+ Materials.Oriharukon,
+ Materials.Osmium,
+ Materials.Oxygen,
+ Materials.Palladium,
+ Materials.Phosphorus,
+ Materials.Platinum,
+ Materials.Plutonium,
+ Materials.Plutonium241,
+ Materials.Potassium,
+ Materials.Praseodymium,
+ Materials.Promethium,
+ Materials.Radon,
+ Materials.Rubidium,
+ Materials.Samarium,
+ Materials.Silicon,
+ Materials.Silver,
+ Materials.Sodium,
+ Materials.Strontium,
+ Materials.Sulfur,
+ Materials.Tantalum,
+ Materials.Tellurium,
+ Materials.Terbium,
+ Materials.Thorium,
+ Materials.Thulium,
+ Materials.Tin,
+ Materials.Titanium,
+ Materials.Tritium,
+ Materials.Tungsten,
+ Materials.Uranium235,
+ Materials.Uranium,
+ Materials.Vanadium,
+ Materials.Ytterbium,
+ Materials.Yttrium,
+ Materials.Zinc,
+ Materials.Flerovium));
+
+ plasmaGTWeightList.addAll(
+ Arrays.asList(
+ 6000 /* Aluminium */,
+ 10000 /* Americium */,
+ 6000 /* Antimony */,
+ 6000 /* Ardite */,
+ 6000 /* Argon */,
+ 6000 /* Arsenic */,
+ 6000 /* Barium */,
+ 6000 /* Beryllium */,
+ 8000 /* Bismuth */,
+ 8000 /* Boron */,
+ 6000 /* Caesium */,
+ 10000 /* Calcium */,
+ 6000 /* Cadmium */,
+ 6000 /* Carbon */,
+ 6000 /* Cerium */,
+ 6000 /* Chlorine */,
+ 6000 /* Chrome */,
+ 6000 /* Cobalt */,
+ 6000 /* Copper */,
+ 6000 /* Desh */,
+ 6000 /* Deuterium */,
+ 2000 /* Dysprosium */,
+ 2000 /* Erbium */,
+ 6000 /* Europium */,
+ 6000 /* Fluorine */,
+ 2000 /* Gadolinium */,
+ 6000 /* Gallium */,
+ 6000 /* Gold */,
+ 10000 /* Helium */,
+ 6000 /* Holmium */,
+ 10000 /* Hydrogen */,
+ 6000 /* Indium */,
+ 6000 /* Iridium */,
+ 10000 /* Iron */,
+ 6000 /* Lanthanum */,
+ 500 /* Lead */,
+ 6000 /* Lithium */,
+ 6000 /* Lutetium */,
+ 6000 /* Magnesium */,
+ 6000 /* Manganese */,
+ 6000 /* Meteoric Iron */,
+ 6000 /* Molybdenum */,
+ 6000 /* Naquadah */,
+ 6000 /* Neodymium */,
+ 10000 /* Nickel */,
+ 10000 /* Niobium */,
+ 10000 /* Nitrogen */,
+ 6000 /* Oriharukon */,
+ 6000 /* Osmium */,
+ 8000 /* Oxygen */,
+ 6000 /* Palladium */,
+ 6000 /* Phosphorus */,
+ 6000 /* Platinum */,
+ 6000 /* Plutonium 239 */,
+ 500 /* Plutonium 241 */,
+ 6000 /* Potassium */,
+ 6000 /* Praseodymium */,
+ 2000 /* Promethium */,
+ 10000 /* Radon */,
+ 2000 /* Rubidium */,
+ 6000 /* Samarium */,
+ 6000 /* Raw Silicon */,
+ 10000 /* Silver */,
+ 6000 /* Sodium */,
+ 2000 /* Strontium */,
+ 10000 /* Sulfur */,
+ 6000 /* Tantalum */,
+ 2000 /* Tellurium */,
+ 1000 /* Terbium */,
+ 500 /* Thorium */,
+ 6000 /* Thulium */,
+ 10000 /* Tin */,
+ 10000 /* Titanium */,
+ 6000 /* Tritium */,
+ 6000 /* Tungsten */,
+ 6000 /* Uranium 235 */,
+ 6000 /* Uranium 238 */,
+ 6000 /* Vanadium */,
+ 2000 /* Ytterbium */,
+ 6000 /* Yttrium */,
+ 6000 /* Zinc */,
+ 1000 /* Flerovium */ ));
+
+ // GT++ materials
+ if (GTPlusPlus.isModLoaded()) {
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().ZIRCONIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().THORIUM232.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().GERMANIUM.getTinyDust(1), 2000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().THALLIUM.getTinyDust(1), 2000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RUTHENIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RHENIUM.getTinyDust(1), 2000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().RHODIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().IODINE.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.ASTRAL_TITANIUM.getTinyDust(1), 8000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.ADVANCED_NITINOL.getTinyDust(1), 8000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.FORCE.getTinyDust(1), 8000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().HAFNIUM.getTinyDust(1), 6000);
+ exoticModulePlasmaItemMap.put(ELEMENT.getInstance().CALIFORNIUM.getTinyDust(1), 1000);
+ exoticModulePlasmaItemMap.put(ELEMENT.STANDALONE.RUNITE.getTinyDust(1), 8000);
+
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().XENON.getFluid(), 1), 8000);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().KRYPTON.getFluid(), 1), 8000);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().NEON.getFluid(), 1), 8000);
+ // These are here because they cant be solidified
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().CURIUM.getFluid(), 1), 10000);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().NEPTUNIUM.getFluid(), 1), 800);
+ exoticModulePlasmaFluidMap.put(new FluidStack(ELEMENT.getInstance().FERMIUM.getFluid(), 1), 800);
+ }
+ // Mercury is weird, it has neither dust nor gas, so it needs to be added separately
+ exoticModulePlasmaFluidMap.put(Materials.Mercury.getFluid(1), 6000);
+
+ // Loop for adding all GT plasma materials
+ for (int i = 0; i < plasmaGTMaterialList.size(); i++) {
+ if (plasmaGTMaterialList.get(i).getDustTiny(1) != null) {
+ exoticModulePlasmaItemMap.put(plasmaGTMaterialList.get(i).getDustTiny(1), plasmaGTWeightList.get(i));
+ } else {
+ exoticModulePlasmaFluidMap.put(plasmaGTMaterialList.get(i).getGas(1), plasmaGTWeightList.get(i));
+ }
+ }
+
+ // Magmatter maps
+ exoticModuleMagmatterItemMap.putAll(exoticModulePlasmaItemMap);
+ exoticModuleMagmatterFluidMap.putAll(exoticModulePlasmaFluidMap);
+
+ // GT materials
+ exoticModuleMagmatterItemMap.put(Materials.CosmicNeutronium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Draconium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.DraconiumAwakened.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Ichorium.getDustTiny(1), 100000);
+ exoticModuleMagmatterItemMap.put(Materials.Neutronium.getDustTiny(1), 100000);
+
+ // GT++ materials
+ if (GTPlusPlus.isModLoaded()) {
+ exoticModuleMagmatterItemMap.put(ELEMENT.STANDALONE.CELESTIAL_TUNGSTEN.getTinyDust(1), 100000);
+ exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.HYPOGEN.getFluidStack(1), 100000);
+ exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.RHUGNOR.getFluidStack(1), 100000);
+ exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.CHRONOMATIC_GLASS.getFluidStack(1), 100000);
+ exoticModuleMagmatterFluidMap.put(ELEMENT.STANDALONE.DRAGON_METAL.getFluidStack(1), 100000);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java
index 953306e9a4..564c596086 100644
--- a/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java
+++ b/src/main/java/com/github/technus/tectech/loader/thing/MachineLoader.java
@@ -19,9 +19,14 @@ import static com.github.technus.tectech.thing.CustomItemList.Machine_DebugWrite
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Computer;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_DataBank;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_EyeOfHarmony;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_ForgeOfGods;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Infuser;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Microwave;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_MoltenModule;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_PlasmaModule;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_QuarkGluonPlasmaModule;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Research;
+import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_SmeltingModule;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Switch;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_TeslaCoil;
import static com.github.technus.tectech.thing.CustomItemList.Machine_Multi_Transformer;
@@ -314,6 +319,7 @@ import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_H
import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_Uncertainty;
import com.github.technus.tectech.thing.metaTileEntity.hatch.GT_MetaTileEntity_Hatch_WirelessMulti;
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_EyeOfHarmony;
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods;
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_computer;
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_dataBank;
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_infuser;
@@ -322,6 +328,10 @@ import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_E
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_transformer;
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_TM_microwave;
import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_TM_teslaCoil;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_ExoticModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule;
import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_PipeBlock_Data;
import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_PipeBlock_Energy;
import com.github.technus.tectech.thing.metaTileEntity.pipe.GT_MetaTileEntity_Pipe_Data;
@@ -2025,6 +2035,21 @@ public class MachineLoader implements Runnable {
Machine_Multi_EyeOfHarmony.set(
new GT_MetaTileEntity_EM_EyeOfHarmony(15410, "multimachine.em.eye_of_harmony", "Eye of Harmony")
.getStackForm(1L));
+ Machine_Multi_ForgeOfGods.set(
+ new GT_MetaTileEntity_EM_ForgeOfGods(15411, "multimachine.em.forge_of_gods", "Forge of the Gods")
+ .getStackForm(1L));
+ Machine_Multi_SmeltingModule.set(
+ new GT_MetaTileEntity_EM_SmeltingModule(15412, "multimachine.em.smelting_module", "Smelting Module")
+ .getStackForm(1L));
+ Machine_Multi_MoltenModule.set(
+ new GT_MetaTileEntity_EM_MoltenModule(15413, "multimachine.em.molten_module", "Molten Module")
+ .getStackForm(1L));
+ Machine_Multi_PlasmaModule.set(
+ new GT_MetaTileEntity_EM_PlasmaModule(15414, "multimachine.em.plasma_module", "Plasma Module")
+ .getStackForm(1L));
+ Machine_Multi_QuarkGluonPlasmaModule.set(
+ new GT_MetaTileEntity_EM_ExoticModule(15415, "multimachine.em.exotic_module", "Exotic Matter Module")
+ .getStackForm(1L));
// ===================================================================================================
// Hatches
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java
new file mode 100644
index 0000000000..15ab723e42
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/loader/thing/MuTeLoader.java
@@ -0,0 +1,21 @@
+package com.github.technus.tectech.loader.thing;
+
+import com.github.technus.tectech.TecTech;
+
+public class MuTeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ TecTech.LOGGER.info("TecTech: Registering MultiTileEntities");
+ registerMachines();
+ registerCasings();
+ }
+
+ private static void registerMachines() {
+
+ }
+
+ private static void registerCasings() {
+
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
index af383a18e8..eaec6574e1 100644
--- a/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
+++ b/src/main/java/com/github/technus/tectech/loader/thing/ThingsLoader.java
@@ -4,11 +4,14 @@ import static com.github.technus.tectech.Reference.MODID;
import static com.github.technus.tectech.TecTech.tectechTexturePage1;
import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.block.GodforgeGlassBlock;
import com.github.technus.tectech.thing.block.QuantumGlassBlock;
import com.github.technus.tectech.thing.block.ReactorSimBlock;
import com.github.technus.tectech.thing.block.TileEyeOfHarmony;
+import com.github.technus.tectech.thing.block.TileForgeOfGods;
import com.github.technus.tectech.thing.casing.GT_Block_CasingsBA0;
import com.github.technus.tectech.thing.casing.GT_Block_CasingsTT;
+import com.github.technus.tectech.thing.casing.GodforgeCasings;
import com.github.technus.tectech.thing.casing.SpacetimeCompressionFieldCasing;
import com.github.technus.tectech.thing.casing.StabilisationFieldCasing;
import com.github.technus.tectech.thing.casing.TT_Container_Casings;
@@ -36,6 +39,7 @@ public class ThingsLoader implements Runnable {
public void run() {
GameRegistry.registerTileEntity(TileEyeOfHarmony.class, MODID + ":EyeOfHarmonyRenderBlock");
+ GameRegistry.registerTileEntity(TileForgeOfGods.class, MODID + ":ForgeOfGodsRenderBlock");
if (Textures.BlockIcons.casingTexturePages[tectechTexturePage1] == null) {
Textures.BlockIcons.casingTexturePages[tectechTexturePage1] = new ITexture[128];
@@ -60,6 +64,12 @@ public class ThingsLoader implements Runnable {
TT_Container_Casings.StabilisationFieldGenerators = new StabilisationFieldCasing();
+ TT_Container_Casings.GodforgeCasings = new GodforgeCasings();
+ TecTech.LOGGER.info("Godforge blocks registered.");
+
+ GodforgeGlassBlock.run();
+ TecTech.LOGGER.info("Godforge Glass registered");
+
QuantumGlassBlock.run();
TecTech.LOGGER.info("Quantum Glass registered");
diff --git a/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java b/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java
index 68b3fb7a0f..e1ba2959f7 100644
--- a/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java
+++ b/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java
@@ -2,6 +2,7 @@ package com.github.technus.tectech.proxy;
import static com.github.technus.tectech.TecTech.RANDOM;
import static com.github.technus.tectech.thing.casing.TT_Container_Casings.eyeOfHarmonyRenderBlock;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiNewChat;
@@ -17,9 +18,14 @@ import net.minecraftforge.common.util.ForgeDirection;
import com.github.technus.tectech.Reference;
import com.github.technus.tectech.rendering.EOH.EOH_ItemRenderer;
import com.github.technus.tectech.rendering.EOH.EOH_TESR;
+import com.github.technus.tectech.thing.block.GodforgeGlassBlock;
+import com.github.technus.tectech.thing.block.GodforgeGlassRender;
import com.github.technus.tectech.thing.block.QuantumGlassBlock;
import com.github.technus.tectech.thing.block.QuantumGlassRender;
+import com.github.technus.tectech.thing.block.RenderForgeOfGods;
import com.github.technus.tectech.thing.block.TileEyeOfHarmony;
+import com.github.technus.tectech.thing.block.TileForgeOfGods;
+import com.github.technus.tectech.thing.item.RenderForgeOfGodsItem;
import com.gtnewhorizon.structurelib.entity.fx.WeightlessParticleFX;
import cpw.mods.fml.client.FMLClientHandler;
@@ -33,11 +39,16 @@ public class ClientProxy extends CommonProxy {
public void registerRenderInfo() {
QuantumGlassBlock.renderID = RenderingRegistry.getNextAvailableRenderId();
RenderingRegistry.registerBlockHandler(QuantumGlassBlock.renderID, new QuantumGlassRender());
+ GodforgeGlassBlock.renderID = RenderingRegistry.getNextAvailableRenderId();
+ RenderingRegistry.registerBlockHandler(GodforgeGlassBlock.renderID, new GodforgeGlassRender());
MinecraftForgeClient
.registerItemRenderer(Item.getItemFromBlock(eyeOfHarmonyRenderBlock), new EOH_ItemRenderer());
+ MinecraftForgeClient
+ .registerItemRenderer(Item.getItemFromBlock(forgeOfGodsRenderBlock), new RenderForgeOfGodsItem());
ClientRegistry.bindTileEntitySpecialRenderer(TileEyeOfHarmony.class, new EOH_TESR());
+ ClientRegistry.bindTileEntitySpecialRenderer(TileForgeOfGods.class, new RenderForgeOfGods());
}
@Override
diff --git a/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java b/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java
new file mode 100644
index 0000000000..1f19fc00c4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/GodforgeExoticFrontend.java
@@ -0,0 +1,51 @@
+package com.github.technus.tectech.recipe;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class GodforgeExoticFrontend extends RecipeMapFrontend {
+
+ public GodforgeExoticFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return Collections.singletonList(new Pos2d(52, 33));
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(106, 33));
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ long eut = recipeInfo.recipe.mEUt;
+ long duration = recipeInfo.recipe.mDuration;
+ recipeInfo.drawText(trans("152", "Total: ") + GT_Utility.formatNumbers(eut * duration) + " EU");
+ recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut) + " EU/t");
+ recipeInfo.drawText(trans("158", "Time: ") + GT_Utility.formatNumbers(duration / 20) + " secs");
+
+ }
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java b/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java
new file mode 100644
index 0000000000..bf8fcc5e8a
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/recipe/GodforgePlasmaFrontend.java
@@ -0,0 +1,64 @@
+package com.github.technus.tectech.recipe;
+
+import static gregtech.api.util.GT_Utility.trans;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+
+import gregtech.api.recipe.BasicUIPropertiesBuilder;
+import gregtech.api.recipe.NEIRecipePropertiesBuilder;
+import gregtech.api.recipe.RecipeMapFrontend;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class GodforgePlasmaFrontend extends RecipeMapFrontend {
+
+ public GodforgePlasmaFrontend(BasicUIPropertiesBuilder uiPropertiesBuilder,
+ NEIRecipePropertiesBuilder neiPropertiesBuilder) {
+ super(uiPropertiesBuilder, neiPropertiesBuilder);
+ }
+
+ @Override
+ public List<Pos2d> getItemInputPositions(int itemInputCount) {
+ return Collections.singletonList(new Pos2d(52, 33));
+ }
+
+ @Override
+ public List<Pos2d> getItemOutputPositions(int itemOutputCount) {
+ return Collections.singletonList(new Pos2d(106, 33));
+ }
+
+ @Override
+ protected void drawEnergyInfo(RecipeDisplayInfo recipeInfo) {
+ long eut = recipeInfo.recipe.mEUt;
+ long duration = recipeInfo.recipe.mDuration;
+ String multistep = "No";
+ if (recipeInfo.recipe.mSpecialItems.toString().equals("true")) {
+ multistep = "Yes";
+ }
+ String requiredUpgrade = switch (recipeInfo.recipe.mSpecialValue) {
+ case 1 -> "T4-T5";
+ case 2 -> "Exotic";
+ default -> "T1-T3";
+ };
+
+ recipeInfo.drawText(trans("152", "Total: ") + GT_Utility.formatNumbers(eut * duration) + " EU");
+ recipeInfo.drawText(trans("153", "Usage: ") + GT_Utility.formatNumbers(eut) + " EU/t");
+ recipeInfo.drawText(trans("158", "Time: ") + GT_Utility.formatNumbers(duration / 20) + " secs");
+ recipeInfo.drawText(translateToLocal("gt.blockmachines.multimachine.FOG.plasmamultistep") + ": " + multistep);
+ recipeInfo.drawText(
+ translateToLocal("gt.blockmachines.multimachine.FOG.plasmarecipetier") + ": " + requiredUpgrade);
+ }
+
+ @Override
+ protected void drawDurationInfo(RecipeDisplayInfo recipeInfo) {}
+
+}
diff --git a/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java b/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java
index 366ee0ebb0..a12a645799 100644
--- a/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java
+++ b/src/main/java/com/github/technus/tectech/recipe/TT_recipeAdder.java
@@ -227,4 +227,91 @@ public class TT_recipeAdder extends GT_RecipeAdder {
return true;
}
+ public static boolean addFOGPlasmaRecipe(ItemStack[] itemInputs, FluidStack[] fluidOutputs, int machineDuration,
+ int machineEUt, boolean multiStep, int recipeTier) {
+ if (itemInputs == null) {
+ itemInputs = nullItem;
+ }
+
+ TecTechRecipeMaps.godforgePlasmaRecipes.addRecipe(
+ false,
+ itemInputs,
+ null,
+ multiStep,
+ null,
+ fluidOutputs,
+ machineDuration,
+ machineEUt,
+ recipeTier);
+ return true;
+ }
+
+ public static boolean addFOGPlasmaRecipe(FluidStack[] fluidInputs, FluidStack[] fluidOutputs, int machineDuration,
+ int machineEUt, boolean multiStep, int recipeTier) {
+
+ if (fluidInputs == null) {
+ fluidInputs = nullFluid;
+ }
+
+ TecTechRecipeMaps.godforgePlasmaRecipes.addRecipe(
+ false,
+ null,
+ null,
+ multiStep,
+ fluidInputs,
+ fluidOutputs,
+ machineDuration,
+ machineEUt,
+ recipeTier);
+ return true;
+ }
+
+ public static boolean addFOGExoticFakeRecipe(Object[] itemInputs, Object[] fluidInputs, FluidStack[] fluidOutputs,
+ int machineDuration, int machineEUt, int recipeTier) {
+
+ if (itemInputs == null) {
+ itemInputs = nullItem;
+ }
+
+ if (fluidInputs == null) {
+ fluidInputs = nullFluid;
+ }
+
+ ItemStack[] inputItems = new ItemStack[itemInputs.length];
+ ItemStack[][] itemAlts = new ItemStack[itemInputs.length][];
+ for (int i = 0; i < itemInputs.length; i++) {
+ Object obj = itemInputs[i];
+ if (obj instanceof ItemStack) {
+ inputItems[i] = (ItemStack) obj;
+ itemAlts[i] = null;
+ } else if (obj instanceof ItemStack[]stacks) {
+ if (stacks.length > 0) {
+ inputItems[i] = stacks[0];
+ itemAlts[i] = Arrays.copyOf(stacks, stacks.length);
+ }
+ }
+ }
+
+ FluidStack[] inputFluids = new FluidStack[fluidInputs.length];
+ for (int i = 0; i < fluidInputs.length; i++) {
+ Object obj = fluidInputs[i];
+ if (obj instanceof FluidStack[]stacks) {
+ inputFluids[i] = stacks[0];
+ }
+ }
+
+ TecTechRecipeMaps.godforgeExoticMatterRecipes.addFakeRecipe(
+ false,
+ inputItems,
+ null,
+ null,
+ inputFluids,
+ fluidOutputs,
+ machineDuration,
+ machineEUt,
+ recipeTier,
+ itemAlts,
+ false);
+ return true;
+ }
}
diff --git a/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java b/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java
index da60084e3e..a115f0cc9f 100644
--- a/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java
+++ b/src/main/java/com/github/technus/tectech/recipe/TecTechRecipeMaps.java
@@ -46,4 +46,13 @@ public class TecTechRecipeMaps {
.logo(TecTechUITextures.PICTURE_TECTECH_LOGO).logoSize(18, 18).logoPos(151, 63)
.neiTransferRect(81, 33, 25, 18).neiTransferRect(124, 33, 18, 29).frontend(ResearchStationFrontend::new)
.neiHandlerInfo(builder -> builder.setDisplayStack(CustomItemList.Machine_Multi_Research.get(1))).build();
+
+ public static final RecipeMap<RecipeMapBackend> godforgePlasmaRecipes = RecipeMapBuilder.of("gt.recipe.fog_plasma")
+ .maxIO(1, 1, 1, 1).progressBar(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP, ProgressBar.Direction.RIGHT)
+ .progressBarPos(86, 44).neiTransferRect(86, 44, 20, 20).frontend(GodforgePlasmaFrontend::new).build();
+ public static final RecipeMap<RecipeMapBackend> godforgeExoticMatterRecipes = RecipeMapBuilder
+ .of("gt.recipe.fog_exotic").maxIO(1, 1, 1, 1)
+ .progressBar(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP, ProgressBar.Direction.RIGHT)
+ .progressBarPos(86, 44).neiTransferRect(86, 44, 20, 20).frontend(GodforgeExoticFrontend::new).build();
+
}
diff --git a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
index 6195942221..a45e342050 100644
--- a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
+++ b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java
@@ -353,6 +353,12 @@ public enum CustomItemList implements IItemContainer {
Machine_Multi_Decay,
Machine_Multi_Annihilation,
Machine_Multi_EyeOfHarmony,
+ Machine_Multi_ForgeOfGods,
+ Machine_Multi_SmeltingModule,
+ Machine_Multi_MoltenModule,
+ Machine_Multi_PlasmaModule,
+ Machine_Multi_QuarkGluonPlasmaModule,
+
hint_0,
hint_1,
hint_2,
@@ -432,6 +438,16 @@ public enum CustomItemList implements IItemContainer {
StabilisationFieldGeneratorTier7,
StabilisationFieldGeneratorTier8,
+ Godforge_Gravitational_Lens,
+ Godforge_Singularity_Shielding_Casing,
+ Godforge_Guidance_Casing,
+ Godforge_Boundless_Structure_Casing,
+ Godforge_Magnetic_Confinement_Casing,
+ Godforge_Stellar_Energy_Siphon_Casing,
+ Godforge_GravitonFlowModulatorTier1,
+ Godforge_GravitonFlowModulatorTier2,
+ Godforge_GravitonFlowModulatorTier3,
+
astralArrayFabricator;
private ItemStack mStack;
diff --git a/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java b/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java
new file mode 100644
index 0000000000..02be399bb0
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/ForgeOfGodsBlock.java
@@ -0,0 +1,70 @@
+package com.github.technus.tectech.thing.block;
+
+import java.util.ArrayList;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+import com.github.technus.tectech.TecTech;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+
+public class ForgeOfGodsBlock extends Block {
+
+ public ForgeOfGodsBlock() {
+ super(Material.iron);
+ this.setResistance(20f);
+ this.setHardness(-1.0f);
+ this.setCreativeTab(TecTech.creativeTabTecTech);
+ this.setBlockName("Forge of the Gods Renderer");
+ this.setLightLevel(100.0f);
+ registerOther(this);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister iconRegister) {
+ blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT");
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean canRenderInPass(int a) {
+ return true;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ public boolean hasTileEntity(int metadata) {
+ return true;
+ }
+
+ @Override
+ public TileEntity createTileEntity(World world, int metadata) {
+ return new TileForgeOfGods();
+ }
+
+ public static void registerOther(Block block) {
+ GameRegistry.registerBlock(block, "ForgeOfGodsRenderBlock");
+ }
+
+ @Override
+ public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int meta, int fortune) {
+ return new ArrayList<>();
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java
new file mode 100644
index 0000000000..67c77f5ac4
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassBlock.java
@@ -0,0 +1,107 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static com.github.technus.tectech.TecTech.creativeTabTecTech;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+import cpw.mods.fml.common.registry.GameRegistry;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import eu.usrv.yamcore.blocks.BlockBase;
+import gregtech.api.GregTech_API;
+
+public class GodforgeGlassBlock extends BlockBase {
+
+ public static IIcon Icon;
+ public static int renderID;
+ public static GodforgeGlassBlock INSTANCE;
+
+ public GodforgeGlassBlock() {
+ super(Material.iron);
+ setBlockBounds(0, 0, 0, 1, 1, 1);
+ setBlockName("spatiallyTranscendentGravitationalLens");
+ setHarvestLevel("wrench", 3);
+ setHardness(50);
+ setResistance(30);
+ setLightOpacity(0);
+ setStepSound(Block.soundTypeGlass);
+ setBlockTextureName(MODID + ":blockSpatiallyTranscendentGravitationalLens");
+ setCreativeTab(creativeTabTecTech);
+ }
+
+ @Override
+ public boolean isBeaconBase(IBlockAccess worldObj, int x, int y, int z, int beaconX, int beaconY, int beaconZ) {
+ return true;
+ }
+
+ @Override
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ @Override
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ @Override
+ public boolean canBeReplacedByLeaves(IBlockAccess world, int x, int y, int z) {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public int getRenderBlockPass() {
+ return 1;
+ }
+
+ @Override
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public boolean shouldSideBeRendered(IBlockAccess worldIn, int x, int y, int z, int side) {
+ Block block = worldIn.getBlock(x, y, z);
+ return block != this;
+ }
+
+ @Override
+ public int getRenderType() {
+ return renderID;
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerBlockIcons(IIconRegister reg) {
+ super.registerBlockIcons(reg);
+ Icon = blockIcon;
+ }
+
+ public static void run() {
+ INSTANCE = new GodforgeGlassBlock();
+ GameRegistry.registerBlock(INSTANCE, GodforgeGlassItem.class, INSTANCE.getUnlocalizedName());
+ GregTech_API.registerMachineBlock(INSTANCE, -1);
+ }
+
+ @Override
+ public void breakBlock(World aWorld, int aX, int aY, int aZ, Block aBlock, int aMeta) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+
+ @Override
+ public void onBlockAdded(World aWorld, int aX, int aY, int aZ) {
+ if (GregTech_API.isMachineBlock(this, aWorld.getBlockMetadata(aX, aY, aZ))) {
+ GregTech_API.causeMachineUpdate(aWorld, aX, aY, aZ);
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java
new file mode 100644
index 0000000000..0e6b0d17c6
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassItem.java
@@ -0,0 +1,30 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.util.CommonValues.GODFORGE_MARK;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+public class GodforgeGlassItem extends ItemBlock {
+
+ public static GodforgeGlassItem INSTANCE;
+
+ public GodforgeGlassItem(Block block) {
+ super(block);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) {
+ aList.add(GODFORGE_MARK);
+ aList.add(translateToLocal("tile.godforgeGlass.desc.0"));
+ aList.add(
+ EnumChatFormatting.AQUA.toString() + EnumChatFormatting.BOLD
+ + translateToLocal("tile.godforgeGlass.desc.1"));
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java
new file mode 100644
index 0000000000..82e7a7d5cd
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/GodforgeGlassRender.java
@@ -0,0 +1,116 @@
+package com.github.technus.tectech.thing.block;
+
+import net.minecraft.block.Block;
+import net.minecraft.client.renderer.RenderBlocks;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
+
+public class GodforgeGlassRender implements ISimpleBlockRenderingHandler {
+
+ @Override
+ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ Tessellator tessellator = Tessellator.instance;
+ GL11.glPushMatrix();
+ // Get icons from custom register (useful for renderers and fluids)
+ IIcon side = GodforgeGlassBlock.Icon;
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, -1.0F, 0.0F);
+ renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 0.0F, -1.0F);
+ renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 0.0F, 1.0F);
+ renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(-1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(1.0F, 0.0F, 0.0F);
+ renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ tessellator.startDrawingQuads();
+ tessellator.setNormal(0.0F, 1.0F, 0.0F);
+ renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, side);
+ tessellator.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ GL11.glPopMatrix();
+ }
+
+ @Override
+ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId,
+ RenderBlocks renderer) {
+
+ renderer.renderStandardBlock(block, x, y, z);
+ Tessellator tes = Tessellator.instance;
+ tes.setNormal(0F, 1F, 0F);
+ tes.setBrightness(15728880);
+ tes.setColorOpaque_F(0F, 1F, 1F);
+ IIcon side = GodforgeGlassBlock.Icon;
+
+ // South
+ if (world.getBlock(x, y, z + 1).getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x, y, z + 0.999, side.getMinU(), side.getMaxV()); // 0.999 instead of 1 for fighting
+ // (textures overlapping)
+ tes.addVertexWithUV(x, y + 1, z + 0.999, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 1, z + 0.999, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y, z + 0.999, side.getMaxU(), side.getMaxV());
+ }
+ // East
+ if (world.getBlock(x + 1, y, z).getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x + 0.999, y, z + 1, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 0.999, y + 1, z + 1, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.999, y + 1, z, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.999, y, z, side.getMaxU(), side.getMaxV());
+ }
+ // North
+ if (world.getBlock(x, y, z - 1).getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x + 1, y, z + 0.001, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 1, y + 1, z + 0.001, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x, y + 1, z + 0.001, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x, y, z + 0.001, side.getMaxU(), side.getMaxV());
+ }
+ // West
+ if (world.getBlock(x - 1, y, z).getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x + 0.001, y, z, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x + 0.001, y + 1, z, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.001, y + 1, z + 1, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 0.001, y, z + 1, side.getMaxU(), side.getMaxV());
+ }
+ // Top
+ if (world.getBlock(x, y + 1, z).getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x, y + 0.999, z + 1, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x, y + 0.999, z, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.999, z, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.999, z + 1, side.getMaxU(), side.getMaxV());
+ }
+ // Bottom
+ if (world.getBlock(x, y - 1, z).getClass() != GodforgeGlassBlock.class) {
+ tes.addVertexWithUV(x, y + 0.001, z, side.getMinU(), side.getMaxV());
+ tes.addVertexWithUV(x, y + 0.001, z + 1, side.getMinU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.001, z + 1, side.getMaxU(), side.getMinV());
+ tes.addVertexWithUV(x + 1, y + 0.001, z, side.getMaxU(), side.getMaxV());
+ }
+ return true;
+ }
+
+ @Override
+ public boolean shouldRender3DInInventory(int modelId) {
+ return true;
+ }
+
+ @Override
+ public int getRenderId() {
+ return GodforgeGlassBlock.renderID;
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java
new file mode 100644
index 0000000000..c38607029e
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/RenderForgeOfGods.java
@@ -0,0 +1,125 @@
+package com.github.technus.tectech.thing.block;
+
+import static com.github.technus.tectech.Reference.MODID;
+import static java.lang.Math.pow;
+
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.AdvancedModelLoader;
+import net.minecraftforge.client.model.IModelCustom;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.FMLClientHandler;
+
+public class RenderForgeOfGods extends TileEntitySpecialRenderer {
+
+ public static final ResourceLocation STAR_LAYER_0 = new ResourceLocation(MODID, "models/StarLayer0.png");
+ public static final ResourceLocation STAR_LAYER_1 = new ResourceLocation(MODID, "models/StarLayer1.png");
+ public static final ResourceLocation STAR_LAYER_2 = new ResourceLocation(MODID, "models/StarLayer2.png");
+ public static IModelCustom starModel;
+ private static IModelCustom spaceModel;
+ private static final float RED = 180 / 255f;
+ private static final float GREEN = 180 / 255f;
+ private static final float BLUE = 255 / 255f;
+
+ public RenderForgeOfGods() {
+ starModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Star.obj"));
+ spaceModel = AdvancedModelLoader.loadModel(new ResourceLocation(MODID, "models/Space.obj"));
+ }
+
+ @Override
+ public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) {
+ if (!(tile instanceof TileForgeOfGods)) return;
+
+ TileForgeOfGods FOGRenderTile = (TileForgeOfGods) tile;
+
+ // Render outer space layer.
+
+ {
+ GL11.glPushMatrix();
+ GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
+ renderOuterSpaceShell();
+
+ // Render star stuff.
+ renderStarLayer(FOGRenderTile, 0, STAR_LAYER_0, 1.0f);
+ renderStarLayer(FOGRenderTile, 1, STAR_LAYER_1, 0.4f);
+ renderStarLayer(FOGRenderTile, 2, STAR_LAYER_2, 0.2f);
+
+ GL11.glPopMatrix();
+ }
+ }
+
+ public static void renderOuterSpaceShell() {
+
+ GL11.glPushMatrix();
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_BLEND);
+
+ FMLClientHandler.instance().getClient().getTextureManager()
+ .bindTexture(new ResourceLocation(MODID, "models/spaceLayer.png"));
+
+ final float scale = 0.01f * 17.5f;
+ GL11.glScalef(scale, scale, scale);
+
+ GL11.glColor4f(222 / 255f, 243 / 255f, 250 / 255f, 255 / 255f);
+
+ spaceModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+ }
+
+ private static final float STAR_RESCALE = 0.2f;
+
+ private void renderStarLayer(TileForgeOfGods FOGRenderTile, int layer, ResourceLocation texture, float alpha) {
+
+ GL11.glPushMatrix();
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ FMLClientHandler.instance().getClient().getTextureManager().bindTexture(texture);
+
+ // 0.01f magic number to shrink sphere obj down
+ float scale = 0.01f * STAR_RESCALE * FOGRenderTile.getRenderSize();
+
+ // Put each layer further out
+ scale *= pow(1.04f, layer);
+
+ // Scale the star up in the x, y and z directions
+ GL11.glScalef(scale, scale, scale);
+
+ switch (layer) {
+ case 0:
+ GL11.glRotatef(130, 0F, 1F, 1F);
+ break;
+ case 1:
+ GL11.glRotatef(-49, 1F, 1F, 0F);
+ break;
+ case 2:
+ GL11.glRotatef(67, 1F, 0F, 1F);
+ break;
+ }
+
+ // Set color and alpha of the star layer
+ GL11.glColor4f(RED, GREEN, BLUE, alpha);
+
+ // Spin the star
+ GL11.glRotatef((0.03f * FOGRenderTile.angle * FOGRenderTile.getRenderRotationSpeed()) % 360.0f, 0F, 0F, 1F);
+
+ starModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java
new file mode 100644
index 0000000000..0e0b536046
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/block/TileForgeOfGods.java
@@ -0,0 +1,77 @@
+package com.github.technus.tectech.thing.block;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.Packet;
+import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+
+public class TileForgeOfGods extends TileEntity {
+
+ private float size = 10;
+ private float rotationSpeed = 10;
+
+ @Override
+ public AxisAlignedBB getRenderBoundingBox() {
+ return INFINITE_EXTENT_AABB;
+ }
+
+ public void setRenderSize(float size) {
+ this.size = size;
+ }
+
+ public void setRenderRotationSpeed(float rotationSpeed) {
+ this.rotationSpeed = rotationSpeed;
+ }
+
+ public float getRenderSize() {
+ return size;
+ }
+
+ public float getRenderRotationSpeed() {
+ return rotationSpeed;
+ }
+
+ @Override
+ public void updateEntity() {
+ angle += 10.0f;
+ }
+
+ // Used to track the rotation of the star
+ public float angle;
+
+ private static final String FOG_NBT_TAG = "FOG:";
+ private static final String ROTATION_SPEED_NBT_TAG = FOG_NBT_TAG + "renderRotationSpeed";
+ private static final String SIZE_NBT_TAG = FOG_NBT_TAG + "renderSize";
+
+ @Override
+ public void writeToNBT(NBTTagCompound compound) {
+ super.writeToNBT(compound);
+
+ // Save stats
+ compound.setFloat(ROTATION_SPEED_NBT_TAG, rotationSpeed);
+ compound.setFloat(SIZE_NBT_TAG, size);
+ }
+
+ @Override
+ public void readFromNBT(NBTTagCompound compound) {
+ super.readFromNBT(compound);
+
+ // Load stats
+ rotationSpeed = compound.getFloat(ROTATION_SPEED_NBT_TAG);
+ size = compound.getFloat(SIZE_NBT_TAG);
+ }
+
+ @Override
+ public Packet getDescriptionPacket() {
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
+ writeToNBT(nbttagcompound);
+ return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound);
+ }
+
+ @Override
+ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
+ readFromNBT(pkt.func_148857_g());
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java
new file mode 100644
index 0000000000..0d04559661
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GT_Item_Casings_Godforge.java
@@ -0,0 +1,119 @@
+package com.github.technus.tectech.thing.casing;
+
+import static com.github.technus.tectech.util.CommonValues.GODFORGE_MARK;
+import static net.minecraft.util.EnumChatFormatting.AQUA;
+import static net.minecraft.util.EnumChatFormatting.BOLD;
+
+import java.util.List;
+
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.EnumChatFormatting;
+
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Item_Casings_Abstract;
+
+public class GT_Item_Casings_Godforge extends GT_Item_Casings_Abstract {
+
+ public GT_Item_Casings_Godforge(Block par1) {
+ super(par1);
+ }
+
+ @Override
+ public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List aList, boolean aF3_H) {
+ aList.add(GODFORGE_MARK);
+ switch (aStack.getItemDamage()) {
+ case 0:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.0.Tooltip.0",
+ "Shielded by the event horizon of a singularity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.0.Tooltip.1",
+ "Don't get too close..."));
+ break;
+ case 1:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.1.Tooltip.0",
+ "Designed to route stellar matter using spacetime distortion"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.1.Tooltip.1", "Reality Distortion"));
+ break;
+ case 2:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.2.Tooltip.0",
+ "Unaffected by gravitational forces"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.2.Tooltip.1",
+ "Not even a black hole could tear it apart."));
+ break;
+ case 3:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.3.Tooltip.0",
+ "Creates enormous magnetic fields capable of constraining entire stars"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.3.Tooltip.1",
+ "It's super effective!"));
+ break;
+ case 4:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.4.Tooltip.0",
+ "Taps into streams of stellar matter to harness their heat energy"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.4.Tooltip.1", "Turn up the heat!"));
+ break;
+ case 5:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.5.Tooltip.0",
+ "Controls the flow of gravitons to manipulate gravity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.5.Tooltip.1",
+ "Exponential scaling past 800 Galaxies"));
+ break;
+ case 6:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.6.Tooltip.0",
+ "Controls the flow of gravitons to manipulate gravity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.6.Tooltip.1", "Getting closer..."));
+ break;
+ case 7:
+ aList.add(
+ GT_LanguageManager.addStringLocalization(
+ "godforge.casings.7.Tooltip.0",
+ "Controls the flow of gravitons to manipulate gravity"));
+ aList.add(
+ AQUA.toString() + BOLD
+ + GT_LanguageManager
+ .addStringLocalization("godforge.casings.7.Tooltip.1", "Gravity Central"));
+ break;
+ default:
+ aList.add(
+ EnumChatFormatting.RED.toString() + BOLD
+ + GT_LanguageManager.addStringLocalization(
+ "godforge.casings.Error.Tooltip",
+ "Error, report to GTNH team"));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java b/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java
new file mode 100644
index 0000000000..eacdf35f13
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/casing/GodforgeCasings.java
@@ -0,0 +1,125 @@
+package com.github.technus.tectech.thing.casing;
+
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+import net.minecraft.world.IBlockAccess;
+
+import com.github.technus.tectech.thing.CustomItemList;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.objects.GT_CopiedBlockTexture;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.common.blocks.GT_Block_Casings_Abstract;
+import gregtech.common.blocks.GT_Material_Casings;
+
+public class GodforgeCasings extends GT_Block_Casings_Abstract {
+
+ private static IIcon GodforgeTrim;
+ private static IIcon GodforgeInner;
+ private static IIcon GodforgeSupport;
+ private static IIcon GodforgeOuter;
+ private static IIcon GodforgeEnergy;
+ private static IIcon GravitonModulatorT1;
+ private static IIcon GravitonModulatorT2;
+ private static IIcon GravitonModulatorT3;
+
+ private static final byte START_INDEX = 64;
+
+ public GodforgeCasings() {
+ super(GT_Item_Casings_Godforge.class, "gt.godforgecasing", GT_Material_Casings.INSTANCE);
+ for (byte b = 0; b < 16; b = (byte) (b + 1)) {
+ Textures.BlockIcons.casingTexturePages[7][b + START_INDEX] = new GT_CopiedBlockTexture(this, 6, b);
+ }
+
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".0.name",
+ "Singularity Reinforced Stellar Shielding Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".1.name", "Celestial Matter Guidance Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".2.name",
+ "Boundless Gravitationally Severed Structure Casing");
+ GT_LanguageManager.addStringLocalization(
+ getUnlocalizedName() + ".3.name",
+ "Transcendentally Amplified Magnetic Confinement Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".4.name", "Stellar Energy Siphon Casing");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".5.name", "Remote Graviton Flow Modulator");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".6.name", "Medial Graviton Flow Modulator");
+ GT_LanguageManager.addStringLocalization(getUnlocalizedName() + ".7.name", "Central Graviton Flow Modulator");
+
+ CustomItemList.Godforge_Singularity_Shielding_Casing.set(new ItemStack(this, 1, 0));
+ CustomItemList.Godforge_Guidance_Casing.set(new ItemStack(this, 1, 1));
+ CustomItemList.Godforge_Boundless_Structure_Casing.set(new ItemStack(this, 1, 2));
+ CustomItemList.Godforge_Magnetic_Confinement_Casing.set(new ItemStack(this, 1, 3));
+ CustomItemList.Godforge_Stellar_Energy_Siphon_Casing.set(new ItemStack(this, 1, 4));
+ CustomItemList.Godforge_GravitonFlowModulatorTier1.set(new ItemStack(this, 1, 5));
+ CustomItemList.Godforge_GravitonFlowModulatorTier2.set(new ItemStack(this, 1, 6));
+ CustomItemList.Godforge_GravitonFlowModulatorTier3.set(new ItemStack(this, 1, 7));
+ }
+
+ @Override
+ public void registerBlockIcons(IIconRegister aIconRegister) {
+ GodforgeTrim = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_TRIM");
+ GodforgeInner = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_INNER");
+ GodforgeSupport = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_SUPPORT");
+ GodforgeOuter = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_TOP_BOTTOM");
+ GodforgeEnergy = aIconRegister.registerIcon("gregtech:iconsets/GODFORGE_ENERGY");
+ GravitonModulatorT1 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_2");
+ GravitonModulatorT2 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_1");
+ GravitonModulatorT3 = aIconRegister.registerIcon("gregtech:iconsets/GRAVITON_CASING_0");
+ }
+
+ @Override
+ public IIcon getIcon(int aSide, int aMeta) {
+ switch (aMeta) {
+ case 0:
+ return GodforgeTrim;
+ case 1:
+ return GodforgeInner;
+ case 2:
+ return GodforgeSupport;
+ case 3:
+ return GodforgeOuter;
+ case 4:
+ return GodforgeEnergy;
+ case 5:
+ if (aSide < 2) {
+ return GodforgeOuter;
+ }
+ return GravitonModulatorT1;
+ case 6:
+ if (aSide < 2) {
+ return GodforgeOuter;
+ }
+ return GravitonModulatorT2;
+ case 7:
+ if (aSide < 2) {
+ return GodforgeOuter;
+ }
+ return GravitonModulatorT3;
+ default:
+ return Textures.BlockIcons.MACHINE_CASING_SOLID_STEEL.getIcon();
+ }
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public IIcon getIcon(IBlockAccess aWorld, int xCoord, int yCoord, int zCoord, int aSide) {
+ int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
+ return getIcon(aSide, tMeta);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void getSubBlocks(Item aItem, CreativeTabs par2CreativeTabs, List aList) {
+ for (int i = 0; i <= 7; i++) {
+ aList.add(new ItemStack(aItem, 1, i));
+ }
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java b/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java
index eaa98cc8f0..009a9f4255 100644
--- a/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java
+++ b/src/main/java/com/github/technus/tectech/thing/casing/TT_Container_Casings.java
@@ -3,6 +3,7 @@ package com.github.technus.tectech.thing.casing;
import net.minecraft.block.Block;
import com.github.technus.tectech.thing.block.EOH_RenderBlock;
+import com.github.technus.tectech.thing.block.ForgeOfGodsBlock;
/**
* Created by danie_000 on 03.10.2016.
@@ -19,6 +20,9 @@ public final class TT_Container_Casings {
public static Block StabilisationFieldGenerators;
public static Block eyeOfHarmonyRenderBlock = new EOH_RenderBlock();
+ public static Block forgeOfGodsRenderBlock = new ForgeOfGodsBlock();
+
+ public static Block GodforgeCasings;
private TT_Container_Casings() {}
}
diff --git a/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java b/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java
index 95dc85429b..9c475345bb 100644
--- a/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java
+++ b/src/main/java/com/github/technus/tectech/thing/gui/TecTechUITextures.java
@@ -17,10 +17,16 @@ public class TecTechUITextures {
.fullImage(MODID, "gui/background/screen_blue_parametrizer_txt");
public static final UITexture BACKGROUND_SCREEN_BLUE_NO_INVENTORY = UITexture
.fullImage(MODID, "gui/background/screen_blue_no_inventory");
+ public static final UITexture BACKGROUND_STAR = UITexture.fullImage(MODID, "gui/background/star");
+ public static final UITexture BACKGROUND_GLOW_ORANGE = UITexture.fullImage(MODID, "gui/background/orange_glow");
+ public static final UITexture BACKGROUND_GLOW_PURPLE = UITexture.fullImage(MODID, "gui/background/purple_glow");
+ public static final UITexture BACKGROUND_GLOW_BLUE = UITexture.fullImage(MODID, "gui/background/blue_glow");
+ public static final UITexture BACKGROUND_GLOW_GREEN = UITexture.fullImage(MODID, "gui/background/green_glow");
public static final UITexture BUTTON_STANDARD_16x16 = UITexture.fullImage(MODID, "gui/button/standard_16x16");
public static final UITexture BUTTON_STANDARD_LIGHT_16x16 = UITexture
.fullImage(MODID, "gui/button/standard_light_16x16");
+ public static final UITexture BUTTON_CELESTIAL_32x32 = UITexture.fullImage(MODID, "gui/button/celestial");
public static final UITexture OVERLAY_BUTTON_POWER_SWITCH_DISABLED = UITexture
.fullImage(MODID, "gui/overlay_button/power_switch_disabled");
@@ -61,6 +67,8 @@ public class TecTechUITextures {
.fullImage(MODID, "gui/overlay_button/parametrizer_c");
public static final UITexture OVERLAY_BUTTON_PARAMETRIZER_IF = UITexture
.fullImage(MODID, "gui/overlay_button/parametrizer_if");
+ public static final UITexture OVERLAY_BUTTON_ARROW_BLUE_UP = UITexture
+ .fullImage(MODID, "gui/overlay_button/arrow_blue_up");
public static final UITexture OVERLAY_SLOT_RACK = UITexture.fullImage(MODID, "gui/overlay_slot/rack");
public static final UITexture OVERLAY_SLOT_MESH = UITexture.fullImage(MODID, "gui/overlay_slot/mesh");
@@ -109,4 +117,10 @@ public class TecTechUITextures {
public static final UITexture PICTURE_PARAMETER_GRAY = UITexture.fullImage(MODID, "gui/picture/parameter_gray");
public static final UITexture PICTURE_UNCERTAINTY_MONITOR_MULTIMACHINE = UITexture
.fullImage(MODID, "gui/picture/uncertainty/monitor_multimachine");
+ public static final UITexture PICTURE_UPGRADE_CONNECTOR_FULL = UITexture.fullImage(MODID, "gui/picture/connector");
+ public static final UITexture PICTURE_UPGRADE_CONNECTOR_EMPTY = UITexture
+ .fullImage(MODID, "gui/picture/connector_empty");
+ public static final UITexture PICTURE_UPGRADE_CONNECTOR_SWITCH = UITexture
+ .fullImage(MODID, "gui/picture/connector_switch");
+ public static final UITexture SLOT_OUTLINE_GREEN = UITexture.fullImage(MODID, "gui/picture/green_selector");
}
diff --git a/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java b/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java
new file mode 100644
index 0000000000..87d226dd72
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/item/RenderForgeOfGodsItem.java
@@ -0,0 +1,88 @@
+package com.github.technus.tectech.thing.item;
+
+import static com.github.technus.tectech.rendering.EOH.EOH_TESR.*;
+import static java.lang.Math.pow;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.IItemRenderer;
+
+import org.lwjgl.opengl.GL11;
+
+import cpw.mods.fml.client.FMLClientHandler;
+
+public class RenderForgeOfGodsItem implements IItemRenderer {
+
+ @Override
+ public boolean handleRenderType(ItemStack item, IItemRenderer.ItemRenderType type) {
+ return true;
+ }
+
+ @Override
+ public boolean shouldUseRenderHelper(IItemRenderer.ItemRenderType type, ItemStack item,
+ IItemRenderer.ItemRendererHelper helper) {
+ return true;
+ }
+
+ @Override
+ public void renderItem(IItemRenderer.ItemRenderType type, ItemStack item, Object... data) {
+ GL11.glPushMatrix();
+
+ if (type == IItemRenderer.ItemRenderType.INVENTORY) GL11.glRotated(180, 0, 1, 0);
+ else if (type == IItemRenderer.ItemRenderType.EQUIPPED
+ || type == IItemRenderer.ItemRenderType.EQUIPPED_FIRST_PERSON) {
+ GL11.glTranslated(0.5, 0.5, 0.5);
+ if (type == IItemRenderer.ItemRenderType.EQUIPPED) GL11.glRotated(90, 0, 1, 0);
+ }
+
+ // Render star stuff
+ renderStarLayer(0, STAR_LAYER_0, 1.0f);
+ renderStarLayer(1, STAR_LAYER_1, 0.4f);
+ renderStarLayer(2, STAR_LAYER_2, 0.2f);
+
+ GL11.glPopMatrix();
+ }
+
+ private void renderStarLayer(int layer, ResourceLocation texture, float alpha) {
+
+ GL11.glPushMatrix();
+
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+
+ FMLClientHandler.instance().getClient().getTextureManager().bindTexture(texture);
+
+ // 0.01f magic number to shrink sphere obj down
+ float scale = 0.01f;
+
+ // Put each layer further out
+ scale *= pow(1.04f, layer);
+
+ // Scale the star up in the x, y and z directions
+ GL11.glScalef(scale, scale, scale);
+
+ switch (layer) {
+ case 0:
+ GL11.glRotatef(130 + (System.currentTimeMillis() / 64) % 360, 0F, 1F, 1F);
+ break;
+ case 1:
+ GL11.glRotatef(-49 + (System.currentTimeMillis() / 64) % 360, 1F, 1F, 0F);
+ break;
+ case 2:
+ GL11.glRotatef(67 + (System.currentTimeMillis() / 64) % 360, 1F, 0F, 1F);
+ break;
+ }
+
+ // Set colour and alpha of the star layer
+ GL11.glColor4f(222, 243, 250, alpha);
+
+ starModel.renderAll();
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_LIGHTING);
+
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java
new file mode 100644
index 0000000000..7dde3ab5b7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/ForgeofGodsStructureString.java
@@ -0,0 +1,2933 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+public abstract class ForgeofGodsStructureString {
+
+ @SuppressWarnings("SpellCheckingInspection")
+ public static final String[][] godForge = {
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CC ",
+ " CCCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C ",
+ " CCCCCC ",
+ " CCCCCCC ",
+ " CCCDDCCC ",
+ " CC DDDCC ",
+ " CCCDDDCC ",
+ " CCCCCCC ",
+ " CCCCCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCCC CCC ",
+ " CCCDDDD CC ",
+ " CCDDDDDD C ",
+ " CCDDDDDDDCC ",
+ " C DDDDDDDC ",
+ " CCDDDDDDDCC ",
+ " CCDDDDDDCC ",
+ " C DDDD C ",
+ " CC DD CC ",
+ " CCCCCC ",
+ " CC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " CC CCC ",
+ " CC DDDDDCC ",
+ " C DDDDDDDCC ",
+ " C DDDDDDDDCC ",
+ " CCDDDDDDDD C ",
+ " CCDDDDDDDDCC ",
+ " CCDDDDDDDDC ",
+ " C DDDDDDDC ",
+ " CCDDDDDDDC ",
+ " CCDDDDD C ",
+ " C DDDDC ",
+ " CC CC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " CCCC ",
+ " CCCCCC ",
+ " CCCCCCC ",
+ " CCCCCCC ",
+ " CCCCCCC ",
+ " CCCCCCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCCCC ",
+ " CCDDDDDCC ",
+ " C DDDDDDDCC ",
+ " CDDDDDDDD CC ",
+ " CCDDDDDDDD C ",
+ " CCDDDDDDDDCC ",
+ " CCDDDDDDDDCC ",
+ " CC DDDDDD C ",
+ " CCDDDDDDDCC ",
+ " C DDDDDD C ",
+ " CCDDDDDD C ",
+ " CDDDDDDC ",
+ " C DDDDCC ",
+ " CC DDCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " CCCC ",
+ " CCCCCC ",
+ " CCCCCCCC ",
+ " CCCCCCCC ",
+ " CCCDDDCCCC ",
+ " CCCDDDDCCC ",
+ " CCDDDDDDCCC ",
+ " CCDDDDDD CCC ",
+ " CC DDDDDDCCCC ",
+ " CCCDDDDDDDCCCC ",
+ " CCC DDDDDDCCCCC ",
+ " CCCC DDDCCCCCC ",
+ " CCCCCCCCCCCC ",
+ " CCCCCCCCC ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " C DDDCCC ",
+ " CDDDDDD C ",
+ " C DDDDDDDCC ",
+ " C DDDDDDDCC ",
+ " CC DDDDDDCCC ",
+ " CCCC DDCCCCC ",
+ " CCCCCCCCCC ",
+ " CCCCCCCCC ",
+ " CC DDD CC ",
+ " CCDDDDD C ",
+ " CCDDDDDDC ",
+ " C DDDDDDC ",
+ " C DDDDDC ",
+ " CCDDDD C ",
+ " C DDCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C ",
+ " CCCC ",
+ " CCCCCC ",
+ " CCCCCCC ",
+ " CCCDD CC ",
+ " CCDDDDCC ",
+ " CCDDDDD CC ",
+ " CCDDDDDDD C ",
+ " CCDDDDDDD CC ",
+ " C DDDDDDDD C ",
+ " CDDDDDDDDDDCC ",
+ " CCDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDD CCC ",
+ " CC DDDDDDDDDDDDDCCCC ",
+ " CC DDDDDDDDDDDCCCC ",
+ " CCC DDDDDDD CCCC ",
+ " CCCCCCCCCCCC ",
+ " CCCCC ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCCC ",
+ " CDDDDDCC ",
+ " CDDDDDD C ",
+ " C DDDDDD C ",
+ " CCDDDDDDCC ",
+ " CCCC CCCC ",
+ " CCCCC ",
+ " ",
+ " ",
+ " CCCCCC ",
+ " CCCC CC ",
+ " CCDDD C ",
+ " CCDDDDDC ",
+ " CDDDDDDC ",
+ " CDDDDDC ",
+ " CDDDD C ",
+ " C DDCC ",
+ " CCCC ",
+ " ",
+ " C ",
+ " CCCCC ",
+ " CCCCCC ",
+ " CCC CCC ",
+ " CCDDDDCC ",
+ " CCDDDDD C ",
+ " CDDDDDD C ",
+ " C DDDDDD C ",
+ " CCDDDDDDDDC ",
+ " CDDDDDDDDDCC ",
+ " C DDDDDDDDD C ",
+ " C DDDDDDDDDDCC ",
+ " CDDDDDDDDDDD C ",
+ " CDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDCCC ",
+ " CDDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDD CCCC ",
+ " CCDDDDDDDDDDDDDDDDDDCCCC ",
+ " C DDDDDDDDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDDDDCCCC ",
+ " CC DDDDDDDDDDDDDDCCCC ",
+ " CCC DDDDDDDDDDCCCC ",
+ " CCCCCC CCCCC ",
+ " CC ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " C DD CC ",
+ " CCDDDDD C ",
+ " CDDDDDD C ",
+ " C DDDDD CC ",
+ " CCCDD CCC ",
+ " CCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C ",
+ " CCCCC ",
+ " C DDDC ",
+ " CDDDDDC ",
+ " C DDDDDC ",
+ " CDDDDDC ",
+ " CDDDDC ",
+ " CCCC CCD C ",
+ " CCCCC CC ",
+ " CCC CC ",
+ " C DDD C ",
+ " CDDDDD C ",
+ " CDDDDDD C ",
+ " C DDDDDD C ",
+ " C DDDDDDD C ",
+ " CDDDDDDDD C ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDD C ",
+ " C DDDDDDDDD C ",
+ " CDDDDDDDDDDDC ",
+ " CDDDDDDDDDDDCC ",
+ " C DDDDDDDDDDDDCC ",
+ " C DDDDDDDDDDDD CC ",
+ " CDDDDDDDDDDDDDDDCC ",
+ " C DDDDDDDDDDDDDDDCCC ",
+ " C DDDDDDDDDDDDDDDDDCCCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDD CCCC ",
+ " CDDDDDDDDDDDDDDDDDDDDDD CCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDCCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDD CCC ",
+ " CCCCDDDDDDDDD CCC ",
+ " CCCCCCCCCCC ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " C DDDCC ",
+ " CDDDDD C ",
+ " CDDDDDDCC ",
+ " CCDDDDDCC ",
+ " CCCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CCDDDC ",
+ " CCC C DDDDC ",
+ " CCCCC CDDDDDC ",
+ " CCCCCC CDDDDDC ",
+ " C DDDCC CDDDDC ",
+ " CDDDDDC CCCCC ",
+ " CDDDDDDC ",
+ " CDDDDDD C ",
+ " CDDDDDDD C ",
+ " CDDDDDDDDC ",
+ " C DDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDDC ",
+ " CDDDDDDDDDDDC ",
+ " C DDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDD C ",
+ " CDDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDDDDCCC ",
+ " CDDDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDDDDCCCCCCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDD CCCCC ",
+ " CDDDDDDDDDDDDDDDDDDDDDDDDDD CCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDDDDDDDDD CC ",
+ " CCCDDDDDDDDDDDDD CC ",
+ " CCCCCCC CCCCCC ",
+ " C " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CDDDDDC ",
+ " CDDDDD C ",
+ " CDDDDDDC ",
+ " CDDDDCC ",
+ " CCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCCCCC CCCC ",
+ " CCDD C CCDDDC ",
+ " C DDD C C DDDDC ",
+ " CDDDDD C CDDDD C ",
+ " CDDDDDDC CDDDDDC ",
+ " CDDDDDDDC CDDDCB ",
+ " CDDDDDDD C CCCCB ",
+ " CDDDDDDDDC BB ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " C DDDDDDDDDDC ",
+ " CDDDDDDDDDD C ",
+ " CDDDDDDDDDD C ",
+ " C DDDDDDDDDDDC ",
+ " CDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDD C ",
+ " CDDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDDDCCC ",
+ " C DDDDDDDDDDDDDDDCCCCC ",
+ " C DDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDD CC ",
+ " CC DDDDDDDDDDDDDDDDDDD CC ",
+ " CCC DDDDDDDDDDDDDD CC ",
+ " CCCCCDDDDDDDCCCC ",
+ " CCCCCCC " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BBCCCCC ",
+ " BC DDDDC ",
+ " BCDDDDD C ",
+ " C DDDD C ",
+ " CCDD C ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C ",
+ " CCCCC ",
+ " CCCCC ",
+ " CCDDD C ",
+ " C DDDD C ",
+ " CDDDDDDC CCCC ",
+ " CDDDDDD C C DDDC ",
+ " CDDDDDDDC CDDDDDC ",
+ " CDDDDDDDDC CDDDDC ",
+ " CDDDDDDDDC CDDDDCB ",
+ " CDDDDDDDDDC C D CB ",
+ " CDDDDDDDDC CCCBB ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDD C ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " C DDDDDDDDDDCC ",
+ " C DDDDDDDDDD C ",
+ " C DDDDDDDDDD CC ",
+ " C DDDDDDDDDDD C ",
+ " C DDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDCCCCC CCC ",
+ " C DDDDDDDDDDDDDDDD CCCCCCCCCCCC CCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CC DDDDDDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDDCCC ",
+ " CCCCCDDDDDDD CCC ",
+ " CCCCCCCC " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB C ",
+ " BBCCDCCC ",
+ " BC DDDD C ",
+ " CDDDDDDC ",
+ " CDDDD C ",
+ " CCC CC ",
+ " C ",
+ " ",
+ " ",
+ " CC ",
+ " CCCCC ",
+ " CCC CC ",
+ " C DDD C ",
+ " CDDDDDC ",
+ " CDDDDDDC ",
+ " C DDDDDDC ",
+ " C DDDDDDDC CCC ",
+ " C DDDDDDDC C D C ",
+ " CDDDDDDD C CDDDDC ",
+ " CDDDDDDDDC CDDDDC ",
+ " CDDDDDDDDC CDDDDDC ",
+ " CDDDDDDDDDC CDDDCB ",
+ " CDDDDDDDDDC CCCCBB ",
+ " CDDDDDDDDDC B ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " C DDDDDDDD C ",
+ " C DDDDDDDD C ",
+ " CDDDDDDDDDCC ",
+ " CDDDDDDDDDCC ",
+ " CDDDDDDDDDCC ",
+ " C DDDDDDDDCC ",
+ " C DDDDDDDDCCC ",
+ " CCDDDDDDDD CCC ",
+ " CC DDDDDDDDDCCCCC CCCCCCCCCCC ",
+ " CCDDDDDDDDDDD CCCCCCCCCCCCDDDDDDDDDCCC ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCC DDDDDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDCCC ",
+ " CCCCCDDDDDDCCCC ",
+ " CCCCCC " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB CC ",
+ " BBCCDDCC ",
+ " BCDDDD C ",
+ " CDDDDDC ",
+ " CDDDD C ",
+ " CCCCC ",
+ " ",
+ " CCC ",
+ " CCCCC ",
+ " CC DCC ",
+ " C DDD C ",
+ " CDDDDDC ",
+ " C DDDDD C ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC CCCC ",
+ " CDDDDDDDDDC CDDDC ",
+ " C DDDDDDDDC C DDDDC ",
+ " CDDDDDDDDC CDDDDC ",
+ " CDDDDDDDDDC CDDDDC ",
+ " C DDDDDDDDC CDD CB ",
+ " CDDDDDDDDC CCCBBB ",
+ " CDDDDDDDDDC BB ",
+ " CDDDDDDDDC ",
+ " C DDDDDDD C ",
+ " C DDDDDDDC ",
+ " CDDDDDDD C ",
+ " CDDDDDDDCC ",
+ " C DDDDDCC ",
+ " C DDDDDCC ",
+ " CCDDDDCCC ",
+ " CCC DCCCC ",
+ " CCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ",
+ " CCCCCCCCCC CCCC DDDDDDCCC ",
+ " CCCCCCCCCCCCCC CCCCCCCCDDDDDDDDDDDDCC ",
+ " CCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDC ",
+ " CCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDC ",
+ " CCCCDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCC DDDDDDDDDDDDDDDDDCC ",
+ " CCC DDDDDDDDDDDDDCC ",
+ " CCCCCC CCCCCC ",
+ " CC " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB ",
+ " BBB CCC ",
+ " BBBC D C ",
+ " CDDDDDC ",
+ " CDDDDDC ",
+ " C DDDDC ",
+ " CCC CCCCC ",
+ " CCCCC ",
+ " CC D CC ",
+ " C DDD C ",
+ " C DDDDDC ",
+ " CDDDDDD C ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC CCCC ",
+ " C DDDDDDDDC CDDD C ",
+ " CDDDDDDDDC CDDDDC ",
+ " CDDDDDDDDC CDDDDC ",
+ " CDDDDDDD C CDDDC ",
+ " CDDDDDDDDC CCCCC B ",
+ " CDDDDDDDC BBB ",
+ " C DDDDDDCC B ",
+ " C DDDDDCC ",
+ " C DDDDCC ",
+ " CCDDDCCC ",
+ " CCCCCCC ",
+ " CCCCCC ",
+ " CCCCCC ",
+ " CCCC ",
+ " CC CC ",
+ " CCCCCCCC ",
+ " CCCDDDDDDCC ",
+ " CCCCDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDD C ",
+ " CCCCCDDDDDDDDDDDDDDDDCC ",
+ " CCCCCCCCDDDDDDDDDDDDDDDDDDDC ",
+ " CCCCCCCDDDDDDDDDDDDDDDDDDDDC ",
+ " CCCCCDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCCCDDDDDDDDDDDDDDDDDDC ",
+ " CCCCDDDDDDDDDDDDDDDCC ",
+ " CCCC DDDDDDDDDCCC ",
+ " CCCCCCCCCCC ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B ",
+ " BB ",
+ " BBB CC ",
+ " CCDDCC ",
+ " CDDDDC ",
+ " CC CDDDDC ",
+ " CCCC CDDDDC ",
+ " C D CC CCCC ",
+ " C DDDDC ",
+ " CDDDDDC ",
+ " CDDDDDD C ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ "C DDDDDDDC ",
+ "CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC CC ",
+ " CDDDDDDDC CDDCC ",
+ " CDDDDDDDC CDDDDC ",
+ " CDDDDDD C CDDDDC ",
+ " CDDDDDD C CDDDC ",
+ " CDDDDD C C DDC BB ",
+ " CCDDDDCC CCC BB ",
+ " CC DDCC BB ",
+ " CCCCCC ",
+ " CCCCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " CCC CCC ",
+ " CCCDDDDD CC ",
+ " CCDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDDDDC ",
+ " CCCDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDDDC ",
+ " CCCCDDDDDDDDDDDDDDDDDC ",
+ " CCCCDDDDDDDDDDDDDDDDDC ",
+ " CCC DDDDDDDDDDDDDDCC ",
+ " CCC DDDDDDDDDDDCC ",
+ " CCC DDDDCCCC ",
+ " CCCCCC ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " BB ",
+ " BBB ",
+ " BBB C ",
+ " C CCDCC ",
+ " CCCCC CDDDD C ",
+ " CC CC CDDDDDC ",
+ " CCDDDDCC C DDD C ",
+ " CDDDDD C CCCCC ",
+ " C DDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ "CDDDDDDDDC ",
+ "CDDDDDDDDC ",
+ "CDDDDDDDDC ",
+ "CDDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDD C ",
+ " CDDDDDDD C ",
+ " CDDDDDDD C ",
+ " CDDDDDD C ",
+ " CDDDDDD C CCCC ",
+ " CDDDDD C CDDDC ",
+ " C DDDDCC CDDDDC ",
+ " CCDD CC CDDDDC ",
+ " CCCCCC CDDDC ",
+ " CCCC CCCC BB ",
+ " CCC BB ",
+ " BB ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CC CCC ",
+ " CCDDDDDDCC ",
+ " CCDDDDDDDD C ",
+ " CCDDDDDDDDDD C ",
+ " CCDDDDDDDDDDDD C ",
+ " CC DDDDDDDDDDDDDC ",
+ " C DDDDDDDDDDDDDD C ",
+ " CC DDDDDDDDDDDDDD C ",
+ " CCCDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDCC ",
+ " CCCCDDDDDDDDDDDCC ",
+ " CCCC DDDDDD CC ",
+ " CCCCCCCCCC ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B ",
+ " BBBB ",
+ " BBBB ",
+ " CCCC CC ",
+ " CC CCC C CC ",
+ " C DDD C CDDDDC ",
+ " C DDDDDC CDDDDC ",
+ " CDDDDDDC CDDDDC ",
+ " CDDDDDDDC CCCCC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ "CDDDDDDDDC ",
+ "CDDDDDDDDC ",
+ "CDDDDDDDDC ",
+ "CDDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " C DDDDDDC ",
+ " CDDDDDDC ",
+ " C DDDD C ",
+ " C DDDCC CCC ",
+ " CCC CCC C DDC ",
+ " CCCCC CDDDDC ",
+ " CCC CDDDDC ",
+ " CDDDDC ",
+ " CDDC ",
+ " CC BB ",
+ " BBB ",
+ " BBB ",
+ " ",
+ " ",
+ " CCCCCC ",
+ " CC DDDCC ",
+ " CC DDDDDDC ",
+ " C DDDDDDDDC ",
+ " CCDDDDDDDDDDC ",
+ " C DDDDDDDDDD C ",
+ " CCDDDDDDDDDDDDC ",
+ " C DDDDDDDDDDDD C ",
+ " CC DDDDDDDDDDDDDC ",
+ " CCCDDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDDC ",
+ " CCCDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDCC ",
+ " CCCCCCCCCC ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " B ",
+ " BB ",
+ " CCC BBB ",
+ " CCCCC BBB ",
+ " C DDDCC CCCCCC ",
+ " CDDDDD C CCCCC CCCCCC ",
+ " C DDDDDDC CDDD C CCCCCCCC ",
+ " CDDDDDDDC CDDDDDC CCCCCC ",
+ " CDDDDDDDDC C DDD C CCCCC ",
+ " CDDDDDDDDC CCDCC CCCC ",
+ " CDDDDDDDDC C CCCC ",
+ " CDDDDDDDDC CCC ",
+ " CDDDDDDDDC C ",
+ "CDDDDDDDDC ",
+ "C DDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDD C ",
+ " CDDDDD C ",
+ " C DDDDC ",
+ " C DDCC ",
+ " CCCCCC ",
+ " CCCC ",
+ " C CCCC ",
+ " CDDD C ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " C DD C ",
+ " CCCC B ",
+ " BBB ",
+ " BBB ",
+ " BCCC ",
+ " CCCCCC ",
+ " CCDDDD C ",
+ " CDDDDDDDCC ",
+ " CCDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " CDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDD C ",
+ " C DDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDC ",
+ " CCCDDDDDDDDD C ",
+ " CCCDDDDDDD CC ",
+ " CCCC CCCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C BB ",
+ " CCCCCBB ",
+ " C DDCCBB ",
+ " CDDDDDCC ",
+ " CDDDDDD C CAAAFCC ",
+ " C DDDDDD C CCCC CCCC DDDDCCC ",
+ " CDDDDDDD C C DDDC CCCCCC DDDDD CC ",
+ " CDDDDDDDC CDDDDC CCCCCCCCCDDDD C ",
+ " CDDDDDDDDC CDDDDC CCDDD C ",
+ " CDDDDDDDDC CDDCC C DD C ",
+ " CDDDDDDDDC CC C DD C ",
+ " CDDDDDDDDC C DDC ",
+ " CDDDDDDDDC CCDCC ",
+ " CDDDDDDDC CCCC ",
+ " CDDDDDDDC CCC ",
+ " CDDDDDDDC CCC ",
+ " CDDDDDD C CC ",
+ " C DDDDDC CC ",
+ " C DDD C ",
+ " CC D CC ",
+ " CCCCC ",
+ " CCC ",
+ " ",
+ " ",
+ " CCCC ",
+ " C DD C ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " CCCC ",
+ " BBC ",
+ " BCCCCC ",
+ " CC DDCC ",
+ " C DDDDDCC ",
+ " CDDDDDDDCC ",
+ " CCDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " C DDDDDDDDDDC ",
+ " C DDDDDDDDDD C ",
+ " C DDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDC ",
+ " CDDDDDDDDDDD C ",
+ " CCDDDDDDDDDD C ",
+ " CCDDDDDDDDDCC ",
+ " CCDDDDDDDCC ",
+ " CCCC CCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CC CCCB ",
+ " C DDDDCB ",
+ " CDDDDDDCC ",
+ " CDDDDDDD C ",
+ " CDDDDDDDC CCAAAACC ",
+ " CDDDDDDDDC CCCC CCDDDDDDDDCCC ",
+ " CDDDDDDDDC CDDD C C DDDDDDDDDDD C ",
+ " CDDDDDDDDDC CDDDDC CCC CCCEEEECDDDDCC ",
+ " CDDDDDDDDDC CDDDDC CCCCC EEEEE DD C ",
+ " CDDDDDDDDC C DDC CC EE DD C ",
+ " CDDDDDDDDC CCC EE DD C ",
+ " CDDDDDDDDC E DDC ",
+ " CDDDDDDDC EDDDC ",
+ " CDDDDDDDC ECDDC ",
+ " C DDDDD C EDDDC ",
+ " CDDDDDC CDDC ",
+ " C DDD C CDDC ",
+ " CCC CC C DC ",
+ " CCCCC CCC ",
+ " CCC CCC ",
+ " CCC ",
+ " CC ",
+ " ",
+ " ",
+ " CC ",
+ " C C ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " CDDC CCCC ",
+ " CC CC CCC ",
+ " C DDD C ",
+ " CDDDDDDC ",
+ " CCDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDDC ",
+ " C DDDDDDDDDDC ",
+ " CDDDDDDDDDD C ",
+ " CCDDDDDDDDD C ",
+ " CCDDDDDDDDCC ",
+ " CCDDDDDD C ",
+ " CCCC CCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C ",
+ " CCCCCC ",
+ " C DDDCC ",
+ " C DDDDDCC ",
+ " C DDDDDDCC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " C DDDDDDDDC CCAAAAC ",
+ " CDDDDDDDDDC CCC CCCDDDCCCCCC ",
+ " CDDDDDDDDC CDDDCB C DDDDDCCCCCCCC ",
+ " CDDDDDDDDC CDDDDC BBCDDDDCCECC CCCCCCC ",
+ " CDDDDDDDDDC CDDDDC CDDDCEEE CCCC ",
+ " CDDDDDDDDC CDDDC CC CE CCCC ",
+ " CDDDDDDDDC CCC CCCC CCCC ",
+ " C DDDDDDC CC CCCC ",
+ " C DDDDDDC CCCC ",
+ " CDDDDDC CCDC ",
+ " C DDD C ECD C ",
+ " CC CC ECDDC ",
+ " CCCCC EEDDC ",
+ " C EDDC ",
+ " EDDC ",
+ " CDDC ",
+ " C DCB ",
+ " C DCBB ",
+ " CCCC BB ",
+ " CCC BB ",
+ " CC BB ",
+ " CCCC ",
+ " C DDDC ",
+ " CDDDDC CCC ",
+ " CDDDDC CCCCCC ",
+ " C DD C C DDDCC ",
+ " CCCC C DDDDDC ",
+ " C DDDDDDC ",
+ " C DDDDDDDC ",
+ " C DDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " C DDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " C DDDDDDDD C ",
+ " C DDDDDDDCC ",
+ " CCDDDDD C ",
+ " CCCC CCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CC CCCC ",
+ " CCDDDDDCC ",
+ " C DDDDDDCC ",
+ " CDDDDDDD C ",
+ " CDDDDDDDDC ",
+ " C DDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDC CCCCCC ",
+ " CDDDDDDDDDC CCC BB CCCCC ",
+ " CDDDDDDDD C CDD CBBBBBBCCCCCCC ",
+ " CDDDDDDDDC CDDDDCBBBBCCDDDCC ",
+ " CDDDDDDD C CDDDDC C DDDCC ",
+ " CDDDDDDDC CDDDC CDDDEE ",
+ " CDDDDDD C CCCC CDDDEE ",
+ " CDDDDD C CD CE ",
+ " CCDDDDC CCCC ",
+ " CC CCC CCC C ",
+ " CCCCC CC CC ",
+ " C CC ",
+ " CCC ",
+ " CCC ",
+ " ECDC ",
+ " E DCB ",
+ " EDDCB ",
+ " EEDDCBB ",
+ " ECDDCBB ",
+ " C D C BB ",
+ " CDDC BBB ",
+ " CCCC BCC CC ",
+ " CCCC CCDDC CCCCC ",
+ " CCC CDDDDC CC D CC ",
+ " CDDDDC C DDDD C ",
+ " CDDDDC C DDDDDDC ",
+ " CCCC CDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CCDDDDDDDDC ",
+ " CCDDDDDDDC ",
+ " CCCDDDDCC ",
+ " CCCCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CC DD CC ",
+ " C DDDDD C ",
+ " CDDDDDDD C ",
+ " CDDDDDDDD C ",
+ " C DDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDC C ",
+ " CDDDDDDDD C CCDCCB ",
+ " CDDDDDDDDC CDDDDCB CCCC ",
+ " C DDDDDDC CDDDDC CCCC ",
+ " C DDDDD C CDDDDC CDDC ",
+ " CDDDD C C DC CDD C ",
+ " CC CC CC CDDDE ",
+ " CCCC CDDCE ",
+ " C C DDE ",
+ " C DCE ",
+ " CCCC ",
+ " CCC ",
+ " CCC ",
+ " C C ",
+ " CCC ",
+ " CCC ",
+ " CCCC ",
+ " ECD C ",
+ " EDD C C ",
+ " ECDDC CCCC ",
+ " EDDDC CC CC CC ",
+ " C DDC CD C C DDDDC ",
+ " CDDC CDDDDC C DDDDD C ",
+ " CCCC CDDDDC CDDDDDD C ",
+ " CCCC CDDDDC CDDDDDDDDC ",
+ " CCDCC C DDDDDDDDC ",
+ " C CDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " C DDDDDDDD C ",
+ " C DDDDDDDDC ",
+ " C DDDDDDDC ",
+ " C DDDDD C ",
+ " CC DD CC ",
+ " CCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C ",
+ " CCCCCC ",
+ " CCDDDDCCC ",
+ " CDDDDDDDCC ",
+ " CDDDDDDDDCC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDC CCCC ",
+ " CDDDDDD C CDDDDC ",
+ " C DDDD C CDDDDC ",
+ " CC D CC CDDDDC CCC ",
+ " CCCCC CDDCC CCCC ",
+ " CC CCB CCCC ",
+ " BB CDDC ",
+ " BB C DCC ",
+ " B CDDCE ",
+ " BBCDDEE ",
+ " BCDDE ",
+ " CD E ",
+ " CDCE ",
+ " CCC ",
+ " CCC ",
+ " CC C ",
+ " CC CC CCCCC ",
+ " C CCC CCC CC ",
+ " CCCC CDDDDCC ",
+ " EC DC C DDDDDC ",
+ " EEDDDC CCCC C DDDDDDC ",
+ " EEDDDC CDDDC CDDDDDDDC ",
+ " CCDDD C CDDDDC C DDDDDDDC ",
+ " CCDDDCCBBBBCDDDDC CDDDDDDDDC ",
+ " CCCCCCCBBB BC DDC C DDDDDDDDC ",
+ " CCCCC CCC CDDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDD C ",
+ " CDDDDDDDDC ",
+ " C DDDDDDDC ",
+ " CCDDDDDD C ",
+ " CCDDDDDCC ",
+ " CCCC CC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " CCC CCCC ",
+ " C DDDDDCC ",
+ " CCDDDDDDD C ",
+ " C DDDDDDDD C ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDD C ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDD C ",
+ " CDDDDDDD C ",
+ " CDDDDDD C ",
+ " CDDDDD C CCCC ",
+ " CCDDD C C DD C ",
+ " CCCCCC CDDDDC ",
+ " CCC CDDDDC ",
+ " CDDD C ",
+ " CCCC ",
+ " BBB CC ",
+ " BBB CCC ",
+ " BBCCCC ",
+ " BBCD C ",
+ " BCD C ",
+ " CDDC ",
+ " CDDE ",
+ " CDDE C ",
+ " CDDEE CCCCC ",
+ " CDDCE CC CC ",
+ " C DCE C DDD C ",
+ " CDCC CDDDDDC ",
+ " CCCC CDDDDDD C ",
+ " CCCC CC CDDDDDD C ",
+ " CCCC CCCC CCC CDDDDDDDDC ",
+ " CCCC EC CC CDDDC CDDDDDDDDC ",
+ " CCCC EEECDDDC CDDDDC CDDDDDDDDDC ",
+ " CCCCCCC CCECCDDDDCBBBBCDDDDC CDDDDDDDDC ",
+ " CCCCCCCCDDDDD CBBBBBBCDDDC CDDDDDDDDC ",
+ " CCCCCCDDDCCC CCC CDDDDDDDDDC ",
+ " CCCCCC CDDDDDDDD C ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CCDDDDDD C ",
+ " CCDDDDD C ",
+ " CCDDD C ",
+ " CCCCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCC CCCC ",
+ " C DDDDDDCC ",
+ " CCDDDDDDDDCC ",
+ " C DDDDDDDDDCC ",
+ " C DDDDDDDDDDC ",
+ " CDDDDDDDDDD C ",
+ " CDDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDCC ",
+ " CDDDDDDC ",
+ " C DDD C ",
+ " CCC CC CC ",
+ " CCCC CDDC ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " C C ",
+ " CC ",
+ " ",
+ " ",
+ " CC ",
+ " CCC ",
+ " CCC CCC ",
+ " CCC CCCCC ",
+ " CD C CC CCC ",
+ " CDDC C DDD C ",
+ " CDDC CDDDDDC ",
+ " CDDDE C DDDDD C ",
+ " CDDCE CDDDDDDDC ",
+ " CDDDE CDDDDDDDC ",
+ " CDD E CDDDDDDDDC ",
+ " C DD EE CCC CDDDDDDDDC ",
+ " C DD EE CC CDD C CDDDDDDDDC ",
+ " C DD EEEEE CCCCC CDDDDC CDDDDDDDDDC ",
+ " CCDDDDCEEEECCC CCC CDDDDC CDDDDDDDDDC ",
+ " C DDDDDDDDDDD C C DDDC CDDDDDDDDC ",
+ " CCCDDDDDDDDCC CCCC CDDDDDDDDC ",
+ " CCCCCCCC CDDDDDDDC ",
+ " C DDDDDDDC ",
+ " CCDDDDDDC ",
+ " CDDDD C ",
+ " CCC CC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCC CCCC ",
+ " CCDDDDDDDCC ",
+ " CCDDDDDDDDDCC ",
+ " C DDDDDDDDDDCC ",
+ " C DDDDDDDDDDDC ",
+ " CDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDD C ",
+ " C DDDDDDDDDD C ",
+ " CDDDDDDDDDD C ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDCC ",
+ " CCDDDDDDDC ",
+ " CCDDDDD C ",
+ " CCDD CCB ",
+ " CCCCC ",
+ " C ",
+ " CCCC ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " C DD C ",
+ " CCCC ",
+ " ",
+ " ",
+ " CCC ",
+ " CCCCC ",
+ " CC D CC ",
+ " C DDD C ",
+ " CC CDDDDD C ",
+ " CC C DDDDDDC ",
+ " CCC CDDDDDDDC ",
+ " CCC CDDDDDDDC ",
+ " CCCC CDDDDDDDC ",
+ " CCDCC CDDDDDDDDC ",
+ " CDD C CDDDDDDDDC ",
+ " C DD C CC CDDDDDDDDC ",
+ " C DD C CCDDC CDDDDDDDDC ",
+ " C DDDCC CDDDDC CDDDDDDDDC ",
+ " C DDDDCCCCCCCCC CDDDDC BCDDDDDDDC ",
+ " CC DDDDD CCCCCC CDDD C BC DDDDDDDC ",
+ " CCCDDDD CCCC CCCC BC DDDDDD C ",
+ " CCCCCC C DDDDDDC ",
+ " CCDDDDDC ",
+ " CCDD C ",
+ " CCCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCCC CCCC ",
+ " CC DDDDDDDCCC ",
+ " C DDDDDDDDDCCC ",
+ " CDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDD C ",
+ " C DDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDCC ",
+ " CCDDDDDDDC ",
+ " C DDDDCC ",
+ " CCCCCCB ",
+ " CCCBBB ",
+ " ",
+ " ",
+ " CCCC ",
+ " C DD C ",
+ " CDDDDC ",
+ " CDDDDC ",
+ " C DDDC ",
+ " CCCC C ",
+ " CCCC ",
+ " CCCCCC ",
+ " CCDD C ",
+ " CDDDD C ",
+ " C DDDDDC ",
+ " C DDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDD C",
+ " CDDDDDDDDC",
+ " C CDDDDDDDDC ",
+ " CCC CDDDDDDDDC ",
+ " CCCC C CDDDDDDDDC ",
+ " CCCC CCDCC CDDDDDDDDC ",
+ " CCCCC C DDD C CDDDDDDDDC ",
+ " CCCCCC CDDDDDC BBCDDDDDDDC ",
+ " CCCCCCCC C DDDC BBCDDDDDD C ",
+ " CCCCCC CCCCC BC DDDDDC ",
+ " CCDDD C ",
+ " CCCCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " CCCCCCCCCC ",
+ " CCDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDCCC ",
+ " CDDDDDDDDDDDDDCC ",
+ " CDDDDDDDDDDDDDCCC ",
+ " CDDDDDDDDDDDDD CC ",
+ " C DDDDDDDDDDDD C ",
+ " CDDDDDDDDDDDDCC ",
+ " C DDDDDDDDDD C ",
+ " CDDDDDDDDDDCC ",
+ " CDDDDDDDD C ",
+ " CDDDDDD CC ",
+ " CCDDD CC ",
+ " CCCCCC ",
+ " BB ",
+ " BBB ",
+ " B ",
+ " ",
+ " CC ",
+ " CDDC ",
+ " CDDDDC ",
+ " CDDDDC CCC ",
+ " CDDDDC CCCCC ",
+ " CDD C CCC CCC ",
+ " CCC CCDDD C ",
+ " C DDDD C ",
+ " CDDDDDDC ",
+ " CDDDDDD C ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDDC",
+ " CDDDDDDDDC",
+ " CDDDDDDDDC",
+ " CDDDDDDDDC",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CCCCC CDDDDDDDC ",
+ " CDDDDC CDDDDDDC ",
+ " CDDDDC BB CDDDDD C ",
+ " CDDDDC BB C DDD C ",
+ " CC C CCC CC ",
+ " CC CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " CCCCCCCCCC ",
+ " CC DDDDDD CCCC ",
+ " CCDDDDDDDDDDDCCCC ",
+ " CCDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDCCC ",
+ " C DDDDDDDDDDDDDD CC ",
+ " C DDDDDDDDDDDDDD C ",
+ " CDDDDDDDDDDDDD CC ",
+ " C DDDDDDDDDDDDCC ",
+ " C DDDDDDDDDDCC ",
+ " C DDDDDDDDCC ",
+ " CCDDDDDDCC ",
+ " CCC CC ",
+ " CCCCC ",
+ " ",
+ " BB ",
+ " BBB ",
+ " B ",
+ " ",
+ " CCC ",
+ " CCCC CCCC ",
+ " CDDDC CCCCCC ",
+ " CDDDDC CC DDCC ",
+ " CDDDDC CCDDDD C ",
+ " CDDDC C DDDDDC ",
+ " CCCC C DDDDDDC ",
+ " C DDDDDDC ",
+ " C DDDDDDDC ",
+ " C DDDDDDDC ",
+ " C DDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDDC",
+ " CDDDDDDDDC",
+ " CDDDDDDDDC",
+ " CDDDDDDDDC",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDD C ",
+ " CCCCC C DDDDDC ",
+ " C DDD C CCDDDDCC ",
+ " CDDDDDC BB CC CC ",
+ " C DDDDC BB CCCCC ",
+ " CCDCC C ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " CCCCCC ",
+ " CCCCDDDD CCC ",
+ " CCDDDDDDDDDDD CCC ",
+ " CCDDDDDDDDDDDDDD CCC ",
+ " CDDDDDDDDDDDDDDDDDCCCC ",
+ " CDDDDDDDDDDDDDDDDDCCCC ",
+ " CDDDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDCCC ",
+ " CDDDDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDCC ",
+ " CC DDDDDCCC ",
+ " CCC CCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " BBB CCC ",
+ " BB CCCCC ",
+ " CCCCCC ",
+ " CCDD CC ",
+ " CCC CCDDDDCC ",
+ " CDD C C DDDDDC ",
+ " CDDDC C DDDDDDC ",
+ " CDDDDC C DDDDDDC ",
+ " CDDDDC CDDDDDDDC ",
+ " CCDDC CDDDDDDDC ",
+ " CC CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC",
+ " CDDDDDDD C",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " C DDDDDDC ",
+ " CDDDDDC ",
+ " CDDDD C ",
+ " CCCC CC D C ",
+ " CDDDDC CCCC ",
+ " CDDDDC BB CC ",
+ " CDDDDC BB ",
+ " CCDDCC ",
+ " CC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " CCCCCCCCCCC ",
+ " CCCDDDDDDDDD CCCC ",
+ " CCDDDDDDDDDDDDDDDCCCC ",
+ " CDDDDDDDDDDDDDDDDDDCCCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDCCCCC ",
+ " CDDDDDDDDDDDDDDDDDDDDCCCCCCC ",
+ " CDDDDDDDDDDDDDDDDDDDCCCCCCCC ",
+ " CCDDDDDDDDDDDDDDDDCCCCC ",
+ " C DDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDCCCC ",
+ " CCDDDDDDCCC ",
+ " CCCCCCCC ",
+ " CC CC ",
+ " CCCC ",
+ " CCCCCC ",
+ " CCCCCC ",
+ " CCCCCCC ",
+ " BB CCCDDDCC ",
+ " BB CCDDDD C ",
+ " BBB CCDDDDD C ",
+ " B CCDDDDDD C ",
+ " CDDDDDDDC ",
+ " CCCCC CDDDDDDDDC ",
+ " CDDDC C DDDDDDDC ",
+ " CDDDDC CDDDDDDDDC ",
+ " CDDDDC CDDDDDDDDC ",
+ " C DDDC CDDDDDDDD C ",
+ " CCCC CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " C DDDDDDC ",
+ " CDDDDD C ",
+ " C DDD C ",
+ " CC D CC ",
+ " CCCCC ",
+ " CCCCC CCC ",
+ " CDDDD C B ",
+ " CDDDDDCBBBB ",
+ " CDDDDDC BB ",
+ " C D C ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " CC ",
+ " CCCCCC CCCCCC ",
+ " CCDDDDDDDDDDDDD CCC ",
+ " CCDDDDDDDDDDDDDDDDD CCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDCCCC ",
+ " CDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCC ",
+ " CDDDDDDDDDDDDDDDDDD CCCCCCCCCCCCCCC ",
+ " CCDDDDDDDDDDDDCCCCCCCC CCCCCCCCCCCCCC ",
+ " CCCDDDDDD CCCC CCCCCCCCCC ",
+ " CCCCCCCCC CCCCCCCCC ",
+ " CCCCCCCCC ",
+ " CCCCD CCC ",
+ " CCCDDDDCC ",
+ " CCDDDDD C ",
+ " CCDDDDD C ",
+ " CCDDDDDDDC ",
+ " C DDDDDDDC ",
+ " BB CDDDDDDD C ",
+ " BBB C DDDDDDD C ",
+ " BBB CDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CCC CDDDDDDDDC ",
+ " C DDC CDDDDDDDD C ",
+ " CDDDDC CDDDDDDDDDC ",
+ " CDDDDC CDDDDDDDDC ",
+ " CDDDD C CDDDDDDDD C ",
+ " CDDDC CDDDDDDDDDC ",
+ " CCCC CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDDC ",
+ " CDDDDDDDC ",
+ " CDDDDDDDC ",
+ " C DDDDD C ",
+ " CDDDDDC ",
+ " C DDD C ",
+ " CCD CC ",
+ " CCCCC ",
+ " CCC ",
+ " ",
+ " CCCCC ",
+ " C DDDDCBBB ",
+ " CDDDDDCBBBB ",
+ " C DDDDCBBB ",
+ " CCDDCC ",
+ " CC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " CCCCCC ",
+ " CCCCDDDDDDCCCCC ",
+ " CCCDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDDDDD CCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD CC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCC ",
+ " CCCDDDDDDDDDCCCCCCCCCCCC DDDDDDDDDDDCC ",
+ " CCCCCCCCCCC CCCCCDDDDDDDDD CC ",
+ " CCC DDDDDDDDCC ",
+ " CCCDDDDDDDD C ",
+ " CCDDDDDDDD C ",
+ " CCDDDDDDDDDC ",
+ " CCDDDDDDDDDC ",
+ " CCDDDDDDDDDC ",
+ " C DDDDDDDD C ",
+ " C DDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " BB C DDDDDDDDDC ",
+ " BBB CDDDDDDDDDC ",
+ " BBB CDDDDDDDDDC ",
+ " B CDDDDDDDDDC ",
+ " CCCC CDDDDDDDDDC ",
+ " CDDDC CDDDDDDDDDC ",
+ " CDDDDDC CDDDDDDDDC ",
+ " CDDDDC CDDDDDDDDC ",
+ " CDDDDC C DDDDDDDC ",
+ " C D C CDDDDDDD C ",
+ " CCC CDDDDDDD C ",
+ " CDDDDDD C ",
+ " CDDDDDDC ",
+ " CDDDDDC ",
+ " C DDD C ",
+ " CC CCC ",
+ " CCCCC ",
+ " CC ",
+ " ",
+ " ",
+ " C ",
+ " CC CCC ",
+ " C DDDDCBBB ",
+ " CDDDDDDCBB ",
+ " C DDDD CB ",
+ " CCCDCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " CCCC~CCC G ",
+ " CCC DDDDDDDCCCCC ",
+ " CCCDDDDDDDDDDDDDDD CCC ",
+ " C DDDDDDDDDDDDDDDDDDDD CC ",
+ " C DDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCC CCCCCCCCCCCC DDDDDDDDDDDDDDDD C ",
+ " CCC CCCCCDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDD C ",
+ " C DDDDDDDDDDD C ",
+ " CC DDDDDDDDDD C ",
+ " C DDDDDDDDDD C ",
+ " CCDDDDDDDDDD C ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " C DDDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " BBB CDDDDDDDDDC ",
+ " BBB C DDDDDDDDDC ",
+ " BBB CDDDDDDDDDC ",
+ " CCC CDDDDDDDDC ",
+ " C D C CDDDDDDDDDC ",
+ " CDDDDC CDDDDDDDDC ",
+ " CDDDDC CDDDDDDDDC ",
+ " CDDDDDC CDDDDDDDC ",
+ " CDDD C C DDDDDDC ",
+ " CCCC CDDDDDDC ",
+ " C DDDD C ",
+ " C DDDCC ",
+ " CCCCC ",
+ " CCCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " C DDCC ",
+ " C DDDD CB ",
+ " C DDDDDCBB ",
+ " CDDDD CB ",
+ " CCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " CCCCCCC ",
+ " CCCCDDDDDDDCCCCC ",
+ " CC DDDDDDDDDDDDDD CCC ",
+ " CC DDDDDDDDDDDDDDDDDDD CC ",
+ " CC DDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDD C ",
+ " CCCCCDDDDDDDDDDDDDDD C ",
+ " CCCDDDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDDC ",
+ " C DDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDC ",
+ " CDDDDDDDDDDD C ",
+ " C DDDDDDDDDDC ",
+ " C DDDDDDDDDDC ",
+ " CDDDDDDDDDD C ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDD C ",
+ " CDDDDDDDDDC ",
+ " BB C DDDDDDDDC ",
+ " BB CDDDDDDDDDC ",
+ " BB CDDDDDDDDC ",
+ " BCCCC C DDDDDDDC ",
+ " BCDDDC CDDDDDDDC ",
+ " CDDDDDC CDDDDDDC ",
+ " C DDDDC C DDDDDC ",
+ " CDDDD C C DDD C ",
+ " CDDDCC C DDCC ",
+ " CCCC CCCCCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CCDDDDC ",
+ " CDDDDDDC ",
+ " C DDDDDC ",
+ " CDDDDDC ",
+ " CCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " C ",
+ " CCCCCC CCCCCCC ",
+ " CC DDDDDDDDDDDDDCCC ",
+ " CC DDDDDDDDDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDDDDDDDDDDDDCCC ",
+ " CCDDDDDDDDDDDDDDDDDDDDDDDD C ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCC DDDDDDDDDDDDDDDDDDDDDDDDDDC ",
+ " CCCCC DDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCCCCCCDDDDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDDDC ",
+ " CCCDDDDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDDC ",
+ " C DDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDD C ",
+ " CDDDDDDDDDDDC ",
+ " CDDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDDC ",
+ " CDDDDDDDDDC ",
+ " CDDDDDDDD C ",
+ " CDDDDDDDDC ",
+ " C DDDDDDDC ",
+ " B C DDDDDDC ",
+ " BBB CDDDDDDC ",
+ " BCCCCC CDDDDDC ",
+ " CDDDDC CCDDD C ",
+ " CDDDDDC CCCCCC ",
+ " CDDDDDC CCCCC ",
+ " CDDDD C CCC ",
+ " CDDDCC ",
+ " CCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCCC ",
+ " CCDDDDDCC ",
+ " CCDDDDDDC ",
+ " C DDDDDC ",
+ " CCDDD C ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " CCCCCCCCCCC ",
+ " CCC DDDDDDDDDCCCC ",
+ " CCC DDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCCDDDDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCC DDDDDDDDDDDDDDDDDDDDDDC ",
+ " CCCC DDDDDDDDDDDDDDDDDDDDCC ",
+ " CCCCCDDDDDDDDDDDDDDDDD C ",
+ " CCCDDDDDDDDDDDDDDD C ",
+ " CCDDDDDDDDDDDDDDDC ",
+ " CC DDDDDDDDDDDD C ",
+ " CCDDDDDDDDDDDD C ",
+ " CCDDDDDDDDDDDC ",
+ " CDDDDDDDDDDDC ",
+ " C DDDDDDDDD C ",
+ " C DDDDDDDDDC ",
+ " C DDDDDDDDDC ",
+ " C DDDDDDDDC ",
+ " C DDDDDDD C ",
+ " C DDDDDD C ",
+ " C DDDDDDC ",
+ " C DDDDDC ",
+ " C DDD C ",
+ " CC CCC ",
+ " BBCC CCCCC ",
+ " BC DCC CCCC ",
+ " CDDDDC ",
+ " CDDDDDC ",
+ " CDDDDD C ",
+ " CDDDDDC ",
+ " CDDD C ",
+ " CCCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CCC DDCCC ",
+ " CC DDDDD C ",
+ " C DDDDDDC ",
+ " C DDDDDCC ",
+ " CC DD C ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " CC ",
+ " CCCCC CCCCCC ",
+ " CCCCDDDDDDDDDD CCC ",
+ " CCCCDDDDDDDDDDDDDD CC ",
+ " CCCCDDDDDDDDDDDDDDDDDCC ",
+ " CCCDDDDDDDDDDDDDDDDDD C ",
+ " CCCCDDDDDDDDDDDDDDDDDDCC ",
+ " CCCC DDDDDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDDDDC ",
+ " CCCDDDDDDDDDDDDDDCC ",
+ " CCDDDDDDDDDDDDDC ",
+ " CCDDDDDDDDDDDDC ",
+ " C DDDDDDDDDDDC ",
+ " CCDDDDDDDDDD C ",
+ " C DDDDDDDDD C ",
+ " CCDDDDDDDDDC ",
+ " CDDDDDDDDCC ",
+ " C DDDDDD C ",
+ " C DDDDDDC ",
+ " C DDDDDCC ",
+ " CCDDDDCC ",
+ " CCC CCC ",
+ " CCCCCC ",
+ " CCCCC ",
+ " C ",
+ " ",
+ " CCCC ",
+ " CCDD C ",
+ " C DDDDC ",
+ " CDDDDDC ",
+ " CDDDDDDC ",
+ " CDDDDDCC ",
+ " C DDDCC ",
+ " CC CCCC ",
+ " CCCCCC ",
+ " ",
+ " ",
+ " CCCCC ",
+ " CCCC CCCC ",
+ " CCDDDDDDCC ",
+ " C DDDDDD C ",
+ " C DDDDDDC ",
+ " CCDDDDDC ",
+ " CCCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " CCCCC ",
+ " CCCCCCCCCCCC ",
+ " CCCC DDDDDDD CCC ",
+ " CCCCDDDDDDDDDDD CC ",
+ " CCCCDDDDDDDDDDDDD CC ",
+ " CCC DDDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDD C ",
+ " CCC DDDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDDCC ",
+ " CC DDDDDDDDDDCC ",
+ " CCDDDDDDDDDDC ",
+ " C DDDDDDDD C ",
+ " CC DDDDDDDCC ",
+ " C DDDDDDDCC ",
+ " CC DDDDDCC ",
+ " CCDDDDCC ",
+ " CC DDCCC ",
+ " CCCCCCC ",
+ " CCCCCC ",
+ " CCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCDD C ",
+ " C DDDDCC ",
+ " CDDDDD C ",
+ " CDDDDDD C ",
+ " CDDDDDDCC ",
+ " C DDDDDCC ",
+ " CC DDD CC ",
+ " CCCCCCCCC ",
+ " CCCCCCCCCC ",
+ " CCCCCDD CCCC ",
+ " CCCDDDDDD CC ",
+ " CCDDDDDDD C ",
+ " CCDDDDDDD C ",
+ " C DDDDDDC ",
+ " CCCDDD C ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " CCCCCCCCC ",
+ " CCCCCCCCCCCC ",
+ " CCCCCCDDD CCCC ",
+ " CCCCCDDDDDD CCC ",
+ " CCCCDDDDDDDCCC ",
+ " CCCCDDDDDD CC ",
+ " CCC DDDDDDCC ",
+ " CCCDDDDDDCC ",
+ " CCCDDDDCCC ",
+ " CCCCDDDCCC ",
+ " CCCCCCCC ",
+ " CCCCCCCC ",
+ " CCCCCC ",
+ " CCCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCDD CC ",
+ " CCDDDD C ",
+ " CDDDDDDC ",
+ " C DDDDDDCC ",
+ " C DDDDDD C ",
+ " CCDDDDDDDCC ",
+ " C DDDDDD CC ",
+ " CCDDDDDDDDCC ",
+ " CCDDDDDDDDCC ",
+ " C DDDDDDDDCC ",
+ " CC DDDDDDDDC ",
+ " CCDDDDDDD C ",
+ " CCDDDDDCC ",
+ " CCCCCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCCCCCC ",
+ " CCCCCCC ",
+ " CCCCCCC ",
+ " CCCCCCC ",
+ " CCCCCC ",
+ " CCCC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CC CC ",
+ " CDDDD C ",
+ " C DDDDDCC ",
+ " CDDDDDDDCC ",
+ " CDDDDDDD C ",
+ " CDDDDDDDDCC ",
+ " CCDDDDDDDDCC ",
+ " C DDDDDDDDCC ",
+ " CCDDDDDDDD C ",
+ " CCDDDDDDD C ",
+ " CCDDDDD CC ",
+ " CCC CC ",
+ " CCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CC ",
+ " CCCCCC ",
+ " CC DD CC ",
+ " C DDDD C ",
+ " CCDDDDDDCC ",
+ " CCDDDDDDDCC ",
+ " CDDDDDDD C ",
+ " CCDDDDDDDCC ",
+ " C DDDDDDCC ",
+ " CC DDDDCCC ",
+ " CCC CCCC ",
+ " CCCC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCCC ",
+ " CCCCCC ",
+ " CCCCCCC ",
+ " CCDDDCCC ",
+ " CCDDD CC ",
+ " CCCDDCCC ",
+ " CCCCCCC ",
+ " CCCCCC ",
+ " C ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " " },
+ { " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " CCC ",
+ " CCCC ",
+ " CC ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ", } };
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java
new file mode 100644
index 0000000000..3603839564
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_ForgeOfGods.java
@@ -0,0 +1,1178 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.forgeOfGodsRenderBlock;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsBA0;
+import static com.github.technus.tectech.thing.casing.TT_Container_Casings.sBlockCasingsTT;
+import static com.github.technus.tectech.util.GodforgeMath.calculateFuelConsumption;
+import static com.github.technus.tectech.util.GodforgeMath.calculateMaxFuelFactor;
+import static com.github.technus.tectech.util.GodforgeMath.calculateMaxHeatForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calucateMaxParallelForModules;
+import static com.github.technus.tectech.util.GodforgeMath.calucateSpeedBonusForModules;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered;
+import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose;
+import static gregtech.api.enums.GT_HatchElement.InputBus;
+import static gregtech.api.enums.GT_HatchElement.InputHatch;
+import static gregtech.api.enums.GT_HatchElement.OutputBus;
+import static gregtech.api.enums.GT_HatchElement.OutputHatch;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_StructureUtility.buildHatchAdder;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidStack;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.github.technus.tectech.TecTech;
+import com.github.technus.tectech.thing.block.TileForgeOfGods;
+import com.github.technus.tectech.thing.casing.TT_Container_Casings;
+import com.github.technus.tectech.thing.gui.TecTechUITextures;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule;
+import com.github.technus.tectech.util.CommonValues;
+import com.google.common.collect.ImmutableList;
+import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
+import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable;
+import com.gtnewhorizon.structurelib.structure.IItemSource;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+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.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+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.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidNameHolderWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.NumericWidget;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IHatchElement;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input;
+import gregtech.api.util.GT_HatchElementBuilder;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.IGT_HatchAdder;
+
+public class GT_MetaTileEntity_EM_ForgeOfGods extends GT_MetaTileEntity_MultiblockBase_EM
+ implements IConstructable, ISurvivalConstructable {
+
+ private static Textures.BlockIcons.CustomIcon ScreenOFF;
+ private static Textures.BlockIcons.CustomIcon ScreenON;
+
+ private int fuelConsumptionFactor = 1;
+ private int selectedFuelType = 0;
+ private long fuelConsumption = 0;
+ private int internalBattery = 0;
+ public ArrayList<GT_MetaTileEntity_EM_BaseModule> moduleHatches = new ArrayList<>();
+
+ private static int spacetimeCompressionFieldMetadata = -1;
+ private int solenoidCoilMetadata = -1;
+ private static final int FUEL_CONFIG_WINDOW_ID = 9;
+ private static final int UPGRADE_TREE_WINDOW_ID = 10;
+ private static final int INDIVIDUAL_UPGRADE_WINDOW_ID = 11;
+ private static final int[] FIRST_SPLIT_UPGRADES = new int[] { 12, 13, 14 };
+ private static final int[] RING_UPGRADES = new int[] { 26, 29 };
+ protected static final String STRUCTURE_PIECE_MAIN = "main";
+
+ private Boolean debugMode = true;
+
+ public int survivalConstruct(ItemStack stackSize, int elementBudget, IItemSource source, EntityPlayerMP actor) {
+ if (mMachine) return -1;
+ int realBudget = elementBudget >= 200 ? elementBudget : Math.min(200, elementBudget * 5); // 200 blocks max per
+ // placement.
+ return survivialBuildPiece(STRUCTURE_PIECE_MAIN, stackSize, 31, 34, 0, realBudget, source, actor, false, true);
+ }
+
+ @Override
+ public IStructureDefinition<GT_MetaTileEntity_EM_ForgeOfGods> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ public static final IStructureDefinition<GT_MetaTileEntity_EM_ForgeOfGods> STRUCTURE_DEFINITION = IStructureDefinition
+ .<GT_MetaTileEntity_EM_ForgeOfGods>builder()
+ .addShape("main", transpose(ForgeofGodsStructureString.godForge))
+
+ .addElement(
+ 'A',
+ buildHatchAdder(GT_MetaTileEntity_EM_ForgeOfGods.class)
+ .atLeast(InputHatch, OutputHatch, InputBus, OutputBus).casingIndex(texturePage << 7).dot(1)
+ .buildAndChain(sBlockCasingsBA0, 12))
+ .addElement('B', ofBlock(sBlockCasingsTT, 11)).addElement('C', ofBlock(sBlockCasingsTT, 12))
+ .addElement(
+ 'D',
+ ofBlocksTiered(
+ (block, meta) -> block == GregTech_API.sSolenoidCoilCasings ? meta : -1,
+ ImmutableList.of(
+ Pair.of(GregTech_API.sSolenoidCoilCasings, 7),
+ Pair.of(GregTech_API.sSolenoidCoilCasings, 8),
+ Pair.of(GregTech_API.sSolenoidCoilCasings, 9),
+ Pair.of(GregTech_API.sSolenoidCoilCasings, 10)),
+ -1,
+ (t, meta) -> t.solenoidCoilMetadata = meta,
+ t -> t.solenoidCoilMetadata))
+ .addElement(
+ 'E',
+ ofBlocksTiered(
+ (block, meta) -> block == TT_Container_Casings.SpacetimeCompressionFieldGenerators ? meta
+ : -1,
+ ImmutableList.of(
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 0),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 1),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 2),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 3),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 4),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 5),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 6),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 7),
+ Pair.of(TT_Container_Casings.SpacetimeCompressionFieldGenerators, 8)),
+ -1,
+ (t, meta) -> spacetimeCompressionFieldMetadata = meta,
+ t -> spacetimeCompressionFieldMetadata))
+ .addElement(
+ 'F',
+ buildHatchAdder(GT_MetaTileEntity_EM_ForgeOfGods.class).atLeast(InputHatch)
+ .casingIndex(texturePage << 7).dot(2).buildAndChain(sBlockCasingsBA0, 12))
+ .addElement(
+ 'G',
+ GT_HatchElementBuilder.<GT_MetaTileEntity_EM_ForgeOfGods>builder().atLeast(moduleElement.Module)
+ .casingIndex(texturePage << 7).dot(3).buildAndChain(sBlockCasingsBA0, 12))
+ .build();
+
+ public GT_MetaTileEntity_EM_ForgeOfGods(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_ForgeOfGods(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_ForgeOfGods(mName);
+ }
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void registerIcons(IIconRegister aBlockIconRegister) {
+ ScreenOFF = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG");
+ ScreenON = new Textures.BlockIcons.CustomIcon("iconsets/EM_BHG_ACTIVE");
+ super.registerIcons(aBlockIconRegister);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12],
+ new TT_RenderedExtendedFacingTexture(aActive ? ScreenON : ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.casingTexturePages[texturePage][12] };
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM(STRUCTURE_PIECE_MAIN, 31, 34, 0, stackSize, hintsOnly);
+ }
+
+ private final ArrayList<FluidStack> validFuelList = new ArrayList<>() {
+
+ {
+ add(MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1));
+ add(MaterialsUEVplus.RawStarMatter.getFluid(1));
+ add(MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1));
+ }
+ };
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) {
+
+ spacetimeCompressionFieldMetadata = -1;
+ moduleHatches.clear();
+
+ // Check structure of multi.
+ if (!structureCheck_EM(STRUCTURE_PIECE_MAIN, 31, 34, 0)) {
+ return false;
+ }
+
+ // Check there is 1 input bus.
+ if (mInputBusses.size() != 1) {
+ return false;
+ }
+
+ // Make sure there are no energy hatches.
+
+ if (mEnergyHatches.size() > 0) {
+ return false;
+ }
+
+ if (mExoticEnergyHatches.size() > 0) {
+ return false;
+ }
+
+ // Make sure there is 1 input hatch.
+ if (mInputHatches.size() != 1) {
+ return false;
+ }
+
+ mHardHammer = true;
+ mSoftHammer = true;
+ mScrewdriver = true;
+ mCrowbar = true;
+ mSolderingTool = true;
+ mWrench = true;
+ return true;
+ }
+
+ int ticker = 0;
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aBaseMetaTileEntity.isServerSide()) {
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ ticker++;
+ // Check and drain fuel
+ if (ticker % SECONDS == 0) {
+ ticker = 0;
+ FluidStack fluidInHatch = mInputHatches.get(0).getFluid();
+
+ fuelConsumption = (long) calculateFuelConsumption(this);
+ if (fluidInHatch != null && fluidInHatch.isFluidEqual(validFuelList.get(selectedFuelType))) {
+ FluidStack fluidNeeded = new FluidStack(
+ validFuelList.get(selectedFuelType),
+ (int) fuelConsumption);
+ FluidStack fluidReal = mInputHatches.get(0).drain(fluidNeeded.amount, true);
+ if (fluidReal == null || fluidReal.amount < fluidNeeded.amount) {
+ reduceBattery(1);
+ } else {
+ increaseBattery(1);
+ }
+ } else {
+ reduceBattery(1);
+ }
+ // Do module calculations and checks
+ if (moduleHatches.size() > 0 && internalBattery > 0) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.connect();
+ module.setHeat(calculateMaxHeatForModules(module, this));
+ module.setSpeedBonus(calucateSpeedBonusForModules(module, this));
+ module.setMaxParallel(calucateMaxParallelForModules(module, this));
+ }
+ }
+ }
+ } else {
+ if (moduleHatches.size() > 0) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.disconnect();
+ }
+ }
+ }
+ if (mEfficiency < 0) mEfficiency = 0;
+ fixAllMaintenance();
+ }
+ }
+
+ public boolean addModuleToMachineList(IGregTechTileEntity tileEntity, int baseCasingIndex) {
+ if (tileEntity == null) {
+ return false;
+ }
+ IMetaTileEntity metaTileEntity = tileEntity.getMetaTileEntity();
+ if (metaTileEntity == null) {
+ return false;
+ }
+ if (metaTileEntity instanceof GT_MetaTileEntity_EM_BaseModule) {
+ return moduleHatches.add((GT_MetaTileEntity_EM_BaseModule) metaTileEntity);
+ }
+ return false;
+ }
+
+ public enum moduleElement implements IHatchElement<GT_MetaTileEntity_EM_ForgeOfGods> {
+
+ Module(GT_MetaTileEntity_EM_ForgeOfGods::addModuleToMachineList, GT_MetaTileEntity_EM_BaseModule.class) {
+
+ @Override
+ public long count(GT_MetaTileEntity_EM_ForgeOfGods tileEntity) {
+ return tileEntity.moduleHatches.size();
+ }
+ };
+
+ private final List<Class<? extends IMetaTileEntity>> mteClasses;
+ private final IGT_HatchAdder<GT_MetaTileEntity_EM_ForgeOfGods> adder;
+
+ @SafeVarargs
+ moduleElement(IGT_HatchAdder<GT_MetaTileEntity_EM_ForgeOfGods> adder,
+ Class<? extends IMetaTileEntity>... mteClasses) {
+ this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses));
+ this.adder = adder;
+ }
+
+ @Override
+ public List<? extends Class<? extends IMetaTileEntity>> mteClasses() {
+ return mteClasses;
+ }
+
+ public IGT_HatchAdder<? super GT_MetaTileEntity_EM_ForgeOfGods> adder() {
+ return adder;
+ }
+ }
+
+ private void createRenderBlock() {
+
+ IGregTechTileEntity gregTechTileEntity = this.getBaseMetaTileEntity();
+
+ int x = gregTechTileEntity.getXCoord();
+ int y = gregTechTileEntity.getYCoord();
+ int z = gregTechTileEntity.getZCoord();
+
+ double xOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetX;
+ double zOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetZ;
+ double yOffset = 16 * getExtendedFacing().getRelativeBackInWorld().offsetY;
+
+ this.getBaseMetaTileEntity().getWorld()
+ .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), Blocks.air);
+ this.getBaseMetaTileEntity().getWorld()
+ .setBlock((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset), forgeOfGodsRenderBlock);
+ TileForgeOfGods rendererTileEntity = (TileForgeOfGods) this.getBaseMetaTileEntity().getWorld()
+ .getTileEntity((int) (x + xOffset), (int) (y + yOffset), (int) (z + zOffset));
+
+ rendererTileEntity.setRenderSize(20);
+ rendererTileEntity.setRenderRotationSpeed(5);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>(Arrays.asList(super.getInfoData()));
+ str.add("Output Buses:" + formatNumbers(mOutputBusses.size()));
+ str.add("Output Hatches:" + formatNumbers(mOutputHatches.size()));
+ str.add("Input Buses:" + formatNumbers(mInputBusses.size()));
+ str.add("Input Hatches:" + formatNumbers(mInputHatches.size()));
+ str.add("Max Parallel:" + formatNumbers(Math.pow(4, spacetimeCompressionFieldMetadata + 1)));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public final void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ createRenderBlock();
+ }
+
+ @Override
+ public void onRemoval() {
+ if (moduleHatches != null && moduleHatches.size() > 0) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.disconnect();
+ }
+ }
+ super.onRemoval();
+ }
+
+ protected void fixAllMaintenance() {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (doesBindPlayerInventory()) {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE).setPos(4, 4)
+ .setSize(190, 91));
+ } else {
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_SCREEN_BLUE_NO_INVENTORY).setPos(4, 4)
+ .setSize(190, 171));
+ }
+ buildContext.addSyncedWindow(UPGRADE_TREE_WINDOW_ID, this::createUpgradeTreeWindow);
+ buildContext.addSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID, this::createIndividualUpgradeWindow);
+ buildContext.addSyncedWindow(FUEL_CONFIG_WINDOW_ID, this::createFuelConfigWindow);
+ builder.widget(
+ new ButtonWidget().setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext().openSyncedWindow(UPGRADE_TREE_WINDOW_ID);
+ }).setSize(16, 16).setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_BUTTON_ARROW_BLUE_UP);
+ return button.toArray(new IDrawable[0]);
+ }).addTooltip("Path of Celestial Transcendence").setPos(174, 167))
+ .widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.PICTURE_HEAT_SINK_SMALL).setPos(174, 183)
+ .setSize(16, 6))
+ .widget(
+ new ButtonWidget().setOnClick(
+ (clickData, widget) -> {
+ if (!widget.isClient()) widget.getContext().openSyncedWindow(FUEL_CONFIG_WINDOW_ID);
+ }).setSize(16, 16).setBackground(() -> {
+ List<UITexture> button = new ArrayList<>();
+ button.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ button.add(TecTechUITextures.OVERLAY_BUTTON_HEAT_ON);
+ return button.toArray(new IDrawable[0]);
+ }).addTooltip(translateToLocal("fog.button.fuelconfig.tooltip")).setPos(174, 129))
+ .widget(
+ TextWidget.dynamicText(this::storedFuel).setDefaultColor(EnumChatFormatting.WHITE).setPos(3, 5)
+ .setSize(74, 34));
+
+ Widget powerSwitchButton = createPowerSwitchButton();
+ builder.widget(powerSwitchButton)
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> getBaseMetaTileEntity().isAllowedToWork(), val -> {
+ if (val) {
+ getBaseMetaTileEntity().enableWorking();
+ } else {
+ getBaseMetaTileEntity().disableWorking();
+ }
+ }));
+ }
+
+ @Override
+ protected ButtonWidget createPowerSwitchButton() {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ getBaseMetaTileEntity().disableWorking();
+ } else {
+ getBaseMetaTileEntity().enableWorking();
+ }
+ }).setPlayClickSound(false).setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ ret.add(TecTechUITextures.BUTTON_CELESTIAL_32x32);
+ if (getBaseMetaTileEntity().isAllowedToWork()) {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_ON);
+ } else {
+ ret.add(TecTechUITextures.OVERLAY_BUTTON_POWER_SWITCH_DISABLED);
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).setPos(174, doesBindPlayerInventory() ? 148 : 172).setSize(16, 16);
+ button.addTooltip("Power Switch").setTooltipShowUpDelay(TOOLTIP_DELAY);
+ return (ButtonWidget) button;
+ }
+
+ 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);
+ builder.setBackground(GT_UITextures.BACKGROUND_SINGLEBLOCK_DEFAULT);
+ builder.setGuiTint(getGUIColorization());
+ builder.setDraggable(true);
+ builder.setPos(
+ (size, window) -> Alignment.Center.getAlignedPos(size, new Size(PARENT_WIDTH, PARENT_HEIGHT)).add(
+ Alignment.TopRight.getAlignedPos(new Size(PARENT_WIDTH, PARENT_HEIGHT), new Size(WIDTH, HEIGHT))
+ .add(WIDTH - 3, 0)));
+ 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(3, 35)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD))
+ .widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_INFORMATION).setPos(65, 25)
+ .setSize(4, 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")))
+ .widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.fueltype").setPos(3, 57)
+ .setSize(74, 24))
+ .widget(
+ TextWidget.localised("gt.blockmachines.multimachine.FOG.fuelusage").setPos(3, 100)
+ .setSize(74, 20))
+ .widget(TextWidget.dynamicText(this::fuelUsage).setPos(3, 115).setSize(74, 15))
+ .widget(
+ new MultiChildWidget().addChild(
+ new FluidNameHolderWidget(
+ () -> MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1)
+ .getUnlocalizedName().substring(6),
+ (String) -> MaterialsUEVplus.DimensionallyTranscendentResidue.getFluid(1)
+ .getUnlocalizedName()) {
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = createFluidStack();
+ addFluidNameInfo(tooltip, fluid);
+ addAdditionalFluidInfo(tooltip, fluid);
+ }
+ }.setPos(1, 1).setSize(16, 16))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ selectedFuelType = 0;
+ }).setBackground(() -> {
+ if (selectedFuelType == 0) {
+ return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN };
+ } else {
+ return new IDrawable[] {};
+ }
+ }).setSize(18, 18).attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType),
+ builder))
+
+ .setPos(6, 82).setSize(18, 18))
+ .widget(
+ new MultiChildWidget().addChild(
+ new FluidNameHolderWidget(
+ () -> MaterialsUEVplus.RawStarMatter.getFluid(1).getUnlocalizedName()
+ .substring(6),
+ (String) -> MaterialsUEVplus.RawStarMatter.getFluid(1).getUnlocalizedName()) {
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = createFluidStack();
+ addFluidNameInfo(tooltip, fluid);
+ addAdditionalFluidInfo(tooltip, fluid);
+ }
+ }.setPos(1, 1).setSize(16, 16))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ selectedFuelType = 1;
+ }).setBackground(() -> {
+ if (selectedFuelType == 1) {
+ return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN };
+ } else {
+ return new IDrawable[] {};
+ }
+ }).setSize(18, 18)).setPos(29, 82).setSize(18, 18).attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType),
+ builder))
+ .widget(
+ new MultiChildWidget().addChild(
+ new FluidNameHolderWidget(
+ () -> MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter.getMolten(1)
+ .getUnlocalizedName().substring(6),
+ (String) -> MaterialsUEVplus.MagnetohydrodynamicallyConstrainedStarMatter
+ .getMolten(1).getUnlocalizedName()) {
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ FluidStack fluid = createFluidStack();
+ addFluidNameInfo(tooltip, fluid);
+ addAdditionalFluidInfo(tooltip, fluid);
+ }
+ }.setPos(1, 1).setSize(16, 16))
+ .addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ TecTech.proxy.playSound(getBaseMetaTileEntity(), "fx_click");
+ selectedFuelType = 2;
+ }).setBackground(() -> {
+ if (selectedFuelType == 2) {
+ return new IDrawable[] { TecTechUITextures.SLOT_OUTLINE_GREEN };
+ } else {
+ return new IDrawable[] {};
+ }
+ }).setSize(18, 18)).setPos(52, 82).setSize(18, 18).attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(this::getFuelType, this::setFuelType),
+ builder));
+
+ return builder.build();
+ }
+
+ private int currentUpgradeID = 0;
+ private int currentColorCode = 0;
+ private int[] prereqUpgrades = new int[] {};
+ private int[] followupUpgrades = new int[] {};
+ private boolean allPrereqRequired = false;
+ private boolean isUpradeSplitStart = false;
+ private boolean[] upgrades = new boolean[31];
+
+ protected ModularWindow createUpgradeTreeWindow(final EntityPlayer player) {
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ final int PARENT_WIDTH = 300;
+ final int PARENT_HEIGHT = 1000;
+ ModularWindow.Builder builder = ModularWindow.builder(PARENT_WIDTH, PARENT_HEIGHT);
+ scrollable.widget(
+ createUpgradeBox(0, 0, new int[] {}, false, new int[] { 1 }, false, new Pos2d(126, 56), scrollable))
+ .widget(
+ createUpgradeBox(
+ 1,
+ 0,
+ new int[] { 0 },
+ false,
+ new int[] { 2, 3 },
+ false,
+ new Pos2d(126, 116),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 2,
+ 0,
+ new int[] { 1 },
+ false,
+ new int[] { 4, 5 },
+ false,
+ new Pos2d(96, 176),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 3,
+ 0,
+ new int[] { 1 },
+ false,
+ new int[] { 5, 6 },
+ false,
+ new Pos2d(156, 176),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 4,
+ 0,
+ new int[] { 2 },
+ false,
+ new int[] { 8 },
+ false,
+ new Pos2d(66, 236),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 5,
+ 0,
+ new int[] { 2, 3 },
+ false,
+ new int[] { 7 },
+ false,
+ new Pos2d(126, 236),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 6,
+ 0,
+ new int[] { 3 },
+ false,
+ new int[] { 10 },
+ false,
+ new Pos2d(186, 236),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 7,
+ 0,
+ new int[] { 5 },
+ false,
+ new int[] { 8, 9, 10 },
+ false,
+ new Pos2d(126, 296),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 8,
+ 0,
+ new int[] { 4, 7 },
+ true,
+ new int[] { 11 },
+ false,
+ new Pos2d(56, 356),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 9,
+ 0,
+ new int[] { 7 },
+ false,
+ new int[] {},
+ false,
+ new Pos2d(126, 356),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 10,
+ 0,
+ new int[] { 6, 7 },
+ true,
+ new int[] { 11 },
+ false,
+ new Pos2d(196, 356),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 11,
+ 0,
+ new int[] { 8, 10 },
+ false,
+ new int[] { 12, 13, 14 },
+ false,
+ new Pos2d(126, 416),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 12,
+ 1,
+ new int[] { 11 },
+ false,
+ new int[] { 17 },
+ true,
+ new Pos2d(66, 476),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 13,
+ 2,
+ new int[] { 11 },
+ false,
+ new int[] { 18 },
+ true,
+ new Pos2d(126, 476),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 14,
+ 3,
+ new int[] { 11 },
+ false,
+ new int[] { 15, 19 },
+ true,
+ new Pos2d(186, 476),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 15,
+ 3,
+ new int[] { 14 },
+ false,
+ new int[] {},
+ false,
+ new Pos2d(246, 496),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 16,
+ 1,
+ new int[] { 17 },
+ false,
+ new int[] {},
+ false,
+ new Pos2d(6, 556),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 17,
+ 1,
+ new int[] { 12 },
+ false,
+ new int[] { 16, 20 },
+ false,
+ new Pos2d(66, 536),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 18,
+ 2,
+ new int[] { 13 },
+ false,
+ new int[] { 21 },
+ false,
+ new Pos2d(126, 536),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 19,
+ 3,
+ new int[] { 14 },
+ false,
+ new int[] { 22 },
+ false,
+ new Pos2d(186, 536),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 20,
+ 1,
+ new int[] { 17 },
+ false,
+ new int[] { 23 },
+ false,
+ new Pos2d(66, 596),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 21,
+ 2,
+ new int[] { 18 },
+ false,
+ new int[] { 23 },
+ false,
+ new Pos2d(126, 596),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 22,
+ 3,
+ new int[] { 19 },
+ false,
+ new int[] { 23 },
+ false,
+ new Pos2d(186, 596),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 23,
+ 0,
+ new int[] { 20, 21, 22 },
+ false,
+ new int[] { 24 },
+ false,
+ new Pos2d(126, 656),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 24,
+ 0,
+ new int[] { 23 },
+ false,
+ new int[] { 25 },
+ false,
+ new Pos2d(126, 718),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 25,
+ 0,
+ new int[] { 24 },
+ false,
+ new int[] { 26 },
+ false,
+ new Pos2d(36, 758),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 26,
+ 0,
+ new int[] { 25 },
+ false,
+ new int[] { 27 },
+ false,
+ new Pos2d(36, 848),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 27,
+ 0,
+ new int[] { 26 },
+ false,
+ new int[] { 28 },
+ false,
+ new Pos2d(126, 888),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 28,
+ 0,
+ new int[] { 27 },
+ false,
+ new int[] { 29 },
+ false,
+ new Pos2d(216, 848),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 29,
+ 0,
+ new int[] { 28 },
+ false,
+ new int[] { 30 },
+ false,
+ new Pos2d(216, 758),
+ scrollable))
+ .widget(
+ createUpgradeBox(
+ 30,
+ 0,
+ new int[] { 29 },
+ false,
+ new int[] {},
+ false,
+ new Pos2d(126, 798),
+ scrollable))
+ .widget(new TextWidget("").setPos(0, 1000));
+
+ builder.widget(
+ new DrawableWidget().setDrawable(TecTechUITextures.BACKGROUND_STAR).setPos(0, 350).setSize(300, 300))
+ .widget(scrollable.setSize(292, 292).setPos(4, 354))
+ .widget(ButtonWidget.closeWindowButton(true).setPos(282, 354));
+ if (debugMode) {
+ builder.widget(
+ new MultiChildWidget()
+ .addChild(
+ new ButtonWidget().setOnClick((clickData, widget) -> upgrades = new boolean[31])
+ .setSize(40, 15).setBackground(GT_UITextures.BUTTON_STANDARD)
+ .addTooltip(translateToLocal("fog.debug.resetbutton.tooltip")))
+ .addChild(
+ new TextWidget(translateToLocal("fog.debug.resetbutton.text"))
+ .setTextAlignment(Alignment.Center).setScale(0.57f).setMaxWidth(36)
+ .setPos(3, 3))
+ .setPos(4, 354));
+ }
+ return builder.build();
+ }
+
+ protected ModularWindow createIndividualUpgradeWindow(final EntityPlayer player) {
+ UITexture background = switch (currentColorCode) {
+ case 1 -> TecTechUITextures.BACKGROUND_GLOW_PURPLE;
+ case 2 -> TecTechUITextures.BACKGROUND_GLOW_ORANGE;
+ case 3 -> TecTechUITextures.BACKGROUND_GLOW_GREEN;
+ default -> TecTechUITextures.BACKGROUND_GLOW_BLUE;
+ };
+ ModularWindow.Builder builder = ModularWindow.builder(200, 200).setBackground(background)
+ .widget(ButtonWidget.closeWindowButton(true).setPos(185, 3))
+ .widget(
+ new MultiChildWidget()
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.text." + (currentUpgradeID)))
+ .setTextAlignment(Alignment.Center).setMaxWidth(185)
+ .setDefaultColor(0x9c9c9c).setPos(9, 35))
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.lore." + (currentUpgradeID)))
+ .setTextAlignment(Alignment.Center).setMaxWidth(185)
+ .setDefaultColor(0x9c9c9c).setPos(9, 110))
+ .setSize(200, 200))
+ .widget(new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ int unlockedPrereqUpgrades = 0;
+ int unlockedFollowupUpgrades = 0;
+ int unlockedSplitUpgrades = 0;
+ if (!upgrades[currentUpgradeID]) {
+ for (int prereqUpgrade : prereqUpgrades) {
+ if (upgrades[prereqUpgrade]) {
+ unlockedPrereqUpgrades++;
+ }
+ }
+ if (allPrereqRequired) {
+ if (unlockedPrereqUpgrades == prereqUpgrades.length) {
+ upgrades[currentUpgradeID] = true;
+ }
+ } else if (unlockedPrereqUpgrades > 0 || prereqUpgrades.length == 0) {
+ if (isUpradeSplitStart) {
+ for (int splitUpgrade : FIRST_SPLIT_UPGRADES) {
+ if (upgrades[splitUpgrade]) {
+ unlockedSplitUpgrades++;
+ }
+ }
+ for (int maxSplitUpgrades : RING_UPGRADES) {
+ if (upgrades[maxSplitUpgrades]) {
+ unlockedSplitUpgrades--;
+ }
+ }
+ }
+ if (unlockedSplitUpgrades <= 0) {
+ upgrades[currentUpgradeID] = true;
+ }
+ }
+ } else {
+ for (int followupUpgrade : followupUpgrades) {
+ if (upgrades[followupUpgrade]) {
+ unlockedFollowupUpgrades++;
+ }
+ }
+ if (unlockedFollowupUpgrades == 0) {
+ upgrades[currentUpgradeID] = false;
+ }
+ }
+ }).setSize(40, 15).setBackground(() -> {
+ if (upgrades[currentUpgradeID]) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD };
+ }
+ }).addTooltip(translateToLocal("fog.upgrade.confirm")))
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.confirm"))
+ .setTextAlignment(Alignment.Center).setScale(0.7f).setMaxWidth(36).setPos(3, 5))
+ .setPos(79, 177));
+ return builder.build();
+ }
+
+ /**
+ * @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 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 pos Position of the upgrade inside the scrollableWidget
+ */
+ private Widget createUpgradeBox(int upgradeID, int colorCode, int[] prerequisiteUpgradeIDs,
+ boolean requireAllPrerequisites, int[] followingUpgradeIDs, boolean isStartOfSplit, Pos2d pos,
+ IWidgetBuilder<?> builder) {
+ return new MultiChildWidget().addChild(new ButtonWidget().setOnClick((clickData, widget) -> {
+ currentUpgradeID = upgradeID;
+ currentColorCode = colorCode;
+ prereqUpgrades = prerequisiteUpgradeIDs;
+ allPrereqRequired = requireAllPrerequisites;
+ followupUpgrades = followingUpgradeIDs;
+ isUpradeSplitStart = isStartOfSplit;
+ if (!widget.isClient()) widget.getContext().openSyncedWindow(INDIVIDUAL_UPGRADE_WINDOW_ID);
+ }).setSize(40, 15).setBackground(() -> {
+ if (upgrades[upgradeID]) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD };
+ }
+ }).addTooltip(translateToLocal("fog.upgrade.tt." + upgradeID)))
+ .addChild(
+ new TextWidget(translateToLocal("fog.upgrade.tt." + upgradeID))
+ .setTextAlignment(Alignment.Center).setScale(0.57f).setMaxWidth(36).setPos(3, 3))
+ .setPos(pos).attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> upgrades[upgradeID], val -> upgrades[upgradeID] = val),
+ builder);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Material Manipulator") // Machine Type:
+ .addInfo("Controller block for the Forge of Gods") // Controller
+ .addInfo("Uses a Star to to manipulate metals").addSeparator().beginStructureBlock(1, 4, 2, false)
+ .addStructureInfo("Output bus/hatch has to be the ME variant")
+ .addStructureInfo("Dot 2 of Input Hatch is the Fuel Input Hatch")
+ .addInputHatch("Any Infinite Spacetime Casing", 1).addInputHatch("Any Infinite Spacetime Casing", 2) // Fuel
+ // Input
+ // Hatch
+ .addInputBus("Any Infinite Spacetime Casing", 1).addOutputBus("Any Infinite Spacetime Casing", 1)
+ .addOutputHatch("Any Infinite Spacetime Casing", 1).toolTipFinisher(CommonValues.GODFORGE_MARK);
+ return tt;
+ }
+
+ @Override
+ public boolean energyFlowOnRunningTick(ItemStack aStack, boolean allowProduction) {
+ return true;
+ }
+
+ @Override
+ public String[] getStructureDescription(ItemStack stackSize) {
+ return new String[] { "Forge of Gods multiblock" };
+ }
+
+ public Integer getFuelType() {
+ return selectedFuelType;
+ }
+
+ private void setFuelType(Integer fuelType) {
+ selectedFuelType = fuelType;
+ }
+
+ public Integer getFuelFactor() {
+ return fuelConsumptionFactor;
+ }
+
+ public Boolean isUpgradeActive(Integer upgradeID) {
+ return upgrades[upgradeID];
+ }
+
+ public Integer getTotalActiveUpgrades() {
+ int totalUpgrades = 0;
+ for (boolean upgrade : upgrades) {
+ if (upgrade) {
+ totalUpgrades++;
+ }
+ }
+ return totalUpgrades;
+ }
+
+ private Text fuelUsage() {
+ return new Text(fuelConsumption + " L/s");
+ }
+
+ private Text storedFuel() {
+ return new Text(
+ translateToLocal("gt.blockmachines.multimachine.FOG.storedfuel") + " " + internalBattery + "/100");
+ }
+
+ private void increaseBattery(Integer amount) {
+ if ((internalBattery + amount) <= 100) {
+ internalBattery += amount;
+ }
+ }
+
+ private void reduceBattery(Integer amount) {
+ internalBattery -= amount;
+ if (internalBattery <= 0) {
+ internalBattery = 0;
+ if (moduleHatches.size() > 0) {
+ for (GT_MetaTileEntity_EM_BaseModule module : moduleHatches) {
+ module.disconnect();
+ }
+ }
+
+ }
+ }
+
+ @Override
+ protected void setHatchRecipeMap(GT_MetaTileEntity_Hatch_Input hatch) {}
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+ NBT.setInteger("spacetimeCompressionTier", spacetimeCompressionFieldMetadata + 1);
+ NBT.setInteger("solenoidCoilTier", solenoidCoilMetadata - 7);
+ NBT.setInteger("selectedFuelType", selectedFuelType);
+ NBT.setInteger("fuelConsumptionFactor", fuelConsumptionFactor);
+ NBT.setInteger("internalBattery", internalBattery);
+
+ // 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);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound NBT) {
+ spacetimeCompressionFieldMetadata = NBT.getInteger("spacetimeCompressionTier") - 1;
+ solenoidCoilMetadata = NBT.getInteger("solenoidCoilTier") + 7;
+ selectedFuelType = NBT.getInteger("selectedFuelType");
+ fuelConsumptionFactor = NBT.getInteger("fuelConsumptionFactor");
+ internalBattery = NBT.getInteger("internalBattery");
+
+ NBTTagCompound tempBooleanTag = NBT.getCompoundTag("upgrades");
+
+ for (int upgradeIndex = 0; upgradeIndex < 31; upgradeIndex++) {
+ boolean upgrade = tempBooleanTag.getBoolean("upgrade" + upgradeIndex);
+ upgrades[upgradeIndex] = upgrade;
+ }
+
+ super.loadNBTData(NBT);
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java
new file mode 100644
index 0000000000..40ef264d25
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_BaseModule.java
@@ -0,0 +1,252 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.processInitialSettings;
+
+import java.util.UUID;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import com.github.technus.tectech.thing.casing.TT_Container_Casings;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.gtnewhorizon.structurelib.structure.IStructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureDefinition;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_StructureUtility;
+
+public class GT_MetaTileEntity_EM_BaseModule extends GT_MetaTileEntity_MultiblockBase_EM {
+
+ protected final int tier = getTier();
+ protected boolean isConnected = false;
+ protected boolean isUpgrade83Unlocked = false;
+ protected UUID userUUID;
+ protected int machineHeat = 0;
+ protected int maximumParallel = 0;
+ protected float processingSpeedBonus = 0;
+
+ private static final String STRUCTURE_PIECE_MAIN = "main";
+ private static final IStructureDefinition<GT_MetaTileEntity_EM_BaseModule> STRUCTURE_DEFINITION = StructureDefinition
+ .<GT_MetaTileEntity_EM_BaseModule>builder()
+ .addShape(
+ STRUCTURE_PIECE_MAIN,
+ StructureUtility.transpose(
+ new String[][] { { "H", "H" }, { "~", "H" }, { "H", "H" }, { "H", "H" }, { "H", "H" } }))
+ .addElement(
+ 'H',
+ GT_StructureUtility.ofHatchAdderOptional(
+ GT_MetaTileEntity_EM_BaseModule::addClassicToMachineList,
+ texturePage << 7,
+ 1,
+ TT_Container_Casings.sBlockCasingsBA0,
+ 12))
+ .build();
+
+ public GT_MetaTileEntity_EM_BaseModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_BaseModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_BaseModule(mName);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide() && isConnected) {
+ super.onPostTick(aBaseMetaTileEntity, aTick);
+ if (aTick % 400 == 0) fixAllIssues();
+ if (mEfficiency < 0) mEfficiency = 0;
+ }
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return RecipeMaps.blastFurnaceRecipes;
+ }
+
+ @Override
+ public boolean drainEnergyInput(long EUtEffective, long Amperes) {
+ long EU_drain = EUtEffective * Amperes;
+ if (EU_drain == 0L) {
+ return true;
+ } else {
+ if (EU_drain > 0L) {
+ EU_drain = -EU_drain;
+ }
+ return addEUToGlobalEnergyMap(userUUID, EU_drain);
+ }
+ }
+
+ public void connect() {
+ isConnected = true;
+ }
+
+ public void disconnect() {
+ isConnected = false;
+ }
+
+ public void setHeat(Integer heat) {
+ machineHeat = heat;
+ }
+
+ public Integer getHeat() {
+ return machineHeat;
+ }
+
+ public void setMaxParallel(Integer parallel) {
+ maximumParallel = parallel;
+ }
+
+ public Integer getMaxParallel() {
+ return maximumParallel;
+ }
+
+ public void setSpeedBonus(Float bonus) {
+ processingSpeedBonus = bonus;
+ }
+
+ public Float getSpeedBonus() {
+ return processingSpeedBonus;
+ }
+
+ public void setUpgrade83(Boolean upgrade) {
+ isUpgrade83Unlocked = upgrade;
+ }
+
+ protected void fixAllIssues() {
+ mWrench = true;
+ mScrewdriver = true;
+ mSoftHammer = true;
+ mHardHammer = true;
+ mSolderingTool = true;
+ mCrowbar = true;
+ }
+
+ public int getTier() {
+ return tier;
+ }
+
+ @Override
+ public long getMaxInputVoltage() {
+ return gregtech.api.enums.GT_Values.V[tier];
+ }
+
+ @Override
+ public IStructureDefinition<? extends GT_MetaTileEntity_MultiblockBase_EM> getStructure_EM() {
+ return STRUCTURE_DEFINITION;
+ }
+
+ @Override
+ public void construct(ItemStack stackSize, boolean hintsOnly) {
+ structureBuild_EM(STRUCTURE_PIECE_MAIN, 0, 1, 0, stackSize, hintsOnly);
+ }
+
+ @Override
+ public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) {
+ fixAllIssues();
+ return structureCheck_EM(STRUCTURE_PIECE_MAIN, 0, 1, 0);
+ }
+
+ @Override
+ public void onPreTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ super.onPreTick(aBaseMetaTileEntity, aTick);
+
+ if (aBaseMetaTileEntity.isServerSide() && (aTick == 1)) {
+ userUUID = processInitialSettings(aBaseMetaTileEntity);
+ }
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK).setPos(4, 4).setSize(190, 85));
+ final SlotWidget inventorySlot = new SlotWidget(inventoryHandler, 1);
+ builder.widget(inventorySlot.setPos(173, 167).setBackground(GT_UITextures.SLOT_DARK_GRAY));
+
+ final DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
+ drawTexts(screenElements, inventorySlot);
+ builder.widget(screenElements);
+
+ builder.widget(createPowerSwitchButton(builder)).widget(createVoidExcessButton(builder))
+ .widget(createInputSeparationButton(builder)).widget(createBatchModeButton(builder))
+ .widget(createLockToSingleRecipeButton(builder));
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {}
+
+ @Override
+ public boolean supportsInputSeparation() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsVoidProtection() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return true;
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return true;
+ }
+
+ @Override
+ public boolean willExplodeInRain() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+ NBT.setBoolean("isConnected", isConnected);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound NBT) {
+ isConnected = NBT.getBoolean("isConnected");
+ super.loadNBTData(NBT);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7),
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) };
+ }
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java
new file mode 100644
index 0000000000..0950ed47ed
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_ExoticModule.java
@@ -0,0 +1,498 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModuleMagmatterFluidMap;
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModuleMagmatterItemMap;
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaFluidMap;
+import static com.github.technus.tectech.loader.recipe.Godforge.exoticModulePlasmaItemMap;
+import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgeExoticMatterRecipes;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static com.github.technus.tectech.util.GodforgeMath.getRandomIntInRange;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+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.FakeSyncWidget;
+
+import gregtech.api.enums.MaterialsUEVplus;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.TierEU;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_ExoticModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private int numberOfFluids = 0;
+ private int numberOfItems = 0;
+ private int currentParallel = 0;
+ private long wirelessEUt = 0;
+ private long EUt = 0;
+ private boolean recipeInProgress = false;
+ private boolean magmatterCapable = true;
+ private boolean magmatterMode = false;
+ private FluidStack[] randomizedFluidInput = new FluidStack[] {};
+ private ItemStack[] randomizedItemInput = new ItemStack[] {};
+ List<FluidStack> inputPlasmas = new ArrayList<>();
+ private GT_Recipe plasmaRecipe = null;
+ private static RecipeMap<RecipeMapBackend> tempRecipeMap = RecipeMapBuilder.of("bye").maxIO(0, 0, 7, 2)
+ .disableRegisterNEI().build();
+ private static final RecipeMap<RecipeMapBackend> emptyRecipeMap = RecipeMapBuilder.of("hey").maxIO(0, 0, 7, 2)
+ .disableRegisterNEI().build();
+ private static final int NUMBER_OF_INPUTS = 7;
+
+ public GT_MetaTileEntity_EM_ExoticModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_ExoticModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_ExoticModule(mName);
+ }
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ if (!recipeInProgress) {
+ HashMap<FluidStack, Integer> fluidMap = exoticModulePlasmaFluidMap;
+ HashMap<ItemStack, Integer> itemMap = exoticModulePlasmaItemMap;
+ FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000);
+
+ if (magmatterMode) {
+ fluidMap = exoticModuleMagmatterFluidMap;
+ itemMap = exoticModuleMagmatterItemMap;
+ outputFluid = MaterialsUEVplus.MagMatter.getMolten(144);
+ }
+
+ tempRecipeMap = emptyRecipeMap;
+ numberOfFluids = getRandomIntInRange(0, NUMBER_OF_INPUTS);
+ numberOfItems = NUMBER_OF_INPUTS - numberOfFluids;
+ randomizedFluidInput = getRandomFluidInputs(fluidMap, numberOfFluids);
+ randomizedItemInput = getRandomItemInputs(itemMap, numberOfItems);
+
+ if (numberOfFluids != 0) {
+ for (FluidStack fluidStack : randomizedFluidInput) {
+ fluidStack.amount = 1000 * getRandomIntInRange(1, 64);
+ }
+ }
+
+ if (numberOfItems != 0) {
+ for (ItemStack itemStack : randomizedItemInput) {
+ itemStack.stackSize = getRandomIntInRange(1, 64);
+ }
+ }
+
+ inputPlasmas = new ArrayList<>(Arrays.asList(convertItemToPlasma(randomizedItemInput, 1)));
+ inputPlasmas.addAll(Arrays.asList(convertFluidToPlasma(randomizedFluidInput, 1)));
+
+ plasmaRecipe = new GT_Recipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ inputPlasmas.toArray(new FluidStack[0]),
+ new FluidStack[] { outputFluid },
+ 10 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ 0);
+
+ tempRecipeMap.add(plasmaRecipe);
+ }
+ return tempRecipeMap.getAllRecipes().parallelStream();
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ if (!recipeInProgress) {
+ maxParallel = 1;
+ wirelessEUt = (long) recipe.mEUt * maxParallel;
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ tempRecipeMap = emptyRecipeMap;
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+
+ if (numberOfFluids != 0) {
+ for (FluidStack fluidStack : randomizedFluidInput) {
+ dumpFluid(
+ mOutputHatches,
+ new FluidStack(fluidStack.getFluid(), fluidStack.amount / 1000),
+ false);
+ }
+ }
+
+ if (numberOfItems != 0) {
+ for (ItemStack itemStack : randomizedItemInput) {
+ addOutput(itemStack);
+ }
+ }
+
+ recipeInProgress = true;
+ }
+ if (new HashSet<>(Arrays.asList(inputFluids)).containsAll(inputPlasmas)) {
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+ return SimpleCheckRecipeResult.ofFailure("waiting_for_inputs");
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ wirelessEUt = (long) recipe.mEUt * maxParallel;
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ tempRecipeMap = emptyRecipeMap;
+ recipeInProgress = false;
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX).setNoOverclock(true);
+ }
+
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7),
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return godforgeExoticMatterRecipes;
+ }
+
+ private FluidStack[] getRandomFluidInputs(HashMap<FluidStack, Integer> fluidMap, int numberOfFluids) {
+ int cumulativeWeight = 0;
+
+ List<Map.Entry<FluidStack, Integer>> fluidEntryList = new ArrayList<>(fluidMap.entrySet());
+
+ List<Integer> cumulativeWeights = new ArrayList<>();
+ for (Map.Entry<FluidStack, Integer> entry : fluidEntryList) {
+ cumulativeWeight += entry.getValue();
+ cumulativeWeights.add(cumulativeWeight);
+ }
+
+ List<FluidStack> pickedFluids = new ArrayList<>();
+ for (int i = 0; i < numberOfFluids; i++) {
+ int randomWeight = getRandomIntInRange(1, cumulativeWeight);
+ // Find the corresponding FluidStack based on randomWeight
+ for (int j = 0; j < cumulativeWeights.size(); j++) {
+ if (randomWeight <= cumulativeWeights.get(j)) {
+ FluidStack pickedFluid = fluidEntryList.get(j).getKey();
+ // prevent duplicates
+ if (pickedFluids.contains(pickedFluid)) {
+ i--;
+ break;
+ }
+ pickedFluids.add(pickedFluid);
+ break;
+ }
+ }
+ }
+
+ return pickedFluids.toArray(new FluidStack[0]);
+
+ }
+
+ private ItemStack[] getRandomItemInputs(HashMap<ItemStack, Integer> itemMap, int numberOfItems) {
+ int cumulativeWeight = 0;
+
+ List<Map.Entry<ItemStack, Integer>> itemEntryList = new ArrayList<>(itemMap.entrySet());
+
+ List<Integer> cumulativeWeights = new ArrayList<>();
+ for (Map.Entry<ItemStack, Integer> entry : itemEntryList) {
+ cumulativeWeight += entry.getValue();
+ cumulativeWeights.add(cumulativeWeight);
+ }
+
+ List<ItemStack> pickedItems = new ArrayList<>();
+ for (int i = 0; i < numberOfItems; i++) {
+ int randomWeight = getRandomIntInRange(1, cumulativeWeight);
+ // Find the corresponding ItemStack based on randomWeight
+ for (int j = 0; j < cumulativeWeights.size(); j++) {
+ if (randomWeight <= cumulativeWeights.get(j)) {
+ ItemStack pickedItem = itemEntryList.get(j).getKey();
+ // prevent duplicates
+ if (pickedItems.contains(pickedItem)) {
+ i--;
+ break;
+ }
+ pickedItems.add(pickedItem);
+ break;
+ }
+ }
+ }
+ return pickedItems.toArray(new ItemStack[0]);
+
+ }
+
+ private FluidStack[] convertItemToPlasma(ItemStack[] items, long multiplier) {
+ List<FluidStack> plasmas = new ArrayList<>();
+
+ for (ItemStack itemStack : items) {
+ String dict = OreDictionary.getOreName(OreDictionary.getOreIDs(itemStack)[0]);
+ // substring 8 because dustTiny is 8 characters long and there is no other possible oreDict
+ String strippedOreDict = dict.substring(8);
+ plasmas.add(
+ FluidRegistry.getFluidStack(
+ "plasma." + strippedOreDict.toLowerCase(),
+ (int) (INGOTS * multiplier * itemStack.stackSize)));
+ }
+
+ return plasmas.toArray(new FluidStack[0]);
+ }
+
+ private FluidStack[] convertFluidToPlasma(FluidStack[] fluids, long multiplier) {
+ List<FluidStack> plasmas = new ArrayList<>();
+
+ for (FluidStack fluidStack : fluids) {
+ String[] fluidName = fluidStack.getUnlocalizedName().split("\\.");
+ plasmas.add(
+ FluidRegistry.getFluidStack(
+ "plasma." + fluidName[fluidName.length - 1],
+ (int) (multiplier * fluidStack.amount)));
+ }
+
+ return plasmas.toArray(new FluidStack[0]);
+ }
+
+ @Override
+ public boolean supportsSingleRecipeLocking() {
+ return false;
+ }
+
+ @Override
+ public boolean supportsBatchMode() {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+
+ NBT.setBoolean("recipeInProgress", recipeInProgress);
+ NBT.setBoolean("magmatterMode", magmatterMode);
+
+ // Store damage values/stack sizes of input plasmas
+ NBTTagCompound fluidStackListNBTTag = new NBTTagCompound();
+ fluidStackListNBTTag.setLong("numberOfPlasmas", inputPlasmas.size());
+
+ int indexFluids = 0;
+ for (FluidStack fluidStack : inputPlasmas) {
+ // Save fluid amount to NBT
+ fluidStackListNBTTag.setLong(indexFluids + "fluidAmount", fluidStack.amount);
+
+ // Save FluidStack to NBT
+ NBT.setTag(indexFluids + "fluidStack", fluidStack.writeToNBT(new NBTTagCompound()));
+
+ indexFluids++;
+ }
+
+ NBT.setTag("inputPlasmas", fluidStackListNBTTag);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound NBT) {
+
+ recipeInProgress = NBT.getBoolean("recipeInProgress");
+ magmatterMode = NBT.getBoolean("magmatterMode");
+
+ // Load damage values/fluid amounts of input plasmas and convert back to fluids
+ NBTTagCompound tempFluidTag = NBT.getCompoundTag("inputPlasmas");
+
+ // Iterate over all stored fluids
+ for (int indexFluids = 0; indexFluids < tempFluidTag.getLong("numberOfPlasmas"); indexFluids++) {
+
+ // Load fluid amount from NBT
+ int fluidAmount = tempFluidTag.getInteger(indexFluids + "fluidAmount");
+
+ // Load FluidStack from NBT
+ FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(NBT.getCompoundTag(indexFluids + "fluidStack"));
+
+ inputPlasmas.add(new FluidStack(fluidStack, fluidAmount));
+ }
+ FluidStack outputFluid = MaterialsUEVplus.QuarkGluonPlasma.getFluid(1000);
+
+ if (magmatterMode) {
+ outputFluid = MaterialsUEVplus.MagMatter.getMolten(144);
+ }
+
+ tempRecipeMap.add(
+ new GT_Recipe(
+ false,
+ null,
+ null,
+ null,
+ null,
+ inputPlasmas.toArray(new FluidStack[0]),
+ new FluidStack[] { outputFluid },
+ 10 * SECONDS,
+ (int) TierEU.RECIPE_MAX,
+ 0));
+
+ super.loadNBTData(NBT);
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(magmatterSwitch(builder));
+
+ }
+
+ protected ButtonWidget magmatterSwitch(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (magmatterCapable) {
+ magmatterMode = !magmatterMode;
+ }
+ }).setPlayClickSound(isMagmatterModeOn()).setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isMagmatterModeOn()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ if (magmatterCapable) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE);
+ }
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ if (magmatterCapable) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS);
+ } else {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE);
+ }
+ }
+ if (!magmatterCapable) {
+ ret.add(GT_UITextures.OVERLAY_BUTTON_DISABLE);
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isMagmatterModeOn, this::setMagmatterMode), builder)
+ .addTooltip(translateToLocal("fog.button.magmattermode.tooltip.01"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(174, 91).setSize(16, 16);
+ if (!magmatterCapable) {
+ button.addTooltip(translateToLocal("fog.button.magmattermode.tooltip.02"));
+ }
+ return (ButtonWidget) button;
+ }
+
+ private boolean isMagmatterModeOn() {
+ return magmatterMode;
+ }
+
+ private void setMagmatterMode(boolean enabled) {
+ magmatterMode = enabled;
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Quark Gluon Plasma Module") // Machine Type:
+ .addInfo("Controller block of the Quark Gluon Plasma Module") // Controller
+ .addInfo("Uses a Star to to turn Items into Quark Gluon Plasma").addSeparator()
+ .beginStructureBlock(1, 4, 2, false).addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch:
+ // Any
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ return str.toArray(new String[0]);
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java
new file mode 100644
index 0000000000..a9e8c411d6
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_MoltenModule.java
@@ -0,0 +1,229 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static gregtech.api.util.GT_OreDictUnificator.getAssociation;
+import static gregtech.api.util.GT_ParallelHelper.addFluidsLong;
+import static gregtech.api.util.GT_ParallelHelper.addItemsLong;
+import static gregtech.api.util.GT_RecipeBuilder.BUCKETS;
+import static gregtech.api.util.GT_RecipeBuilder.INGOTS;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+
+import javax.annotation.Nonnull;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.common.util.ForgeDirection;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.TierEU;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.objects.ItemData;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_ParallelHelper;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_MoltenModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private long EUt = 0;
+ private int currentParallel = 0;
+
+ public GT_MetaTileEntity_EM_MoltenModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_MoltenModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_MoltenModule(mName);
+ }
+
+ long wirelessEUt = 0;
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ private FluidStack[] meltableItems;
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+
+ if (recipe.mSpecialValue > getHeat()) {
+ return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+ wirelessEUt = (long) recipe.mEUt * getMaxParallel();
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+
+ meltableItems = new FluidStack[recipe.mOutputs.length];
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null) {
+ continue;
+ }
+ // if this is null it has to be a gt++ material
+ ItemData data = getAssociation(item);
+ Materials mat = data == null ? null : data.mMaterial.mMaterial;
+ if (mat != null) {
+ if (mat.mStandardMoltenFluid != null) {
+ meltableItems[i] = mat.getMolten(INGOTS);
+ } else if (mat.mFluid != null) {
+ meltableItems[i] = mat.getFluid(BUCKETS);
+ }
+ } else {
+ String dict = OreDictionary.getOreName(OreDictionary.getOreIDs(item)[0]);
+ // substring 8 because ingotHot is 8 characters long
+ String strippedOreDict = dict.substring(8);
+ meltableItems[i] = FluidRegistry
+ .getFluidStack("molten." + strippedOreDict.toLowerCase(), (int) (INGOTS));
+ }
+ }
+
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX).setRecipeHeat(recipe.mSpecialValue)
+ .setHeatOC(true).setHeatDiscount(true).setMachineHeat(getHeat());
+
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration);
+ }
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_ParallelHelper createParallelHelper(@Nonnull GT_Recipe recipe) {
+ return super.createParallelHelper(recipe).setCustomItemOutputCalculation(currentParallel -> {
+ ArrayList<ItemStack> outputItems = new ArrayList<>();
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ ItemStack item = recipe.getOutput(i);
+ if (item == null || meltableItems[i] != null) {
+ continue;
+ }
+ ItemStack itemToAdd = item.copy();
+ addItemsLong(outputItems, itemToAdd, (long) item.stackSize * currentParallel);
+ }
+ return outputItems.toArray(new ItemStack[0]);
+ }).setCustomFluidOutputCalculation(currentParallel -> {
+ ArrayList<FluidStack> fluids = new ArrayList<>();
+
+ for (int i = 0; i < recipe.mOutputs.length; i++) {
+ FluidStack fluid = meltableItems[i];
+ if (fluid == null) {
+ continue;
+ }
+ FluidStack fluidToAdd = fluid.copy();
+ long fluidAmount = (long) fluidToAdd.amount * recipe.mOutputs[i].stackSize * currentParallel;
+ addFluidsLong(fluids, fluidToAdd, fluidAmount);
+ }
+
+ for (int i = 0; i < recipe.mFluidOutputs.length; i++) {
+ FluidStack fluid = recipe.getFluidOutput(i);
+ if (fluid == null) {
+ continue;
+ }
+ FluidStack fluidToAdd = fluid.copy();
+ addFluidsLong(fluids, fluidToAdd, (long) fluidToAdd.amount * currentParallel);
+ }
+ return fluids.toArray(new FluidStack[0]);
+ });
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setMaxParallel(getMaxParallel());
+ logic.setSpeedBonus(getSpeedBonus());
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7),
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) };
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat()));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Molten Module") // Machine Type:
+ .addInfo("Controller block of the Molten Module") // Controller
+ .addInfo("Uses a Star to to melt Metals").addSeparator().beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: Any
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java
new file mode 100644
index 0000000000..299dbb4fc7
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_PlasmaModule.java
@@ -0,0 +1,217 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.recipe.TecTechRecipeMaps.godforgePlasmaRecipes;
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Objects;
+
+import javax.annotation.Nonnull;
+
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.math.Color;
+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.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.textfield.TextFieldWidget;
+
+import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.TierEU;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.recipe.check.SimpleCheckRecipeResult;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_PlasmaModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private long EUt = 0;
+ private int currentParallel = 0;
+ private boolean multiStep = false;
+ private boolean debug = true;
+ private int fusionTier = 0;
+ private int inputMaxParallel = 0;
+
+ public GT_MetaTileEntity_EM_PlasmaModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_PlasmaModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_PlasmaModule(mName);
+ }
+
+ long wirelessEUt = 0;
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+ wirelessEUt = (long) recipe.mEUt * getMaxParallel();
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ if (recipe.mSpecialValue > fusionTier
+ || Objects.equals(recipe.mSpecialItems.toString(), "true") && !multiStep) {
+ return SimpleCheckRecipeResult.ofFailure("missing_upgrades");
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ wirelessEUt = (long) recipe.mEUt * maxParallel;
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX);
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setMaxParallel(getMaxParallel());
+ logic.setSpeedBonus(getSpeedBonus());
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ if (debug) {
+ builder.widget(createTestButton(builder)).widget(createTestButton2()).widget(createTestButton3());
+ }
+ }
+
+ protected Widget createTestButton(IWidgetBuilder<?> builder) {
+ return new ButtonWidget().setOnClick((clickData, widget) -> { multiStep = !multiStep; })
+ .setPlayClickSoundResource(
+ () -> isAllowedToWork() ? SoundResource.GUI_BUTTON_UP.resourceLocation
+ : SoundResource.GUI_BUTTON_DOWN.resourceLocation)
+ .setBackground(() -> {
+ if (multiStep) {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD_PRESSED,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_ON };
+ } else {
+ return new IDrawable[] { GT_UITextures.BUTTON_STANDARD,
+ GT_UITextures.OVERLAY_BUTTON_POWER_SWITCH_OFF };
+ }
+ }).attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isAllowedToWork, val -> {
+ if (val) enableWorking();
+ else disableWorking();
+ }), builder).addTooltip("multi-step").setTooltipShowUpDelay(TOOLTIP_DELAY).setPos(174, 100)
+ .setSize(16, 16);
+ }
+
+ protected Widget createTestButton2() {
+ return new TextFieldWidget().setSetterInt(val -> fusionTier = val).setGetterInt(() -> fusionTier)
+ .setNumbers(0, 2).setTextAlignment(Alignment.Center).setTextColor(Color.WHITE.normal).setPos(3, 18)
+ .addTooltip("fusion tier").setTooltipShowUpDelay(TOOLTIP_DELAY).setSize(16, 16).setPos(174, 80)
+ .setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD);
+ }
+
+ protected Widget createTestButton3() {
+ return new TextFieldWidget().setSetterInt(val -> inputMaxParallel = val).setGetterInt(() -> inputMaxParallel)
+ .setNumbers(0, Integer.MAX_VALUE).setTextAlignment(Alignment.Center).setTextColor(Color.WHITE.normal)
+ .setPos(3, 18).addTooltip("parallel").setTooltipShowUpDelay(TOOLTIP_DELAY).setSize(70, 16)
+ .setPos(174, 60).setBackground(GT_UITextures.BACKGROUND_TEXT_FIELD);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7),
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) };
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return godforgePlasmaRecipes;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Plasma Module") // Machine Type:
+ .addInfo("Controller block of the Plasma Module") // Controller
+ .addInfo("Uses a Star to to turn Metals into Plasma").addSeparator().beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: Any
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java
new file mode 100644
index 0000000000..cfd6839ceb
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/metaTileEntity/multi/godforge_modules/GT_MetaTileEntity_EM_SmeltingModule.java
@@ -0,0 +1,243 @@
+package com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules;
+
+import static com.github.technus.tectech.thing.casing.GT_Block_CasingsTT.texturePage;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.util.GT_Utility.formatNumbers;
+import static gregtech.common.misc.WirelessNetworkManager.addEUToGlobalEnergyMap;
+import static gregtech.common.misc.WirelessNetworkManager.getUserEU;
+import static net.minecraft.util.EnumChatFormatting.GREEN;
+import static net.minecraft.util.EnumChatFormatting.RED;
+import static net.minecraft.util.EnumChatFormatting.RESET;
+import static net.minecraft.util.EnumChatFormatting.YELLOW;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.jetbrains.annotations.NotNull;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM;
+import com.github.technus.tectech.thing.metaTileEntity.multi.base.render.TT_RenderedExtendedFacingTexture;
+import com.github.technus.tectech.util.CommonValues;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+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.FakeSyncWidget;
+
+import gregtech.api.enums.Textures;
+import gregtech.api.enums.TierEU;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.logic.ProcessingLogic;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.recipe.check.CheckRecipeResult;
+import gregtech.api.recipe.check.CheckRecipeResultRegistry;
+import gregtech.api.util.GT_Multiblock_Tooltip_Builder;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_Utility;
+
+public class GT_MetaTileEntity_EM_SmeltingModule extends GT_MetaTileEntity_EM_BaseModule {
+
+ private long EUt = 0;
+ private long currentParallel = 0;
+ private boolean furnaceMode = false;
+
+ public GT_MetaTileEntity_EM_SmeltingModule(int aID, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional);
+ }
+
+ public GT_MetaTileEntity_EM_SmeltingModule(String aName) {
+ super(aName);
+ }
+
+ @Override
+ public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_EM_SmeltingModule(mName);
+ }
+
+ @Override
+ public RecipeMap<?> getRecipeMap() {
+ return null;
+ }
+
+ @Nonnull
+ @Override
+ public Collection<RecipeMap<?>> getAvailableRecipeMaps() {
+ return Arrays.asList(RecipeMaps.blastFurnaceRecipes, RecipeMaps.furnaceRecipes);
+ }
+
+ private static RecipeMap<?> getRecipeMap(boolean furnaceMode) {
+ if (furnaceMode) {
+ return RecipeMaps.furnaceRecipes;
+ } else {
+ return RecipeMaps.blastFurnaceRecipes;
+ }
+ }
+
+ long wirelessEUt = 0;
+
+ @Override
+ protected ProcessingLogic createProcessingLogic() {
+ return new ProcessingLogic() {
+
+ @Nonnull
+ @Override
+ protected Stream<GT_Recipe> findRecipeMatches(@Nullable RecipeMap<?> map) {
+ RecipeMap<?> recipes = getRecipeMap(furnaceMode);
+ return super.findRecipeMatches(recipes);
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult validateRecipe(@Nonnull GT_Recipe recipe) {
+
+ if (recipe.mSpecialValue > getHeat()) {
+ return CheckRecipeResultRegistry.insufficientHeat(recipe.mSpecialValue);
+ }
+
+ wirelessEUt = (long) recipe.mEUt * getMaxParallel();
+ if (getUserEU(userUUID).compareTo(BigInteger.valueOf(wirelessEUt * recipe.mDuration)) < 0) {
+ return CheckRecipeResultRegistry.insufficientPower(wirelessEUt * recipe.mDuration);
+ }
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @NotNull
+ @Override
+ protected CheckRecipeResult onRecipeStart(@Nonnull GT_Recipe recipe) {
+ if (!addEUToGlobalEnergyMap(userUUID, -calculatedEut * duration)) {
+ return CheckRecipeResultRegistry.insufficientPower(calculatedEut * duration);
+ }
+ currentParallel = calculatedParallels;
+ EUt = calculatedEut;
+ setCalculatedEut(0);
+ return CheckRecipeResultRegistry.SUCCESSFUL;
+ }
+
+ @Nonnull
+ @Override
+ protected GT_OverclockCalculator createOverclockCalculator(@Nonnull GT_Recipe recipe) {
+ return super.createOverclockCalculator(recipe).setEUt(TierEU.MAX).setRecipeHeat(recipe.mSpecialValue)
+ .setHeatOC(true).setHeatDiscount(true).setMachineHeat(getHeat());
+ }
+ };
+ }
+
+ @Override
+ protected void setProcessingLogicPower(ProcessingLogic logic) {
+ logic.setAvailableVoltage(Long.MAX_VALUE);
+ logic.setAvailableAmperage(Integer.MAX_VALUE);
+ logic.setAmperageOC(false);
+ logic.setMaxParallel(getMaxParallel());
+ logic.setSpeedBonus(getSpeedBonus());
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing,
+ int colorIndex, boolean aActive, boolean aRedstone) {
+ if (side == facing) {
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7),
+ new TT_RenderedExtendedFacingTexture(
+ aActive ? GT_MetaTileEntity_MultiblockBase_EM.ScreenON
+ : GT_MetaTileEntity_MultiblockBase_EM.ScreenOFF) };
+ }
+ return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(texturePage << 7) };
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(furnaceSwitch(builder));
+
+ }
+
+ protected ButtonWidget furnaceSwitch(IWidgetBuilder<?> builder) {
+ Widget button = new ButtonWidget().setOnClick((clickData, widget) -> furnaceMode = !furnaceMode)
+ .setPlayClickSound(isFurnaceModeOn()).setBackground(() -> {
+ List<UITexture> ret = new ArrayList<>();
+ if (isFurnaceModeOn()) {
+ ret.add(GT_UITextures.BUTTON_STANDARD_PRESSED);
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CHECKMARK);
+ } else {
+ ret.add(GT_UITextures.BUTTON_STANDARD);
+ ret.add(GT_UITextures.OVERLAY_BUTTON_CROSS);
+
+ }
+ return ret.toArray(new IDrawable[0]);
+ }).attachSyncer(new FakeSyncWidget.BooleanSyncer(this::isFurnaceModeOn, this::setFurnaceMode), builder)
+ .addTooltip(translateToLocal("fog.button.furnacemode.tooltip")).setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(174, 91).setSize(16, 16);
+ return (ButtonWidget) button;
+ }
+
+ private boolean isFurnaceModeOn() {
+ return furnaceMode;
+ }
+
+ private void setFurnaceMode(boolean enabled) {
+ furnaceMode = enabled;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound NBT) {
+ NBT.setBoolean("furnaceMode", furnaceMode);
+ super.saveNBTData(NBT);
+ }
+
+ @Override
+ public void loadNBTData(final NBTTagCompound NBT) {
+ furnaceMode = NBT.getBoolean("furnaceMode");
+ super.loadNBTData(NBT);
+ }
+
+ @Override
+ public String[] getInfoData() {
+ ArrayList<String> str = new ArrayList<>();
+ str.add(
+ "Progress: " + GREEN
+ + GT_Utility.formatNumbers(mProgresstime / 20)
+ + RESET
+ + " s / "
+ + YELLOW
+ + GT_Utility.formatNumbers(mMaxProgresstime / 20)
+ + RESET
+ + " s");
+ str.add("Currently using: " + RED + formatNumbers(EUt) + RESET + " EU/t");
+ str.add(YELLOW + "Max Parallel: " + RESET + formatNumbers(getMaxParallel()));
+ str.add(YELLOW + "Current Parallel: " + RESET + formatNumbers(currentParallel));
+ str.add(YELLOW + "Heat Capacity: " + RESET + formatNumbers(getHeat()));
+ str.add(YELLOW + "Recipe time multiplier: " + RESET + formatNumbers(getSpeedBonus()));
+ return str.toArray(new String[0]);
+ }
+
+ @Override
+ public GT_Multiblock_Tooltip_Builder createTooltip() {
+ final GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder();
+ tt.addMachineType("Smelting Module") // Machine Type:
+ .addInfo("Controller block of the Smelting Module") // Controller
+ .addInfo("Uses a Star to Smelt Metals").addSeparator().beginStructureBlock(1, 4, 2, false)
+ .addEnergyHatch("Any Infinite Spacetime Casing", 1) // Energy Hatch: Any
+ .addMaintenanceHatch("Any Infinite Spacetime Casing", 1) // Maintenance
+ .toolTipFinisher(CommonValues.TEC_MARK_EM);
+ return tt;
+ }
+
+}
diff --git a/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java b/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/thing/multiTileEntity/GodForge.java
diff --git a/src/main/java/com/github/technus/tectech/util/CommonValues.java b/src/main/java/com/github/technus/tectech/util/CommonValues.java
index 346fad64db..e6cbeb7654 100644
--- a/src/main/java/com/github/technus/tectech/util/CommonValues.java
+++ b/src/main/java/com/github/technus/tectech/util/CommonValues.java
@@ -15,6 +15,7 @@ public final class CommonValues {
public static final String TEC_MARK_EM = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Elemental Matter";
public static final String THETA_MOVEMENT = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Theta Movement";
public static final String COSMIC_MARK = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Cosmic";
+ public static final String GODFORGE_MARK = TEC_MARK_SHORT + EnumChatFormatting.BLUE + ": Project Godforge";
public static final byte MOVE_AT = 4; // move stuff around
public static final byte RECIPE_AT = 6; // move stuff around
diff --git a/src/main/java/com/github/technus/tectech/util/GodforgeMath.java b/src/main/java/com/github/technus/tectech/util/GodforgeMath.java
new file mode 100644
index 0000000000..f5c7c660b0
--- /dev/null
+++ b/src/main/java/com/github/technus/tectech/util/GodforgeMath.java
@@ -0,0 +1,145 @@
+package com.github.technus.tectech.util;
+
+import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_ForgeOfGods;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_BaseModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_MoltenModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_PlasmaModule;
+import com.github.technus.tectech.thing.metaTileEntity.multi.godforge_modules.GT_MetaTileEntity_EM_SmeltingModule;
+
+public class GodforgeMath {
+
+ public static int getRandomIntInRange(int min, int max) {
+ return (int) (Math.random() * (max - min)) + min;
+ }
+
+ public static double calculateFuelConsumption(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double upgradeFactor = 1;
+ if (godforge.isUpgradeActive(2)) {
+ upgradeFactor = 0.8;
+ }
+ if (godforge.getFuelType() == 0) {
+ return Math
+ .max(godforge.getFuelFactor() * 300 * Math.pow(1.15, godforge.getFuelFactor()) * upgradeFactor, 1);
+ }
+ if (godforge.getFuelType() == 1) {
+ return Math.max(godforge.getFuelFactor() * 2 * Math.pow(1.08, godforge.getFuelFactor()) * upgradeFactor, 1);
+ } else return Math.max(godforge.getFuelFactor() / 25 * upgradeFactor, 1);
+ }
+
+ public static int calculateMaxFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+
+ if (godforge.isUpgradeActive(27)) {
+ return Integer.MAX_VALUE;
+ }
+
+ int fuelCap = 5;
+ if (godforge.isUpgradeActive(9)) {
+ fuelCap += godforge.getTotalActiveUpgrades();
+ }
+
+ if (godforge.isUpgradeActive(3)) {
+ fuelCap *= 1.2;
+ }
+ return fuelCap;
+ }
+
+ public static int calculateMaxHeatForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double logBase = 1.5;
+ int baseHeat = 12601;
+ if (godforge.isUpgradeActive(12)) {
+ if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) {
+ logBase = 1.12;
+ } else {
+ logBase = 1.18;
+ }
+ }
+ return baseHeat + (int) (Math.log(godforge.getFuelFactor()) / Math.log(logBase) * 1000);
+ }
+
+ public static float calucateSpeedBonusForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ double speedBonus = 1;
+
+ if (godforge.isUpgradeActive(1)) {
+ speedBonus = Math.pow(module.getHeat(), -0.01);
+ }
+
+ if (godforge.isUpgradeActive(22)) {
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ speedBonus /= Math.pow(module.getMaxParallel(), 0.02);
+ } else {
+ speedBonus /= Math.pow(module.getMaxParallel(), 0.012);
+ }
+ }
+ return (float) speedBonus;
+ }
+
+ public static int calculateEffectiveFuelFactor(GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ int fuelFactor = godforge.getFuelFactor();
+ if (fuelFactor <= 43) {
+ return fuelFactor;
+ } else {
+ return 43 + (int) Math.floor(Math.pow((fuelFactor - 43), 0.4));
+ }
+ }
+
+ public static int calucateMaxParallelForModules(GT_MetaTileEntity_EM_BaseModule module,
+ GT_MetaTileEntity_EM_ForgeOfGods godforge) {
+ int baseParallel = 0;
+ float fuelFactorMultiplier = 1;
+ float heatMultiplier = 1;
+ float upgradeAmountMultiplier = 1;
+ int node53 = 1;
+ boolean isMoltenOrSmeltingWithUpgrade = false;
+
+ if (module instanceof GT_MetaTileEntity_EM_SmeltingModule) {
+ baseParallel = 1024;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_MoltenModule) {
+ baseParallel = 512;
+ }
+ if (module instanceof GT_MetaTileEntity_EM_PlasmaModule) {
+ baseParallel = 256;
+ }
+
+ if (module instanceof GT_MetaTileEntity_EM_MoltenModule
+ || (module instanceof GT_MetaTileEntity_EM_SmeltingModule && godforge.isUpgradeActive(16))) {
+ isMoltenOrSmeltingWithUpgrade = true;
+ }
+
+ if (godforge.isUpgradeActive(10)) {
+ node53 = 2;
+ }
+
+ if (godforge.isUpgradeActive(6)) {
+ if (godforge.isUpgradeActive(13)) {
+ if (isMoltenOrSmeltingWithUpgrade) {
+ fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f * 3;
+ } else {
+ fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f * 2;
+ }
+ } else {
+ fuelFactorMultiplier = 1 + calculateEffectiveFuelFactor(godforge) / 15f;
+ }
+ }
+
+ if (godforge.isUpgradeActive(18)) {
+ if (isMoltenOrSmeltingWithUpgrade) {
+ heatMultiplier = 1 + module.getHeat() / 15000f;
+ } else {
+ heatMultiplier = 1 + module.getHeat() / 25000f;
+ }
+ }
+
+ if (godforge.isUpgradeActive(21)) {
+ if (isMoltenOrSmeltingWithUpgrade) {
+ upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 5f;
+ } else {
+ upgradeAmountMultiplier = 1 + godforge.getTotalActiveUpgrades() / 8f;
+ }
+ }
+
+ return (int) (baseParallel * node53 * fuelFactorMultiplier * heatMultiplier * upgradeAmountMultiplier);
+ }
+}