From 1b820de08a05070909a267e17f033fcf58ac8710 Mon Sep 17 00:00:00 2001 From: NotAPenguin Date: Mon, 2 Sep 2024 23:17:17 +0200 Subject: The Great Renaming (#3014) * move kekztech to a single root dir * move detrav to a single root dir * move gtnh-lanthanides to a single root dir * move tectech and delete some gross reflection in gt++ * remove more reflection inside gt5u * delete more reflection in gt++ * fix imports * move bartworks and bwcrossmod * fix proxies * move galactigreg and ggfab * move gtneioreplugin * try to fix gt++ bee loader * apply the rename rules to BW * apply rename rules to bwcrossmod * apply rename rules to detrav scanner mod * apply rename rules to galacticgreg * apply rename rules to ggfab * apply rename rules to goodgenerator * apply rename rules to gtnh-lanthanides * apply rename rules to gt++ * apply rename rules to kekztech * apply rename rules to kubatech * apply rename rules to tectech * apply rename rules to gt apply the rename rules to gt * fix tt import * fix mui hopefully * fix coremod except intergalactic * rename assline recipe class * fix a class name i stumbled on * rename StructureUtility to GTStructureUtility to prevent conflict with structurelib * temporary rename of GTTooltipDataCache to old name * fix gt client/server proxy names --- .../java/gregtech/api/util/AssemblyLineServer.java | 297 ++ .../java/gregtech/api/util/AssemblyLineUtils.java | 561 +++ .../gregtech/api/util/BlastFurnaceGasStat.java | 5 +- .../java/gregtech/api/util/CircuitryBehavior.java | 212 + .../gregtech/api/util/ColorsMetadataSection.java | 2 +- .../api/util/ColorsMetadataSectionSerializer.java | 12 +- src/main/java/gregtech/api/util/CoverBehavior.java | 402 ++ .../java/gregtech/api/util/CoverBehaviorBase.java | 839 ++++ .../gregtech/api/util/ExoticEnergyInputHelper.java | 103 + .../java/gregtech/api/util/FishPondFakeRecipe.java | 8 +- .../java/gregtech/api/util/GTApiaryModifier.java | 24 + .../java/gregtech/api/util/GTApiaryUpgrade.java | 224 + src/main/java/gregtech/api/util/GTBaseCrop.java | 311 ++ src/main/java/gregtech/api/util/GTBlockMap.java | 134 + src/main/java/gregtech/api/util/GTBlockSet.java | 39 + src/main/java/gregtech/api/util/GTCLSCompat.java | 157 + .../gregtech/api/util/GTChunkAssociatedData.java | 494 ++ .../java/gregtech/api/util/GTClientPreference.java | 43 + src/main/java/gregtech/api/util/GTConfig.java | 162 + src/main/java/gregtech/api/util/GTCreativeTab.java | 26 + src/main/java/gregtech/api/util/GTFoodStat.java | 122 + .../java/gregtech/api/util/GTForestryCompat.java | 193 + src/main/java/gregtech/api/util/GTGCCompat.java | 52 + .../java/gregtech/api/util/GTIBoxableWrapper.java | 13 + .../api/util/GTItsNotMyFaultException.java | 18 + .../java/gregtech/api/util/GTLanguageManager.java | 603 +++ src/main/java/gregtech/api/util/GTLog.java | 45 + src/main/java/gregtech/api/util/GTModHandler.java | 2435 ++++++++++ src/main/java/gregtech/api/util/GTMusicSystem.java | 667 +++ .../gregtech/api/util/GTOreDictUnificator.java | 578 +++ src/main/java/gregtech/api/util/GTPlayedSound.java | 31 + src/main/java/gregtech/api/util/GTRecipe.java | 1366 ++++++ .../java/gregtech/api/util/GTRecipeBuilder.java | 946 ++++ .../java/gregtech/api/util/GTRecipeConstants.java | 691 +++ .../java/gregtech/api/util/GTRecipeMapUtil.java | 198 + .../gregtech/api/util/GTRecipeRegistrator.java | 872 ++++ .../java/gregtech/api/util/GTRenderingWorld.java | 195 + .../java/gregtech/api/util/GTShapedRecipe.java | 100 + .../java/gregtech/api/util/GTShapelessRecipe.java | 100 + .../gregtech/api/util/GTSpawnEventHandler.java | 81 + src/main/java/gregtech/api/util/GTStreamUtil.java | 44 + .../java/gregtech/api/util/GTStructureUtility.java | 616 +++ .../gregtech/api/util/GTToolHarvestHelper.java | 71 + .../java/gregtech/api/util/GTTooltipDataCache.java | 104 + src/main/java/gregtech/api/util/GTUtil.java | 344 ++ src/main/java/gregtech/api/util/GTUtility.java | 4852 +++++++++++++++++++ .../java/gregtech/api/util/GTUtilityClient.java | 52 + src/main/java/gregtech/api/util/GTWaila.java | 23 + .../java/gregtech/api/util/GT_ApiaryModifier.java | 24 - .../java/gregtech/api/util/GT_ApiaryUpgrade.java | 225 - .../gregtech/api/util/GT_AssemblyLineUtils.java | 559 --- .../gregtech/api/util/GT_Assemblyline_Server.java | 297 -- src/main/java/gregtech/api/util/GT_BaseCrop.java | 311 -- src/main/java/gregtech/api/util/GT_BlockMap.java | 134 - src/main/java/gregtech/api/util/GT_BlockSet.java | 39 - src/main/java/gregtech/api/util/GT_CLS_Compat.java | 157 - .../gregtech/api/util/GT_ChunkAssociatedData.java | 494 -- .../gregtech/api/util/GT_CircuitryBehavior.java | 212 - .../gregtech/api/util/GT_ClientPreference.java | 43 - src/main/java/gregtech/api/util/GT_Config.java | 162 - .../java/gregtech/api/util/GT_CoverBehavior.java | 402 -- .../gregtech/api/util/GT_CoverBehaviorBase.java | 839 ---- .../java/gregtech/api/util/GT_CreativeTab.java | 26 - .../api/util/GT_ExoticEnergyInputHelper.java | 114 - src/main/java/gregtech/api/util/GT_FoodStat.java | 122 - .../java/gregtech/api/util/GT_Forestry_Compat.java | 193 - src/main/java/gregtech/api/util/GT_GC_Compat.java | 52 - .../gregtech/api/util/GT_HatchElementBuilder.java | 547 --- .../java/gregtech/api/util/GT_IBoxableWrapper.java | 13 - .../api/util/GT_ItsNotMyFaultException.java | 18 - .../gregtech/api/util/GT_JubilanceMegaApiary.java | 23 - .../java/gregtech/api/util/GT_LanguageManager.java | 603 --- src/main/java/gregtech/api/util/GT_Log.java | 45 - src/main/java/gregtech/api/util/GT_ModHandler.java | 2437 ---------- .../api/util/GT_Multiblock_Tooltip_Builder.java | 735 --- .../java/gregtech/api/util/GT_MusicSystem.java | 667 --- .../gregtech/api/util/GT_OreDictUnificator.java | 578 --- .../gregtech/api/util/GT_OverclockCalculator.java | 621 --- .../gregtech/api/util/GT_PCBFactoryManager.java | 25 - .../java/gregtech/api/util/GT_ParallelHelper.java | 713 --- .../java/gregtech/api/util/GT_PlayedSound.java | 31 - .../api/util/GT_ProcessingArray_Manager.java | 51 - src/main/java/gregtech/api/util/GT_Recipe.java | 1366 ------ .../java/gregtech/api/util/GT_RecipeBuilder.java | 946 ---- .../java/gregtech/api/util/GT_RecipeConstants.java | 692 --- .../java/gregtech/api/util/GT_RecipeMapUtil.java | 198 - .../gregtech/api/util/GT_RecipeRegistrator.java | 872 ---- .../java/gregtech/api/util/GT_RenderingWorld.java | 195 - .../java/gregtech/api/util/GT_Shaped_Recipe.java | 100 - .../gregtech/api/util/GT_Shapeless_Recipe.java | 100 - .../gregtech/api/util/GT_SpawnEventHandler.java | 81 - src/main/java/gregtech/api/util/GT_StreamUtil.java | 44 - .../gregtech/api/util/GT_StructureUtility.java | 618 --- .../gregtech/api/util/GT_StructureUtilityMuTE.java | 8 +- .../gregtech/api/util/GT_ToolHarvestHelper.java | 71 - .../gregtech/api/util/GT_TooltipDataCache.java | 9 +- src/main/java/gregtech/api/util/GT_Util.java | 347 -- src/main/java/gregtech/api/util/GT_Utility.java | 4859 -------------------- .../java/gregtech/api/util/GT_UtilityClient.java | 52 - src/main/java/gregtech/api/util/GT_Waila.java | 23 - .../gregtech/api/util/HatchElementBuilder.java | 546 +++ src/main/java/gregtech/api/util/IGTHatchAdder.java | 28 + .../java/gregtech/api/util/IGT_HatchAdder.java | 28 - .../gregtech/api/util/JubilanceMegaApiary.java | 23 + .../api/util/MultiblockTooltipBuilder.java | 735 +++ .../java/gregtech/api/util/OutputHatchWrapper.java | 6 +- .../gregtech/api/util/OverclockCalculator.java | 621 +++ .../java/gregtech/api/util/PCBFactoryManager.java | 25 + .../java/gregtech/api/util/ParallelHelper.java | 713 +++ .../gregtech/api/util/ProcessingArrayManager.java | 51 + .../gregtech/api/util/SemiFluidFuelHandler.java | 10 +- .../gregtech/api/util/VoidProtectionHelper.java | 2 +- .../java/gregtech/api/util/item/ItemHolder.java | 4 +- .../api/util/recipe/RecipeInputRequirements.java | 8 +- .../api/util/shutdown/ReasonOutOfFluid.java | 4 +- .../api/util/shutdown/ReasonOutOfItem.java | 2 +- .../api/util/shutdown/ReasonOutOfStuff.java | 2 +- .../api/util/shutdown/ShutDownReasonRegistry.java | 2 +- 118 files changed, 22223 insertions(+), 22147 deletions(-) create mode 100644 src/main/java/gregtech/api/util/AssemblyLineServer.java create mode 100644 src/main/java/gregtech/api/util/AssemblyLineUtils.java create mode 100644 src/main/java/gregtech/api/util/CircuitryBehavior.java create mode 100644 src/main/java/gregtech/api/util/CoverBehavior.java create mode 100644 src/main/java/gregtech/api/util/CoverBehaviorBase.java create mode 100644 src/main/java/gregtech/api/util/ExoticEnergyInputHelper.java create mode 100644 src/main/java/gregtech/api/util/GTApiaryModifier.java create mode 100644 src/main/java/gregtech/api/util/GTApiaryUpgrade.java create mode 100644 src/main/java/gregtech/api/util/GTBaseCrop.java create mode 100644 src/main/java/gregtech/api/util/GTBlockMap.java create mode 100644 src/main/java/gregtech/api/util/GTBlockSet.java create mode 100644 src/main/java/gregtech/api/util/GTCLSCompat.java create mode 100644 src/main/java/gregtech/api/util/GTChunkAssociatedData.java create mode 100644 src/main/java/gregtech/api/util/GTClientPreference.java create mode 100644 src/main/java/gregtech/api/util/GTConfig.java create mode 100644 src/main/java/gregtech/api/util/GTCreativeTab.java create mode 100644 src/main/java/gregtech/api/util/GTFoodStat.java create mode 100644 src/main/java/gregtech/api/util/GTForestryCompat.java create mode 100644 src/main/java/gregtech/api/util/GTGCCompat.java create mode 100644 src/main/java/gregtech/api/util/GTIBoxableWrapper.java create mode 100644 src/main/java/gregtech/api/util/GTItsNotMyFaultException.java create mode 100644 src/main/java/gregtech/api/util/GTLanguageManager.java create mode 100644 src/main/java/gregtech/api/util/GTLog.java create mode 100644 src/main/java/gregtech/api/util/GTModHandler.java create mode 100644 src/main/java/gregtech/api/util/GTMusicSystem.java create mode 100644 src/main/java/gregtech/api/util/GTOreDictUnificator.java create mode 100644 src/main/java/gregtech/api/util/GTPlayedSound.java create mode 100644 src/main/java/gregtech/api/util/GTRecipe.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeBuilder.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeConstants.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeMapUtil.java create mode 100644 src/main/java/gregtech/api/util/GTRecipeRegistrator.java create mode 100644 src/main/java/gregtech/api/util/GTRenderingWorld.java create mode 100644 src/main/java/gregtech/api/util/GTShapedRecipe.java create mode 100644 src/main/java/gregtech/api/util/GTShapelessRecipe.java create mode 100644 src/main/java/gregtech/api/util/GTSpawnEventHandler.java create mode 100644 src/main/java/gregtech/api/util/GTStreamUtil.java create mode 100644 src/main/java/gregtech/api/util/GTStructureUtility.java create mode 100644 src/main/java/gregtech/api/util/GTToolHarvestHelper.java create mode 100644 src/main/java/gregtech/api/util/GTTooltipDataCache.java create mode 100644 src/main/java/gregtech/api/util/GTUtil.java create mode 100644 src/main/java/gregtech/api/util/GTUtility.java create mode 100644 src/main/java/gregtech/api/util/GTUtilityClient.java create mode 100644 src/main/java/gregtech/api/util/GTWaila.java delete mode 100644 src/main/java/gregtech/api/util/GT_ApiaryModifier.java delete mode 100644 src/main/java/gregtech/api/util/GT_ApiaryUpgrade.java delete mode 100644 src/main/java/gregtech/api/util/GT_AssemblyLineUtils.java delete mode 100644 src/main/java/gregtech/api/util/GT_Assemblyline_Server.java delete mode 100644 src/main/java/gregtech/api/util/GT_BaseCrop.java delete mode 100644 src/main/java/gregtech/api/util/GT_BlockMap.java delete mode 100644 src/main/java/gregtech/api/util/GT_BlockSet.java delete mode 100644 src/main/java/gregtech/api/util/GT_CLS_Compat.java delete mode 100644 src/main/java/gregtech/api/util/GT_ChunkAssociatedData.java delete mode 100644 src/main/java/gregtech/api/util/GT_CircuitryBehavior.java delete mode 100644 src/main/java/gregtech/api/util/GT_ClientPreference.java delete mode 100644 src/main/java/gregtech/api/util/GT_Config.java delete mode 100644 src/main/java/gregtech/api/util/GT_CoverBehavior.java delete mode 100644 src/main/java/gregtech/api/util/GT_CoverBehaviorBase.java delete mode 100644 src/main/java/gregtech/api/util/GT_CreativeTab.java delete mode 100644 src/main/java/gregtech/api/util/GT_ExoticEnergyInputHelper.java delete mode 100644 src/main/java/gregtech/api/util/GT_FoodStat.java delete mode 100644 src/main/java/gregtech/api/util/GT_Forestry_Compat.java delete mode 100644 src/main/java/gregtech/api/util/GT_GC_Compat.java delete mode 100644 src/main/java/gregtech/api/util/GT_HatchElementBuilder.java delete mode 100644 src/main/java/gregtech/api/util/GT_IBoxableWrapper.java delete mode 100644 src/main/java/gregtech/api/util/GT_ItsNotMyFaultException.java delete mode 100644 src/main/java/gregtech/api/util/GT_JubilanceMegaApiary.java delete mode 100644 src/main/java/gregtech/api/util/GT_LanguageManager.java delete mode 100644 src/main/java/gregtech/api/util/GT_Log.java delete mode 100644 src/main/java/gregtech/api/util/GT_ModHandler.java delete mode 100644 src/main/java/gregtech/api/util/GT_Multiblock_Tooltip_Builder.java delete mode 100644 src/main/java/gregtech/api/util/GT_MusicSystem.java delete mode 100644 src/main/java/gregtech/api/util/GT_OreDictUnificator.java delete mode 100644 src/main/java/gregtech/api/util/GT_OverclockCalculator.java delete mode 100644 src/main/java/gregtech/api/util/GT_PCBFactoryManager.java delete mode 100644 src/main/java/gregtech/api/util/GT_ParallelHelper.java delete mode 100644 src/main/java/gregtech/api/util/GT_PlayedSound.java delete mode 100644 src/main/java/gregtech/api/util/GT_ProcessingArray_Manager.java delete mode 100644 src/main/java/gregtech/api/util/GT_Recipe.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeBuilder.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeConstants.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeMapUtil.java delete mode 100644 src/main/java/gregtech/api/util/GT_RecipeRegistrator.java delete mode 100644 src/main/java/gregtech/api/util/GT_RenderingWorld.java delete mode 100644 src/main/java/gregtech/api/util/GT_Shaped_Recipe.java delete mode 100644 src/main/java/gregtech/api/util/GT_Shapeless_Recipe.java delete mode 100644 src/main/java/gregtech/api/util/GT_SpawnEventHandler.java delete mode 100644 src/main/java/gregtech/api/util/GT_StreamUtil.java delete mode 100644 src/main/java/gregtech/api/util/GT_StructureUtility.java delete mode 100644 src/main/java/gregtech/api/util/GT_ToolHarvestHelper.java delete mode 100644 src/main/java/gregtech/api/util/GT_Util.java delete mode 100644 src/main/java/gregtech/api/util/GT_Utility.java delete mode 100644 src/main/java/gregtech/api/util/GT_UtilityClient.java delete mode 100644 src/main/java/gregtech/api/util/GT_Waila.java create mode 100644 src/main/java/gregtech/api/util/HatchElementBuilder.java create mode 100644 src/main/java/gregtech/api/util/IGTHatchAdder.java delete mode 100644 src/main/java/gregtech/api/util/IGT_HatchAdder.java create mode 100644 src/main/java/gregtech/api/util/JubilanceMegaApiary.java create mode 100644 src/main/java/gregtech/api/util/MultiblockTooltipBuilder.java create mode 100644 src/main/java/gregtech/api/util/OverclockCalculator.java create mode 100644 src/main/java/gregtech/api/util/PCBFactoryManager.java create mode 100644 src/main/java/gregtech/api/util/ParallelHelper.java create mode 100644 src/main/java/gregtech/api/util/ProcessingArrayManager.java (limited to 'src/main/java/gregtech/api/util') diff --git a/src/main/java/gregtech/api/util/AssemblyLineServer.java b/src/main/java/gregtech/api/util/AssemblyLineServer.java new file mode 100644 index 0000000000..49e3882982 --- /dev/null +++ b/src/main/java/gregtech/api/util/AssemblyLineServer.java @@ -0,0 +1,297 @@ +package gregtech.api.util; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; + +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import gregtech.api.GregTechAPI; +import gregtech.api.enums.Materials; +import gregtech.api.enums.MaterialsBotania; + +public class AssemblyLineServer { + + public static LinkedHashMap lServerNames = new LinkedHashMap<>(); + private static LinkedHashMap internal2 = new LinkedHashMap<>(), internal3 = new LinkedHashMap<>(), + internal4 = new LinkedHashMap<>(); + private static HashMap internal = new HashMap<>(); + + public static void fillMap(FMLPreInitializationEvent aEvent) { + Configuration conf = GTLanguageManager.sEnglishFile; + + ConfigCategory cat = conf.getCategory("languagefile"); + internal.putAll(cat.getValues()); + for (Map.Entry entry : internal.entrySet()) { + try { + String s = entry.getValue() + .getString() + .replaceAll("%", ""); + + if (entry.getKey() + .contains("metaitem") && s.contains("material")) internal2.put(entry.getKey(), s); + else if (entry.getKey() + .contains("blockmachines") && s.contains("material")) internal3.put(entry.getKey(), s); + else if ((entry.getKey() + .contains("blockores") + || (entry.getKey() + .contains("blockmetal") + || entry.getKey() + .contains("blockgem"))) + && s.contains("material")) internal4.put(entry.getKey(), s); + else lServerNames.put(entry.getKey(), s); + } catch (Exception ignored) {} + } + for (Map.Entry entry : internal2.entrySet()) { + try { + if (entry.getKey() + .contains("name")) { + int i = Integer.parseInt( + entry.getKey() + .substring( + "gt.metaitem.01.".length(), + entry.getKey() + .length() - ".name".length())); + i = i % 1000; + if (GregTechAPI.sGeneratedMaterials[i] != null) lServerNames.put( + entry.getKey(), + entry.getValue() + .replace("material", GregTechAPI.sGeneratedMaterials[i].toString())); + else lServerNames.put(entry.getKey(), null); + } + } catch (Exception ignored) {} + } + for (Map.Entry entry : internal3.entrySet()) { + try { + if (entry.getKey() + .contains("cable")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.cable.".length(), + entry.getKey() + .length() - ".01.name".length()))); + else if (entry.getKey() + .contains("gt_frame_")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_frame_".length(), + entry.getKey() + .length() - ".name".length()))); + else if (entry.getKey() + .contains("gt_pipe_")) { + if (!entry.getKey() + .contains("_huge") + && !entry.getKey() + .contains("_large") + && !entry.getKey() + .contains("_nonuple") + && !entry.getKey() + .contains("_quadruple") + && !entry.getKey() + .contains("_small") + && !entry.getKey() + .contains("_tiny")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - ".name".length()))); + else if (entry.getKey() + .contains("_huge") + || entry.getKey() + .contains("_tiny")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_tiny.name".length()))); + else if (entry.getKey() + .contains("_large") + || entry.getKey() + .contains("_small")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_large.name".length()))); + else if (entry.getKey() + .contains("_nonuple")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_nonuple.name".length()))); + else if (entry.getKey() + .contains("_quadruple")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.gt_pipe_".length(), + entry.getKey() + .length() - "_quadruple.name".length()))); + } else if (entry.getKey() + .contains("wire")) + lServerNames.put( + entry.getKey(), + entry.getValue() + .replace( + "material", + entry.getKey() + .substring( + "gt.blockmachines.wire.".length(), + entry.getKey() + .length() - ".01.name".length()))); + else lServerNames.put(entry.getKey(), entry.getValue()); + } catch (Exception ignored) {} + } + for (Map.Entry entry : internal4.entrySet()) { + try { + if (entry.getKey() + .contains("blockores")) { + int i = Integer.parseInt( + entry.getKey() + .substring( + "gt.blockores.".length(), + entry.getKey() + .length() - ".name".length())); + i = i % 1000; + if (GregTechAPI.sGeneratedMaterials[i] != null) lServerNames.put( + entry.getKey(), + entry.getValue() + .replace("material", GregTechAPI.sGeneratedMaterials[i].toString())); + else lServerNames.put(entry.getKey(), null); + } else if (entry.getKey() + .contains("blockmetal")) { + Materials[] mMats = null; + String t = entry.getKey() + .substring("gt.blockmetal".length()); + t = t.substring(0, 1); + int i = Integer.parseInt(t); + switch (i) { + case 1 -> mMats = new Materials[] { Materials.Adamantium, Materials.Aluminium, + Materials.Americium, Materials.AnnealedCopper, Materials.Antimony, Materials.Arsenic, + Materials.AstralSilver, Materials.BatteryAlloy, Materials.Beryllium, Materials.Bismuth, + Materials.BismuthBronze, Materials.BlackBronze, Materials.BlackSteel, + Materials.BlueAlloy, Materials.BlueSteel, Materials.Brass }; + case 2 -> mMats = new Materials[] { Materials.Bronze, Materials.Caesium, Materials.Cerium, + Materials.Chrome, Materials.ChromiumDioxide, Materials.Cobalt, Materials.CobaltBrass, + Materials.Copper, Materials.Cupronickel, Materials.DamascusSteel, Materials.DarkIron, + Materials.DeepIron, Materials.Desh, Materials.Duranium, Materials.Dysprosium, + Materials.Electrum }; + case 3 -> mMats = new Materials[] { Materials.ElectrumFlux, Materials.Enderium, + Materials.Erbium, Materials.Europium, Materials.FierySteel, Materials.Gadolinium, + Materials.Gallium, Materials.Holmium, Materials.HSLA, Materials.Indium, + Materials.InfusedGold, Materials.Invar, Materials.Iridium, Materials.IronMagnetic, + Materials.IronWood, Materials.Kanthal }; + case 4 -> mMats = new Materials[] { Materials.Knightmetal, Materials.Lanthanum, + Materials.Lead, Materials.Lutetium, Materials.Magnalium, Materials.Magnesium, + Materials.Manganese, Materials.MeteoricIron, Materials.MeteoricSteel, Materials.Trinium, + Materials.Mithril, Materials.Molybdenum, Materials.Naquadah, Materials.NaquadahAlloy, + Materials.NaquadahEnriched, Materials.Naquadria }; + case 5 -> mMats = new Materials[] { Materials.Neodymium, Materials.NeodymiumMagnetic, + Materials.Neutronium, Materials.Nichrome, Materials.Nickel, Materials.Niobium, + Materials.NiobiumNitride, Materials.NiobiumTitanium, Materials.Osmiridium, + Materials.Osmium, Materials.Palladium, Materials.PigIron, Materials.Platinum, + Materials.Plutonium, Materials.Plutonium241, Materials.Praseodymium }; + case 6 -> mMats = new Materials[] { Materials.Promethium, Materials.RedAlloy, + Materials.RedSteel, Materials.RoseGold, Materials.Rubidium, Materials.Samarium, + Materials.Scandium, Materials.ShadowIron, Materials.ShadowSteel, Materials.Silicon, + Materials.Silver, Materials.SolderingAlloy, Materials.StainlessSteel, Materials.Steel, + Materials.SteelMagnetic, Materials.SterlingSilver }; + case 7 -> mMats = new Materials[] { Materials.Sunnarium, Materials.Tantalum, + Materials.Tellurium, Materials.Terbium, Materials.Thaumium, Materials.Thorium, + Materials.Thulium, Materials.Tin, Materials.TinAlloy, Materials.Titanium, + Materials.Tritanium, Materials.Tungsten, Materials.TungstenSteel, Materials.Ultimet, + Materials.Uranium, Materials.Uranium235 }; + case 8 -> mMats = new Materials[] { Materials.Vanadium, Materials.VanadiumGallium, + Materials.WroughtIron, Materials.Ytterbium, Materials.Yttrium, + Materials.YttriumBariumCuprate, Materials.Zinc, Materials.TungstenCarbide, + Materials.VanadiumSteel, Materials.HSSG, Materials.HSSE, Materials.HSSS, + Materials.Steeleaf, Materials.Ichorium, Materials.Firestone }; + } + t = entry.getKey() + .substring( + "gt.blockmetal1.".length(), + entry.getKey() + .length() - ".name".length()); + i = Integer.parseInt(t); + lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString()); + mMats = null; + } else if (entry.getKey() + .contains("blockgem")) { + Materials[] mMats = null; + String t = entry.getKey() + .substring("gt.blockgem".length()); + t = t.substring(0, 1); + int i = Integer.parseInt(t); + switch (i) { + case 1 -> mMats = new Materials[] { Materials.InfusedAir, Materials.Amber, + Materials.Amethyst, Materials.InfusedWater, Materials.BlueTopaz, + Materials.CertusQuartz, Materials.Dilithium, Materials.EnderEye, + Materials.EnderPearl, Materials.FoolsRuby, Materials.Force, Materials.Forcicium, + Materials.Forcillium, Materials.GreenSapphire, Materials.InfusedFire, + Materials.Jasper, MaterialsBotania.ManaDiamond, + MaterialsBotania.BotaniaDragonstone }; + case 2 -> mMats = new Materials[] { Materials.Lazurite, Materials.Lignite, + Materials.Monazite, Materials.Niter, Materials.Olivine, Materials.Opal, + Materials.InfusedOrder, Materials.InfusedEntropy, Materials.Phosphorus, + Materials.Quartzite, Materials.GarnetRed, Materials.Ruby, Materials.Sapphire, + Materials.Sodalite, Materials.Tanzanite, Materials.InfusedEarth }; + case 3 -> mMats = new Materials[] { Materials.Topaz, Materials.Vinteum, + Materials.GarnetYellow, Materials.NetherStar, Materials.Charcoal, Materials.Blaze }; + } + t = entry.getKey() + .substring( + "gt.blockgem1.".length(), + entry.getKey() + .length() - ".name".length()); + i = Integer.parseInt(t); + lServerNames.put(entry.getKey(), "Block of " + mMats[i].toString()); + mMats = null; + } + } catch (Exception ignored) {} + } + + internal = null; + internal2 = null; + internal3 = null; + internal4 = null; + } +} diff --git a/src/main/java/gregtech/api/util/AssemblyLineUtils.java b/src/main/java/gregtech/api/util/AssemblyLineUtils.java new file mode 100644 index 0000000000..22bed1884b --- /dev/null +++ b/src/main/java/gregtech/api/util/AssemblyLineUtils.java @@ -0,0 +1,561 @@ +package gregtech.api.util; + +import static gregtech.GTMod.GT_FML_LOGGER; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.common.util.Constants.NBT; +import net.minecraftforge.fluids.FluidStack; + +import cpw.mods.fml.common.FMLCommonHandler; +import gregtech.api.enums.GTValues; +import gregtech.api.enums.ItemList; +import gregtech.api.objects.GTItemStack; +import gregtech.api.util.GTRecipe.RecipeAssemblyLine; + +public class AssemblyLineUtils { + + /** + * A cache of Recipes using the Output as Key. + */ + private static final HashMap sRecipeCacheByOutput = new HashMap<>(); + /** + * A cache of Recipes using the Recipe Hash String as Key. + */ + private static final HashMap sRecipeCacheByRecipeHash = new HashMap<>(); + + /** + * Checks the DataStick for deprecated/invalid recipes, updating them as required. + * + * @param aDataStick - The DataStick to process + * @return Is this DataStick now valid with a current recipe? + */ + public static GTRecipe.RecipeAssemblyLine processDataStick(ItemStack aDataStick) { + if (!isItemDataStick(aDataStick)) { + return null; + } + if (doesDataStickNeedUpdate(aDataStick)) { + ItemStack aStickOutput = getDataStickOutput(aDataStick); + if (aStickOutput != null) { + GTRecipe.RecipeAssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput); + if (aIntendedRecipe != null && setAssemblyLineRecipeOnDataStick(aDataStick, aIntendedRecipe)) + return aIntendedRecipe; + } + } + return null; + } + + /** + * Finds an Assembly Line recipe from a DataStick. + * + * @param aDataStick - The DataStick to check. + * @return The GTRecipe_AssemblyLine recipe contained on the DataStick, if any. + */ + public static RecipeAssemblyLine findAssemblyLineRecipeFromDataStick(ItemStack aDataStick) { + return findAssemblyLineRecipeFromDataStick(aDataStick, false).getRecipe(); + } + + /** + * Finds an Assembly Line recipe from a DataStick. + * + * @param aDataStick - The DataStick to check. + * @param aReturnBuiltRecipe - Do we return a GTRecipe_AssemblyLine built from the data on the Data Stick instead + * of searching the Recipe Map? + * @return The GTRecipe_AssemblyLine recipe contained on the DataStick, if any. + */ + @Nonnull + public static LookupResult findAssemblyLineRecipeFromDataStick(ItemStack aDataStick, boolean aReturnBuiltRecipe) { + if (!isItemDataStick(aDataStick) || !doesDataStickHaveOutput(aDataStick)) { + return LookupResultType.INVALID_STICK.getResult(); + } + List aInputs = new ArrayList<>(16); + ItemStack aOutput = getDataStickOutput(aDataStick); + List> mOreDictAlt = new ArrayList<>(16); + List aFluidInputs = new ArrayList<>(4); + + NBTTagCompound aTag = aDataStick.getTagCompound(); + if (aTag == null) { + return LookupResultType.INVALID_STICK.getResult(); + } + + // Get From Cache + if (doesDataStickHaveRecipeHash(aDataStick)) { + GTRecipe.RecipeAssemblyLine aRecipeFromCache = sRecipeCacheByRecipeHash + .get(getHashFromDataStack(aDataStick)); + if (aRecipeFromCache != null && GTUtility.areStacksEqual(aOutput, aRecipeFromCache.mOutput)) { + return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipeFromCache); + } // else: no cache, or the old recipe run into a hash collision with a different new recipe + } + + for (int i = 0; i < 16; i++) { + int count = aTag.getInteger("a" + i); + if (!aTag.hasKey("" + i) && count <= 0) { + continue; + } + + List tAltCurrent = new ArrayList<>(); + for (int j = 0; j < count; j++) { + ItemStack tLoaded = GTUtility.loadItem(aTag, "a" + i + ":" + j); + if (tLoaded == null) { + continue; + } + tAltCurrent.add(tLoaded); + if (GTValues.D1) { + GT_FML_LOGGER.info("Item Alt " + i + " : " + tLoaded.getUnlocalizedName()); + } + } + mOreDictAlt.add(tAltCurrent); + ItemStack tLoaded = GTUtility.loadItem(aTag, "" + i); + if (tLoaded == null) { + continue; + } + aInputs.add(tLoaded); + if (GTValues.D1) { + GT_FML_LOGGER.info("Item " + i + " : " + tLoaded.getUnlocalizedName()); + } + } + + if (GTValues.D1) { + GT_FML_LOGGER.info("All Items done, start fluid check"); + } + for (int i = 0; i < 4; i++) { + if (!aTag.hasKey("f" + i)) continue; + FluidStack tLoaded = GTUtility.loadFluid(aTag, "f" + i); + if (tLoaded == null) continue; + aFluidInputs.add(tLoaded); + if (GTValues.D1) { + GT_FML_LOGGER.info("Fluid " + i + " " + tLoaded.getUnlocalizedName()); + } + } + if (!aTag.hasKey("output") || !aTag.hasKey("time") + || aTag.getInteger("time") <= 0 + || !aTag.hasKey("eu") + || !GTUtility.isStackValid(aOutput)) { + return LookupResultType.INVALID_STICK.getResult(); + } + if (GTValues.D1) { + GT_FML_LOGGER.info("Found Data Stick recipe"); + } + + int aTime = aTag.getInteger("time"); + int aEU = aTag.getInteger("eu"); + + // Try build a recipe instance + if (aReturnBuiltRecipe) { + return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult( + new GTRecipe.RecipeAssemblyLine( + null, + 0, + aInputs.toArray(new ItemStack[0]), + aFluidInputs.toArray(new FluidStack[0]), + aOutput, + aTime, + aEU)); + } + + for (GTRecipe.RecipeAssemblyLine aRecipe : RecipeAssemblyLine.sAssemblylineRecipes) { + if (aRecipe.mEUt != aEU || aRecipe.mDuration != aTime) continue; + if (!GTUtility.areStacksEqual(aOutput, aRecipe.mOutput, true)) continue; + if (!GTUtility.areStackListsEqual(Arrays.asList(aRecipe.mInputs), aInputs, false, true)) continue; + if (!Objects.equals(Arrays.asList(aRecipe.mFluidInputs), aFluidInputs)) continue; + if (!areStacksEqual(aRecipe.mOreDictAlt, mOreDictAlt)) continue; + + // Cache it + String aRecipeHash = generateRecipeHash(aRecipe); + sRecipeCacheByRecipeHash.put(aRecipeHash, aRecipe); + sRecipeCacheByOutput.put(new GTItemStack(aRecipe.mOutput), aRecipe); + if (doesDataStickHaveRecipeHash(aDataStick)) { + String aStickHash = getHashFromDataStack(aDataStick); + if (aRecipeHash.equals(aStickHash)) + return LookupResultType.VALID_STACK_AND_VALID_HASH.getResult(aRecipe); + } + return LookupResultType.VALID_STACK_AND_VALID_RECIPE.getResult(aRecipe); + } + return LookupResultType.VALID_STACK_BUT_INVALID_RECIPE.getResult(); + } + + private static boolean areStacksEqual(ItemStack[][] lhs, List> rhs) { + for (int i = 0; i < lhs.length; i++) { + if (!areStacksEqual(lhs[i], rhs.get(i))) return false; + } + return true; + } + + private static boolean areStacksEqual(ItemStack[] lhs, List rhs) { + return lhs == null ? rhs.isEmpty() + : !rhs.isEmpty() && GTUtility.areStackListsEqual(Arrays.asList(lhs), rhs, false, true); + } + + /** + * Finds a GTRecipe_AssemblyLine based on the expected output ItemStack. + * + * @param aOutput - The Output of a GTRecipe_AssemblyLine. + * @return First found GTRecipe_AssemblyLine with matching output. + */ + public static GTRecipe.RecipeAssemblyLine findAssemblyLineRecipeByOutput(ItemStack aOutput) { + if (aOutput == null) { + return null; + } + + // Check the cache + GTItemStack aCacheStack = new GTItemStack(aOutput); + RecipeAssemblyLine aRecipeFromCache = sRecipeCacheByOutput.get(aCacheStack); + if (aRecipeFromCache != null) { + return aRecipeFromCache; + } + + // Iterate all recipes and return the first matching based on Output. + for (RecipeAssemblyLine aRecipe : GTRecipe.RecipeAssemblyLine.sAssemblylineRecipes) { + ItemStack aRecipeOutput = aRecipe.mOutput; + if (GTUtility.areStacksEqual(aRecipeOutput, aOutput)) { + // Cache it to prevent future iterations of all recipes + sRecipeCacheByOutput.put(aCacheStack, aRecipe); + sRecipeCacheByRecipeHash.put(generateRecipeHash(aRecipe), aRecipe); + return aRecipe; + } + } + return null; + } + + /** + * @param aRecipe - The recipe to generate a Recipe Hash String from. + * @return The Recipe Hash String. + */ + public static String generateRecipeHash(GTRecipe.RecipeAssemblyLine aRecipe) { + String aHash = "Invalid.Recipe.Hash"; + if (aRecipe != null) { + aHash = "Hash." + aRecipe.getPersistentHash(); + } + return aHash; + } + + /** + * @param aRecipe - The recipe to add to internal caches + * @throws IllegalArgumentException if given recipe collide with any existing recipe in the cache + */ + public static void addRecipeToCache(RecipeAssemblyLine aRecipe) { + if (aRecipe != null) { + String aHash = "Hash." + aRecipe.getPersistentHash(); + GTRecipe.RecipeAssemblyLine existing = sRecipeCacheByOutput.put(new GTItemStack(aRecipe.mOutput), aRecipe); + if (existing != null) throw new IllegalArgumentException("Duplicate assline recipe for " + aRecipe.mOutput); + existing = sRecipeCacheByRecipeHash.put(aHash, aRecipe); + if (existing != null && !existing.equals(aRecipe)) + throw new IllegalArgumentException("Recipe hash collision for " + aRecipe + " and " + existing); + } + } + + /** + * @param aHash - Recipe hash String, may be null but will just be treated as invalid. + * @return Is this Recipe Hash String valid? + */ + public static boolean isValidHash(String aHash) { + if (aHash != null && aHash.length() > 0) { + // persistent hash can never be 0 + return !aHash.equals("Invalid.Recipe.Hash") && !aHash.equals("Hash.0"); + } + return false; + } + + /** + * @param aStack - The ItemStack to check. + * @return Is this ItemStack a Data Stick? + */ + public static boolean isItemDataStick(ItemStack aStack) { + return GTUtility.isStackValid(aStack) && ItemList.Tool_DataStick.isStackEqual(aStack, false, true); + } + + /** + * @param aDataStick - The Data Stick to check. + * @return Does this Data Stick have a valid output ItemStack? + */ + public static boolean doesDataStickHaveOutput(ItemStack aDataStick) { + return isItemDataStick(aDataStick) && aDataStick.hasTagCompound() + && aDataStick.getTagCompound() + .hasKey("output"); + } + + /** + * @param aDataStick - The Data Stick to check. + * @return Does this Data Stick need recipe data updated. + */ + public static boolean doesDataStickNeedUpdate(ItemStack aDataStick) { + if (isItemDataStick(aDataStick) && doesDataStickHaveRecipeHash(aDataStick)) { + String aStickHash = getHashFromDataStack(aDataStick); + if (isValidHash(aStickHash) && doesDataStickHaveOutput(aDataStick)) { + ItemStack aStickOutput = getDataStickOutput(aDataStick); + GTRecipe.RecipeAssemblyLine aIntendedRecipe = findAssemblyLineRecipeByOutput(aStickOutput); + return !aStickHash.equals(generateRecipeHash(aIntendedRecipe)); + } + } + return true; + } + + /** + * @param aDataStick - The Data Stick to check. + * @return Does this have a Recipe Hash String at all? + */ + public static boolean doesDataStickHaveRecipeHash(ItemStack aDataStick) { + if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { + NBTTagCompound aNBT = aDataStick.getTagCompound(); + return aNBT.hasKey("Data.Recipe.Hash") && !aNBT.getString("Data.Recipe.Hash") + .equals("Hash.0"); + } + return false; + } + + /** + * Get the Output ItemStack from a Data Stick. + * + * @param aDataStick - The Data Stick to check. + * @return Output ItemStack contained on the Data Stick. + */ + public static ItemStack getDataStickOutput(ItemStack aDataStick) { + if (doesDataStickHaveOutput(aDataStick)) { + return GTUtility.loadItem(aDataStick.getTagCompound(), "output"); + } + return null; + } + + /** + * @param aDataStick - The Data Stick to process. + * @return The stored Recipe Hash String on the Data Stick, will return an invalid Hash if one is not found. + *

+ * The hash will be guaranteed to pass isValidHash(). + *

+ * Will not return Null. + */ + public static String getHashFromDataStack(ItemStack aDataStick) { + if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { + NBTTagCompound aNBT = aDataStick.getTagCompound(); + if (aNBT.hasKey("Data.Recipe.Hash", NBT.TAG_STRING)) { + String hash = aNBT.getString("Data.Recipe.Hash"); + if (isValidHash(hash)) return hash; + } + } + return "Invalid.Recipe.Hash"; + } + + /** + * + * @param aDataStick - The Data Stick to update. + * @param aRecipeHash - The Recipe Hash String to update with. + * @return Did we update the Recipe Hash String on the Data Stick? + */ + public static boolean setRecipeHashOnDataStick(ItemStack aDataStick, String aRecipeHash) { + if (isItemDataStick(aDataStick) && aDataStick.hasTagCompound()) { + NBTTagCompound aNBT = aDataStick.getTagCompound(); + aNBT.setString("Data.Recipe.Hash", aRecipeHash); + aDataStick.setTagCompound(aNBT); + return true; + } + return false; + } + + /** + * + * @param aDataStick - The Data Stick to update. + * @param aNewRecipe - The New GTRecipe_AssemblyLine recipe to update it with. + * @return Did we set the new recipe data & Recipe Hash String on the Data Stick? + */ + public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, + GTRecipe.RecipeAssemblyLine aNewRecipe) { + return setAssemblyLineRecipeOnDataStick(aDataStick, aNewRecipe, true); + } + + public static boolean setAssemblyLineRecipeOnDataStick(ItemStack aDataStick, GTRecipe.RecipeAssemblyLine aNewRecipe, + boolean setUpdateTime) { + if (isItemDataStick(aDataStick) && aNewRecipe.mOutput != null) { + String s = aNewRecipe.mOutput.getDisplayName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(aNewRecipe.mOutput.getDisplayName()); + if (s == null) { + s = aNewRecipe.mOutput.getDisplayName(); + } + } + + String aHash = generateRecipeHash(aNewRecipe); + if (GTValues.D1) { + GTRecipe.RecipeAssemblyLine aOldRecipe = findAssemblyLineRecipeFromDataStick(aDataStick, true).recipe; + GT_FML_LOGGER.info( + "Updating data stick: " + aDataStick.getDisplayName() + + " | Old Recipe Hash: " + + generateRecipeHash(aOldRecipe) + + ", New Recipe Hash: " + + aHash); + } + + String author = "Assembling Line Recipe Generator"; + String displayName = null; + if (aDataStick.hasTagCompound()) { + NBTTagCompound tag = aDataStick.getTagCompound(); + if (tag.hasKey("author", NBT.TAG_STRING)) { + author = tag.getString("author"); + } + if (tag.hasKey("display", NBT.TAG_COMPOUND)) { + NBTTagCompound displayTag = tag.getCompoundTag("display"); + if (displayTag.hasKey("Name", NBT.TAG_STRING)) displayName = displayTag.getString("Name"); + } + } + + // remove possible old NBTTagCompound + aDataStick.setTagCompound(new NBTTagCompound()); + if (displayName != null) aDataStick.setStackDisplayName(displayName); + if (GTValues.D1) { + GTUtility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data (" + aHash + ")"); + } else { + GTUtility.ItemNBT.setBookTitle(aDataStick, s + " Construction Data"); + } + + NBTTagCompound tNBT = aDataStick.getTagCompound(); + if (tNBT == null) { + tNBT = new NBTTagCompound(); + } + + tNBT.setTag("output", aNewRecipe.mOutput.writeToNBT(new NBTTagCompound())); + tNBT.setInteger("time", aNewRecipe.mDuration); + tNBT.setInteger("eu", aNewRecipe.mEUt); + tNBT.setString("author", author); + NBTTagList tNBTList = new NBTTagList(); + tNBTList.appendTag( + new NBTTagString( + "Construction plan for " + aNewRecipe.mOutput.stackSize + + " " + + s + + ". Needed EU/t: " + + aNewRecipe.mEUt + + " Production time: " + + (aNewRecipe.mDuration / 20))); + for (int i = 0; i < aNewRecipe.mInputs.length; i++) { + boolean hasSetOreDictAlt = false; + + if (aNewRecipe.mOreDictAlt[i] != null && aNewRecipe.mOreDictAlt[i].length > 0) { + tNBT.setInteger("a" + i, aNewRecipe.mOreDictAlt[i].length); + int count = 0; + StringBuilder tBuilder = new StringBuilder("Input Bus " + (i + 1) + ": "); + for (int j = 0; j < aNewRecipe.mOreDictAlt[i].length; j++) { + ItemStack tStack = aNewRecipe.mOreDictAlt[i][j]; + if (tStack != null) { + tNBT.setTag("a" + i + ":" + j, tStack.writeToNBT(new NBTTagCompound())); + + s = tStack.getDisplayName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(tStack.getDisplayName()); + if (s == null) s = tStack.getDisplayName(); + } + + tBuilder.append(count == 0 ? "" : "\nOr ") + .append(tStack.stackSize) + .append(" ") + .append(s); + count++; + } + } + if (count > 0) { + tNBTList.appendTag(new NBTTagString(tBuilder.toString())); + hasSetOreDictAlt = true; + } + } + + if (aNewRecipe.mInputs[i] != null) { + tNBT.setTag("" + i, aNewRecipe.mInputs[i].writeToNBT(new NBTTagCompound())); + + if (!hasSetOreDictAlt) { + s = aNewRecipe.mInputs[i].getDisplayName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(aNewRecipe.mInputs[i].getDisplayName()); + if (s == null) s = aNewRecipe.mInputs[i].getDisplayName(); + } + tNBTList.appendTag( + new NBTTagString( + "Input Bus " + (i + 1) + ": " + aNewRecipe.mInputs[i].stackSize + " " + s)); + } + } + } + for (int i = 0; i < aNewRecipe.mFluidInputs.length; i++) { + if (aNewRecipe.mFluidInputs[i] != null) { + tNBT.setTag("f" + i, aNewRecipe.mFluidInputs[i].writeToNBT(new NBTTagCompound())); + + s = aNewRecipe.mFluidInputs[i].getLocalizedName(); + if (FMLCommonHandler.instance() + .getEffectiveSide() + .isServer()) { + s = AssemblyLineServer.lServerNames.get(aNewRecipe.mFluidInputs[i].getLocalizedName()); + if (s == null) s = aNewRecipe.mFluidInputs[i].getLocalizedName(); + } + tNBTList.appendTag( + new NBTTagString( + "Input Hatch " + (i + 1) + ": " + aNewRecipe.mFluidInputs[i].amount + "L " + s)); + } + } + tNBT.setTag("pages", tNBTList); + if (setUpdateTime) tNBT.setLong("lastUpdate", System.currentTimeMillis()); + aDataStick.setTagCompound(tNBT); + // Set recipe hash + setRecipeHashOnDataStick(aDataStick, aHash); + return true; + } + return false; + } + + public enum LookupResultType { + + INVALID_STICK(true), + VALID_STACK_BUT_INVALID_RECIPE(true), + VALID_STACK_AND_VALID_RECIPE(false), + VALID_STACK_AND_VALID_HASH(false); + + private final boolean recipeNull; + private LookupResult singletonResult; + + LookupResultType(boolean recipeNull) { + this.recipeNull = recipeNull; + } + + public LookupResult getResult() { + if (!recipeNull) throw new IllegalArgumentException("This result type require a nonnull recipe"); + if (singletonResult == null) singletonResult = new LookupResult(null, this); + return singletonResult; + } + + public LookupResult getResult(GTRecipe.RecipeAssemblyLine recipe) { + if ((recipe == null) != recipeNull) + throw new IllegalArgumentException("This result type does not allow given input"); + return new LookupResult(recipe, this); + } + } + + public static class LookupResult { + + private final GTRecipe.RecipeAssemblyLine recipe; + private final LookupResultType type; + + LookupResult(GTRecipe.RecipeAssemblyLine recipe, LookupResultType type) { + this.recipe = recipe; + this.type = type; + } + + public GTRecipe.RecipeAssemblyLine getRecipe() { + return recipe; + } + + public LookupResultType getType() { + return type; + } + } +} diff --git a/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java b/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java index ac1601e846..822e2f036e 100644 --- a/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java +++ b/src/main/java/gregtech/api/util/BlastFurnaceGasStat.java @@ -6,9 +6,8 @@ import java.util.List; import net.minecraftforge.fluids.FluidStack; -import com.github.bartimaeusnek.bartworks.system.material.Werkstoff; -import com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader; - +import bartworks.system.material.Werkstoff; +import bartworks.system.material.WerkstoffLoader; import gregtech.api.enums.Materials; public class BlastFurnaceGasStat { diff --git a/src/main/java/gregtech/api/util/CircuitryBehavior.java b/src/main/java/gregtech/api/util/CircuitryBehavior.java new file mode 100644 index 0000000000..3859be590a --- /dev/null +++ b/src/main/java/gregtech/api/util/CircuitryBehavior.java @@ -0,0 +1,212 @@ +package gregtech.api.util; + +import net.minecraftforge.common.util.ForgeDirection; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.GregTechAPI; +import gregtech.api.interfaces.IRedstoneCircuitBlock; + +/** + * Redstone Circuit Control Code + *

+ * This should make everything possible what a Redstone Computer or BuildCraft Gate could do. It is intended to use this + * similar to BC-Gates (for acquiring Data) and RP Logic Gates. You could write an extremely specified and complex Logic + * Gate, which works only for you Setup, like with ComputerCraft, but you would have to write an extra Mod to add that, + * as it doesn't work Ingame. + *

+ * One can make use of the fact, that ItemStacks can be stored as Integer, so that you can scan Inventories for specific + * Items using that. Luckily the Buttons in the GUI enable Copy/Paste of ItemID+MetaData to Integer, including the + * WildCard Damage Value when you use rightclick to place it. You just need to use @GT_Utility.stackToInt(ItemStack + * aStack) to get it. + *

+ * All Functions run usually in a seperate try/catch Block, so that failed Logic won't crash the TileEntity. + */ +public abstract class CircuitryBehavior { + + /** + * @param aIndex 0 - 1023 are my own Indices, so use other Numbers! + */ + public CircuitryBehavior(int aIndex) { + GregTechAPI.sCircuitryBehaviors.put(aIndex, this); + } + + /** + * returns if there is Redstone applied to any of the valid Inputs (OR) + */ + public static boolean getAnyRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { + return true; + } + } + } + return false; + } + + /** + * returns if there is Redstone applied to all the valid Inputs (AND) + */ + public static boolean getAllRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) == 0) { + return false; + } + } + } + return true; + } + + /** + * returns if there is Redstone applied to exactly one of the valid Inputs (XOR) + */ + public static boolean getOneRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + int tRedstoneAmount = 0; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + if (aRedstoneCircuitBlock.getInputRedstone(side) > 0) { + tRedstoneAmount++; + } + } + } + return tRedstoneAmount == 1; + } + + /** + * returns the strongest incoming RS-Power + */ + public static byte getStrongestRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + byte tRedstoneAmount = 0; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(side) + .letsRedstoneGoIn( + side, + aRedstoneCircuitBlock.getCoverID(side), + aRedstoneCircuitBlock.getCoverVariable(side), + aRedstoneCircuitBlock.getOwnTileEntity())) { + tRedstoneAmount = (byte) Math.max(tRedstoneAmount, aRedstoneCircuitBlock.getInputRedstone(side)); + } + } + return tRedstoneAmount; + } + + // region GUI Functions + + /** + * returns the weakest incoming non-zero RS-Power + */ + public static byte getWeakestNonZeroRedstone(IRedstoneCircuitBlock aRedstoneCircuitBlock) { + if (!getAnyRedstone(aRedstoneCircuitBlock)) return 0; + byte tRedstoneAmount = 15; + for (final ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { + if (side != aRedstoneCircuitBlock.getOutputFacing() && aRedstoneCircuitBlock.getCover(sid