Jump to content

Multiple crafting recipe ingredients


peter1745

Recommended Posts

Hello, i'm currently having an issue with a crafting recipe, i want the recipe to require more than 1 of a specific ingredient, so you would require say 3x potatoes, 4x carrots and 7x apples.

 

I haven't found a way to do this using the JSON format, so I figured that i would implement an IRecipe, however i can't make it work, logically it seems like it should work. So i was wondering if anyone have any examples of a mod that does this, or if anyone know how to do it.

 

The code that i currently have is below:

 

private static class RecipeMysticalSaladEssence extends net.minecraftforge.registries.IForgeRegistryEntry.Impl<IRecipe> implements IRecipe
	{

		private static final Map<Item, Integer> REQUIRED_AMOUNTS = Maps.newHashMap();
		private static final Map<Item, Boolean> FOUND_ITEMS = Maps.newHashMap();

		public RecipeMysticalSaladEssence()
		{
			FOUND_ITEMS.put(MFItems.CUCUMBER_SLICE, false);
			FOUND_ITEMS.put(MFItems.TOMATO_SLICE, false);
			FOUND_ITEMS.put(MFItems.CARROT_SLICE, false);
			FOUND_ITEMS.put(MFItems.POTATO_SLICE, false);

			REQUIRED_AMOUNTS.put(MFItems.CUCUMBER_SLICE, 7);
			REQUIRED_AMOUNTS.put(MFItems.TOMATO_SLICE, 5);
			REQUIRED_AMOUNTS.put(MFItems.CARROT_SLICE, 2);
			REQUIRED_AMOUNTS.put(MFItems.POTATO_SLICE, 3);
		}

		@Override
		public boolean matches(InventoryCrafting inv, World worldIn)
		{
			int matchingItems = 0;

			for (int i = 0; i < inv.getSizeInventory(); i++)
			{
				ItemStack stack = inv.getStackInSlot(i);
				if (!stack.isEmpty())
				{
					if (this.hasRequiredAmount(stack) && !this.hasBeenFound(stack))
					{
						matchingItems++;
						FOUND_ITEMS.replace(stack.getItem(), true);
					}
				}
			}

			return matchingItems == 4;
		}

		private boolean hasBeenFound(ItemStack stack)
		{
			return FOUND_ITEMS.containsKey(stack.getItem()) && FOUND_ITEMS.get(stack.getItem());
		}

		private boolean hasRequiredAmount(ItemStack stack)
		{
			return REQUIRED_AMOUNTS.containsKey(stack.getItem()) && stack.getCount() >= REQUIRED_AMOUNTS.get(stack.getItem());
		}

		private int getAmountForItem(ItemStack stack)
		{
			if (!REQUIRED_AMOUNTS.containsKey(stack.getItem()))
				return -1;

			return REQUIRED_AMOUNTS.get(stack.getItem());
		}

		@Override
		public ItemStack getCraftingResult(InventoryCrafting inv)
		{
			return new ItemStack(MFItems.MYSTICAL_SALAD_ESSENCE);
		}

		@Override
		public boolean canFit(int width, int height)
		{
			return width > 1 && height > 1;
		}

		@Override
		public ItemStack getRecipeOutput()
		{
			return new ItemStack(MFItems.MYSTICAL_SALAD_ESSENCE);
		}

		@Override
		public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv)
		{
			NonNullList<ItemStack> items = NonNullList.withSize(inv.getSizeInventory(), ItemStack.EMPTY);

			for (int i = 0; i < inv.getSizeInventory(); i++)
			{
				ItemStack stack = inv.getStackInSlot(i);

				if (!stack.isEmpty())
				{
					int amount = this.getAmountForItem(stack);

					if (amount > 0)
					{
						ItemStack copy = stack.copy();
						copy.shrink(amount);
						items.add(i, copy);
					}
				}

			}

			inv.clear();

			return items;
		}

	}

 

Link to comment
Share on other sites

You are not resetting your FOUND_ITEMS map's state, thus the matches will never return true.

IList#add inserts the entry into a given position in the list, shifting all entries with a higher or equal position to the right. This will crash the NonNullList created with the [int, T] constructor since the add operation in that case is not supported. You need to use set, not add.

Link to comment
Share on other sites

 @V0idWa1k3r That fixed one issue, however i've determined that the major issue isn't with my IRecipe, apparently Minecraft/Minecraft Forge doesn't update the crafting matrix when you right-click to add 1x item to the crafting grid. Personally i think this is a major flaw, since it prevents us from accurately determining how many of an item there is in a stack, since IRecipe's matching method isn't called when you right-click. Thanks for pointing out the smaller flawes in my code btw :)

