Jump to content

Conditional crafting recipes?


Alekseyev

Recommended Posts

Hi all, I have a question.

 

Let's say I want to have some crafting recipes that either give a different result are simply unavailable depending on a variable. (The question is not how to store/read this variable, but how to hijack the vanilla crafting process.)

 

Two simple completely arbitrary examples:

 

1. Standard crafting recipe is 4 sand becomes 1 sandstone. Now I want to check some data stored on the player and if variable A = 3, putting 4 sand into the crafting box gives 4 sandstone instead of 1.

2. Usually, putting one piece of sand into the crafting box does nothing. If variable A = 4, it should be able to be crafted into glass.

 

The idea is that this variable can be different for each player, so some should get these crafting options and others not.

 

Is it even possible with vanilla crafting? I know that Thaumcraft has crafting recipes that you have to unlock first and per player, but those use a special custom crafting table.

 

Regards :)

Link to comment
Share on other sites

Yes, see Choonster's TestMod3

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

You'll need to read this variable from the crafting player (ForgeHooks.getCraftingPlayer) in the appropriate methods to determine the return value. You can either hardcode the variable, value and result or allow them to be specified via the JSON recipe file (possibly via the existing recipe conditions system, like I do in the class Draco18s linked).

 

For a dynamic input item, you'll need to create your own Ingredient implementation and override Ingredient#apply to check the variable and return true or false depending on its value and the ItemStack argument.


For a dynamic output item, you'll need to create your own IRecipe implementation (probably extending an existing one like ShapedOreRecipe/ShapelessOreRecipe) and implement IRecipe#getCraftingResult to check the variable and return the appropriate item.

 

For a dynamically unlocked recipe, you'll need to create your own IRecipe implementation and implement IRecipe#matches to check the variable and return false if it's not the right value.

 

7 hours ago, Draco18s said:

Yes, see Choonster's TestMod3

 

That class allows for load-time conditions to enable/disable an Ingredient, which isn't quite what the OP wants.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I think i've found a more "generation friendly way" of generating random blobs of mineral around the ore. This both does the trick and make the generation work flawlessly (albeit i need to make some adjustments). I just ended up thinking "MAYBE there is another Feature I can use to place the minerals instead of doing it manually" And, low and behold, SCATTERED_ORE  is actually a thing. I don't really know how "orthodox" this solution is, but it works and rids me of all the problems I had witht my original "manual" implementation. If anybody has any insight on why my original class could've been causing lag to the point of freezes and chunk generation just refusing to keep loading new chunks, I'm also all ears:   Here is the full if (placed) block for anyone with a smiliar issue: if (placed) { // Define the block to replace surrounding blocks with BlockState surroundingBlockState = BlockInit.ABERRANT_MINERALOID.get().defaultBlockState(); RuleTest stoneReplacement = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); //Tag which indicates ores that can replace stone RuleTest deepslateReplacement = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); //Tag which indicates ores that can replace deepslate // Create a list of TargetBlockState for the Aberrant Mineraloids List<OreConfiguration.TargetBlockState> targets = new ArrayList<>(); targets.add(OreConfiguration.target(stoneReplacement, surroundingBlockState)); targets.add(OreConfiguration.target(deepslateReplacement, surroundingBlockState)); // Create a new OreConfiguration for the Aberrant Mineraloids OreConfiguration mineraloidConfig = new OreConfiguration(targets, 9); // vein size // Create a new context for the Aberrant Mineraloids FeaturePlaceContext<OreConfiguration> mineraloidCtx = new FeaturePlaceContext<>( Optional.empty(), world, ctx.chunkGenerator(), ctx.random(), offsetOrigin, mineraloidConfig ); // Generate the Aberrant Mineraloids using the SCATTERED_ORE configuration boolean mineraloidsPlaced = Feature.SCATTERED_ORE.place(mineraloidCtx); }  
    • bonjour , j ai trouver une vidéo très intéressant sur Minecraft comment voler des villageois sans qu'il sans rendent compte en 37 manière , c est très intéressant a voir et surtout  le refaire après    Je vous les met le lien de la vidéo YouTube : https://shrinkme.cc/ZlHy 
    • Wow, thanks @scientistknight1 ! That was exactly it. The issue: I was extending BaseEntityBlock, which implements getRenderShape as invisible for some reason: public abstract class BaseEntityBlock extends Block implements EntityBlock { ... public RenderShape getRenderShape(BlockState p_49232_) { return RenderShape.INVISIBLE; } ... } Looking at the Implementation on Block, it calls BlockBehaviour, which returns RenderShape.MODEL. Overriding it on my Entity did the trick.   public class AutomataStartBlock extends BaseEntityBlock { ... @Override public RenderShape getRenderShape(BlockState p_49232_) { return RenderShape.MODEL; } ... } It now works. I wonder why why BaseEntityBlock returns INVISIBLE, though.
    • The issue occurs here: CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MOD_ID); Exception message: java.lang.NoSuchFieldError: Class net.minecraft.core.registries.Registries does not have member field 'net.minecraft.resources.ResourceKey f_279569_' The mod loads and operates without any issues during debugging in the development environment. However, it crashes when loading the mod through the official Minecraft launcher. This problem did not occur in versions 1.20.1 or 1.20.4. How can I resolve this error?
  • Topics

×
×
  • Create New...

Important Information

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