Jump to content

[1.16.4] Register recipe type - cannot join server


bajtix

Recommended Posts

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.

Link to comment
Share on other sites

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.

Link to comment
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.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.