Posted December 30, 20204 yr I'm posting this in a different thread, because it is a little different then just creating a recipe. So I managed to make my custom recipe work, but it only works for singleplayer. When I try to join a server, the client throws Internal Exception: io.netty.handler.codec.EncoderException: java.lang.NullPointerException I am registering the recipe here: @SubscribeEvent public static void onRecipeRegistry(final RegistryEvent.Register<IRecipeSerializer<?>> recipeRegistryEvent) { LOGGER.info("Recipe registry!"); SpecialRecipeSerializer<MusicCloningRecipe> musicCloningRecipe = (SpecialRecipeSerializer<MusicCloningRecipe>) new SpecialRecipeSerializer<>(MusicCloningRecipe::new).setRegistryName("crafting_special_musiccloning"); recipeRegistryEvent.getRegistry().register( musicCloningRecipe ); } And it is kept here: @ObjectHolder("musicblock") class Recipes { public static final SpecialRecipeSerializer<MusicCloningRecipe> CRAFTING_SPECIAL_MUSICCLONING = null; } The recipe code: package xyz.bajtix.musicblock; import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.WrittenBookItem; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.SpecialRecipe; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; public class MusicCloningRecipe extends SpecialRecipe { public MusicCloningRecipe(ResourceLocation idIn) { super(idIn); } public boolean matches(CraftingInventory inv, World worldIn) { int i = 0; boolean oneHasData = false; for(int j = 0; j < inv.getSizeInventory(); ++j) { if(inv.getStackInSlot(j).getItem() == ItemList.musicBlock) { i++; if(inv.getStackInSlot(j).hasTag() && inv.getStackInSlot(j).getTag().contains("music")) oneHasData = !oneHasData; } } return i == 2 && oneHasData; } /** * Returns an Item that is the result of this recipe * * @param inv */ @Override public ItemStack getCraftingResult(CraftingInventory inv) { int i = 0; CompoundNBT data = null; for(int j = 0; j < inv.getSizeInventory(); ++j) { if(inv.getStackInSlot(j).getItem() == ItemList.musicBlock) { i++; if(inv.getStackInSlot(j).hasTag() && inv.getStackInSlot(j).getTag().contains("music")) data = inv.getStackInSlot(j).getTag(); } } if(data == null) return null; ItemStack stack = new ItemStack(ItemList.musicBlock,1,data); stack.setTag(data); return stack; } @Override public NonNullList<ItemStack> getRemainingItems(CraftingInventory inv) { NonNullList<ItemStack> itemlist = NonNullList.withSize(inv.getSizeInventory(), ItemStack.EMPTY); for(int i = 0; i < itemlist.size(); ++i) { ItemStack itemstack = inv.getStackInSlot(i); if (itemstack.hasContainerItem()) { itemlist.set(i, itemstack.getContainerItem()); } else if (itemstack.getItem() == ItemList.musicBlock) { ItemStack itemstack1 = itemstack.copy(); itemstack1.setCount(1); itemlist.set(i, itemstack1); break; } } return itemlist; } /** * Used to determine if this recipe can fit in a grid of the given width/height * * @param width * @param height */ @Override public boolean canFit(int width, int height) { return width >= 2 && height >= 2; } @Override public IRecipeSerializer<?> getSerializer() { return null; } } And it is registered in an @OjectHolder class Could someone please tell me what am I doing wrong? I couldn't really find a good documentation for it.
December 30, 20204 yr @Override public IRecipeSerializer<?> getSerializer() { return null; } This is where you should tell the game which serializer has to be used to read/write your recipe, it should not be null Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port
December 30, 20204 yr Author 55 minutes ago, Beethoven92 said: @Override public IRecipeSerializer<?> getSerializer() { return null; } This is where you should tell the game which serializer has to be used to read/write your recipe, it should not be null Thank you! I somehow overlooked that in my code and spent a few hours searching for the solution.
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.