Jump to content
  • Home
  • Files
  • Docs
  • Merch
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [1.12] Dynamic Crafting Recipe
1.13 Update Notes for Mod Creators
Sign in to follow this  
Followers 1
JimiIT92

[1.12] Dynamic Crafting Recipe

By JimiIT92, November 12, 2017 in Modder Support

  • Reply to this topic
  • Start new topic

Recommended Posts

JimiIT92    19

JimiIT92

JimiIT92    19

  • Dragon Slayer
  • JimiIT92
  • Members
  • 19
  • 723 posts
Posted November 12, 2017 (edited)

In 1.10 i've added a dynamic crafting recipe so the player can craft an empty gift or e gift with an itemstack in it. To do this the recipe will check the center slot of the crafting table: if it's empty than return an empty gift, if it's not than "pack" that itemstack into the gift. Looking at how banners do this for the patterns it was simple to add something like this, but now in 1.12 i'm having issues registering all this recipes due to the new json system. The class i'm using to get a different result based on events is this

	package com.mw.crafting;
	import com.mw.core.MWBlocks;
	import net.minecraft.init.Blocks;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
	public class CraftingGift {
    public static class RecipeGift extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe {
        /**
         * Used to check if a recipe matches current crafting inventory
         */
        public boolean matches(InventoryCrafting inv, World worldIn) {
            boolean flag = false;
            int num = 0;
            for (int i = 0; i < inv.getSizeInventory(); ++i) {
                ItemStack itemstack = inv.getStackInSlot(i);
	                if (itemstack != null && itemstack.getItem() == Item.getItemFromBlock(Blocks.WOOL) && i != 4) {
                    if (num == 7) {
                        flag = true;
                        num = 0;
                        break;
                    }
                    num++;
                }
            }
	            return flag;
        }
	        /**
         * Returns an Item that is the result of this recipe
         */
        public ItemStack getCraftingResult(InventoryCrafting inv) {
            ItemStack itemstack = ItemStack.EMPTY;
            ItemStack chestitem = ItemStack.EMPTY;
            int num = 0;
            for (int i = 0; i < inv.getSizeInventory(); ++i) {
                ItemStack itemstack1 = inv.getStackInSlot(i);
	                if (itemstack1 != null && itemstack1.getItem() == Item.getItemFromBlock(Blocks.WOOL) && i != 4) {
                    if (num == 7) {
                        itemstack = new ItemStack(MWBlocks.GIFT);
                        itemstack.setCount(1);
                        num = 0;
                        chestitem = inv.getStackInSlot(4);
                        break;
                    }
                    num++;
                }
            }
	            if (chestitem != null) {
                NBTTagCompound nbttagcompound1 = itemstack.getSubCompound("BlockEntityTag");
                NBTTagList nbttaglist;
                nbttaglist = new NBTTagList();
                NBTTagCompound nbttagcompound = new NBTTagCompound();
                nbttagcompound.setByte("Gift", (byte) 0);
                chestitem.writeToNBT(nbttagcompound);
                nbttaglist.appendTag(nbttagcompound);
                nbttagcompound1.setTag("Items", nbttaglist);
            }
            return itemstack;
        }
	        public ItemStack getRecipeOutput() {
            return ItemStack.EMPTY;
        }
	        public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) {
            NonNullList<ItemStack> nonnulllist = NonNullList.<ItemStack>withSize(inv.getSizeInventory(),
                    ItemStack.EMPTY);
	            for (int i = 0; i < nonnulllist.size(); ++i) {
                ItemStack itemstack = inv.getStackInSlot(i);
                nonnulllist.set(i, net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack));
            }
	            return nonnulllist;
        }
	        public boolean isHidden() {
            return true;
        }
	        /**
         * Used to determine if this recipe can fit in a grid of the given width/height
         */
        public boolean canFit(int width, int height) {
            return width >= 3 && height >= 3;
        }
    }
}
	



What i'm missing is how i can register this :/ In 1.10 i do this

CraftingManager.getInstance().addRecipe(new RecipeGift());


but now that seems to be gone :/ So how can i register this?

Edited November 12, 2017 by JimiIT92
  • Quote

Share this post


Link to post
Share on other sites

Draco18s    2091

