Custom Recipes
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
RecipeSerializer
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<RecipeSerializer<?>> implements RecipeSerializer<MyRecipe> { // your serializer code here }
RecipeType
Links the recipe type to its implementation class(es). This is a very lightweight class that vanilla uses to determine what recipes are associated with what implementors (e.g. CRAFTING
is for SHAPED_RECIPE
, SHAPELESS_RECIPE
, etc.).
Container
Vanilla's inventory system used in recipes to grab references to implementors to see if the associated recipe matches the current container data.
Recipe
Your actual recipe class or an abstraction to use your own recipe matching system. Takes the Container
from above and matches it. Your recipe class should return the RecipeType
from registration in #getType
and the serializer in #getSerializer
.
Setup
Once you have the above implementations, here's how to wire everything up:
- Register your recipe serializer to the
RECIPE_SERIALIZERS
Forge registry. - Register the recipe type during the common setup event or statically. See below.
- Place a JSON file in
data/recipes/my_recipe.json
and ensure it has"type": "mymod:my_recipe_serializer_registry_name"
in the JSON structure.
RecipeType.register("mymod:my_recipe_type");
This will load the recipe using the recipe serialization system, and wire it back to the serializer via matching the registry name of the serializer to the value you specified while registering the serializer in step 1.