Link to comment
Share on other sites

7 minutes ago, peter1745 said:

Minecraft/Minecraft Forge doesn't update the crafting matrix when you right-click to add 1x item to the crafting grid. Personally i think this is a major flaw, since it prevents us from accurately determining how many of an item there is in a stack, since IRecipe's matching method isn't called when you right-click.

Well, that happens because in vanilla there is no reason to. All recipes in minecraft take one item at a time, not many, and as such the system just isn't built with requiring more than one item in a stack at a time. This isn't a "major flaw", this is you using the system in a way it was never meant to be used. 

Your best solution is to have your own implementation of ContainerWorkbench that does the check every time a stack size is changed aswell. Of course that means that you need your own workbench.

Edited by V0idWa1k3r
Link to comment
Share on other sites

2 minutes ago, V0idWa1k3r said:

Well, that happens because in vanilla there is no reason to. All recipes in minecraft take one item at a time, not many, and as such the system just isn't built with requiring more than one item in a stack at a time. This isn't a "major flaw", this is you using the system in a way it was never meant to be used. 

Your best solution is to have your own implementation of ContainerWorkbench that does the check every time a stack size is changed aswell. Of course that means that you need your own workbench.

True it wasn't built to support that, however i think it should've been, it would allow for more flexibility, however i understand why it wasn't built to support that kind of implementation

Link to comment
Share on other sites

You could have your own version of ContainerWorkbench that does the check and replace the default one with yours when the container is opened. It won't work for any of the modded crafting tables though.

I suppose you could make an issue/submit a pull request at forge's github about that but I don't know how likely it is that forge would accept it, since you are the only one doing this.

I guess you could also contact Mojang directly and ask them to add the ability to have recipes support more than one item from a stack per craft. They might be willing to do this since they are already doing the whole data-driven recipes for map makers thing, but good luck contacting them in the first place.

Link to comment
Share on other sites

16 minutes ago, V0idWa1k3r said:

You could have your own version of ContainerWorkbench that does the check and replace the default one with yours when the container is opened. It won't work for any of the modded crafting tables though.

I suppose you could make an issue/submit a pull request at forge's github about that but I don't know how likely it is that forge would accept it, since you are the only one doing this.

I guess you could also contact Mojang directly and ask them to add the ability to have recipes support more than one item from a stack per craft. They might be willing to do this since they are already doing the whole data-driven recipes for map makers thing, but good luck contacting them in the first place.

