I am working on a mod that adds a crafting station with five input slots and one output slot. I want to implement a new crafting type so that I can create shapeless recipes for use with this block, but that cannot be crafted in any other table.
I found this example that was shared by someone on a different thread that helped me get started setting up the IRecipe and Serializer. Im not totally sure, but it seems to me like this recipe type takes a single input and produces output from looking at the matches() function, but I could be understanding it wrong. My block also will have no ticks/processing time so I removed that.
Here is my recipe class so far
public class BdoCookingRecipe implements IRecipe<RecipeWrapper> {
private final ResourceLocation id;
private final String group;
private final NBTIngredient original;
private final ItemStack result;
public BdoCookingRecipe(ResourceLocation id, String group, NBTIngredient original, ItemStack result) {
this.id = id;
this.group = group;
this.original = original;
this.result = result;
}
@Override
public boolean matches(RecipeWrapper inv, World worldIn) {
return this.original.test(inv.getStackInSlot(0));
}
@Override
public ItemStack getCraftingResult(RecipeWrapper inv) {
return this.result.copy();
}
@Override
public boolean canFit(int width, int height) {
return true;
}
@Override
public ItemStack getRecipeOutput() {
return this.result;
}
@Override
public ResourceLocation getId() {
return this.id;
}
@Override
public String getGroup() {
return this.group;
}
@Override
public NonNullList<Ingredient> getIngredients() {
return NonNullList.withSize(1, this.original);
}
@Override
public NonNullList<ItemStack> getRemainingItems(RecipeWrapper inv) {
return NonNullList.create();
}
@Override
public ItemStack getIcon() {
return new ItemStack(RegistryHandler.BASIC_COOKING_UTENSIL_BLOCK.get());
}
@Override
public IRecipeSerializer<?> getSerializer() {
return ModRecipes.BDOCOOKING.get();
}
@Override
public IRecipeType<?> getType() {
return ModRecipes.Type.BDOCOOKING;
}
public static class Serializer extends ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<BdoCookingRecipe> {
@Override
public BdoCookingRecipe read(ResourceLocation recipeId, JsonObject json) {
String group = JSONUtils.getString(json, "group", "");
NBTIngredient ingredient = NBTIngredient.Serializer.INSTANCE.parse(JSONUtils.getJsonObject(json, "ingredient"));
ItemStack result = CraftingHelper.getItemStack(JSONUtils.getJsonObject(json, "result"), true);
return new BdoCookingRecipe(recipeId, group, ingredient, result);
}
@Override
public BdoCookingRecipe read(ResourceLocation recipeId, PacketBuffer buffer) {
String group = buffer.readString(32767);
NBTIngredient ingredient = NBTIngredient.Serializer.INSTANCE.parse(buffer);
ItemStack result = buffer.readItemStack();
return new BdoCookingRecipe(recipeId, group, ingredient, result);
}
@Override
public void write(PacketBuffer buffer, BdoCookingRecipe recipe) {
buffer.writeString(recipe.group);
recipe.original.write(buffer);
buffer.writeItemStack(recipe.result);
}
}
}
And the serializer
public class ModRecipes {
public static class Type {
public static final IRecipeType<BdoCookingRecipe> BDOCOOKING = IRecipeType.register(BdoCooking.MOD_ID + ":bdocooking");
}
public static final DeferredRegister<IRecipeSerializer<?>> RECIPE_SERIALIZERS = new DeferredRegister<>(ForgeRegistries.RECIPE_SERIALIZERS, BdoCooking.MOD_ID);
public static final RegistryObject<IRecipeSerializer<BdoCookingRecipe>> BDOCOOKING = RECIPE_SERIALIZERS.register("bdocooking", () -> (new BdoCookingRecipe.Serializer()));
}
What changes do I need to make to ensure that this recipe will be shapeless and support 5 inputs?
Github: https://github.com/AliceProxy/CookingMod/tree/master/src/main/java/com/proxyalice/bdocookingmod
Thanks for any help and suggestions.