package gory_moon.moarsigns.items; import com.google.common.collect.Maps; import gory_moon.moarsigns.MoarSigns; import gory_moon.moarsigns.api.*; import gory_moon.moarsigns.lib.Reference; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.common.registry.IForgeRegistry; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.RecipeSorter; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; import java.util.*; @GameRegistry.ObjectHolder(Reference.MODID) public class ModItems { public static final ItemMoarSign SIGN = new ItemMoarSign(); public static final ItemDebug DEBUG = new ItemDebug(); public static final ItemNugget NUGGET = new ItemNugget(); public static final ItemSignToolbox SIGN_TOOLBOX = new ItemSignToolbox(); public static boolean replaceRecipes = true; @Mod.EventBusSubscriber public static class RegistrationHandler { public static final Set<Item> ITEMS = new HashSet<>(); /** * Register this mod's {@link Item}s. * * @param event The event */ @SubscribeEvent public static void registerItems(RegistryEvent.Register<Item> event) { NuggetRegistry.init(); final Item[] items = {SIGN, DEBUG, NUGGET, SIGN_TOOLBOX}; final IForgeRegistry<Item> registry = event.getRegistry(); for (final Item item : items) { registry.register(item); ITEMS.add(item); } } } public static void registerRecipes() { RecipeSorter.register("moarsigns:shaped", ShapedMoarSignRecipe.class, RecipeSorter.Category.SHAPED, "after:minecraft:shaped before:minecraft:shapeless"); RecipeSorter.register("moarsigns:shapeless", ShapelessMoarSignRecipe.class, RecipeSorter.Category.SHAPELESS, "after:minecraft:shapeless"); removeRecipesWithResult(new ItemStack(Items.SIGN, 3)); ArrayList<ItemStack> list = new ArrayList<ItemStack>(); SIGN.getSubItemStacks(list); ItemStack generalSign = null; Container dummyContainer = new Container() { @Override public boolean canInteractWith(EntityPlayer entityplayer) { return true; } @Override public void onCraftMatrixChanged(IInventory par1IInventory) { } }; InventoryCrafting crafting = new InventoryCrafting(dummyContainer, 2, 2); for (ItemStack stack : list) { ItemMoarSign sign = (ItemMoarSign) stack.getItem(); String texture = sign.getTextureFromNBTFull(stack.getTagCompound()); boolean isMetal = stack.getItemDamage() == 1; stack.stackSize = 3; if (texture.equals("oak_sign")) { generalSign = stack; continue; } SignInfo s = SignRegistry.get(texture); List<MaterialInfo> materials = SignRegistry.getAlternativeMaterials(s); MaterialInfo material = s != null ? s.material : null; materials.add(0, material); for (MaterialInfo infos : materials) { ItemStack mat = infos.material; if (mat != null && mat.getItem() != null && material != null) { if (isMetal) { mat.stackSize = 1; if (mat.getItem() instanceof ItemBlock) { crafting.setInventorySlotContents(0, mat); mat = CraftingManager.getInstance().findMatchingRecipe(crafting, null); } ItemStack recNugget = null; if (mat != null) { mat.stackSize = 1; if (!material.gotNugget) { String unlocName = mat.getUnlocalizedName(); NuggetRegistry.NuggetInfo nuggetInfo = NuggetRegistry.getNuggetInfo(unlocName); if (nuggetInfo != null) { nuggetInfo.needed = true; recNugget = new ItemStack(NUGGET, 1, nuggetInfo.id); OreDictionary.registerOre(nuggetInfo.oreName, recNugget.copy()); recNugget.stackSize = 9; GameRegistry.addShapelessRecipe(recNugget.copy(), mat); GameRegistry.addRecipe(new ShapedOreRecipe(mat, "xxx", "xxx", "xxx", 'x', nuggetInfo.oreName)); } } else { crafting.setInventorySlotContents(0, mat); recNugget = CraftingManager.getInstance().findMatchingRecipe(crafting, null); } } if (recNugget != null && recNugget.getItem() != null) { ItemStack stack1 = stack.copy(); stack1.stackSize = 1; recNugget.stackSize = 1; if (recNugget.getUnlocalizedName().equals("item.moarsigns.diamond_nugget")) { GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', "diamondNugget", '/', "stickWood")); GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', "nuggetDiamond", '/', "stickWood")); } else if (recNugget.getUnlocalizedName().equals("item.moarsigns.iron_nugget")) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', "nuggetIron", '/', "stickWood")); else if (recNugget.getUnlocalizedName().equals("item.moarsigns.emerald_nugget")) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', "nuggetEmerald", '/', "stickWood")); else if (recNugget.getUnlocalizedName().equals("item.moarsigns.lapis_nugget")) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', "nuggetLapis", '/', "stickWood")); else if (recNugget.getUnlocalizedName().equals("item.moarsigns.quartz_nugget")) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', "nuggetQuartz", '/', "stickWood")); else GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack1, true, true, "XXX", "XXX", " / ", 'X', recNugget, '/', "stickWood")); } stack.stackSize = 9; } if (mat.getUnlocalizedName().equals(Items.DIAMOND.getUnlocalizedName())) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack, true, true, "XXX", "XXX", " / ", 'X', "gemDiamond", '/', "stickWood")); else if (mat.getUnlocalizedName().equals(Items.EMERALD.getUnlocalizedName())) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack, true, true, "XXX", "XXX", " / ", 'X', "gemEmerald", '/', "stickWood")); else if (mat.getUnlocalizedName().equals(Items.IRON_INGOT.getUnlocalizedName())) GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack, true, true, "XXX", "XXX", " / ", 'X', "ingotIron", '/', "stickWood")); else GameRegistry.addRecipe(new ShapedMoarSignRecipe(stack, true, true, "XXX", "XXX", " / ", 'X', mat, '/', "stickWood")); } } } GameRegistry.addRecipe(new ShapedMoarSignRecipe(generalSign, true, true, "###", "###", " X ", '#', "plankWood", 'X', "stickWood")); GameRegistry.addRecipe(new ShapedMoarSignRecipe(SIGN_TOOLBOX, "rxr", "xsx", "rxr", 'x', "ingotIron", 's', ShapedMoarSignRecipe.MatchType.ALL, 'r', "dyeRed")); if (replaceRecipes) { ArrayList recipes = (ArrayList) CraftingManager.getInstance().getRecipeList(); ItemStack signStack = new ItemStack(Items.SIGN); for (int scan = 0; scan < recipes.size(); scan++) { IRecipe tmpRecipe = (IRecipe) recipes.get(scan); List input = null; if (tmpRecipe instanceof ShapedRecipes) { input = Arrays.asList(((ShapedRecipes) tmpRecipe).recipeItems); } else if (tmpRecipe instanceof ShapelessRecipes) { input = ((ShapelessRecipes) tmpRecipe).recipeItems; } else if (tmpRecipe instanceof ShapedOreRecipe) { input = Arrays.asList(((ShapedOreRecipe) tmpRecipe).getInput()); } else if (tmpRecipe instanceof ShapelessOreRecipe) { input = ((ShapelessOreRecipe) tmpRecipe).getInput(); } if (input != null) { for (Object stack : input) { if (stack instanceof ItemStack && OreDictionary.itemMatches((ItemStack) stack, signStack, false)) { HashMap<ItemStack, Object> map = Maps.newHashMap(); map.put(signStack, ShapedMoarSignRecipe.MatchType.ALL); IRecipe replacement = null; if (tmpRecipe instanceof ShapedRecipes || tmpRecipe instanceof ShapedOreRecipe) GameRegistry.addRecipe(replacement = new ShapedMoarSignRecipe(tmpRecipe, map)); if (tmpRecipe instanceof ShapelessRecipes || tmpRecipe instanceof ShapelessOreRecipe) GameRegistry.addRecipe(replacement = new ShapelessMoarSignRecipe(tmpRecipe, map)); MoarSigns.logger.info("Replacing Recipe: " + tmpRecipe + " (containing " + stack + ") -> " + replacement); recipes.remove(scan); } } } } } } private static void removeRecipesWithResult(ItemStack resultItem) { ArrayList recipes = (ArrayList) CraftingManager.getInstance().getRecipeList(); for (int scan = 0; scan < recipes.size(); scan++) { IRecipe tmpRecipe = (IRecipe) recipes.get(scan); ItemStack recipeResult = tmpRecipe.getRecipeOutput(); if (ItemStack.areItemStacksEqual(resultItem, recipeResult)) { MoarSigns.logger.debug("Removing Recipe: " + recipes.get(scan) + " -> " + recipeResult); recipes.remove(scan); } } } }