Jump to content

How to change default crafting recipes and disable items in vanilla minecraft


_KS_
 Share

Recommended Posts

Hi. I need help with changing vanilla minecraft default recipes and disabling items from vanilla minecraft.

I want to change in my mod entire logic of vanilla game and make custom progress system based on players progress in my mod.
Disabling item is for unlocking them after player get progress points something like in sevtech ages.

No code for now just item registers but i cant find any option to change registry with vanilla items and recipes without changing game files it self

Link to comment
Share on other sites

1 hour ago, _KS_ said:

Hi. I need help with changing vanilla minecraft default recipes and disabling items from vanilla minecraft.

Replace the recipe JSONs by supplying ones with a similar name. If you want to make it such that recipes can't be crafted until a certain point, it is much simpler to create a new block that functions the same as a crafting workbench but checks the progress. You can then disable any vanilla items by making an uncraftable recipe. If you need to change how non-JSONable recipes work, there are events for those (`PotionBrewEvent$Pre`, `AnvilUpdateEvent`, etc.).

You should always avoid touching and reregistering registry objects or modifying vanilla methods as you would most likely break compatibility with any other mod. The best way is just to modify the JSONs when applicable.

  • Like 1
Link to comment
Share on other sites

1 hour ago, ChampionAsh5357 said:

Replace the recipe JSONs by supplying ones with a similar name. If you want to make it such that recipes can't be crafted until a certain point, it is much simpler to create a new block that functions the same as a crafting workbench but checks the progress. You can then disable any vanilla items by making an uncraftable recipe. If you need to change how non-JSONable recipes work, there are events for those (`PotionBrewEvent$Pre`, `AnvilUpdateEvent`, etc.).

You should always avoid touching and reregistering registry objects or modifying vanilla methods as you would most likely break compatibility with any other mod. The best way is just to modify the JSONs when applicable.

Yes i know about problems with touching registry objects but i dont want to modify any of game file in assets because after uninstaling my mod this can generate problems.
About crafting table and any of blocks like anvil, etc. i made my own versions in my mod just for this purpose

I'm 100% sure i can change registry objects because i making mod to be incompatible with any other mod that adding any machines or upgrades to vanilla crafting methods

Edited by _KS_
Link to comment
Share on other sites

1 hour ago, _KS_ said:

Yes i know about problems with touching registry objects but i dont want to modify any of game file in assets because after uninstaling my mod this can generate problems.

You wouldn't be modifying the game assets though? Additionally, if you want to make a mod that's backwards compatible with vanilla, I would suggest a datapack.

1 hour ago, _KS_ said:

I'm 100% sure i can change registry objects because i making mod to be incompatible with any other mod that adding any machines or upgrades to vanilla crafting methods

Sure, but I would not explain how to do it since nearly any instance of registry replacement will break the game because of all the static storages of vanilla registry objects which in most instances would cause the game to crash in some capacity. Hence, I suggested the solution above as an alternative. It would also allow you to have more compatibility with other mods if you provide an open API or create an addon that supports the mod even if you do not wish to support it.

  • Like 1
Link to comment
Share on other sites

52 minutes ago, ChampionAsh5357 said:

You wouldn't be modifying the game assets though? Additionally, if you want to make a mod that's backwards compatible with vanilla, I would suggest a datapack.

Sure, but I would not explain how to do it since nearly any instance of registry replacement will break the game because of all the static storages of vanilla registry objects which in most instances would cause the game to crash in some capacity. Hence, I suggested the solution above as an alternative. It would also allow you to have more compatibility with other mods if you provide an open API or create an addon that supports the mod even if you do not wish to support it.

Ok if i good understand what u telling there.
The best idea cause of minecraft static storage is to make custom crafting table, furnace etc. to just track player progress in game.
But what with disabling items to make custom mining progress or better is to go around this and make something like this custom crafting blocks

Link to comment
Share on other sites

3 hours ago, _KS_ said:

But what with disabling items to make custom mining progress or better is to go around this and make something like this custom crafting blocks

You can override any JSON, so loot tables and recipes can just be modified to handle that. You can even add a custom condition for loot tables that take in the player context such that you can check your player's progress before dropping that loot.

  • Like 1
Link to comment
Share on other sites

14 hours ago, ChampionAsh5357 said:

You can override any JSON, so loot tables and recipes can just be modified to handle that. You can even add a custom condition for loot tables that take in the player context such that you can check your player's progress before dropping that loot.

What about uninstalling mod? Overriding json files can generate problem or game check control sums of files after any startup.

For safe change in game i propably need to change all loots via events to custom and make custom usable blocks

Edited by _KS_
Link to comment
Share on other sites

7 minutes ago, ChampionAsh5357 said:

How would that generate problems? It would just revert to vanilla behavior on uninstall.

 

Ok. How u want to do this.
Using just file operations or getting game variables and changing it.
Sorry for my misunderstood im new in forge coding.
I will propably do this by cancelling events and calculating my self everyting

Edited by _KS_
Link to comment
Share on other sites

45 minutes ago, _KS_ said:

Sorry for my misunderstood im new in forge coding.

JSON replacement is a vanilla system using datapacks. You can modify behavior in any which way without worrying.

45 minutes ago, _KS_ said:

Ok. How u want to do this.

I've already explained above. Override recipes and loot table JSONs for changing/disabling things. If not supported, use an associated event. Since you want the recipes to be unlocked based upon the player, you will most likely need to create a new block which supports taking in the player as part of the recipe calculation.

  • Like 1
Link to comment
Share on other sites

9 minutes ago, ChampionAsh5357 said:

JSON replacement is a vanilla system using datapacks. You can modify behavior in any which way without worrying.

