Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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.

  • 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.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.