Posted February 22, 20169 yr I want to add a recipe that adds an enchantment to every item that extends ItemArmour without adding a recipe for every single armour item some mod might add. I want to put the armour item together with an item from my mod in the crafting grid and get the armour back with the enchantment added to it. Do I need to use a custom IRecipe for that?
February 22, 20169 yr Would this work? package XFactHD.thermalreactors.common.crafting.handlers; import XFactHD.thermalreactors.common.items.armor.ItemRadArmor; import XFactHD.thermalreactors.common.util.EnchantmentRadiationProtection; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; public class ArmourEnchantRecipe implements IRecipe { @Override public int getRecipeSize() { return 2; } @Override public boolean matches(InventoryCrafting inventoryCrafting, World world) { boolean armor = false; boolean radArmor = false; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (inventoryCrafting.getStackInRowAndColumn(i, j) != null && inventoryCrafting.getStackInRowAndColumn(i, j).getItem() instanceof ItemArmor && !(inventoryCrafting.getStackInRowAndColumn(i, j).getItem() instanceof ItemRadArmor)) { armor = true; } else if (inventoryCrafting.getStackInRowAndColumn(i, j) != null && inventoryCrafting.getStackInRowAndColumn(i, j).getItem() instanceof ItemRadArmor) { radArmor = true; } } } return armor && radArmor; } @Override public ItemStack getCraftingResult(InventoryCrafting inventoryCrafting) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (inventoryCrafting.getStackInRowAndColumn(i, j) != null && inventoryCrafting.getStackInRowAndColumn(i, j).getItem() instanceof ItemArmor && !(inventoryCrafting.getStackInRowAndColumn(i, j).getItem() instanceof ItemRadArmor)) { ItemStack stack; stack = inventoryCrafting.getStackInRowAndColumn(i, j); stack.addEnchantment(new EnchantmentRadiationProtection(), 1); return stack; } } } return null; } @Override public ItemStack getRecipeOutput() { return null; } } Also, what is the weight on enchantments and how can I get a free enchantment id?
February 22, 20169 yr The problem right now is that the player can put in like 4 rad armors, one normal armor 4 sticks and your recipe would still say "hey that matches"
February 22, 20169 yr Weight on enchantments is how common it is. If there were only 3 enchants and they had weights: A: 1 B: 2 C: 4 Then the odds of getting B would be 28%, double that of A (14%) and half that of C (57%) For an available ID, there is not a function for that as far as I am aware. Mine are config-valued. Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
February 22, 20169 yr For getting a free enchantment id, you could always loop through the enchantmentsList array until you get to a null value and use that index as the id.
February 22, 20169 yr Does the weight play any role if I disallow the enchantment to be applied in an enchantment table? Thanks for the idea with the for loop, seems to work. Would the matching check work this way? @Override public boolean matches(InventoryCrafting inventoryCrafting, World world) { ArrayList<ItemStack> stacks = new ArrayList<ItemStack>(9); int armorItems = 0; int radArmorItems = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { stacks.add(inventoryCrafting.getStackInRowAndColumn(i, j)); } } for (ItemStack stack : stacks) { if (stack != null) { if (stack.getItem() instanceof ItemArmor && !(stack.getItem() instanceof ItemRadArmor)) { armorItems = armorItems + 1; } else if (stack.getItem() instanceof ItemRadArmor) { radArmorItems = radArmorItems + 1; } else { return false; } } } return (armorItems == 1 && radArmorItems == 1); }
February 22, 20169 yr The crafting inventory can be smaller then 3. e.g. 2x2 so dont iterate until 3, check the size of the crafting and use that as bounds why are u adding all stacks to the list? why not all that are !=null? after that u can check if the size of the list is 2. if it is not ur recipe wont match
February 22, 20169 yr I did it like this now: @Override public boolean matches(InventoryCrafting inventoryCrafting, World world) { int armorItems = 0; int radArmorItems = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (inventoryCrafting.getStackInRowAndColumn(i, j) != null) { ItemStack stack = inventoryCrafting.getStackInRowAndColumn(i, j); if (stack.getItem() instanceof ItemArmor && !(stack.getItem() instanceof ItemRadArmor)) { armorItems = armorItems + 1; } else if (stack.getItem() instanceof ItemRadArmor) { radArmorItems = radArmorItems + 1; } else { return false; } } } } return (armorItems == 1 && radArmorItems == 1); } Another question: Is it possible to make the armor not gleam if only a specific enchantment is added?
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.