I've already explained above. Override recipes and loot table JSONs for changing/disabling things. If not supported, use an associated event. Since you want the recipes to be unlocked based upon the player, you will most likely need to create a new block which supports taking in the player as part of the recipe calculation.

Thx i will stay with my method because now i recognize i need to change all block inventories (player too)to make my mod work correctly. Still thx so much for help 

Edited by _KS_
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.

 Share



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • if (player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND && block == Blocks.MOSS_BLOCK){ if (!level.isClientSide){ player.drop(ItemInit.STONE_PEBBLE.get().getDefaultInstance(), false); } else { level.playSound(player, event.getPos(), SoundEvents.MOSS_PLACE, SoundSource.BLOCKS, 1f, 1f); } }   That worked! Thanks. I'm not quite sure why though? Does it have to do with sounds only being able to play on the client/server?
    • try this: if first three conditions { if not clientside drop pebble else play sound } i can't fire up the ide now but something like this should work.
    • I am trying to play a vanilla Minecraft sound when I am spawning an item into the world. I think I am close but the sound does not play when the item spawns into the world.   @SubscribeEvent public static void onRightClickBlock(RightClickBlock event) { Player player = event.getEntity(); Level level = event.getLevel(); InteractionHand hand = event.getHand(); BlockState blockState = event.getLevel().getBlockState(event.getPos()); Block block = blockState.getBlock(); if (player.isShiftKeyDown() && hand == InteractionHand.MAIN_HAND && block == Blocks.MOSS_BLOCK && !level.isClientSide){ player.drop(ItemInit.STONE_PEBBLE.get().getDefaultInstance(), false); level.playSound(player, event.getPos(), SoundEvents.MOSS_PLACE, SoundSource.BLOCKS, 1f, 1f); }   I am still new to modding and coding so this may be a little ugly haha. Trying to learn!
    • I have a custom recipe that uses JSON to work properly. And everything works right except I cant seem to figure out how to find the stack count for each ingredient of my recipe.   Recipe class: public class AlloyKilnRecipe implements Recipe<SimpleContainer> { private final ResourceLocation id; private final ItemStack output; private final NonNullList<Ingredient> ingredients; public AlloyKilnRecipe(ResourceLocation id, ItemStack output, NonNullList<Ingredient> ingredients) { this.id = id; this.output = output; this.ingredients = ingredients; } @Override public boolean matches(SimpleContainer pContainer, Level pLevel) { if (pLevel.isClientSide()) return false; return (ingredients.get(0).test(pContainer.getItem(0)) && ingredients.get(1).test(pContainer.getItem(1))) || (ingredients.get(0).test(pContainer.getItem(1)) && ingredients.get(1).test(pContainer.getItem(0))); } public int getIngAmnt(int index) { ItemStack[] stacks = ingredients.get(index).getItems(); for (ItemStack stack : stacks) { return stack.getCount(); } return 0; } @Override public NonNullList<Ingredient> getIngredients() { return ingredients; } @Override public ItemStack assemble(SimpleContainer pContainer) { return output; } @Override public boolean canCraftInDimensions(int pWidth, int pHeight) { return true; } @Override public ItemStack getResultItem() { return output.copy(); } @Override public ResourceLocation getId() { return id; } @Override public RecipeSerializer<?> getSerializer() { return Serializer.INSTANCE; } @Override public RecipeType<?> getType() { return Type.INSTANCE; } public static class Type implements RecipeType<AlloyKilnRecipe> { private Type() {} public static final Type INSTANCE = new Type(); public static final String ID = "alloy_kiln_recipe"; } public static class Serializer implements RecipeSerializer<AlloyKilnRecipe> { public static final Serializer INSTANCE = new Serializer(); public static final ResourceLocation ID = new ResourceLocation(FF.MOD_ID, "alloy_kiln_recipe"); @Override public AlloyKilnRecipe fromJson(ResourceLocation pRecipeId, JsonObject pSerializedRecipe) { ItemStack output = ShapedRecipe.itemStackFromJson(GsonHelper.getAsJsonObject(pSerializedRecipe, "output")); JsonArray ingredients = GsonHelper.getAsJsonArray(pSerializedRecipe, "ingredients"); NonNullList<Ingredient> inputs = NonNullList.withSize(2, Ingredient.EMPTY); for (int i = 0; i < ingredients.size(); i++) { inputs.set(i, Ingredient.fromJson(ingredients.get(i))); } return new AlloyKilnRecipe(pRecipeId, output, inputs); } @Override public @Nullable AlloyKilnRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { NonNullList<Ingredient> inputs = NonNullList.withSize(pBuffer.readInt(), Ingredient.EMPTY); for (int i = 0; i < inputs.size(); i++) { inputs.set(i, Ingredient.fromNetwork(pBuffer)); } ItemStack output = pBuffer.readItem(); return new AlloyKilnRecipe(pRecipeId, output, inputs); } @Override public void toNetwork(FriendlyByteBuf pBuffer, AlloyKilnRecipe pRecipe) { pBuffer.writeInt(pRecipe.getIngredients().size()); for (Ingredient ing : pRecipe.getIngredients()) { ing.toNetwork(pBuffer); } pBuffer.writeItemStack(pRecipe.getResultItem(), false); } } } And here is my recipe.json { "type": "forgedfactory:alloy_kiln_recipe", "ingredients": [ { "item": "minecraft:iron_ingot", "count": 3 }, { "item": "minecraft:gold_ingot" } ], "output": { "item": "minecraft:diamond", "count": 3 } } Could someone tell me what I would have to do? The getIngAmount method just returns 1 even though I have a count defined for the iron ingots.
    • forge installer version 43.1.7 for 1.19.2 won't download the jar file, only the json 
  • Topics

×
×
  • Create New...

Important Information

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