Skip to content

Commit 10faa2c

Browse files
committed
Enchantment recipes
1 parent aafb733 commit 10faa2c

16 files changed

Lines changed: 398 additions & 69 deletions

File tree

src/generated/resources/.cache/20f5c98dc0fe2d7a53fc98de5b4a9405da0eaab5

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
// 1.21.1 2025-02-09T11:46:17.8792977 Biome Modifier Registries: ifw
1+
// 1.21.1 2025-02-09T16:11:58.5825194 Biome Modifier Registries: ifw
22
a25ea81b0b513691a1aadbdd843a920893a06506 data/ifw/neoforge/biome_modifier/ifw_add_features.json
33
992b4ba93bdc98a8c33f3fdbb002c1918e9c4f33 data/ifw/neoforge/biome_modifier/ifw_add_spawns.json
4-
78e29f65210883c5baddabec772009c2be349d3e data/ifw/neoforge/biome_modifier/ifw_remove_features.json
4+
c3c517b6bb5c1a869ec2b8bb6a5895a4eda835c4 data/ifw/neoforge/biome_modifier/ifw_remove_features.json
55
9fc860ae583986f2182428d9af81e985f912caae data/ifw/neoforge/biome_modifier/ifw_remove_spawns.json
66
78c60995ac955e2d8c3decd999ee61f693e654ce data/ifw/worldgen/configured_feature/ore_adamantium.json
77
48ffb8b7278a819fe429e41573d5e998be39158c data/ifw/worldgen/configured_feature/ore_mithril.json

src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 1.21.1 2025-02-09T11:46:17.8818171 Recipes
1+
// 1.21.1 2025-02-09T16:19:49.2681514 Recipes
22
8b121b827b1b9657f5f6e233bbec2659875f4afe data/ifw/advancement/recipes/building_blocks/adamantium_anvil.json
33
8095e32c2e0106f3ba40a10c204f6043d8dabfeb data/ifw/advancement/recipes/building_blocks/adamantium_bars.json
44
9d5e5fb6ff22512e12565ce8c70ec8434a2d5448 data/ifw/advancement/recipes/building_blocks/adamantium_door.json
@@ -414,6 +414,7 @@ f712991b7ae1c41a6294325b4874595d0cc90aec data/minecraft/advancement/recipes/buil
414414
67bf3b3c79a662e0553e377ea1247a8e4efd6512 data/minecraft/advancement/recipes/combat/chainmail_chestplate.json
415415
0d60fa22918541abd64c0d9d76469d53eee769ad data/minecraft/advancement/recipes/combat/chainmail_helmet.json
416416
9c1978b88e7be74a5f546511f6310dfbb10a56b9 data/minecraft/advancement/recipes/combat/chainmail_leggings.json
417+
8c97b84efad2ea4c8db559c578cece94367f4f37 data/minecraft/advancement/recipes/enchantment/enchanted_golden_apple.json
417418
106fdcfc07bfb263d2f23587f050b5e56c5cb293 data/minecraft/advancement/recipes/food/cake.json
418419
d35c0944b087c0dd3a6c18551bdb3f5460ae16e1 data/minecraft/advancement/recipes/food/ifw_bread.json
419420
74aa51198d89114ecf3e29813be87454c10d5260 data/minecraft/advancement/recipes/food/mushroom_stew.json
@@ -461,6 +462,7 @@ a62e514cf33835da07bec3c12076ab3e4e8ace5f data/minecraft/recipe/chainmail_helmet.
461462
96cbf7c584d0e8ab3136b51a477850a35b39a254 data/minecraft/recipe/copper_nugget.json
462463
2e74e3f0882f87b3b6eec8040620a3752d38314f data/minecraft/recipe/diamond.json
463464
8626a0ff5c0a91e52a41b575ae23587c8aa2ed4f data/minecraft/recipe/emerald.json
465+
790fc36730dd4561d6da10ef93379b81694da46c data/minecraft/recipe/enchanted_golden_apple.json
464466
2c8c553d155a89c614bbb54949fcafb485be8843 data/minecraft/recipe/flint.json
465467
5ca38a6797c55037444e9d9d712646371f949eb0 data/minecraft/recipe/flint_and_steel.json
466468
6b5eb93df2a4a421b876fa2b764fb92aa6ea489a data/minecraft/recipe/glass.json

