Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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?

How would I need to do that? I couldn't find any useful posts while googling. :-\

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?

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"

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.

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.

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);
    }

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

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.