Alright, might try to make an issue or pull request

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hi I’m running same mod on a server and realized they are spawning in chests which I don’t want, if I were to edit this data pack to disable them spawning in chests how would I do that? Explain to me like I’m 8
    • every time i use play forge in the launcher it says game crashed unexpected issuse and when i use curseforge it also doesn't work
    • I've attempted to use Jarfix as well. I tried running a previous version (18.2) of Minecraft and added a few random popular mods and the crashing is persistent among the servers. 
    • I attempted Java 17 again and it still doesn't work. Java -version in CMD: java -version java version "17.0.6" 2023-01-17 LTS Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190) Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)   The error I get after using Java 17 again. 2023-03-24 19:01:56,259 main WARN Advanced terminal features are not available in this environment [19:01:56] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, forgeserver, --fml.forgeVersion, 43.2.8, --fml.mcVersion, 1.19.2, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20220805.130853] [19:01:56] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 10.0.8+10.0.8+main.0ef7e830 starting: java version 17.0.6 by Oracle Corporation; OS Windows 10 arch amd64 version 10.0 [19:01:57] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/Kheyo/Downloads/Servers/Badaboop%20Server/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2363!/ Service=ModLauncher Env=SERVER [19:01:57] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Kheyo\Downloads\Servers\Badaboop Server\libraries\net\minecraftforge\fmlcore\1.19.2-43.2.8\fmlcore-1.19.2-43.2.8.jar is missing mods.toml file [19:01:57] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Kheyo\Downloads\Servers\Badaboop Server\libraries\net\minecraftforge\javafmllanguage\1.19.2-43.2.8\javafmllanguage-1.19.2-43.2.8.jar is missing mods.toml file [19:01:57] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Kheyo\Downloads\Servers\Badaboop Server\libraries\net\minecraftforge\lowcodelanguage\1.19.2-43.2.8\lowcodelanguage-1.19.2-43.2.8.jar is missing mods.toml file [19:01:57] [main/WARN] [ne.mi.fm.lo.mo.ModFileParser/LOADING]: Mod file C:\Users\Kheyo\Downloads\Servers\Badaboop Server\libraries\net\minecraftforge\mclanguage\1.19.2-43.2.8\mclanguage-1.19.2-43.2.8.jar is missing mods.toml file [19:01:57] [main/INFO] [ne.mi.fm.lo.mo.JarInJarDependencyLocator/]: Found 8 dependencies adding them to mods collection [19:01:59] [main/INFO] [mixin/]: Compatibility level set to JAVA_17 [19:01:59] [main/ERROR] [mixin/]: Mixin config mixins.oculus.compat.sodium.json does not specify "minVersion" property [19:01:59] [main/INFO] [mixin/]: Successfully loaded Mixin Connector [com.sonicether.soundphysics.MixinConnector] [19:01:59] [main/INFO] [mixin/]: Successfully loaded Mixin Connector [ca.spottedleaf.starlight.mixin.MixinConnector] [19:01:59] [main/INFO] [cp.mo.mo.LaunchServiceHandler/MODLAUNCHER]: Launching target 'forgeserver' with arguments [] [19:01:59] [main/WARN] [mixin/]: Reference map 'createdeco.refmap.json' for createdeco.mixins.json could not be read. If this is a development environment you can ignore this message [19:01:59] [main/WARN] [mixin/]: Reference map 'Weeping-Angels-forge-refmap.json' for weeping_angels.mixins.json could not be read. If this is a development environment you can ignore this message [19:01:59] [main/INFO] [Rubidium/]: Loaded configuration file for Rubidium: 30 options available, 0 override(s) found [19:01:59] [main/WARN] [mixin/]: Reference map 'yungsextras.refmap.json' for yungsextras.mixins.json could not be read. If this is a development environment you can ignore this message [19:01:59] [main/WARN] [mixin/]: Reference map 'yungsextras.refmap.json' for yungsextras_forge.mixins.json could not be read. If this is a development environment you can ignore this message [19:01:59] [main/WARN] [mixin/]: Reference map '${refmap_target}refmap.json' for corgilib.forge.mixins.json could not be read. If this is a development environment you can ignore this message [19:01:59] [main/WARN] [mixin/]: Reference map 'modid.refmap.json' for createtweaker.mixin.json could not be read. If this is a development environment you can ignore this message [Serene Seasons Transformer]: Transforming m_47480_ (Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;Z)Z in net/minecraft/world/level/biome/Biome [Serene Seasons Transformer]: Patched 1 calls [Serene Seasons Transformer]: Transforming m_47519_ (Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z in net/minecraft/world/level/biome/Biome [Serene Seasons Transformer]: Successfully patched shouldSnow [Serene Seasons Transformer]: Transforming m_8714_ (Lnet/minecraft/world/level/chunk/LevelChunk;I)V in net/minecraft/server/level/ServerLevel [Serene Seasons Transformer]: Successfully patched tickChunk [19:01:59] [main/INFO] [ne.mi.co.Co.placebo/COREMODLOG]: Patching IForgeItemStack#getEnchantmentLevel [19:01:59] [main/INFO] [ne.mi.co.Co.placebo/COREMODLOG]: Patching IForgeItemStack#getEnchantmentLevel [19:01:59] [main/WARN] [mixin/]: Error loading class: com/mojang/blaze3d/audio/Channel (java.lang.ClassNotFoundException: com.mojang.blaze3d.audio.Channel) [19:01:59] [main/WARN] [mixin/]: @Mixin target com.mojang.blaze3d.audio.Channel was not found assets/sound_physics_remastered/sound_physics_remastered.mixins.json:ChannelAccessor [Serene Seasons Transformer]: Transforming m_8714_ (Lnet/minecraft/world/level/chunk/LevelChunk;I)V in net/minecraft/server/level/ServerLevel [Serene Seasons Transformer]: Successfully patched tickChunk [19:02:00] [main/INFO] [ne.mi.co.Co.placebo/COREMODLOG]: Patching IForgeItemStack#getEnchantmentLevel [19:02:00] [main/INFO] [ne.mi.co.Co.placebo/COREMODLOG]: Patching IForgeItemStack#getEnchantmentLevel [Serene Seasons Transformer]: Transforming m_8107_ ()V in net/minecraft/world/entity/animal/SnowGolem [Serene Seasons Transformer]: Patched 1 calls [19:02:01] [main/INFO] [ne.mi.co.Co.placebo/COREMODLOG]: Patching IForgeItemStack#getEnchantmentLevel [19:02:01] [main/INFO] [ne.mi.co.Co.placebo/COREMODLOG]: Patching IForgeItemStack#getEnchantmentLevel [19:02:02] [main/INFO] [minecraft/DataFixers]: Building unoptimized datafixer [19:02:02] [main/WARN] [mixin/]: @ModifyConstant conflict. Skipping repurposed_structures.mixins.json:structures.StructurePoolMixin->@ModifyConstant::repurposedstructures_increaseWeightLimitDev(I)I with priority 1000, already redirected by yungsapi_forge.mixins.json:IncreaseStructureWeightLimitMixinForge->@ModifyConstant::yungsapi_increaseWeightLimit(I)I with priority 1000 [Serene Seasons Transformer]: Transforming m_47480_ (Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;Z)Z in net/minecraft/world/level/biome/Biome [Serene Seasons Transformer]: Patched 1 calls [Serene Seasons Transformer]: Transforming m_47519_ (Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z in net/minecraft/world/level/biome/Biome [Serene Seasons Transformer]: Successfully patched shouldSnow [19:02:03] [main/ERROR] [ne.mi.fm.lo.RuntimeDistCleaner/DISTXFORM]: Attempted to load class net/minecraft/client/KeyMapping for invalid dist DEDICATED_SERVER [19:02:03] [main/WARN] [mixin/]: Error loading class: net/minecraft/client/KeyMapping (java.lang.RuntimeException: Attempted to load class net/minecraft/client/KeyMapping for invalid dist DEDICATED_SERVER) Exception in thread "main" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:32)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.Launcher.run(Launcher.java:106)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.Launcher.main(Launcher.java:77)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23)         at cpw.mods.bootstraplauncher@1.1.2/cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:141) Caused by: java.lang.reflect.InvocationTargetException         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)         at java.base/java.lang.reflect.Method.invoke(Method.java:568)         at MC-BOOTSTRAP/fmlloader@1.19.2-43.2.8/net.minecraftforge.fml.loading.targets.CommonServerLaunchHandler.lambda$launchService$0(CommonServerLaunchHandler.java:29)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30)         ... 7 more Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:392)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:250)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.service.modlauncher.MixinTransformationHandler.processClass(MixinTransformationHandler.java:131)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.launch.MixinLaunchPluginLegacy.processClass(MixinLaunchPluginLegacy.java:131)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.serviceapi.ILaunchPluginService.processClassWithFlags(ILaunchPluginService.java:156)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.LaunchPluginHandler.offerClassNodeToPlugins(LaunchPluginHandler.java:88)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.ClassTransformer.transform(ClassTransformer.java:120)         at MC-BOOTSTRAP/cpw.mods.modlauncher@10.0.8/cpw.mods.modlauncher.TransformingClassLoader.maybeTransformClassBytes(TransformingClassLoader.java:50)         at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.readerToClass(ModuleClassLoader.java:113)         at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.lambda$findClass$15(ModuleClassLoader.java:219)         at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.loadFromModule(ModuleClassLoader.java:229)         at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.findClass(ModuleClassLoader.java:219)         at cpw.mods.securejarhandler/cpw.mods.cl.ModuleClassLoader.loadClass(ModuleClassLoader.java:135)         at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.world.inventory.MenuType.<clinit>(MenuType.java:7)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.core.Registry.m_235768_(Registry.java:230)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.core.Registry.lambda$internalRegister$54(Registry.java:461)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.core.Registry.lambda$static$70(Registry.java:667)         at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.core.Registry.<clinit>(Registry.java:666)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.server.Bootstrap.m_135870_(Bootstrap.java:43)         at TRANSFORMER/minecraft@1.19.2/net.minecraft.server.Main.main(Main.java:110)         ... 13 more Caused by: org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException: net.minecraft.client.KeyMapping         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinPreProcessorStandard.transformMethod(MixinPreProcessorStandard.java:754)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinPreProcessorStandard.transform(MixinPreProcessorStandard.java:739)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinPreProcessorStandard.attach(MixinPreProcessorStandard.java:310)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinPreProcessorStandard.createContextFor(MixinPreProcessorStandard.java:280)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinInfo.createContextFor(MixinInfo.java:1288)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:292)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:383)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:365)         at MC-BOOTSTRAP/org.spongepowered.mixin/org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:363)         ... 34 more Press any key to continue . . .    
  • Topics

×
×
  • Create New...

Important Information

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