src/generated/resources/data/ifw/neoforge/biome_modifier/ifw_remove_features.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"minecraft:patch_melon_sparse"
88
],
99
"steps": [
10-
"vegetal_decoration",
11-
"lakes"
10+
"lakes",
11+
"vegetal_decoration"
1212
]
1313
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"parent": "minecraft:recipes/root",
3+
"criteria": {
4+
"has_golden_apple": {
5+
"conditions": {
6+
"items": [
7+
{
8+
"items": "minecraft:golden_apple"
9+
}
10+
]
11+
},
12+
"trigger": "minecraft:inventory_changed"
13+
},
14+
"has_the_recipe": {
15+
"conditions": {
16+
"recipe": "minecraft:enchanted_golden_apple"
17+
},
18+
"trigger": "minecraft:recipe_unlocked"
19+
}
20+
},
21+
"requirements": [
22+
[
23+
"has_the_recipe",
24+
"has_golden_apple"
25+
]
26+
],
27+
"rewards": {
28+
"recipes": [
29+
"minecraft:enchanted_golden_apple"
30+
]
31+
}
32+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"type": "ifw:enchantment",
3+
"experience": 200.0,
4+
"ingredient": {
5+
"item": "minecraft:golden_apple"
6+
},
7+
"result": {
8+
"count": 1,
9+
"id": "minecraft:enchanted_golden_apple"
10+
}
11+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package huix.infinity.common.world.item.crafting;
2+
3+
import net.minecraft.core.HolderLookup;
4+
import net.minecraft.world.item.ItemStack;
5+
import net.minecraft.world.item.crafting.*;
6+
import net.minecraft.world.level.Level;
7+
8+
public class EnchantmentRecipe implements Recipe<SingleRecipeInput> {
9+
10+
private final Ingredient ingredient;
11+
private final ItemStack result;
12+
private final float experience;
13+
14+
public EnchantmentRecipe(final Ingredient ingredient, final ItemStack result, final float experience) {
15+
this.ingredient = ingredient;
16+
this.result = result;
17+
this.experience = experience;
18+
}
19+
20+
public Ingredient ingredient() {
21+
return this.ingredient;
22+
}
23+
24+
public float experience() {
25+
return this.experience;
26+
}
27+
28+
public ItemStack result() {
29+
return this.result;
30+
}
31+
32+
@Override
33+
public boolean matches(SingleRecipeInput singleRecipeInput, Level level) {
34+
return this.ingredient.test(singleRecipeInput.item());
35+
}
36+
37+
@Override
38+
public ItemStack assemble(SingleRecipeInput singleRecipeInput, HolderLookup.Provider provider) {
39+
return this.result.copy();
40+
}
41+
42+
@Override
43+
public boolean canCraftInDimensions(int i, int i1) {
44+
return true;
45+
}
46+
47+
@Override
48+
public ItemStack getResultItem(HolderLookup.Provider provider) {
49+
return this.result;
50+
}
51+
52+
@Override
53+
public RecipeSerializer<?> getSerializer() {
54+
return IFWRecipeSerializers.enchantment.get();
55+
}
56+
57+
@Override
58+
public RecipeType<?> getType() {
59+
return IFWRecipeTypes.enchantment.get();
60+
}
61+
62+
@FunctionalInterface
63+
public interface Factory<T extends EnchantmentRecipe> {
64+
T create(Ingredient ingredient, ItemStack result, float experience);
65+
}
66+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package huix.infinity.common.world.item.crafting;
2+
3+
import net.minecraft.advancements.Advancement;
4+
import net.minecraft.advancements.AdvancementRequirements;
5+
import net.minecraft.advancements.AdvancementRewards;
6+
import net.minecraft.advancements.Criterion;
7+
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
8+
import net.minecraft.data.recipes.RecipeBuilder;
9+
import net.minecraft.data.recipes.RecipeOutput;
10+
import net.minecraft.resources.ResourceLocation;
11+
import net.minecraft.world.item.Item;
12+
import net.minecraft.world.item.ItemStack;
13+
import net.minecraft.world.item.crafting.AbstractCookingRecipe;
14+
import net.minecraft.world.item.crafting.Ingredient;
15+
import net.minecraft.world.level.ItemLike;
16+
import org.jetbrains.annotations.Nullable;
17+
18+
import java.util.LinkedHashMap;
19+
import java.util.Map;
20+
import java.util.Objects;
21+
22+
public class EnchantmentRecipeBuilder implements RecipeBuilder {
23+
private final Ingredient ingredient;
24+
private final ItemStack result;
25+
private final float experience;
26+
private final Map<String, Criterion<?>> criteria = new LinkedHashMap<>();
27+
private final EnchantmentRecipe.Factory<?> factory;
28+
29+
public EnchantmentRecipeBuilder(Ingredient ingredient, ItemStack result, float experience) {
30+
this.ingredient = ingredient;
31+
this.result = result;
32+
this.experience = experience;
33+
this.factory = EnchantmentRecipe::new;
34+
}
35+
36+
public static EnchantmentRecipeBuilder basic(Ingredient ingredient, ItemLike result, float experience) {
37+
return new EnchantmentRecipeBuilder(ingredient, new ItemStack(result), experience);
38+
}
39+
40+
@Override
41+
public EnchantmentRecipeBuilder unlockedBy(String s, Criterion<?> criterion) {
42+
this.criteria.put(s, criterion);
43+
return this;
44+
}
45+
46+
@Override
47+
public EnchantmentRecipeBuilder group(@Nullable String s) {
48+
return this;
49+
}
50+
51+
@Override
52+
public Item getResult() {
53+
return this.result.getItem();
54+
}
55+
56+
@Override
57+
public void save(RecipeOutput output, ResourceLocation location) {
58+
Advancement.Builder advancement$builder = output.advancement()
59+
.addCriterion("has_the_recipe", RecipeUnlockedTrigger.unlocked(location))
60+
.rewards(AdvancementRewards.Builder.recipe(location))
61+
.requirements(AdvancementRequirements.Strategy.OR);
62+
this.criteria.forEach(advancement$builder::addCriterion);
63+
EnchantmentRecipe recipe = this.factory.create(this.ingredient, this.result, this.experience);
64+
output.accept(location, recipe, advancement$builder.build(location.withPrefix("recipes/enchantment/")));
65+
}
66+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package huix.infinity.common.world.item.crafting;
2+
3+
import com.mojang.serialization.Codec;
4+
import com.mojang.serialization.MapCodec;
5+
import com.mojang.serialization.codecs.RecordCodecBuilder;
6+
import net.minecraft.network.RegistryFriendlyByteBuf;
7+
import net.minecraft.network.codec.StreamCodec;
8+
import net.minecraft.world.item.ItemStack;
9+
import net.minecraft.world.item.crafting.AbstractCookingRecipe;
10+
import net.minecraft.world.item.crafting.CookingBookCategory;
11+
import net.minecraft.world.item.crafting.Ingredient;
12+
import net.minecraft.world.item.crafting.RecipeSerializer;
13+
14+
public class EnchantmentSerializer<T extends EnchantmentRecipe> implements RecipeSerializer<T> {
15+
private final EnchantmentRecipe.Factory<T> factory;
16+
private final MapCodec<T> codec;
17+
private final StreamCodec<RegistryFriendlyByteBuf, T> streamCodec;
18+
19+
public EnchantmentSerializer(EnchantmentRecipe.Factory<T> factory) {
20+
this.factory = factory;
21+
this.codec = RecordCodecBuilder.mapCodec(
22+
instance -> instance.group(
23+
Ingredient.CODEC_NONEMPTY.fieldOf("ingredient").forGetter(EnchantmentRecipe::ingredient),
24+
ItemStack.CODEC.fieldOf("result").forGetter(EnchantmentRecipe::result),
25+
Codec.FLOAT.fieldOf("experience").forGetter(EnchantmentRecipe::experience)
26+
)
27+
.apply(instance, factory::create)
28+
);
29+
this.streamCodec = StreamCodec.of(this::toNetwork, this::fromNetwork);
30+
}
31+
32+
@Override
33+
public MapCodec<T> codec() {
34+
return this.codec;
35+
}
36+
37+
@Override
38+
public StreamCodec<RegistryFriendlyByteBuf, T> streamCodec() {
39+
return this.streamCodec;
40+
}
41+
42+
private T fromNetwork(RegistryFriendlyByteBuf byteBuf) {
43+
Ingredient ingredient = Ingredient.CONTENTS_STREAM_CODEC.decode(byteBuf);
44+
ItemStack itemstack = ItemStack.STREAM_CODEC.decode(byteBuf);
45+
float experience = byteBuf.readFloat();
46+
return this.factory.create(ingredient, itemstack, experience);
47+
}
48+
49+
private void toNetwork(RegistryFriendlyByteBuf byteBuf, T instance) {
50+
Ingredient.CONTENTS_STREAM_CODEC.encode(byteBuf, instance.ingredient());
51+
ItemStack.STREAM_CODEC.encode(byteBuf, instance.result());
52+
byteBuf.writeFloat(instance.experience());
53+
}
54+
55+
public EnchantmentRecipe create(Ingredient ingredient, ItemStack result, float experience) {
56+
return this.factory.create(ingredient, result, experience);
57+
}
58+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package huix.infinity.common.world.item.crafting;
2+
3+
import huix.infinity.init.InfinityWay;
4+
import net.minecraft.core.registries.BuiltInRegistries;
5+
import net.minecraft.world.item.crafting.RecipeSerializer;
6+
import net.neoforged.neoforge.registries.DeferredHolder;
7+
import net.neoforged.neoforge.registries.DeferredRegister;
8+
9+
public class IFWRecipeSerializers {
10+
11+
public static final DeferredRegister<RecipeSerializer<?>> RECIPE_SERIALIZERS = DeferredRegister.create(BuiltInRegistries.RECIPE_SERIALIZER, InfinityWay.MOD_ID);
12+
13+
public static final DeferredHolder<RecipeSerializer<?>, RecipeSerializer<EnchantmentRecipe>> enchantment = RECIPE_SERIALIZERS.register("enchantment",
14+
location -> new EnchantmentSerializer<>(EnchantmentRecipe::new));
15+
}

src/main/java/huix/infinity/common/world/item/crafting/IFWRecipeTypes.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import huix.infinity.init.InfinityWay;
44
import net.minecraft.core.registries.BuiltInRegistries;
55
import net.minecraft.resources.ResourceLocation;
6+
import net.minecraft.world.item.crafting.RecipeSerializer;
67
import net.minecraft.world.item.crafting.RecipeType;
78
import net.neoforged.neoforge.registries.DeferredHolder;
89
import net.neoforged.neoforge.registries.DeferredRegister;
@@ -11,5 +12,6 @@ public class IFWRecipeTypes {
1112

1213
public static final DeferredRegister<RecipeType<?>> RECIPES = DeferredRegister.create(BuiltInRegistries.RECIPE_TYPE, InfinityWay.MOD_ID);
1314

14-
15+
public static final DeferredHolder<RecipeType<?>, RecipeType<EnchantmentRecipe>> enchantment = RECIPES.register("enchantment",
16+
location -> RecipeType.simple(ResourceLocation.fromNamespaceAndPath(InfinityWay.MOD_ID,"enchantment")));
1517
}

0 commit comments

Comments
 (0)