diff --git a/src/main/java/com/github/technus/tectech/TecTech.java b/src/main/java/com/github/technus/tectech/TecTech.java index 0845e0273..ea5a23558 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 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 void PreLoad(FMLPreInitializationEvent PreEvent) { 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 d50f7d410..e9df999e8 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 static Materials getOrDefault(String name, Materials def) { } public void run() { - + new Godforge().run(); // todo: Move those recipes in NHCore if (NewHorizonsCoreMod.isModLoaded()) { new Assembler().run(); @@ -44,6 +44,5 @@ public void run() { 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 000000000..ca5f719aa --- /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 plasmaGTMaterialList = new ArrayList<>(); + public static final ArrayList plasmaGTWeightList = new ArrayList<>(); + public static final HashMap exoticModulePlasmaItemMap = new HashMap<>(); + public static final HashMap exoticModulePlasmaFluidMap = new HashMap<>(); + public static final HashMap exoticModuleMagmatterItemMap = new HashMap<>(); + public static final HashMap 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 e0a373e67..20f6abccb 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_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; @@ -312,6 +317,7 @@ 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; @@ -320,6 +326,10 @@ 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; @@ -2023,6 +2033,21 @@ public void run() { 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 000000000..15ab723e4 --- /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 af383a18e..eaec6574e 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.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 void run() { 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 68b3fb7a0..e1ba2959f 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 @@ 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 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 000000000..1f19fc00c --- /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 getItemInputPositions(int itemInputCount) { + return Collections.singletonList(new Pos2d(52, 33)); + } + + @Override + public List 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 000000000..bf8fcc5e8 --- /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 getItemInputPositions(int itemInputCount) { + return Collections.singletonList(new Pos2d(52, 33)); + } + + @Override + public List 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 366ee0ebb..a12a64579 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 static boolean addResearchableAssemblylineRecipe(ItemStack aResearchItem, 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 da60084e3..a115f0cc9 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 static void init() {} .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 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 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 6f19d13a2..ccfee7870 100644 --- a/src/main/java/com/github/technus/tectech/thing/CustomItemList.java +++ b/src/main/java/com/github/technus/tectech/thing/CustomItemList.java @@ -352,6 +352,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, @@ -431,6 +437,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 000000000..02be399bb --- /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 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 000000000..67c77f5ac --- /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 000000000..0e6b0d17c --- /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 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 000000000..82e7a7d5c --- /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 000000000..c38607029 --- /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 000000000..0e0b53604 --- /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 000000000..0d0455966 --- /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 000000000..eacdf35f1 --- /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 eaa98cc8f..009a9f425 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 @@ 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 95dc85429..9c475345b 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 000000000..87d226dd7 --- /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 000000000..7dde3ab5b --- /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 000000000..360383956 --- /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 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 getStructure_EM() { + return STRUCTURE_DEFINITION; + } + + public static final IStructureDefinition STRUCTURE_DEFINITION = IStructureDefinition + .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.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 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 { + + 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> mteClasses; + private final IGT_HatchAdder adder; + + @SafeVarargs + moduleElement(IGT_HatchAdder adder, + Class... mteClasses) { + this.mteClasses = Collections.unmodifiableList(Arrays.asList(mteClasses)); + this.adder = adder; + } + + @Override + public List> mteClasses() { + return mteClasses; + } + + public IGT_HatchAdder 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 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 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 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 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 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 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 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 000000000..40ef264d2 --- /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 STRUCTURE_DEFINITION = StructureDefinition + .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 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 000000000..0950ed47e --- /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 inputPlasmas = new ArrayList<>(); + private GT_Recipe plasmaRecipe = null; + private static RecipeMap tempRecipeMap = RecipeMapBuilder.of("bye").maxIO(0, 0, 7, 2) + .disableRegisterNEI().build(); + private static final RecipeMap 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 findRecipeMatches(@Nullable RecipeMap map) { + if (!recipeInProgress) { + HashMap fluidMap = exoticModulePlasmaFluidMap; + HashMap 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 fluidMap, int numberOfFluids) { + int cumulativeWeight = 0; + + List> fluidEntryList = new ArrayList<>(fluidMap.entrySet()); + + List cumulativeWeights = new ArrayList<>(); + for (Map.Entry entry : fluidEntryList) { + cumulativeWeight += entry.getValue(); + cumulativeWeights.add(cumulativeWeight); + } + + List 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 itemMap, int numberOfItems) { + int cumulativeWeight = 0; + + List> itemEntryList = new ArrayList<>(itemMap.entrySet()); + + List cumulativeWeights = new ArrayList<>(); + for (Map.Entry entry : itemEntryList) { + cumulativeWeight += entry.getValue(); + cumulativeWeights.add(cumulativeWeight); + } + + List 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 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 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 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 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 000000000..a9e8c411d --- /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 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 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 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 000000000..299dbb4fc --- /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 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 000000000..cfd6839ce --- /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> 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 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 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 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 000000000..e69de29bb 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 346fad64d..e6cbeb765 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 000000000..f5c7c660b --- /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); + } +} diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png new file mode 100644 index 000000000..ef00e4b09 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_ENERGY.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png new file mode 100644 index 000000000..ee2cb0934 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_INNER.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png new file mode 100644 index 000000000..ea98b573e Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_SUPPORT.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png new file mode 100644 index 000000000..0b9353912 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GODFORGE_TRIM.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png new file mode 100644 index 000000000..1c247db84 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta new file mode 100644 index 000000000..97596ba81 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_0.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png new file mode 100644 index 000000000..728b89f8f Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta new file mode 100644 index 000000000..60af67825 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_1.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png new file mode 100644 index 000000000..d296edcad Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta new file mode 100644 index 000000000..5e86a7cd5 --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_CASING_2.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png new file mode 100644 index 000000000..a21e6d941 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/GRAVITON_TOP_BOTTOM.png differ diff --git a/src/main/resources/assets/tectech/lang/en_US.lang b/src/main/resources/assets/tectech/lang/en_US.lang index ea7e870d6..d7db56e17 100644 --- a/src/main/resources/assets/tectech/lang/en_US.lang +++ b/src/main/resources/assets/tectech/lang/en_US.lang @@ -10,6 +10,10 @@ tile.quantumGlass.name=Quantum Glass tile.quantumGlass.desc.0=Dense yet transparent tile.quantumGlass.desc.1=Glassy & Classy +tile.spatiallyTranscendentGravitationalLens.name=Spatially Transcendent Gravitational Lens Block +tile.godforgeGlass.desc.0=Gravitational lensing taken literal +tile.godforgeGlass.desc.1=GraviLens 9000! + tile.reactorSim.name=Reactor Simulator tile.reactorSim.desc.0=Fission Reaction Uncertainty Resolver 9001 tile.reactorSim.desc.1=Explodes, but not as much... @@ -864,6 +868,138 @@ achievement.gt.stabilisation_field_generator.6=Perfect Stabilisation Field Gener achievement.gt.stabilisation_field_generator.7=Tipler Stabilisation Field Generator achievement.gt.stabilisation_field_generator.8=Gallifreyan Stabilisation Field Generator +# Forge of the Gods / Godforge +fog.upgrade.confirm=Construct + +fog.upgrade.tt.0=upgrade start +fog.upgrade.tt.1=upgrade 11 +fog.upgrade.tt.2=upgrade 21 +fog.upgrade.tt.3=upgrade 22 +fog.upgrade.tt.4=upgrade 31 +fog.upgrade.tt.5=upgrade 32 +fog.upgrade.tt.6=upgrade 33 +fog.upgrade.tt.7=upgrade 41 +fog.upgrade.tt.8=upgrade 51 +fog.upgrade.tt.9=upgrade 52 +fog.upgrade.tt.10=upgrade 53 +fog.upgrade.tt.11=upgrade 61 +fog.upgrade.tt.12=upgrade 71 +fog.upgrade.tt.13=upgrade 72 +fog.upgrade.tt.14=upgrade 73 +fog.upgrade.tt.15=upgrade 74 +fog.upgrade.tt.16=upgrade 80 +fog.upgrade.tt.17=upgrade 81 +fog.upgrade.tt.18=upgrade 82 +fog.upgrade.tt.19=upgrade 83 +fog.upgrade.tt.20=upgrade 91 +fog.upgrade.tt.21=upgrade 92 +fog.upgrade.tt.22=upgrade 93 +fog.upgrade.tt.23=upgrade 101 +fog.upgrade.tt.24=upgrade 111 +fog.upgrade.tt.25=upgrade 121 +fog.upgrade.tt.26=upgrade 131 +fog.upgrade.tt.27=upgrade 141 +fog.upgrade.tt.28=upgrade 151 +fog.upgrade.tt.29=upgrade 161 +fog.upgrade.tt.30=upgrade end + +fog.upgrade.lore.0=*insert lore here* upgrade start +fog.upgrade.lore.1=*insert lore here* upgrade 11 +fog.upgrade.lore.2=*insert lore here* upgrade 21 +fog.upgrade.lore.3=*insert lore here* upgrade 22 +fog.upgrade.lore.4=*insert lore here* upgrade 31 +fog.upgrade.lore.5=*insert lore here* upgrade 32 +fog.upgrade.lore.6=*insert lore here* upgrade 33 +fog.upgrade.lore.7=*insert lore here* upgrade 41 +fog.upgrade.lore.8=*insert lore here* upgrade 51 +fog.upgrade.lore.9=*insert lore here* upgrade 52 +fog.upgrade.lore.10=*insert lore here* upgrade 53 +fog.upgrade.lore.11=*insert lore here* upgrade 61 +fog.upgrade.lore.12=*insert lore here* upgrade 71 +fog.upgrade.lore.13=*insert lore here* upgrade 72 +fog.upgrade.lore.14=*insert lore here* upgrade 73 +fog.upgrade.lore.15=*insert lore here* upgrade 74 +fog.upgrade.lore.16=*insert lore here* upgrade 80 +fog.upgrade.lore.17=*insert lore here* upgrade 81 +fog.upgrade.lore.18=*insert lore here* upgrade 82 +fog.upgrade.lore.19=*insert lore here* upgrade 83 +fog.upgrade.lore.20=*insert lore here* upgrade 91 +fog.upgrade.lore.21=*insert lore here* upgrade 92 +fog.upgrade.lore.22=*insert lore here* upgrade 93 +fog.upgrade.lore.23=*insert lore here* upgrade 101 +fog.upgrade.lore.24=*insert lore here* upgrade 111 +fog.upgrade.lore.25=*insert lore here* upgrade 121 +fog.upgrade.lore.26=*insert lore here* upgrade 131 +fog.upgrade.lore.27=*insert lore here* upgrade 141 +fog.upgrade.lore.28=*insert lore here* upgrade 151 +fog.upgrade.lore.29=*insert lore here* upgrade 161 +fog.upgrade.lore.30=*insert lore here* upgrade end + +fog.upgrade.text.0=Unlocks a recipe time reduction multiplier based on the current heat the multi is running at. This bonus is calculated via following formula: Multiplier = 1/(Heat^0.01) +fog.upgrade.text.1=*insert text here* upgrade 11 +fog.upgrade.text.2=*insert text here* upgrade 21 +fog.upgrade.text.3=*insert text here* upgrade 22 +fog.upgrade.text.4=*insert text here* upgrade 31 +fog.upgrade.text.5=*insert text here* upgrade 32 +fog.upgrade.text.6=*insert text here* upgrade 33 +fog.upgrade.text.7=*insert text here* upgrade 41 +fog.upgrade.text.8=*insert text here* upgrade 51 +fog.upgrade.text.9=*insert text here* upgrade 52 +fog.upgrade.text.10=*insert text here* upgrade 53 +fog.upgrade.text.11=*insert text here* upgrade 61 +fog.upgrade.text.12=*insert text here* upgrade 71 +fog.upgrade.text.13=*insert text here* upgrade 72 +fog.upgrade.text.14=*insert text here* upgrade 73 +fog.upgrade.text.15=*insert text here* upgrade 74 +fog.upgrade.text.16=*insert text here* upgrade 80 +fog.upgrade.text.17=*insert text here* upgrade 81 +fog.upgrade.text.18=*insert text here* upgrade 82 +fog.upgrade.text.19=*insert text here* upgrade 83 +fog.upgrade.text.20=*insert text here* upgrade 91 +fog.upgrade.text.21=*insert text here* upgrade 92 +fog.upgrade.text.22=*insert text here* upgrade 93 +fog.upgrade.text.23=*insert text here* upgrade 101 +fog.upgrade.text.24=*insert text here* upgrade 111 +fog.upgrade.text.25=*insert text here* upgrade 121 +fog.upgrade.text.26=*insert text here* upgrade 131 +fog.upgrade.text.27=*insert text here* upgrade 141 +fog.upgrade.text.28=*insert text here* upgrade 151 +fog.upgrade.text.29=*insert text here* upgrade 161 +fog.upgrade.text.30=*insert text here* upgrade end + +fog.debug.resetbutton.text=Reset +fog.debug.resetbutton.tooltip=Resets all upgrades to zero + +fog.button.fuelconfig.tooltip=Fuel Configuration Menu +fog.button.furnacemode.tooltip=Toggle Furnace Mode +fog.button.magmattermode.tooltip.01=Toggle Magmatter Mode +fog.button.magmattermode.tooltip.02=Magmatter Mode Locked, missing upgrade + + +achievement.gt.blockmachines.multimachine.em.forge_of_gods=Forge of the Gods +achievement.gt.godforgecasing.0=Singularity Reinforced Stellar Shielding Casing +achievement.gt.godforgecasing.1=Celestial Matter Guidance Casing +achievement.gt.godforgecasing.2=Boundless Gravitationally Severed Structure Casing +achievement.gt.godforgecasing.3=Transcendentally Amplified Magnetic Confinement Casing +achievement.gt.godforgecasing.4=Stellar Energy Siphon Casing +achievement.gt.godforgecasing.5=Remote Graviton Flow Modulator +achievement.gt.godforgecasing.6=Medial Graviton Flow Modulator +achievement.gt.godforgecasing.7=Central Graviton Flow Modulator + +gt.blockmachines.multimachine.FOG.parallel=Parallel +gt.blockmachines.multimachine.FOG.batch=Batch Size +gt.blockmachines.multimachine.FOG.fuelconsumption=Stellar Fuel Consumption Factor +gt.blockmachines.multimachine.FOG.fuelinfo.0=The Stellar Fuel Consumption Factor is the main determining factor in calculating the total stellar fuel consumption per second. Each fuel type has different scaling, which is as follows: +gt.blockmachines.multimachine.FOG.fuelinfo.1=Dimensionally Transcendent Residue: factor*300*1.15^factor +gt.blockmachines.multimachine.FOG.fuelinfo.2=Condensed Raw Stellar Plasma Mixture: factor*2*1.08^factor +gt.blockmachines.multimachine.FOG.fuelinfo.3=Magnetohydrodynamically Constrained Star Matter: factor/25 +gt.blockmachines.multimachine.FOG.fuelinfo.4=Upgrades can influence these formulas, the changes are listed in the respective upgrades' descriptions. +gt.blockmachines.multimachine.FOG.fueltype=Click to Select Fuel Type +gt.blockmachines.multimachine.FOG.fuelusage=Fuel Usage +gt.blockmachines.multimachine.FOG.plasmamultistep=Multi-Step plasma +gt.blockmachines.multimachine.FOG.plasmarecipetier=Fusion Tier +gt.blockmachines.multimachine.FOG.storedfuel=Stored fuel amount: + # Optical Circuits achievement.gt.metaitem.03.32155=Optical Assembly achievement.gt.metaitem.03.32156=Optical Computer @@ -987,6 +1123,8 @@ GT5U.gui.text.invalid_current_setting=§7Invalid current setting GT5U.gui.text.invalid_time_setting=§7Invalid time setting GT5U.gui.text.invalid_overdrive_setting=§7Invalid overdrive setting GT5U.gui.text.insufficient_power_no_val=§7Insufficient power +GT5U.gui.text.missing_upgrades=§7Missing upgrades +GT5U.gui.text.waiting_for_inputs=§7Waiting for inputs # RecipeMaps gt.recipe.eyeofharmony=Eye of Harmony diff --git a/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png b/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png new file mode 100644 index 000000000..d8b0bed4a Binary files /dev/null and b/src/main/resources/assets/tectech/textures/blocks/blockSpatiallyTranscendentGravitationalLens.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png b/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png new file mode 100644 index 000000000..8a4dc4730 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/blue_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/background/green_glow.png b/src/main/resources/assets/tectech/textures/gui/background/green_glow.png new file mode 100644 index 000000000..ff6c8ac7f Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/green_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png b/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png new file mode 100644 index 000000000..1e3d22f8c Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/orange_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png b/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png new file mode 100644 index 000000000..434e23ad4 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/purple_glow.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/background/star.png b/src/main/resources/assets/tectech/textures/gui/background/star.png new file mode 100644 index 000000000..ad21ad086 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/background/star.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/button/celestial.png b/src/main/resources/assets/tectech/textures/gui/button/celestial.png new file mode 100644 index 000000000..5b9bc0688 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/button/celestial.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png b/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png new file mode 100644 index 000000000..04d5ab80b Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/overlay_button/arrow_blue_up.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/connector.png b/src/main/resources/assets/tectech/textures/gui/picture/connector.png new file mode 100644 index 000000000..c333d0ded Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/connector.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png b/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png new file mode 100644 index 000000000..c043180b5 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/connector_empty.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png b/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png new file mode 100644 index 000000000..f72c959a5 Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/connector_switch.png differ diff --git a/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png b/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png new file mode 100644 index 000000000..daa67e29c Binary files /dev/null and b/src/main/resources/assets/tectech/textures/gui/picture/green_selector.png differ