Jump to content

[1.15.2] Recipe not registering properly [Solved]


Recommended Posts

Posted (edited)

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
Posted

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.

Posted

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.

 

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • been getting this error and followed the old tick loop post however i cant figure out what file to delete Description: Exception in server tick loop java.lang.NullPointerException: Cannot invoke "net.minecraft.world.level.LevelAccessor.m_7654_()" because the return value of "net.minecraftforge.event.level.LevelEvent$Unload.getLevel()" is null     at com.lion.graveyard.platform.forge.HordeSpawner.onWorldUnload(HordeSpawner.java:41) ~[The_Graveyard_3.1_(FORGE)_for_1.20.1.jar%23196!/:?] {re:classloading}     at com.lion.graveyard.platform.forge.__HordeSpawner_onWorldUnload_Unload.invoke(.dynamic) ~[The_Graveyard_3.1_(FORGE)_for_1.20.1.jar%23196!/:?] {re:classloading,pl:eventbus:B}     at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:73) ~[eventbus-6.0.5.jar%2352!/:?] {}     at net.minecraftforge.eventbus.EventBus.post(EventBus.java:315) ~[eventbus-6.0.5.jar%2352!/:?] {}     at net.minecraftforge.eventbus.EventBus.post(EventBus.java:296) ~[eventbus-6.0.5.jar%2352!/:?] {}     at net.mehvahdjukaar.moonlight.api.platform.forge.PlatHelperImpl.invokeLevelUnload(PlatHelperImpl.java:279) ~[moonlight-1.20-2.13.66-forge.jar%23185!/:?] {re:classloading}     at net.mehvahdjukaar.moonlight.api.platform.PlatHelper.invokeLevelUnload(PlatHelper.java) ~[moonlight-1.20-2.13.66-forge.jar%23185!/:?] {re:mixin,re:classloading}     at net.mehvahdjukaar.moonlight.core.misc.FakeLevelManager.invalidate(FakeLevelManager.java:29) ~[moonlight-1.20-2.13.66-forge.jar%23185!/:?] {re:classloading}     at net.mehvahdjukaar.supplementaries.common.utils.fake_level.BlockTestLevel.invalidate(BlockTestLevel.java:34) ~[supplementaries-1.20-3.1.13.jar%23192!/:?] {re:classloading}     at net.mehvahdjukaar.supplementaries.common.block.faucet.FaucetBehaviorsManager.onReloadWithLevel(FaucetBehaviorsManager.java:129) ~[supplementaries-1.20-3.1.13.jar%23192!/:?] {re:classloading}     at net.mehvahdjukaar.supplementaries.common.events.ServerEvents.onServerStart(ServerEvents.java:160) ~[supplementaries-1.20-3.1.13.jar%23192!/:?] {re:mixin,re:classloading}     at net.mehvahdjukaar.supplementaries.common.events.forge.ServerEventsForge.onServerStart(ServerEventsForge.java:119) ~[supplementaries-1.20-3.1.13.jar%23192!/:?] {re:classloading}     at net.mehvahdjukaar.supplementaries.common.events.forge.__ServerEventsForge_onServerStart_ServerStartedEvent.invoke(.dynamic) ~[supplementaries-1.20-3.1.13.jar%23192!/:?] {re:classloading,pl:eventbus:B}     at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:73) ~[eventbus-6.0.5.jar%2352!/:?] {}     at net.minecraftforge.eventbus.EventBus.post(EventBus.java:315) ~[eventbus-6.0.5.jar%2352!/:?] {}     at net.minecraftforge.eventbus.EventBus.post(EventBus.java:296) ~[eventbus-6.0.5.jar%2352!/:?] {}     at net.minecraftforge.server.ServerLifecycleHooks.handleServerStarted(ServerLifecycleHooks.java:115) ~[forge-1.20.1-47.3.29-universal.jar%23212!/:?] {re:classloading}     at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:638) ~[server-1.20.1-20230612.114412-srg.jar%23207!/:?] {re:mixin,pl:accesstransformer:B,xf:fml:xaeroworldmap:xaero_wm_minecraftserver,xf:fml:xaerominimap:xaero_minecraftserver,re:classloading,pl:accesstransformer:B,xf:fml:xaeroworldmap:xaero_wm_minecraftserver,xf:fml:xaerominimap:xaero_minecraftserver,pl:mixin:APP:unionlib.mixins.json:MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:A}     at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.20.1-20230612.114412-srg.jar%23207!/:?] {re:mixin,pl:accesstransformer:B,xf:fml:xaeroworldmap:xaero_wm_minecraftserver,xf:fml:xaerominimap:xaero_minecraftserver,re:classloading,pl:accesstransformer:B,xf:fml:xaeroworldmap:xaero_wm_minecraftserver,xf:fml:xaerominimap:xaero_minecraftserver,pl:mixin:APP:unionlib.mixins.json:MinecraftServerMixin,pl:mixin:APP:citadel.mixins.json:MinecraftServerMixin,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:A}     at java.lang.Thread.run(Thread.java:833) ~[?:?] {}  
    • Online forums in general seem to be declining in popularity imo. There’s still value here for certain types of content, such as written tutorials and blog posts which would otherwise get lost in the chat history fairly quickly on Discord. Also for those that prefer the forums format ofc. But for faster support related topics, I agree that the Discord is probably your best bet at the moment. The speed of responses is also down to the ratio of volunteers - the player support forum still seems pretty active, but the coding ones much less so. Once you’re feeling more confident in your modding skills, be the change you want to see
    • try the same link, i swapped logs after sitting in the world for a few minutes then leaving. Lmk if it keeps happening then ill just send a video of the live log on modrinth
    • It is an issue with chimes
  • Topics

×
×
  • Create New...

Important Information

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