From 2f3bc6acd93db155b1c100be54efd43800ac3985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 12 Oct 2025 18:13:23 +0200 Subject: feat(heart): custom recipe is only nether star, must mixin Item::onCraft to handle it --- build.gradle | 6 ++++ .../java/world/anhgelus/lifesteal/LifeStealer.java | 3 +- .../anhgelus/lifesteal/datagen/CraftProvider.java | 42 ++++++++++++++++++++++ .../anhgelus/lifesteal/datagen/DataGenerator.java | 12 +++++++ src/main/resources/fabric.mod.json | 3 ++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/main/java/world/anhgelus/lifesteal/datagen/CraftProvider.java create mode 100644 src/main/java/world/anhgelus/lifesteal/datagen/DataGenerator.java diff --git a/build.gradle b/build.gradle index a4bb960..92c4dd2 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,12 @@ base { archivesName = project.archives_base_name } +fabricApi { + configureDataGeneration() { + client = true + } +} + repositories { // Add repositories to retrieve artifacts from in here. // You should only use this when depending on other mods because diff --git a/src/main/java/world/anhgelus/lifesteal/LifeStealer.java b/src/main/java/world/anhgelus/lifesteal/LifeStealer.java index 9052515..5036b4e 100644 --- a/src/main/java/world/anhgelus/lifesteal/LifeStealer.java +++ b/src/main/java/world/anhgelus/lifesteal/LifeStealer.java @@ -11,6 +11,7 @@ import net.minecraft.item.Items; import net.minecraft.nbt.NbtCompound; import net.minecraft.server.BannedPlayerEntry; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; @@ -53,7 +54,7 @@ public class LifeStealer { final var nbt = new NbtCompound(); nbt.putString(PLAYER_KEY, player.getUuid().toString()); final var is = new ItemStack(Items.NETHER_STAR); - is.set(DataComponentTypes.CUSTOM_NAME, player.getName()); + is.set(DataComponentTypes.CUSTOM_NAME, Text.empty().append(Text.of("Heart of ")).append(player.getName())); is.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(nbt)); return is; } diff --git a/src/main/java/world/anhgelus/lifesteal/datagen/CraftProvider.java b/src/main/java/world/anhgelus/lifesteal/datagen/CraftProvider.java new file mode 100644 index 0000000..69763e0 --- /dev/null +++ b/src/main/java/world/anhgelus/lifesteal/datagen/CraftProvider.java @@ -0,0 +1,42 @@ +package world.anhgelus.lifesteal.datagen; + +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.minecraft.data.recipe.RecipeExporter; +import net.minecraft.data.recipe.RecipeGenerator; +import net.minecraft.item.Items; +import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.registry.RegistryWrapper; + +import java.util.concurrent.CompletableFuture; + +public class CraftProvider extends FabricRecipeProvider { + public CraftProvider(FabricDataOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected RecipeGenerator getRecipeGenerator(RegistryWrapper.WrapperLookup registryLookup, RecipeExporter exporter) { + return new RecipeGenerator(registryLookup, exporter) { + @Override + public void generate() { + final var base = createShaped(RecipeCategory.COMBAT, Items.NETHER_STAR) + .pattern("sns") + .pattern("nrn") + .pattern("sns") + .input('s', Items.NAUTILUS_SHELL) + .input('n', Items.NETHERITE_INGOT) + .criterion(hasItem(Items.NETHERITE_INGOT), conditionsFromItem(Items.NETHERITE_INGOT)); + base.input('r', Items.OMINOUS_TRIAL_KEY).offerTo(exporter); + base.input('r', Items.DRAGON_HEAD).offerTo(exporter); + base.input('r', Items.WITHER_SKELETON_SKULL).offerTo(exporter); + } + }; + } + + + @Override + public String getName() { + return "LifeStealRecipesProvider"; + } +} diff --git a/src/main/java/world/anhgelus/lifesteal/datagen/DataGenerator.java b/src/main/java/world/anhgelus/lifesteal/datagen/DataGenerator.java new file mode 100644 index 0000000..3c82011 --- /dev/null +++ b/src/main/java/world/anhgelus/lifesteal/datagen/DataGenerator.java @@ -0,0 +1,12 @@ +package world.anhgelus.lifesteal.datagen; + +import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; +import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; + +public class DataGenerator implements DataGeneratorEntrypoint { + @Override + public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { + final var pack = fabricDataGenerator.createPack(); + pack.addProvider(CraftProvider::new); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 805e28b..74ba1e7 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -12,6 +12,9 @@ "entrypoints": { "main": [ "world.anhgelus.lifesteal.LifeSteal" + ], + "fabric-datagen": [ + "world.anhgelus.lifesteal.datagen.DataGenerator" ] }, "mixins": [ -- cgit v1.2.3