Draco18s

Draco18s    2091

  • Reality Controller
  • Draco18s
  • Members
  • 2091
  • 14018 posts
Posted November 12, 2017 (edited)

Skip all that nonsense (your class doesn't change, but you register it differently) and make the recipe follow the JSON format. You still need an IRecipe class, but you just add a Factory class to it that can deserialize the json.

Which...takes almost nothing at all:

public IRecipe parse(JsonContext context, JsonObject json) {
     return new RecipeGift();
}

After that, you just need a file that looks like this in your assets (named _factories.json):

https://github.com/Draco18s/ReasonableRealism/blob/1.12.1/src/main/resources/assets/hardlib/recipes/_factories.json

And this:

https://github.com/Draco18s/ReasonableRealism/blob/1.12.1/src/main/java/com/draco18s/industry/ExpandedIndustryBase.java#L171

 

And oh yeah, you'll need a single json for the recipe of course.

Edited November 12, 2017 by Draco18s
  • Quote

Share this post


Link to post
Share on other sites

JimiIT92    19

JimiIT92

JimiIT92    19

  • Dragon Slayer
  • JimiIT92
  • Members
  • 19
  • 723 posts
Posted November 12, 2017

Thank you for the answer, i did those steps and it worked :)

  • Quote

Share this post


Link to post
Share on other sites

Draco18s    2091

Draco18s

Draco18s    2091

  • Reality Controller
  • Draco18s
  • Members
  • 2091
  • 14018 posts
Posted November 12, 2017
1 hour ago, JimiIT92 said:

Thank you for the answer, i did those steps and it worked :)

JSON recipes are so easy to set up. Pretty much anything you'd want to deserialize out of them as ingredients has already been done in either the vanilla or Forge recipes. The ones I've done have been smashed together from what I can find in existing code.

 

You're welcome.

  • Quote

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Insert image from URL
×
  • Desktop
  • Tablet
  • Phone
Sign in to follow this  
Followers 1
Go To Topic Listing



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • MattNL
      Trouble getting contents of a Chest

      By MattNL · Posted 1 hour ago

      Oh, I see... well that's useful to know! I'm going to try implementing your JSON-style replacement. Thank you very much!
    • Differentiation
      [1.12.2] Modifying player capabilities for offline players?

      By Differentiation · Posted 1 hour ago

      Hey!   Is there any way to modify capability values for offline players (where EntityPlayerMP instance is null essentially) without using JSON? Is there like a way to make capabilities for GameProfile?   Any help is appreciated!   Thanks!
    • Draco18s
      Trouble getting contents of a Chest

      By Draco18s · Posted 1 hour ago

      This event does not fire on 1.14 https://github.com/MinecraftForge/MinecraftForge/pull/6267
    • DaemonUmbra
      Trouble getting contents of a Chest

      By DaemonUmbra · Posted 1 hour ago

      https://mcforge.readthedocs.io/en/1.13.x/concepts/sides/
    • MattNL
      Trouble getting contents of a Chest

      By MattNL · Posted 1 hour ago

      So, I realized I didn't really mention what the problem was, oops. I need to get the contents of broken containers, not just chests, and write that data to an item stack (presumably through net.minecraft.client.Minecraft.storeTEInStack).
  • Topics

    • MattNL
      4
      Trouble getting contents of a Chest

      By MattNL
      Started 1 hour ago

    • Differentiation
      0
      [1.12.2] Modifying player capabilities for offline players?

      By Differentiation
      Started 1 hour ago

    • inzig0
      1
      Does forge 1.14.-28.1 support openjdk11?

      By inzig0
      Started 2 hours ago

    • hobohogiepro
      5
      1.7.10 libraries won't download

      By hobohogiepro
      Started 2 hours ago

    • millerman19
      1
      java.lang.NoSuchFieldError: world

      By millerman19
      Started 2 hours ago

  • Who's Online (See full list)

    • MattNL
    • snivinia
    • saxon564
    • TrazorMC
    • Differentiation
    • DavidM
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [1.12] Dynamic Crafting Recipe
  • Theme
  • Contact Us
  • Discord

Copyright © 2019 ForgeDevelopment LLC · Ads by Curse Powered by Invision Community