Custom Recipes/1.16

Revision as of 04:13, 27 July 2021 by ShrimpBot (talk | contribs) (Copy Custom Recipes to MC1.16 archive)

Custom Recipe Serializers

Want to make a custom recipe type for a machine, or some mechanic your mod has? Great! It means users can participate in the datapack system for recipes, so you get automatic syncing, updating, and ease of maintenance on servers. Here's what you need to get started:

Classes/Interfaces for the inventories and serialization

IRecipeSerializer

The thing that actually serializes recipe files. It implements the vanilla recipe serializer interface and provides means of reading from JSON and performing read/write operations on network buffer objects. One should look into using Codecs for this class, as using them simplifies the logic significantly.

public class MyRecipeSerializer 
  extends ForgeRegistryEntry<IRecipeSerializer<?>> 
  implements IRecipeSerializer<MyRecipeType> {
  
  // your serializer code here

}

IRecipeType

Links the recipe type to its implementation class. This is a very lightweight class that vanilla uses to make a recipe file's type line to which serializer should be used to deserialize a recipe into an instance.

IInventory

Wraps vanilla's IInventory system. Here's a reference. Note this should not be used directly; you should make a fake inventory class and handle the actual match implementation with your own methods and logic.

IRecipe

Your actual recipe class or an abstraction to cheat vanilla's system and use your own recipe matching system. Takes the IInventory from above and matches it. Your recipe class should return the IRecipeType from registration in the getType override.

Setup

Once you have the above implementations, here's how to wire everything up:

  1. Register your recipe serializer to the RECIPE_SERIALIZERS Forge registry.
  2. Register the recipe type during the registration (constructor) phase. See below.
  3. Place a JSON file in data/recipes/my_recipe.json and ensure it has "type": "mymod:my_recipe_type" in the JSON structure.
Registry.register(Registry.RECIPE_TYPE, new ResLoc('mymod:my_recipe_type'), MyRecipeType.class);

This will load the recipe using the recipe serialization system, and wire it back to the serializer via matching the registry name in type to the value you specified while registering the serializer in step 1.