Jump to content

[1.15.2] Recipe not registering properly [Solved]


Thorius

Recommended Posts

Hi,

i'm trying to create a special recipe for a custom recipe type. The problem is that while the recipe exists, the recipe doesn't seem to have any information stored. I made it so that the function matches(CraftingInventory inv, World worldIn) outputs a text to the console if it is called. The recipe is registered the same way as a SpecialRecipe, which works fine for me. However, even though the recipe is in the RecipeManager and it does extend my recipe class, calling matches(CraftingInventory inv, World worldIn) manually does not output anything to the console.

I can't find the root of this behaviour, because i checked explicitly that the recipe extends my class. The only thing i can think of are the Sides. Maybe the server side doesn't get the required data. But then again it works for the SpecialRecipe and the SpecialRecipeSerializer is defined for IRecipe, which my custom recipe also implements. So is it inevitable to create a new recipeSerializer or does the problem lie elsewhere?

 

Thanks in advance

Edited by Thorius
Problem solved
Link to comment
Share on other sites

RecipeInit:

package com.thoriuslight.professionsmod.init;

import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.SpecialRecipeSerializer;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import com.thoriuslight.professionsmod.ProfessionsMod;
import com.thoriuslight.professionsmod.item.crafting.DoughRecipe;
import com.thoriuslight.professionsmod.item.crafting.SmithChainArmorRecipe;

import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;

@Mod.EventBusSubscriber(modid = ProfessionsMod.MODID, bus = Bus.MOD)
public class RecipeInit {
    public static final IRecipeSerializer<DoughRecipe> DOUGH_CRAFTING = null;
    public static final IRecipeSerializer<SmithChainArmorRecipe> CHAINMAIL_CRAFTING = null;
    
    @SubscribeEvent
    public static void registerRecipes(final RegistryEvent.Register<IRecipeSerializer<?>> event) {
    	System.out.println("RECIPE_INITIALIZATION");
        event.getRegistry().register(new SpecialRecipeSerializer<>(DoughRecipe::new).setRegistryName(ProfessionsMod.MODID, "dough_crafting"));
        event.getRegistry().register(new SpecialRecipeSerializer<>(SmithChainArmorRecipe::new).setRegistryName(ProfessionsMod.MODID, "chainmail_crafting"));
    }
}

DoughRecipe is the normal SpecialRecipe

 

SmithChainArmorRecipe: (kind of a mess right now, because i'm focusing on getting it to work)

package com.thoriuslight.professionsmod.item.crafting;

import java.util.List;

import com.google.common.collect.Lists;
import com.thoriuslight.professionsmod.init.ItemInit;
import com.thoriuslight.professionsmod.init.RecipeInit;
import com.thoriuslight.professionsmod.init.SkillInit;
import com.thoriuslight.professionsmod.item.ButtedChainArmorItem;

import net.minecraft.inventory.CraftingInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

public class SmithChainArmorRecipe implements ISmithRecipe{
	
	private final ItemStack recipeOutput;
	private final ResourceLocation id;
	private final int requiredSkills;
	
	public SmithChainArmorRecipe(ResourceLocation id){
		this.id = id;
		this.requiredSkills = SkillInit.WEAK_CHAIN_ARMOR.getId();
		this.recipeOutput = new ItemStack(ItemInit.COPPER_BUTTED_CHAIN_BOOTS.get());
	}
	
	@Override
	public boolean matches(CraftingInventory inv, World worldIn) {
		System.out.print("its working");
		List<ItemStack> list = Lists.newArrayList();
		boolean chainArmor = false;
		boolean chain = false;
		for(int i = 0; i < inv.getSizeInventory(); ++i) {
	    	ItemStack itemstack = inv.getStackInSlot(i);
	    	if (!itemstack.isEmpty()) {
	    		list.add(itemstack);
	    		if(itemstack.getItem() instanceof ButtedChainArmorItem)
	    			chainArmor = true;
	    		if(itemstack.getItem() == ItemInit.COPPER_CHAIN.get())
	    			chain = true;
	    	}
		}
	    if (list.size() == 2 && chain && chainArmor) {
	    	ItemStack stack = null;
	    	for(int j = 0; j < 2; ++j) {
	    		if(list.get(j).getItem() instanceof ButtedChainArmorItem) {
	    			stack = list.get(j);
	    			break;
	    		}
	    	}
	    	if(stack != null) {
	    		if(stack.getDamage() != 0)
	    		return true;
	    	}
		}
		return false;
	   }
	
	@Override
	public boolean isUnlocked(int skillList) {
		skillList &= this.requiredSkills;
		return skillList == this.requiredSkills;
	}
	
	@Override
	public ItemStack getCraftingResult(CraftingInventory inv) {
		return this.recipeOutput.copy();
	}

	@Override
	public boolean canFit(int width, int height) {
		return width * height >= 2;
	}

	@Override
	public ItemStack getRecipeOutput() {
		return ItemStack.EMPTY;
	}

	@Override
	public ResourceLocation getId() {
		return this.id;
	}

	@Override
	public IRecipeSerializer<?> getSerializer() {
		return RecipeInit.CHAINMAIL_CRAFTING;
	}

	@Override
	public Ingredient getInput() {
		return null;
	}
	@Override
	public NonNullList<Ingredient> getIngredients() {
		return null;
	}
	
	public int getRequirements() {
		return this.requiredSkills;
	}
	@Override
	public boolean isDynamic() {
		return true;
	}
}

 

ISmithRecipe:

package com.thoriuslight.professionsmod.item.crafting;

import javax.annotation.Nonnull;

import com.thoriuslight.professionsmod.ProfessionsMod;

import net.minecraft.inventory.CraftingInventory;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.registry.Registry;

public interface ISmithRecipe extends IRecipe<CraftingInventory>{
	ResourceLocation RECIPE_TYPE_ID = new ResourceLocation(ProfessionsMod.MODID, "smith");
	
	@Nonnull
	@Override
	default IRecipeType<?> getType() {
		return Registry.RECIPE_TYPE.getValue(RECIPE_TYPE_ID).get();
	}
	
	@Override
	default boolean canFit(int width, int height) {
		return false;
	}
	
	Ingredient getInput();

	boolean isUnlocked(int skillList);
}

 

Other SmithRecipes specified elsewhere with json files are working fine.

Link to comment
Share on other sites

Thanks for your reply,

it seems i made the wrong assumptions because of some mistakes on my part.

The function is called properly but i wrote print instead of println and it is also fine for another function to return null.

So the remaining problems are unrelated to this topic and i can manage them by myself.

 

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.

×
×
  • Create New...

Important Information

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