PageRenderTime 58ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/common/buildcraft/transport/BCTransportRecipes.java

https://github.com/2xsaiko/BuildCraft
Java | 348 lines | 281 code | 55 blank | 12 comment | 38 complexity | 950957b99b2cf91533d6adfe037905a1 MD5 | raw file
Possible License(s): LGPL-2.0
  1. /*
  2. * Copyright (c) 2017 SpaceToad and the BuildCraft team
  3. * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not
  4. * distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/
  5. */
  6. package buildcraft.transport;
  7. import java.util.HashSet;
  8. import java.util.Set;
  9. import com.google.common.collect.ImmutableSet;
  10. import net.minecraft.block.Block;
  11. import net.minecraft.init.Blocks;
  12. import net.minecraft.init.Items;
  13. import net.minecraft.item.EnumDyeColor;
  14. import net.minecraft.item.Item;
  15. import net.minecraft.item.ItemStack;
  16. import net.minecraft.item.crafting.IRecipe;
  17. import net.minecraft.item.crafting.Ingredient;
  18. import net.minecraft.item.crafting.ShapelessRecipes;
  19. import net.minecraft.util.NonNullList;
  20. import net.minecraft.util.ResourceLocation;
  21. import net.minecraftforge.common.crafting.CraftingHelper;
  22. import net.minecraftforge.event.RegistryEvent;
  23. import net.minecraftforge.fml.common.Mod;
  24. import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
  25. import net.minecraftforge.fml.common.registry.ForgeRegistries;
  26. import net.minecraftforge.fml.common.registry.GameRegistry;
  27. import net.minecraftforge.oredict.OreDictionary;
  28. import net.minecraftforge.oredict.ShapedOreRecipe;
  29. import net.minecraftforge.oredict.ShapelessOreRecipe;
  30. import buildcraft.api.enums.EnumEngineType;
  31. import buildcraft.api.enums.EnumRedstoneChipset;
  32. import buildcraft.api.mj.MjAPI;
  33. import buildcraft.api.recipes.AssemblyRecipe;
  34. import buildcraft.api.recipes.AssemblyRecipeBasic;
  35. import buildcraft.api.recipes.IngredientStack;
  36. import buildcraft.lib.misc.ColourUtil;
  37. import buildcraft.lib.recipe.AssemblyRecipeRegistry;
  38. import buildcraft.lib.recipe.IngredientNBTBC;
  39. import buildcraft.lib.recipe.RecipeBuilderShaped;
  40. import buildcraft.core.BCCoreBlocks;
  41. import buildcraft.transport.gate.EnumGateLogic;
  42. import buildcraft.transport.gate.EnumGateMaterial;
  43. import buildcraft.transport.gate.EnumGateModifier;
  44. import buildcraft.transport.gate.GateVariant;
  45. import buildcraft.transport.item.ItemPipeHolder;
  46. import buildcraft.transport.recipe.FacadeAssemblyRecipes;
  47. import buildcraft.transport.recipe.FacadeSwapRecipe;
  48. @Mod.EventBusSubscriber(modid = BCTransport.MODID)
  49. public class BCTransportRecipes {
  50. @GameRegistry.ObjectHolder("buildcraftsilicon:assembly_table")
  51. private static final Block SILICON_TABLE_ASSEMBLY = null;
  52. @SubscribeEvent
  53. public static void registerRecipes(RegistryEvent.Register<IRecipe> event) {
  54. addPipeRecipe(BCTransportItems.pipeItemWood, "plankWood");
  55. addPipeRecipe(BCTransportItems.pipeItemCobble, "cobblestone");
  56. addPipeRecipe(BCTransportItems.pipeItemStone, "stone");
  57. addPipeRecipe(BCTransportItems.pipeItemQuartz, "blockQuartz");
  58. addPipeRecipe(BCTransportItems.pipeItemIron, "ingotIron");
  59. addPipeRecipe(BCTransportItems.pipeItemGold, "ingotGold");
  60. addPipeRecipe(BCTransportItems.pipeItemClay, Blocks.CLAY);
  61. addPipeRecipe(BCTransportItems.pipeItemSandstone,
  62. new ItemStack(Blocks.SANDSTONE, 1, OreDictionary.WILDCARD_VALUE));
  63. addPipeRecipe(BCTransportItems.pipeItemVoid, new ItemStack(Items.DYE, 1, EnumDyeColor.BLACK.getDyeDamage()),
  64. "dustRedstone");
  65. addPipeRecipe(BCTransportItems.pipeItemObsidian, Blocks.OBSIDIAN);
  66. addPipeRecipe(BCTransportItems.pipeItemDiamond, Items.DIAMOND);
  67. addPipeRecipe(BCTransportItems.pipeItemLapis, Blocks.LAPIS_BLOCK);
  68. addPipeRecipe(BCTransportItems.pipeItemDaizuli, Blocks.LAPIS_BLOCK, Items.DIAMOND);
  69. addPipeRecipe(BCTransportItems.pipeItemDiaWood, "plankWood", Items.DIAMOND);
  70. Item waterproof = BCTransportItems.waterproof;
  71. if (waterproof == null) {
  72. waterproof = Items.SLIME_BALL;
  73. }
  74. addPipeUpgradeRecipe(BCTransportItems.pipeItemWood, BCTransportItems.pipeFluidWood, waterproof);
  75. addPipeUpgradeRecipe(BCTransportItems.pipeItemCobble, BCTransportItems.pipeFluidCobble, waterproof);
  76. addPipeUpgradeRecipe(BCTransportItems.pipeItemStone, BCTransportItems.pipeFluidStone, waterproof);
  77. addPipeUpgradeRecipe(BCTransportItems.pipeItemQuartz, BCTransportItems.pipeFluidQuartz, waterproof);
  78. addPipeUpgradeRecipe(BCTransportItems.pipeItemIron, BCTransportItems.pipeFluidIron, waterproof);
  79. addPipeUpgradeRecipe(BCTransportItems.pipeItemGold, BCTransportItems.pipeFluidGold, waterproof);
  80. addPipeUpgradeRecipe(BCTransportItems.pipeItemClay, BCTransportItems.pipeFluidClay, waterproof);
  81. addPipeUpgradeRecipe(BCTransportItems.pipeItemSandstone, BCTransportItems.pipeFluidSandstone, waterproof);
  82. addPipeUpgradeRecipe(BCTransportItems.pipeItemVoid, BCTransportItems.pipeFluidVoid, waterproof);
  83. addPipeUpgradeRecipe(BCTransportItems.pipeItemObsidian, BCTransportItems.pipeFluidObsidian, waterproof);
  84. addPipeUpgradeRecipe(BCTransportItems.pipeItemDiamond, BCTransportItems.pipeFluidDiamond, waterproof);
  85. addPipeUpgradeRecipe(BCTransportItems.pipeItemDiaWood, BCTransportItems.pipeFluidDiaWood, waterproof);
  86. String upgrade = "dustRedstone";
  87. addPipeUpgradeRecipe(BCTransportItems.pipeItemWood, BCTransportItems.pipePowerWood, upgrade);
  88. addPipeUpgradeRecipe(BCTransportItems.pipeItemCobble, BCTransportItems.pipePowerCobble, upgrade);
  89. addPipeUpgradeRecipe(BCTransportItems.pipeItemStone, BCTransportItems.pipePowerStone, upgrade);
  90. addPipeUpgradeRecipe(BCTransportItems.pipeItemQuartz, BCTransportItems.pipePowerQuartz, upgrade);
  91. // addPipeUpgradeRecipe(BCTransportItems.pipeItemIron, BCTransportItems.pipePowerIron, upgrade);
  92. addPipeUpgradeRecipe(BCTransportItems.pipeItemGold, BCTransportItems.pipePowerGold, upgrade);
  93. addPipeUpgradeRecipe(BCTransportItems.pipeItemSandstone, BCTransportItems.pipePowerSandstone, upgrade);
  94. // addPipeUpgradeRecipe(BCTransportItems.pipeItemDiamond, BCTransportItems.pipePowerDiamond, upgrade);
  95. if (BCTransportItems.plugGate != null) {
  96. // You can craft some of the basic gate types in a normal crafting table
  97. RecipeBuilderShaped builder = new RecipeBuilderShaped();
  98. builder.add(" m ");
  99. builder.add("mrm");
  100. builder.add(" b ");
  101. builder.map('r', "dustRedstone");
  102. builder.map('b', BCTransportItems.plugBlocker, Blocks.COBBLESTONE);
  103. // Base craftable types
  104. builder.map('m', Items.BRICK);
  105. makeGateRecipe(builder, EnumGateMaterial.CLAY_BRICK, EnumGateModifier.NO_MODIFIER);
  106. builder.map('m', "ingotIron");
  107. makeGateRecipe(builder, EnumGateMaterial.IRON, EnumGateModifier.NO_MODIFIER);
  108. builder.map('m', Items.NETHERBRICK);
  109. makeGateRecipe(builder, EnumGateMaterial.NETHER_BRICK, EnumGateModifier.NO_MODIFIER);
  110. // Iron modifier addition
  111. GateVariant variant =
  112. new GateVariant(EnumGateLogic.AND, EnumGateMaterial.IRON, EnumGateModifier.NO_MODIFIER);
  113. ItemStack ironGateBase = BCTransportItems.plugGate.getStack(variant);
  114. builder = new RecipeBuilderShaped();
  115. builder.add(" m ");
  116. builder.add("mgm");
  117. builder.add(" m ");
  118. builder.map('g', ironGateBase);
  119. builder.map('m', new ItemStack(Items.DYE, 1, EnumDyeColor.BLUE.getDyeDamage()));
  120. makeGateRecipe(builder, EnumGateMaterial.IRON, EnumGateModifier.LAPIS);
  121. builder.map('m', Items.QUARTZ);
  122. makeGateRecipe(builder, EnumGateMaterial.IRON, EnumGateModifier.QUARTZ);
  123. // And Gate <-> Or Gate (shapeless)
  124. // TODO: Create a recipe class for this instead!
  125. for (EnumGateMaterial material : EnumGateMaterial.VALUES) {
  126. if (material == EnumGateMaterial.CLAY_BRICK) {
  127. continue;
  128. }
  129. for (EnumGateModifier modifier : EnumGateModifier.VALUES) {
  130. GateVariant varAnd = new GateVariant(EnumGateLogic.AND, material, modifier);
  131. ItemStack resultAnd = BCTransportItems.plugGate.getStack(varAnd);
  132. GateVariant varOr = new GateVariant(EnumGateLogic.OR, material, modifier);
  133. ItemStack resultOr = BCTransportItems.plugGate.getStack(varOr);
  134. ForgeRegistries.RECIPES.register(new ShapedOreRecipe(resultOr.getItem().getRegistryName(), resultAnd, "i", 'i', new IngredientNBTBC(resultOr)).setRegistryName(resultOr.getItem().getRegistryName() + "_" + modifier + "_" + material + "_or"));
  135. ForgeRegistries.RECIPES.register(new ShapedOreRecipe(resultAnd.getItem().getRegistryName(), resultOr, "i", 'i', new IngredientNBTBC(resultAnd)).setRegistryName(resultAnd.getItem().getRegistryName() + "_" + modifier + "_" + material + "_and"));
  136. }
  137. }
  138. }
  139. if (BCTransportItems.plugPulsar != null) {
  140. ItemStack output = new ItemStack(BCTransportItems.plugPulsar);
  141. ItemStack redstoneEngine;
  142. if (BCCoreBlocks.engine != null) {
  143. redstoneEngine = BCCoreBlocks.engine.getStack(EnumEngineType.WOOD);
  144. } else {
  145. redstoneEngine = new ItemStack(Blocks.REDSTONE_BLOCK);
  146. }
  147. if (SILICON_TABLE_ASSEMBLY != null) {
  148. Set<IngredientStack> input = new HashSet<>();
  149. input.add(new IngredientStack(Ingredient.fromStacks(redstoneEngine)));
  150. input.add(new IngredientStack(CraftingHelper.getIngredient("ingotIron"), 2));
  151. AssemblyRecipe recipe = new AssemblyRecipeBasic("plug_pulsar", 1000 * MjAPI.MJ, input, output);
  152. AssemblyRecipeRegistry.register(recipe);
  153. }
  154. }
  155. if (BCTransportItems.plugGate != null) {
  156. IngredientStack lapis = IngredientStack.of("gemLapis");
  157. makeGateAssembly(20_000, EnumGateMaterial.IRON, EnumGateModifier.NO_MODIFIER, EnumRedstoneChipset.IRON);
  158. makeGateAssembly(40_000, EnumGateMaterial.NETHER_BRICK, EnumGateModifier.NO_MODIFIER,
  159. EnumRedstoneChipset.IRON, IngredientStack.of(new ItemStack(Blocks.NETHER_BRICK)));
  160. makeGateAssembly(80_000, EnumGateMaterial.GOLD, EnumGateModifier.NO_MODIFIER, EnumRedstoneChipset.GOLD);
  161. makeGateModifierAssembly(40_000, EnumGateMaterial.IRON, EnumGateModifier.LAPIS, lapis);
  162. makeGateModifierAssembly(60_000, EnumGateMaterial.IRON, EnumGateModifier.QUARTZ,
  163. IngredientStack.of(EnumRedstoneChipset.QUARTZ.getStack()));
  164. makeGateModifierAssembly(80_000, EnumGateMaterial.IRON, EnumGateModifier.DIAMOND,
  165. IngredientStack.of(EnumRedstoneChipset.DIAMOND.getStack()));
  166. makeGateModifierAssembly(80_000, EnumGateMaterial.NETHER_BRICK, EnumGateModifier.LAPIS, lapis);
  167. makeGateModifierAssembly(100_000, EnumGateMaterial.NETHER_BRICK, EnumGateModifier.QUARTZ,
  168. IngredientStack.of(EnumRedstoneChipset.QUARTZ.getStack()));
  169. makeGateModifierAssembly(120_000, EnumGateMaterial.NETHER_BRICK, EnumGateModifier.DIAMOND,
  170. IngredientStack.of(EnumRedstoneChipset.DIAMOND.getStack()));
  171. makeGateModifierAssembly(100_000, EnumGateMaterial.GOLD, EnumGateModifier.LAPIS, lapis);
  172. makeGateModifierAssembly(140_000, EnumGateMaterial.GOLD, EnumGateModifier.QUARTZ,
  173. IngredientStack.of(EnumRedstoneChipset.QUARTZ.getStack()));
  174. makeGateModifierAssembly(180_000, EnumGateMaterial.GOLD, EnumGateModifier.DIAMOND,
  175. IngredientStack.of(EnumRedstoneChipset.DIAMOND.getStack()));
  176. }
  177. if (BCTransportItems.plugLightSensor != null) {
  178. AssemblyRecipeRegistry.register(new AssemblyRecipeBasic("light-sensor", 500 * MjAPI.MJ,
  179. ImmutableSet.of(IngredientStack.of(Blocks.DAYLIGHT_DETECTOR)),
  180. new ItemStack(BCTransportItems.plugLightSensor)));
  181. }
  182. if (BCTransportItems.plugFacade != null) {
  183. AssemblyRecipeRegistry.register(FacadeAssemblyRecipes.INSTANCE);
  184. ForgeRegistries.RECIPES.register(FacadeSwapRecipe.INSTANCE);
  185. }
  186. if (BCTransportItems.wire != null) {
  187. for (EnumDyeColor color : ColourUtil.COLOURS) {
  188. String name = String.format("wire-%s", color.getUnlocalizedName());
  189. ImmutableSet<IngredientStack> input = ImmutableSet.of(IngredientStack.of("dustRedstone"),
  190. IngredientStack.of(ColourUtil.getDyeName(color)));
  191. AssemblyRecipeRegistry.register(new AssemblyRecipeBasic(name, 10_000 * MjAPI.MJ, input,
  192. new ItemStack(BCTransportItems.wire, 8, color.getMetadata())));
  193. }
  194. }
  195. if (BCTransportItems.plugLens != null) {
  196. for (EnumDyeColor colour : ColourUtil.COLOURS) {
  197. String name = String.format("lens-regular-%s", colour.getUnlocalizedName());
  198. IngredientStack stainedGlass = IngredientStack.of("blockGlass" + ColourUtil.getName(colour));
  199. ImmutableSet<IngredientStack> input = ImmutableSet.of(stainedGlass);
  200. ItemStack output = BCTransportItems.plugLens.getStack(colour, false);
  201. AssemblyRecipeRegistry.register(new AssemblyRecipeBasic(name, 500 * MjAPI.MJ, input, output));
  202. name = String.format("lens-filter-%s", colour.getUnlocalizedName());
  203. output = BCTransportItems.plugLens.getStack(colour, true);
  204. input = ImmutableSet.of(stainedGlass, IngredientStack.of(new ItemStack(Blocks.IRON_BARS)));
  205. AssemblyRecipeRegistry.register(new AssemblyRecipeBasic(name, 500 * MjAPI.MJ, input, output));
  206. }
  207. IngredientStack glass = IngredientStack.of("blockGlass");
  208. ImmutableSet<IngredientStack> input = ImmutableSet.of(glass);
  209. ItemStack output = BCTransportItems.plugLens.getStack(null, false);
  210. AssemblyRecipeRegistry.register(new AssemblyRecipeBasic("lens-regular", 500 * MjAPI.MJ, input, output));
  211. output = BCTransportItems.plugLens.getStack(null, true);
  212. input = ImmutableSet.of(glass, IngredientStack.of(new ItemStack(Blocks.IRON_BARS)));
  213. AssemblyRecipeRegistry.register(new AssemblyRecipeBasic("lens-filter", 500 * MjAPI.MJ, input, output));
  214. }
  215. }
  216. private static void makeGateModifierAssembly(int multiplier, EnumGateMaterial material, EnumGateModifier modifier,
  217. IngredientStack... mods) {
  218. for (EnumGateLogic logic : EnumGateLogic.VALUES) {
  219. String name = String.format("gate-modifier-%s-%s-%s", logic, material, modifier);
  220. ItemStack toUpgrade =
  221. BCTransportItems.plugGate.getStack(new GateVariant(logic, material, EnumGateModifier.NO_MODIFIER));
  222. ItemStack output = BCTransportItems.plugGate.getStack(new GateVariant(logic, material, modifier));
  223. ImmutableSet<IngredientStack> input = new ImmutableSet.Builder<IngredientStack>()
  224. .add(IngredientStack.of(toUpgrade)).add(mods).build();
  225. AssemblyRecipeRegistry.register((new AssemblyRecipeBasic(name, MjAPI.MJ * multiplier, input, output)));
  226. }
  227. }
  228. private static void makeGateAssembly(int multiplier, EnumGateMaterial material, EnumGateModifier modifier,
  229. EnumRedstoneChipset chipset, IngredientStack... additional) {
  230. ImmutableSet.Builder<IngredientStack> temp = ImmutableSet.builder();
  231. temp.add(IngredientStack.of(chipset.getStack()));
  232. temp.add(additional);
  233. ImmutableSet<IngredientStack> input = temp.build();
  234. String name = String.format("gate-and-%s-%s", material, modifier);
  235. ItemStack output = BCTransportItems.plugGate.getStack(new GateVariant(EnumGateLogic.AND, material, modifier));
  236. AssemblyRecipeRegistry.register((new AssemblyRecipeBasic(name, MjAPI.MJ * multiplier, input, output)));
  237. name = String.format("gate-or-%s-%s", material, modifier);
  238. output = BCTransportItems.plugGate.getStack(new GateVariant(EnumGateLogic.OR, material, modifier));
  239. AssemblyRecipeRegistry.register((new AssemblyRecipeBasic(name, MjAPI.MJ * multiplier, input, output)));
  240. }
  241. private static void makeGateRecipe(RecipeBuilderShaped builder, EnumGateMaterial material,
  242. EnumGateModifier modifier) {
  243. GateVariant variant = new GateVariant(EnumGateLogic.AND, material, modifier);
  244. builder.setResult(BCTransportItems.plugGate.getStack(variant));
  245. builder.registerNbtAware();
  246. }
  247. private static void addPipeRecipe(ItemPipeHolder pipe, Object material) {
  248. addPipeRecipe(pipe, material, material);
  249. }
  250. private static void addPipeRecipe(ItemPipeHolder pipe, Object left, Object right) {
  251. if (pipe == null) {
  252. return;
  253. }
  254. ItemStack result = new ItemStack(pipe, 8);
  255. IRecipe recipe = new ShapedOreRecipe(pipe.getRegistryName(),
  256. result, "lgr", 'l', left, 'r', right, 'g', "blockGlassColorless");
  257. recipe.setRegistryName(new ResourceLocation(pipe.getRegistryName() + "_colorless"));
  258. ForgeRegistries.RECIPES.register(recipe);
  259. for (EnumDyeColor colour : EnumDyeColor.values()) {
  260. ItemStack resultStack = new ItemStack(pipe, 8, colour.getMetadata() + 1);
  261. IRecipe colorRecipe = new ShapedOreRecipe(pipe.getRegistryName(), resultStack,
  262. "lgr", 'l', left, 'r', right, 'g', "blockGlass" + ColourUtil.getName(colour));
  263. colorRecipe.setRegistryName(new ResourceLocation(pipe.getRegistryName() + "_" + colour));
  264. ForgeRegistries.RECIPES.register(colorRecipe);
  265. }
  266. }
  267. private static void addPipeUpgradeRecipe(ItemPipeHolder from, ItemPipeHolder to, Object additional) {
  268. if (from == null || to == null) {
  269. return;
  270. }
  271. if (additional == null) {
  272. throw new NullPointerException("additional");
  273. }
  274. IRecipe returnRecipe = new ShapelessOreRecipe(from.getRegistryName(), new ItemStack(from), new ItemStack(to)).setRegistryName(new ResourceLocation(from.getRegistryName() + "_undo"));
  275. ForgeRegistries.RECIPES.register(returnRecipe);
  276. NonNullList<Ingredient> list = NonNullList.create();
  277. list.add(Ingredient.fromItem(from));
  278. list.add(CraftingHelper.getIngredient(additional));
  279. IRecipe upgradeRecipe = new ShapelessRecipes(to.getRegistryName().getResourcePath(), new ItemStack(to), list).setRegistryName(new ResourceLocation(to.getRegistryName() + "_colorless"));
  280. ForgeRegistries.RECIPES.register(upgradeRecipe);
  281. for (EnumDyeColor colour : ColourUtil.COLOURS) {
  282. ItemStack f = new ItemStack(from, 1, colour.getMetadata() + 1);
  283. ItemStack t = new ItemStack(to, 1, colour.getMetadata() + 1);
  284. IRecipe returnRecipeColored = new ShapelessOreRecipe(from.getRegistryName(), f, t).setRegistryName(new ResourceLocation(from.getRegistryName() + colour.getName() + "_undo"));
  285. ForgeRegistries.RECIPES.register(returnRecipeColored);
  286. NonNullList<Ingredient> colorList = NonNullList.create();
  287. colorList.add(Ingredient.fromStacks(f));
  288. colorList.add(CraftingHelper.getIngredient(additional));
  289. IRecipe upgradeRecipeColored = new ShapelessOreRecipe(to.getRegistryName(), colorList, t).setRegistryName(new ResourceLocation(to.getRegistryName() + "_" + colour.getName()));
  290. ForgeRegistries.RECIPES.register(upgradeRecipeColored);
  291. }
  292. }
  293. }