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

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

  • Author

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.

  • Author

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

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.