From b7d00daa49889a9aa34c82001188cc75d45291f2 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Fri, 2 Jan 2026 15:33:17 +0800 Subject: [PATCH 01/16] feat: use mixin to handle tags --- .../java/cam72cam/mod/event/CommonEvents.java | 14 +++++++ .../event/platform/RegisterBlockTagEvent.java | 36 ++++++++++++++++++ .../event/platform/RegisterItemTagEvent.java | 35 ++++++++++++++++++ src/main/java/cam72cam/mod/item/Fuzzy.java | 24 ++---------- .../data_registry/MixinTagCollection.java | 37 +++++++++++++++++++ .../mixins.feat.universalmodcore.json | 1 + 6 files changed, 126 insertions(+), 21 deletions(-) create mode 100644 src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java create mode 100644 src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java create mode 100644 src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java diff --git a/src/main/java/cam72cam/mod/event/CommonEvents.java b/src/main/java/cam72cam/mod/event/CommonEvents.java index 62f114d2..15ef94e7 100644 --- a/src/main/java/cam72cam/mod/event/CommonEvents.java +++ b/src/main/java/cam72cam/mod/event/CommonEvents.java @@ -1,6 +1,8 @@ package cam72cam.mod.event; import cam72cam.mod.ModCore; +import cam72cam.mod.event.platform.RegisterBlockTagEvent; +import cam72cam.mod.event.platform.RegisterItemTagEvent; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.container.ContainerType; @@ -41,6 +43,7 @@ public static final class World { public static final class Block { public static final Event REGISTER = new Event<>(); public static final Event BROKEN = new Event<>(); + public static final Event> TAGS = new Event<>(); } public static final class Tile { @@ -49,6 +52,7 @@ public static final class Tile { public static final class Item { public static final Event REGISTER = new Event<>(); + public static final Event> TAGS = new Event<>(); } public static final class Recipe { @@ -157,5 +161,15 @@ public static void registerEntities(RegistryEvent.Register> event) public static void registerContainers(RegistryEvent.Register> event) { CONTAINER_REGISTRY.execute(x -> x.accept(event.getRegistry())); } + + @SubscribeEvent + public static void registerItemTag(RegisterBlockTagEvent event) { + Block.TAGS.execute(x -> x.accept(event)); + } + + @SubscribeEvent + public static void registerItemTag(RegisterItemTagEvent event) { + Item.TAGS.execute(x -> x.accept(event)); + } } } diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java new file mode 100644 index 00000000..d49d1a7b --- /dev/null +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -0,0 +1,36 @@ +package cam72cam.mod.event.platform; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.tags.Tag; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.eventbus.api.Event; + +import java.util.Collection; +import java.util.Map; + +public class RegisterBlockTagEvent extends Event { + private Map> map; + + public RegisterBlockTagEvent(Map> map) { + this.map = map; + } + + public void registerTag(ResourceLocation ident, Collection includes) { + for (Block include : includes) { + registerTag(ident, include); + } + } + + public void registerTag(ResourceLocation ident, Block item) { + Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); + builder.add(item); + map.put(ident, builder); + } + + public void registerTag(ResourceLocation ident, Tag includes) { + Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); + builder.add(includes); + map.put(ident, builder); + } +} diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java new file mode 100644 index 00000000..aaed5e91 --- /dev/null +++ b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java @@ -0,0 +1,35 @@ +package cam72cam.mod.event.platform; + +import net.minecraft.item.Item; +import net.minecraft.tags.Tag; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.eventbus.api.Event; + +import java.util.Collection; +import java.util.Map; + +public class RegisterItemTagEvent extends Event { + private Map> map; + + public RegisterItemTagEvent(Map> map) { + this.map = map; + } + + public void registerTag(ResourceLocation ident, Collection includes) { + for (Item include : includes) { + registerTag(ident, include); + } + } + + public void registerTag(ResourceLocation ident, Item item) { + Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); + builder.add(item); + map.put(ident, builder); + } + + public void registerTag(ResourceLocation ident, Tag includes) { + Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); + builder.add(includes); + map.put(ident, builder); + } +} diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index 5b5d5840..43b171a8 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -1,10 +1,9 @@ package cam72cam.mod.item; import cam72cam.mod.config.ConfigFile; +import cam72cam.mod.event.CommonEvents; import net.minecraft.block.Block; import net.minecraft.block.Blocks; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.ItemTagsProvider; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.tags.ItemTags; @@ -172,6 +171,7 @@ public Fuzzy add(Block block) { /** Don't use directly (unless in version specific code) */ public Fuzzy add(Item item) { customItems.add(item); + CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), item)); return this; } @@ -183,6 +183,7 @@ public Fuzzy add(CustomItem item) { /** Pull other fuzzy into this one */ public Fuzzy include(Fuzzy other) { includes.add(other); + CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), other.tag)); return this; } @@ -190,23 +191,4 @@ public Fuzzy include(Fuzzy other) { public String toString() { return ident; } - - public static void register(DataGenerator gen) { - gen.addProvider(new ItemTagsProvider(gen) { - @Override - protected void registerTags() { - for (Fuzzy value : registered.values()) { - if (!value.customItems.isEmpty() || !value.includes.isEmpty()) { - Tag.Builder builder = getBuilder(value.tag); - for (Item customItem : value.customItems) { - builder.add(customItem); - } - for (Fuzzy include : value.includes) { - builder.add(include.tag); - } - } - } - } - }); - } } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java new file mode 100644 index 00000000..cb06222e --- /dev/null +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -0,0 +1,37 @@ +package cam72cam.mod.mixin.feat.data_registry; + +import cam72cam.mod.event.platform.RegisterBlockTagEvent; +import cam72cam.mod.event.platform.RegisterItemTagEvent; +import net.minecraft.resources.IResourceManager; +import net.minecraft.tags.Tag; +import net.minecraft.tags.TagCollection; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModLoader; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Map; + +@Mixin(TagCollection.class) +public class MixinTagCollection { + @Shadow + @Final + private String resourceLocationPrefix; + + @Inject(method = "lambda$reload$3", at = @At("RETURN"), remap = false) + public void onRegisterTag(IResourceManager p_lambda$reload$3_1_, CallbackInfoReturnable>> cir) { + Map> map = cir.getReturnValue(); + if (this.resourceLocationPrefix.contains("block")) { + RegisterBlockTagEvent event = new RegisterBlockTagEvent(map); + ModLoader.get().postEvent(event); + } else if (this.resourceLocationPrefix.contains("item")) { + RegisterItemTagEvent event = new RegisterItemTagEvent(map); + ModLoader.get().postEvent(event); + } + } +} diff --git a/src/main/resources/mixins.feat.universalmodcore.json b/src/main/resources/mixins.feat.universalmodcore.json index 62cb3b2d..cd394c25 100644 --- a/src/main/resources/mixins.feat.universalmodcore.json +++ b/src/main/resources/mixins.feat.universalmodcore.json @@ -7,6 +7,7 @@ "compatibilityLevel": "JAVA_8", "mixinPriority": 1300, "mixins": [ + "data_registry.MixinTagCollection", "global_renderer.MixinRenderGlobal", "large_entity_collision.MixinVanillaWorld" ], From dcd4739e1ebf2a1cea8b574bdeb0e0166b9c7e75 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sat, 17 Jan 2026 13:36:24 +0800 Subject: [PATCH 02/16] feat: recipe de-data --- .../java/cam72cam/mod/UMCMixinPlugin.java | 2 - .../java/cam72cam/mod/event/CommonEvents.java | 19 +++- .../platform/RegisterAdvancementEvent.java | 38 ++++++++ .../event/platform/RegisterBlockTagEvent.java | 5 +- .../platform/RegisterCraftingRecipeEvent.java | 70 +++++++++++++++ .../event/platform/RegisterItemTagEvent.java | 4 +- src/main/java/cam72cam/mod/item/Fuzzy.java | 4 + src/main/java/cam72cam/mod/item/Recipes.java | 86 ++++--------------- .../feat/data_registry/MixinAdvancement.java | 31 +++++++ .../data_registry/MixinRecipeManager.java | 32 +++++++ .../data_registry/MixinTagCollection.java | 3 +- .../resources/META-INF/accesstransformer.cfg | 6 +- .../mixins.feat.universalmodcore.json | 2 + 13 files changed, 222 insertions(+), 80 deletions(-) create mode 100644 src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java create mode 100644 src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java create mode 100644 src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java create mode 100644 src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java diff --git a/src/main/java/cam72cam/mod/UMCMixinPlugin.java b/src/main/java/cam72cam/mod/UMCMixinPlugin.java index 54e97ca2..24225b7b 100644 --- a/src/main/java/cam72cam/mod/UMCMixinPlugin.java +++ b/src/main/java/cam72cam/mod/UMCMixinPlugin.java @@ -1,6 +1,5 @@ package cam72cam.mod; -import com.llamalad7.mixinextras.MixinExtrasBootstrap; import cpw.mods.modlauncher.api.IEnvironment; import cpw.mods.modlauncher.api.ITransformationService; import cpw.mods.modlauncher.api.ITransformer; @@ -16,7 +15,6 @@ public class UMCMixinPlugin implements ITransformationService { public UMCMixinPlugin() { MixinBootstrap.init(); - MixinExtrasBootstrap.init(); Mixins.addConfiguration("mixins.feat.universalmodcore.json"); Mixins.addConfiguration("mixins.fix.universalmodcore.json"); } diff --git a/src/main/java/cam72cam/mod/event/CommonEvents.java b/src/main/java/cam72cam/mod/event/CommonEvents.java index 15ef94e7..7d335ccc 100644 --- a/src/main/java/cam72cam/mod/event/CommonEvents.java +++ b/src/main/java/cam72cam/mod/event/CommonEvents.java @@ -1,7 +1,9 @@ package cam72cam.mod.event; import cam72cam.mod.ModCore; +import cam72cam.mod.event.platform.RegisterAdvancementEvent; import cam72cam.mod.event.platform.RegisterBlockTagEvent; +import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent; import cam72cam.mod.event.platform.RegisterItemTagEvent; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; @@ -22,6 +24,8 @@ import net.minecraftforge.registries.IForgeRegistry; import net.minecraft.world.server.ServerWorld; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; /** Registry of events that fire off on both client and server. Do not use directly! */ @@ -56,7 +60,9 @@ public static final class Item { } public static final class Recipe { - public static final Event REGISTER = new Event<>(); + public static final Event> REGISTER = new Event<>(); + //TODO make event listener refreshable + public static ThreadLocal>> RECIPE_LISTENER = ThreadLocal.withInitial(ArrayList::new); } public static final class Entity { @@ -171,5 +177,16 @@ public static void registerItemTag(RegisterBlockTagEvent event) { public static void registerItemTag(RegisterItemTagEvent event) { Item.TAGS.execute(x -> x.accept(event)); } + + @SubscribeEvent + public static void registerCraftingRecipe(RegisterCraftingRecipeEvent event) { + CommonEvents.Recipe.REGISTER.execute(x -> x.accept(event)); + } + + @SubscribeEvent + public static void registerRecipeTrigger(RegisterAdvancementEvent event) { + CommonEvents.Recipe.RECIPE_LISTENER.get().forEach(x -> x.accept(event)); + CommonEvents.Recipe.RECIPE_LISTENER.set(new ArrayList<>()); + } } } diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java new file mode 100644 index 00000000..99be0811 --- /dev/null +++ b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java @@ -0,0 +1,38 @@ +package cam72cam.mod.event.platform; + +import cam72cam.mod.item.Fuzzy; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.criterion.*; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.eventbus.api.Event; + +import java.util.Map; + +public class RegisterAdvancementEvent extends Event { + private static final ResourceLocation RECIPE = new ResourceLocation("minecraft:recipes/root"); + private final Map map; + + public RegisterAdvancementEvent(Map map) { + this.map = map; + } + + public void registerRecipeTrigger(ResourceLocation ident, ResourceLocation recipe, Fuzzy... trigger) { + Advancement.Builder builder = Advancement.Builder.builder().withParentId(RECIPE); + +// Criterion hasRecipe = new Criterion(new RecipeUnlockedTrigger.Instance(recipe)); +// builder.withCriterion("has_recipe", hasRecipe); + for (int i = 0; i < trigger.length; i++) { + Fuzzy ingredient = trigger[i]; + if (ingredient == null || ingredient.getTag() == null) continue; + + Criterion hasItem = new Criterion(InventoryChangeTrigger.Instance.forItems( + ItemPredicate.Builder.create().tag(ingredient.getTag()).build())); + builder.withCriterion("has" + ingredient + i, hasItem); + } + builder.withRewards(AdvancementRewards.Builder.recipe(recipe)); + + map.put(ident, builder); + } +} diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java index d49d1a7b..62c917d4 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -1,7 +1,6 @@ package cam72cam.mod.event.platform; import net.minecraft.block.Block; -import net.minecraft.item.Item; import net.minecraft.tags.Tag; import net.minecraft.util.ResourceLocation; import net.minecraftforge.eventbus.api.Event; @@ -10,7 +9,7 @@ import java.util.Map; public class RegisterBlockTagEvent extends Event { - private Map> map; + private final Map> map; public RegisterBlockTagEvent(Map> map) { this.map = map; @@ -30,7 +29,7 @@ public void registerTag(ResourceLocation ident, Block item) { public void registerTag(ResourceLocation ident, Tag includes) { Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); - builder.add(includes); + includes.getEntries().forEach(builder::add); map.put(ident, builder); } } diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java new file mode 100644 index 00000000..512e4e58 --- /dev/null +++ b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java @@ -0,0 +1,70 @@ +package cam72cam.mod.event.platform; + +import cam72cam.mod.ModCore; +import cam72cam.mod.event.CommonEvents; +import cam72cam.mod.item.Fuzzy; +import cam72cam.mod.item.ItemStack; +import com.google.common.collect.ImmutableMap; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +//Only support full height recipe for now +public class RegisterCraftingRecipeEvent extends Event { + Map, ImmutableMap.Builder>> map; + + public RegisterCraftingRecipeEvent(Map, ImmutableMap.Builder>> map) { + this.map = map; + } + + public void register(ItemStack target, int width, List ingredients, List dependencies, List conflicts) { + ResourceLocation itemName = target.internal.getItem().getRegistryName(); + ResourceLocation name = new ResourceLocation(itemName.getNamespace(), itemName.getPath() + + ingredients.hashCode() + dependencies.hashCode() + conflicts.hashCode()); + boolean dependencyNotMet = dependencies.stream().anyMatch(f -> { + return f.enumerate().stream().anyMatch(item -> + !ForgeRegistries.ITEMS.containsKey(item.internal.getItem().getRegistryName())) + || f.getTag().getAllElements().isEmpty(); + }); + + boolean hasConflict = conflicts.stream().anyMatch(f -> { + return f.enumerate().stream().anyMatch(item -> + ForgeRegistries.ITEMS.containsKey(item.internal.getItem().getRegistryName())) + || !f.getTag().getAllElements().isEmpty(); + }); + + if (dependencyNotMet || hasConflict) { + ModCore.info("Requirements not met, skipping UMC recipe %s", name.toString()); + return; + } + + List n = new ArrayList<>(); + for (Fuzzy ingredient : ingredients) { + if (ingredient == null || ingredient.isEmpty()) { + n.add(new Ingredient(Stream.of(new Ingredient.SingleItemList(net.minecraft.item.ItemStack.EMPTY)))); + } else { + n.add(new Ingredient(Stream.of(new Ingredient.TagList(ingredient.getTag())))); + } + } + NonNullList ingredient = NonNullList.create(); + ingredient.addAll(n); + + ShapedRecipe recipe = new ShapedRecipe(name, "", width, 3, ingredient, target.internal); + + CommonEvents.Recipe.RECIPE_LISTENER.get().add(event -> { + ResourceLocation ad = new ResourceLocation(name.getNamespace(), "unlock" + name.getPath()); + event.registerRecipeTrigger(ad, name, ingredients.toArray(new Fuzzy[0])); + }); + map.getOrDefault(IRecipeType.CRAFTING, ImmutableMap.builder()).put(name, recipe); + } +} diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java index aaed5e91..1ac72700 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java @@ -9,7 +9,7 @@ import java.util.Map; public class RegisterItemTagEvent extends Event { - private Map> map; + private final Map> map; public RegisterItemTagEvent(Map> map) { this.map = map; @@ -29,7 +29,7 @@ public void registerTag(ResourceLocation ident, Item item) { public void registerTag(ResourceLocation ident, Tag includes) { Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); - builder.add(includes); + includes.getEntries().forEach(builder::add); map.put(ident, builder); } } diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index 43b171a8..be91463b 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -187,6 +187,10 @@ public Fuzzy include(Fuzzy other) { return this; } + public Tag getTag() { + return tag; + } + @Override public String toString() { return ident; diff --git a/src/main/java/cam72cam/mod/item/Recipes.java b/src/main/java/cam72cam/mod/item/Recipes.java index 16b92300..f39fda1f 100644 --- a/src/main/java/cam72cam/mod/item/Recipes.java +++ b/src/main/java/cam72cam/mod/item/Recipes.java @@ -1,37 +1,15 @@ package cam72cam.mod.item; -import net.minecraft.advancements.criterion.InventoryChangeTrigger; -import net.minecraft.advancements.criterion.ItemPredicate; -import net.minecraft.advancements.criterion.MinMaxBounds; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.IFinishedRecipe; -import net.minecraft.data.RecipeProvider; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.registry.Registry; -import net.minecraftforge.common.crafting.ConditionalRecipe; -import net.minecraftforge.common.crafting.conditions.ItemExistsCondition; -import net.minecraftforge.common.crafting.conditions.NotCondition; -import net.minecraftforge.common.crafting.conditions.TagEmptyCondition; +import cam72cam.mod.event.CommonEvents; +import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.function.Consumer; /** Recipe registration */ -public class Recipes extends RecipeProvider { - private static final List>> registry = new ArrayList<>(); - - public Recipes(DataGenerator generatorIn) { - super(generatorIn); - } - - @Override - protected void registerRecipes(Consumer consumer) { - registry.forEach(fn -> fn.accept(consumer)); - } - +public class Recipes { public static ShapedRecipeBuilder shapedRecipe(CustomItem item, int width, Fuzzy... ingredients) { return new ShapedRecipeBuilder(new ItemStack(item, 1), width, ingredients); } @@ -41,53 +19,19 @@ public static ShapedRecipeBuilder shapedRecipe(ItemStack item, int width, Fuzzy. } public static class ShapedRecipeBuilder { - private List dependencies = new ArrayList<>(); - private List conflicts = new ArrayList<>(); + private final List dependencies = new ArrayList<>(); + private final List conflicts = new ArrayList<>(); - private ShapedRecipeBuilder(ItemStack item, int width, Fuzzy... ingredients) { - net.minecraft.data.ShapedRecipeBuilder builder = new net.minecraft.data.ShapedRecipeBuilder(item.internal.getItem(), item.getCount()); - - int height = ingredients.length / width; + private final ItemStack target; + private final int width; + private final List ingredients; - for (int h = 0; h < height; h++) { - String line = ""; - for (int w = 0; w < width; w++) { - int idx = h * width + w; - Fuzzy ingredient = ingredients[idx]; - line += ingredient == null ? " " : idx + ""; - if (ingredient != null) { - // TODO tags - builder.key((idx + "").charAt(0), ingredient.tag); - builder.addCriterion( - "has" + ingredient.toString() + idx, - new InventoryChangeTrigger.Instance( - MinMaxBounds.IntBound.UNBOUNDED, - MinMaxBounds.IntBound.UNBOUNDED, - MinMaxBounds.IntBound.UNBOUNDED, - new ItemPredicate[]{ItemPredicate.Builder.create().tag(ingredient.tag).build()} - ) - ); - } - } - builder.patternLine(line); - } - registry.add(out -> { - ResourceLocation itemName = item.internal.getItem().getRegistryName(); - ResourceLocation name = new ResourceLocation(itemName.getNamespace(), itemName.getPath() + Arrays.hashCode(ingredients) + dependencies.hashCode() + conflicts.hashCode()); + private ShapedRecipeBuilder(ItemStack item, int width, Fuzzy... ingredients) { + this.target = item; + this.width = width; + this.ingredients = Arrays.asList(ingredients); - if (!dependencies.isEmpty() || !conflicts.isEmpty()) { - ConditionalRecipe.Builder conditions = ConditionalRecipe.builder(); - for (Fuzzy dependency : dependencies) { - conditions = conditions.addCondition(new NotCondition(new TagEmptyCondition(dependency.tag.getId()))); - } - for (Fuzzy conflict : conflicts) { - conditions = conditions.addCondition(new TagEmptyCondition(conflict.tag.getId())); - } - conditions.addRecipe(builder::build).build(out, name); - } else { - builder.build(out, name); - } - }); + CommonEvents.Recipe.REGISTER.subscribe(this::register); } public ShapedRecipeBuilder require(Fuzzy ...dependencies) { @@ -99,5 +43,9 @@ public ShapedRecipeBuilder conflicts(Fuzzy ...conflicts) { this.conflicts.addAll(Arrays.asList(conflicts)); return this; } + + private void register(RegisterCraftingRecipeEvent event) { + event.register(target, width, ingredients, dependencies, conflicts); + } } } \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java new file mode 100644 index 00000000..0ccf8609 --- /dev/null +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java @@ -0,0 +1,31 @@ +package cam72cam.mod.mixin.feat.data_registry; + +import cam72cam.mod.event.platform.RegisterAdvancementEvent; +import com.google.gson.JsonObject; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementManager; +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModLoader; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Map; + +/** + * Used for injecting recipe unlock conditions for now + */ +@Mixin(AdvancementManager.class) +public class MixinAdvancement { + @Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/resources/IResourceManager;Lnet/minecraft/profiler/IProfiler;)V", + at = @At(value = "NEW", target = "()Lnet/minecraft/advancements/AdvancementList;")) + public void postAdvancementReload(Map p_212853_1_, IResourceManager p_212853_2_, + IProfiler p_212853_3_, CallbackInfo ci, @Local(ordinal = 1) Map map) { + RegisterAdvancementEvent event = new RegisterAdvancementEvent(map); + ModLoader.get().postEvent(event); + } +} diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java new file mode 100644 index 00000000..76c76a00 --- /dev/null +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java @@ -0,0 +1,32 @@ +package cam72cam.mod.mixin.feat.data_registry; + +import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent; +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonObject; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.RecipeManager; +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModLoader; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Map; + + +@Mixin(RecipeManager.class) +public class MixinRecipeManager { + @Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/resources/IResourceManager;Lnet/minecraft/profiler/IProfiler;)V", + at = @At(value = "INVOKE", target = "Ljava/util/Map;entrySet()Ljava/util/Set;", ordinal = 1)) + public void postRecipeReload(Map splashList, IResourceManager resourceManagerIn, + IProfiler profilerIn, CallbackInfo ci, + @Local(ordinal = 1) Map, ImmutableMap.Builder>> mapLocalRef) { + RegisterCraftingRecipeEvent event = new RegisterCraftingRecipeEvent(mapLocalRef); + ModLoader.get().postEvent(event); + } +} diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java index cb06222e..8b5018c6 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -7,7 +7,6 @@ import net.minecraft.tags.TagCollection; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.ModLoader; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -24,7 +23,7 @@ public class MixinTagCollection { private String resourceLocationPrefix; @Inject(method = "lambda$reload$3", at = @At("RETURN"), remap = false) - public void onRegisterTag(IResourceManager p_lambda$reload$3_1_, CallbackInfoReturnable>> cir) { + public void postTagReload(IResourceManager p_lambda$reload$3_1_, CallbackInfoReturnable>> cir) { Map> map = cir.getReturnValue(); if (this.resourceLocationPrefix.contains("block")) { RegisterBlockTagEvent event = new RegisterBlockTagEvent(map); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 7a5d65e7..a611fd5b 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -13,4 +13,8 @@ public net.minecraft.resources.FolderPack func_195768_c(Ljava/lang/String;)Z # n public net.minecraft.resources.FolderPack func_195766_a(Ljava/lang/String;)Ljava/io/InputStream; # net/minecraft/resources/ResourcePack/getInputStream (Ljava/lang/String;)Ljava/io/InputStream; public net.minecraft.world.server.ChunkManager func_223491_f()Ljava/lang/Iterable; # net/minecraft/world/server/ChunkManager/getLoadedChunksIterable ()Ljava/lang/Iterable; public net.minecraft.client.world.ClientWorld field_73035_a #connection -public net.minecraft.client.gui.widget.button.CheckboxButton field_212943_a # checked \ No newline at end of file +public net.minecraft.client.gui.widget.button.CheckboxButton field_212943_a # checked +public net.minecraft.util.math.shapes.VoxelShape (Lnet/minecraft/util/math/shapes/VoxelShapePart;)V +public net.minecraft.util.math.shapes.VoxelShape field_197768_g # part +public net.minecraft.util.math.shapes.VoxelShapeCube (Lnet/minecraft/util/math/shapes/VoxelShapePart;)V +public net.minecraft.item.crafting.Ingredient (Ljava/util/stream/Stream;)V \ No newline at end of file diff --git a/src/main/resources/mixins.feat.universalmodcore.json b/src/main/resources/mixins.feat.universalmodcore.json index cd394c25..e2e0ee69 100644 --- a/src/main/resources/mixins.feat.universalmodcore.json +++ b/src/main/resources/mixins.feat.universalmodcore.json @@ -7,6 +7,8 @@ "compatibilityLevel": "JAVA_8", "mixinPriority": 1300, "mixins": [ + "data_registry.MixinAdvancement", + "data_registry.MixinRecipeManager", "data_registry.MixinTagCollection", "global_renderer.MixinRenderGlobal", "large_entity_collision.MixinVanillaWorld" From 3d0da9c4aea02d66443e3cdd1bc7dfedd445e917 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sat, 17 Jan 2026 14:24:28 +0800 Subject: [PATCH 03/16] ref: remove data generator stuff --- src/main/java/cam72cam/mod/ModCore.java | 10 ---------- .../template/src/main/java/PACKAGEPATH/Mod.java | 6 ------ 2 files changed, 16 deletions(-) diff --git a/src/main/java/cam72cam/mod/ModCore.java b/src/main/java/cam72cam/mod/ModCore.java index d507376a..f7c86853 100644 --- a/src/main/java/cam72cam/mod/ModCore.java +++ b/src/main/java/cam72cam/mod/ModCore.java @@ -19,10 +19,7 @@ import cam72cam.mod.entity.ModdedEntity; import cam72cam.mod.entity.sync.EntitySync; import cam72cam.mod.event.ClientEvents; -import cam72cam.mod.event.CommonEvents; import cam72cam.mod.input.Mouse; -import cam72cam.mod.item.Fuzzy; -import cam72cam.mod.item.Recipes; import cam72cam.mod.net.Packet; import cam72cam.mod.net.PacketDirection; import cam72cam.mod.render.Light; @@ -38,7 +35,6 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; import net.minecraftforge.fml.event.server.FMLServerStartedEvent; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; @@ -483,12 +479,6 @@ public void serverEvent(ModEvent event) { } } - public static void genData(String MODID, GatherDataEvent event) { - CommonEvents.Recipe.REGISTER.execute(Runnable::run); - event.getGenerator().addProvider(new Recipes(event.getGenerator())); - Fuzzy.register(event.getGenerator()); - } - public static void debug(String msg, Object... params) { if (Config.DebugLogging) { if (instance == null || instance.logger == null) { diff --git a/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java b/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java index b17e77e1..2f52f77a 100644 --- a/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java +++ b/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java @@ -5,7 +5,6 @@ import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; @net.minecraftforge.fml.common.Mod(Mod.MODID) -@net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = Mod.MODID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD) public class Mod { public static final String MODID = "#ID#"; @@ -16,9 +15,4 @@ public class Mod { throw new RuntimeException("Could not load mod " + MODID, e); } } - - @SubscribeEvent - public static void genData(GatherDataEvent event) { - ModCore.genData(MODID, event); - } } From 24bd5ca73dc119b2bec6dc8ad58c6750a4e495ed Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sat, 17 Jan 2026 15:07:23 +0800 Subject: [PATCH 04/16] ref: persist stuff --- .../platform/RegisterCraftingRecipeEvent.java | 15 +++------------ src/main/java/cam72cam/mod/item/Fuzzy.java | 5 +++++ 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java index 512e4e58..e2be4f00 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java @@ -31,17 +31,8 @@ public void register(ItemStack target, int width, List ingredients, List< ResourceLocation itemName = target.internal.getItem().getRegistryName(); ResourceLocation name = new ResourceLocation(itemName.getNamespace(), itemName.getPath() + ingredients.hashCode() + dependencies.hashCode() + conflicts.hashCode()); - boolean dependencyNotMet = dependencies.stream().anyMatch(f -> { - return f.enumerate().stream().anyMatch(item -> - !ForgeRegistries.ITEMS.containsKey(item.internal.getItem().getRegistryName())) - || f.getTag().getAllElements().isEmpty(); - }); - - boolean hasConflict = conflicts.stream().anyMatch(f -> { - return f.enumerate().stream().anyMatch(item -> - ForgeRegistries.ITEMS.containsKey(item.internal.getItem().getRegistryName())) - || !f.getTag().getAllElements().isEmpty(); - }); + boolean dependencyNotMet = dependencies.stream().anyMatch(f -> f.getTag().getAllElements().isEmpty()); + boolean hasConflict = conflicts.stream().anyMatch(f -> !f.getTag().getAllElements().isEmpty()); if (dependencyNotMet || hasConflict) { ModCore.info("Requirements not met, skipping UMC recipe %s", name.toString()); @@ -65,6 +56,6 @@ public void register(ItemStack target, int width, List ingredients, List< ResourceLocation ad = new ResourceLocation(name.getNamespace(), "unlock" + name.getPath()); event.registerRecipeTrigger(ad, name, ingredients.toArray(new Fuzzy[0])); }); - map.getOrDefault(IRecipeType.CRAFTING, ImmutableMap.builder()).put(name, recipe); + map.computeIfAbsent(IRecipeType.CRAFTING, o -> ImmutableMap.builder()).put(name, recipe); } } diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index be91463b..1d52899b 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -195,4 +195,9 @@ public Tag getTag() { public String toString() { return ident; } + + @Override + public int hashCode() { + return toString().hashCode(); + } } From 7d5b3884f77c0f32531e3c7632f92e8f8950cebc Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sat, 17 Jan 2026 15:14:48 +0800 Subject: [PATCH 05/16] ref: change to a non-hacky way --- .../platform/RegisterCraftingRecipeEvent.java | 1 - .../feat/data_registry/MixinTagCollection.java | 15 +++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java index e2be4f00..5ff67fc9 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java @@ -12,7 +12,6 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.registries.ForgeRegistries; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java index 8b5018c6..d17d2d99 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -25,12 +25,15 @@ public class MixinTagCollection { @Inject(method = "lambda$reload$3", at = @At("RETURN"), remap = false) public void postTagReload(IResourceManager p_lambda$reload$3_1_, CallbackInfoReturnable>> cir) { Map> map = cir.getReturnValue(); - if (this.resourceLocationPrefix.contains("block")) { - RegisterBlockTagEvent event = new RegisterBlockTagEvent(map); - ModLoader.get().postEvent(event); - } else if (this.resourceLocationPrefix.contains("item")) { - RegisterItemTagEvent event = new RegisterItemTagEvent(map); - ModLoader.get().postEvent(event); + switch (this.resourceLocationPrefix) { + case "tags/blocks": + RegisterBlockTagEvent blockTagEvent = new RegisterBlockTagEvent(map); + ModLoader.get().postEvent(blockTagEvent); + return; + case "tags/items": + RegisterItemTagEvent itemTagEvent = new RegisterItemTagEvent(map); + ModLoader.get().postEvent(itemTagEvent); + return; } } } From 8bb7ae03373c9d71d76992562045243fbf591dd0 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sat, 17 Jan 2026 16:20:25 +0800 Subject: [PATCH 06/16] ref: rename --- .../cam72cam/mod/event/platform/RegisterBlockTagEvent.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java index 62c917d4..1e54d51c 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -21,9 +21,9 @@ public void registerTag(ResourceLocation ident, Collection includes) { } } - public void registerTag(ResourceLocation ident, Block item) { + public void registerTag(ResourceLocation ident, Block block) { Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); - builder.add(item); + builder.add(block); map.put(ident, builder); } From edb35bfafe950151a67f6c0e5e4797b04754f7a8 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Mon, 9 Feb 2026 20:05:59 +0800 Subject: [PATCH 07/16] fix: unstable hashcode of Arrays.ArrayList --- src/main/java/cam72cam/mod/item/Recipes.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/mod/item/Recipes.java b/src/main/java/cam72cam/mod/item/Recipes.java index f39fda1f..ed951ba9 100644 --- a/src/main/java/cam72cam/mod/item/Recipes.java +++ b/src/main/java/cam72cam/mod/item/Recipes.java @@ -29,7 +29,7 @@ public static class ShapedRecipeBuilder { private ShapedRecipeBuilder(ItemStack item, int width, Fuzzy... ingredients) { this.target = item; this.width = width; - this.ingredients = Arrays.asList(ingredients); + this.ingredients = new ArrayList<>(Arrays.asList(ingredients)); CommonEvents.Recipe.REGISTER.subscribe(this::register); } From d572753bda4ada2b7ce01c43ee207fa0096c534f Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 18:30:48 +0800 Subject: [PATCH 08/16] fix: remove `remap = false` --- .../mod/mixin/feat/data_registry/MixinTagCollection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java index d17d2d99..1ee0a0ed 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -22,7 +22,7 @@ public class MixinTagCollection { @Final private String resourceLocationPrefix; - @Inject(method = "lambda$reload$3", at = @At("RETURN"), remap = false) + @Inject(method = "lambda$reload$3", at = @At("RETURN")) public void postTagReload(IResourceManager p_lambda$reload$3_1_, CallbackInfoReturnable>> cir) { Map> map = cir.getReturnValue(); switch (this.resourceLocationPrefix) { From bde0171c55ce37655efe6b343f94388bffcdfeb6 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 19:42:56 +0800 Subject: [PATCH 09/16] ref: code cleanup --- .../platform/RegisterAdvancementEvent.java | 15 ++++--- .../event/platform/RegisterBlockTagEvent.java | 4 +- .../platform/RegisterCraftingRecipeEvent.java | 43 +++---------------- .../event/platform/RegisterItemTagEvent.java | 12 +++++- src/main/java/cam72cam/mod/item/Fuzzy.java | 9 +--- src/main/java/cam72cam/mod/item/Recipes.java | 39 +++++++++++------ .../data_registry/MixinTagCollection.java | 6 ++- .../mixins.feat.universalmodcore.json | 1 - 8 files changed, 60 insertions(+), 69 deletions(-) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java index 99be0811..89d444da 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java @@ -4,6 +4,7 @@ import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementRewards; import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.IRequirementsStrategy; import net.minecraft.advancements.criterion.*; import net.minecraft.util.ResourceLocation; import net.minecraftforge.eventbus.api.Event; @@ -11,18 +12,16 @@ import java.util.Map; public class RegisterAdvancementEvent extends Event { - private static final ResourceLocation RECIPE = new ResourceLocation("minecraft:recipes/root"); + private static final ResourceLocation RECIPE_ROOT = new ResourceLocation("minecraft:recipes/root"); private final Map map; public RegisterAdvancementEvent(Map map) { this.map = map; } - public void registerRecipeTrigger(ResourceLocation ident, ResourceLocation recipe, Fuzzy... trigger) { - Advancement.Builder builder = Advancement.Builder.builder().withParentId(RECIPE); + public void registerRecipeTrigger(ResourceLocation advancementIdent, ResourceLocation recipe, Fuzzy... trigger) { + Advancement.Builder builder = Advancement.Builder.builder().withParentId(RECIPE_ROOT); -// Criterion hasRecipe = new Criterion(new RecipeUnlockedTrigger.Instance(recipe)); -// builder.withCriterion("has_recipe", hasRecipe); for (int i = 0; i < trigger.length; i++) { Fuzzy ingredient = trigger[i]; if (ingredient == null || ingredient.getTag() == null) continue; @@ -31,8 +30,10 @@ public void registerRecipeTrigger(ResourceLocation ident, ResourceLocation recip ItemPredicate.Builder.create().tag(ingredient.getTag()).build())); builder.withCriterion("has" + ingredient + i, hasItem); } + //Unlock the recipe when any of the ingredients being acquired + builder.withRequirementsStrategy(IRequirementsStrategy.OR); builder.withRewards(AdvancementRewards.Builder.recipe(recipe)); - map.put(ident, builder); + map.put(advancementIdent, builder); } -} +} \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java index 1e54d51c..af3d279e 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -22,14 +22,16 @@ public void registerTag(ResourceLocation ident, Collection includes) { } public void registerTag(ResourceLocation ident, Block block) { + //Safe casting verified by event poster Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); builder.add(block); map.put(ident, builder); } public void registerTag(ResourceLocation ident, Tag includes) { + //Safe casting verified by event poster Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); includes.getEntries().forEach(builder::add); map.put(ident, builder); } -} +} \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java index 5ff67fc9..b0da97ef 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java @@ -1,24 +1,16 @@ package cam72cam.mod.event.platform; -import cam72cam.mod.ModCore; import cam72cam.mod.event.CommonEvents; import cam72cam.mod.item.Fuzzy; -import cam72cam.mod.item.ItemStack; import com.google.common.collect.ImmutableMap; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; -import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipe; -import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; import net.minecraftforge.eventbus.api.Event; -import java.util.ArrayList; -import java.util.List; import java.util.Map; -import java.util.stream.Stream; -//Only support full height recipe for now public class RegisterCraftingRecipeEvent extends Event { Map, ImmutableMap.Builder>> map; @@ -26,35 +18,12 @@ public RegisterCraftingRecipeEvent(Map, ImmutableMap.Builder ingredients, List dependencies, List conflicts) { - ResourceLocation itemName = target.internal.getItem().getRegistryName(); - ResourceLocation name = new ResourceLocation(itemName.getNamespace(), itemName.getPath() - + ingredients.hashCode() + dependencies.hashCode() + conflicts.hashCode()); - boolean dependencyNotMet = dependencies.stream().anyMatch(f -> f.getTag().getAllElements().isEmpty()); - boolean hasConflict = conflicts.stream().anyMatch(f -> !f.getTag().getAllElements().isEmpty()); - - if (dependencyNotMet || hasConflict) { - ModCore.info("Requirements not met, skipping UMC recipe %s", name.toString()); - return; - } - - List n = new ArrayList<>(); - for (Fuzzy ingredient : ingredients) { - if (ingredient == null || ingredient.isEmpty()) { - n.add(new Ingredient(Stream.of(new Ingredient.SingleItemList(net.minecraft.item.ItemStack.EMPTY)))); - } else { - n.add(new Ingredient(Stream.of(new Ingredient.TagList(ingredient.getTag())))); - } - } - NonNullList ingredient = NonNullList.create(); - ingredient.addAll(n); - - ShapedRecipe recipe = new ShapedRecipe(name, "", width, 3, ingredient, target.internal); - + public void registerCraftingRecipe(ShapedRecipe recipe, Fuzzy... triggers) { + //Register corresponding unlocking advancement CommonEvents.Recipe.RECIPE_LISTENER.get().add(event -> { - ResourceLocation ad = new ResourceLocation(name.getNamespace(), "unlock" + name.getPath()); - event.registerRecipeTrigger(ad, name, ingredients.toArray(new Fuzzy[0])); + ResourceLocation advancement = new ResourceLocation(recipe.getId().getNamespace(), "unlock" + recipe.getId().getPath()); + event.registerRecipeTrigger(advancement, recipe.getId(), triggers); }); - map.computeIfAbsent(IRecipeType.CRAFTING, o -> ImmutableMap.builder()).put(name, recipe); + map.computeIfAbsent(IRecipeType.CRAFTING, o -> ImmutableMap.builder()).put(recipe.getId(), recipe); } -} +} \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java index 1ac72700..036e2225 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java @@ -1,5 +1,6 @@ package cam72cam.mod.event.platform; +import cam72cam.mod.item.ItemStack; import net.minecraft.item.Item; import net.minecraft.tags.Tag; import net.minecraft.util.ResourceLocation; @@ -22,14 +23,23 @@ public void registerTag(ResourceLocation ident, Collection includes) { } public void registerTag(ResourceLocation ident, Item item) { + //Safe casting verified by event poster Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); builder.add(item); map.put(ident, builder); } public void registerTag(ResourceLocation ident, Tag includes) { + //Safe casting verified by event poster Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); includes.getEntries().forEach(builder::add); map.put(ident, builder); } -} + + public void registerTag(ResourceLocation ident, ItemStack itemStack) { + //Safe casting verified by event poster + Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); + builder.add(itemStack.internal.getItem()); + map.put(ident, builder); + } +} \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index 1d52899b..5a7daa86 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -157,8 +157,8 @@ public ItemStack example() { } /** Use to register an itemstack */ - public Fuzzy add(ItemStack item) { - add(item.internal.getItem()); + public Fuzzy add(ItemStack itemStack) { + CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), itemStack)); return this; } @@ -195,9 +195,4 @@ public Tag getTag() { public String toString() { return ident; } - - @Override - public int hashCode() { - return toString().hashCode(); - } } diff --git a/src/main/java/cam72cam/mod/item/Recipes.java b/src/main/java/cam72cam/mod/item/Recipes.java index ed951ba9..f46a8fa7 100644 --- a/src/main/java/cam72cam/mod/item/Recipes.java +++ b/src/main/java/cam72cam/mod/item/Recipes.java @@ -2,11 +2,15 @@ import cam72cam.mod.event.CommonEvents; -import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Stream; /** Recipe registration */ public class Recipes { @@ -22,16 +26,29 @@ public static class ShapedRecipeBuilder { private final List dependencies = new ArrayList<>(); private final List conflicts = new ArrayList<>(); - private final ItemStack target; - private final int width; - private final List ingredients; - private ShapedRecipeBuilder(ItemStack item, int width, Fuzzy... ingredients) { - this.target = item; - this.width = width; - this.ingredients = new ArrayList<>(Arrays.asList(ingredients)); + CommonEvents.Recipe.REGISTER.subscribe(event -> { + boolean dependencyNotMet = dependencies.stream().anyMatch(f -> f.getTag().getAllElements().isEmpty()); + boolean hasConflict = conflicts.stream().anyMatch(f -> !f.getTag().getAllElements().isEmpty()); + + if (dependencyNotMet || hasConflict) { + // Don't register recipe + return; + } + ResourceLocation itemName = item.internal.getItem().getRegistryName(); + + int height = ingredients.length / width; + NonNullList result = NonNullList.withSize(ingredients.length, Ingredient.EMPTY); + for (int i = 0; i < ingredients.length; i++) { + Fuzzy ingredient = ingredients[i]; + if (ingredient != null && !ingredient.isEmpty()) { + result.set(i, new Ingredient(Stream.of(new Ingredient.TagList(ingredient.getTag())))); + } + } - CommonEvents.Recipe.REGISTER.subscribe(this::register); + ShapedRecipe recipe = new ShapedRecipe(itemName, "", width, height, result, item.internal); + event.registerCraftingRecipe(recipe, ingredients); + }); } public ShapedRecipeBuilder require(Fuzzy ...dependencies) { @@ -43,9 +60,5 @@ public ShapedRecipeBuilder conflicts(Fuzzy ...conflicts) { this.conflicts.addAll(Arrays.asList(conflicts)); return this; } - - private void register(RegisterCraftingRecipeEvent event) { - event.register(target, width, ingredients, dependencies, conflicts); - } } } \ No newline at end of file diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java index 1ee0a0ed..17eeb108 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -23,7 +23,7 @@ public class MixinTagCollection { private String resourceLocationPrefix; @Inject(method = "lambda$reload$3", at = @At("RETURN")) - public void postTagReload(IResourceManager p_lambda$reload$3_1_, CallbackInfoReturnable>> cir) { + public void postTagReload(IResourceManager manager, CallbackInfoReturnable>> cir) { Map> map = cir.getReturnValue(); switch (this.resourceLocationPrefix) { case "tags/blocks": @@ -34,6 +34,8 @@ public void postTagReload(IResourceManager p_lambda$reload$3_1_, CallbackInfoRet RegisterItemTagEvent itemTagEvent = new RegisterItemTagEvent(map); ModLoader.get().postEvent(itemTagEvent); return; + default: + //Waiting for more... } } -} +} \ No newline at end of file diff --git a/src/main/resources/mixins.feat.universalmodcore.json b/src/main/resources/mixins.feat.universalmodcore.json index 899c26de..11de1156 100644 --- a/src/main/resources/mixins.feat.universalmodcore.json +++ b/src/main/resources/mixins.feat.universalmodcore.json @@ -11,7 +11,6 @@ "data_registry.MixinAdvancement", "data_registry.MixinRecipeManager", "data_registry.MixinTagCollection", - "global_renderer.MixinRenderGlobal", "large_entity_collision.MixinVanillaWorld" ], "client": [ From d2f1796453f7852a06f399f0eac6fa2782f6679a Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 19:53:52 +0800 Subject: [PATCH 10/16] docs: add javadoc for mixins and events --- src/main/java/cam72cam/mod/event/CommonEvents.java | 12 ++++++------ .../mod/event/platform/RegisterAdvancementEvent.java | 3 +++ .../mod/event/platform/RegisterBlockTagEvent.java | 3 +++ .../mod/event/platform/RegisterItemTagEvent.java | 3 +++ ...tingRecipeEvent.java => RegisterRecipeEvent.java} | 9 ++++++--- .../mixin/feat/data_registry/MixinAdvancement.java | 3 ++- .../mixin/feat/data_registry/MixinRecipeManager.java | 9 ++++++--- .../mixin/feat/data_registry/MixinTagCollection.java | 6 ++++++ 8 files changed, 35 insertions(+), 13 deletions(-) rename src/main/java/cam72cam/mod/event/platform/{RegisterCraftingRecipeEvent.java => RegisterRecipeEvent.java} (78%) diff --git a/src/main/java/cam72cam/mod/event/CommonEvents.java b/src/main/java/cam72cam/mod/event/CommonEvents.java index 7d335ccc..f3b90f32 100644 --- a/src/main/java/cam72cam/mod/event/CommonEvents.java +++ b/src/main/java/cam72cam/mod/event/CommonEvents.java @@ -3,7 +3,7 @@ import cam72cam.mod.ModCore; import cam72cam.mod.event.platform.RegisterAdvancementEvent; import cam72cam.mod.event.platform.RegisterBlockTagEvent; -import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent; +import cam72cam.mod.event.platform.RegisterRecipeEvent; import cam72cam.mod.event.platform.RegisterItemTagEvent; import net.minecraft.entity.EntityType; import net.minecraft.entity.player.PlayerEntity; @@ -60,9 +60,9 @@ public static final class Item { } public static final class Recipe { - public static final Event> REGISTER = new Event<>(); + public static final Event> REGISTER = new Event<>(); //TODO make event listener refreshable - public static ThreadLocal>> RECIPE_LISTENER = ThreadLocal.withInitial(ArrayList::new); + public static ThreadLocal>> POST_RECIPE = ThreadLocal.withInitial(ArrayList::new); } public static final class Entity { @@ -179,14 +179,14 @@ public static void registerItemTag(RegisterItemTagEvent event) { } @SubscribeEvent - public static void registerCraftingRecipe(RegisterCraftingRecipeEvent event) { + public static void registerCraftingRecipe(RegisterRecipeEvent event) { CommonEvents.Recipe.REGISTER.execute(x -> x.accept(event)); } @SubscribeEvent public static void registerRecipeTrigger(RegisterAdvancementEvent event) { - CommonEvents.Recipe.RECIPE_LISTENER.get().forEach(x -> x.accept(event)); - CommonEvents.Recipe.RECIPE_LISTENER.set(new ArrayList<>()); + CommonEvents.Recipe.POST_RECIPE.get().forEach(x -> x.accept(event)); + CommonEvents.Recipe.POST_RECIPE.set(new ArrayList<>()); } } } diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java index 89d444da..d72c5ced 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java @@ -11,6 +11,9 @@ import java.util.Map; +/** + * Fired when advancement datapacks are reloaded + */ public class RegisterAdvancementEvent extends Event { private static final ResourceLocation RECIPE_ROOT = new ResourceLocation("minecraft:recipes/root"); private final Map map; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java index af3d279e..0878ca81 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -8,6 +8,9 @@ import java.util.Collection; import java.util.Map; +/** + * Fired when block tag datapacks are reloaded + */ public class RegisterBlockTagEvent extends Event { private final Map> map; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java index 036e2225..89cd9af7 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java @@ -9,6 +9,9 @@ import java.util.Collection; import java.util.Map; +/** + * Fired when item tag datapacks are reloaded + */ public class RegisterItemTagEvent extends Event { private final Map> map; diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java similarity index 78% rename from src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java rename to src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java index b0da97ef..48321026 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterCraftingRecipeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java @@ -11,16 +11,19 @@ import java.util.Map; -public class RegisterCraftingRecipeEvent extends Event { +/** + * Fired when recipe datapacks are reloaded + */ +public class RegisterRecipeEvent extends Event { Map, ImmutableMap.Builder>> map; - public RegisterCraftingRecipeEvent(Map, ImmutableMap.Builder>> map) { + public RegisterRecipeEvent(Map, ImmutableMap.Builder>> map) { this.map = map; } public void registerCraftingRecipe(ShapedRecipe recipe, Fuzzy... triggers) { //Register corresponding unlocking advancement - CommonEvents.Recipe.RECIPE_LISTENER.get().add(event -> { + CommonEvents.Recipe.POST_RECIPE.get().add(event -> { ResourceLocation advancement = new ResourceLocation(recipe.getId().getNamespace(), "unlock" + recipe.getId().getPath()); event.registerRecipeTrigger(advancement, recipe.getId(), triggers); }); diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java index 0ccf8609..5de95dc0 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinAdvancement.java @@ -17,7 +17,8 @@ import java.util.Map; /** - * Used for injecting recipe unlock conditions for now + * Used for posting RegisterAdvancementEvent + * @see RegisterAdvancementEvent */ @Mixin(AdvancementManager.class) public class MixinAdvancement { diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java index 76c76a00..253d0c33 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinRecipeManager.java @@ -1,6 +1,6 @@ package cam72cam.mod.mixin.feat.data_registry; -import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent; +import cam72cam.mod.event.platform.RegisterRecipeEvent; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonObject; import com.llamalad7.mixinextras.sugar.Local; @@ -18,7 +18,10 @@ import java.util.Map; - +/** + * Used for posting RegisterRecipeEvent + * @see RegisterRecipeEvent + */ @Mixin(RecipeManager.class) public class MixinRecipeManager { @Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/resources/IResourceManager;Lnet/minecraft/profiler/IProfiler;)V", @@ -26,7 +29,7 @@ public class MixinRecipeManager { public void postRecipeReload(Map splashList, IResourceManager resourceManagerIn, IProfiler profilerIn, CallbackInfo ci, @Local(ordinal = 1) Map, ImmutableMap.Builder>> mapLocalRef) { - RegisterCraftingRecipeEvent event = new RegisterCraftingRecipeEvent(mapLocalRef); + RegisterRecipeEvent event = new RegisterRecipeEvent(mapLocalRef); ModLoader.get().postEvent(event); } } diff --git a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java index 17eeb108..f7f86236 100644 --- a/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java +++ b/src/main/java/cam72cam/mod/mixin/feat/data_registry/MixinTagCollection.java @@ -16,6 +16,11 @@ import java.util.Map; +/** + * Used for posting RegisterBlockTagEvent and RegisterItemTagEvent + * @see RegisterBlockTagEvent + * @see RegisterItemTagEvent + */ @Mixin(TagCollection.class) public class MixinTagCollection { @Shadow @@ -26,6 +31,7 @@ public class MixinTagCollection { public void postTagReload(IResourceManager manager, CallbackInfoReturnable>> cir) { Map> map = cir.getReturnValue(); switch (this.resourceLocationPrefix) { + //Change me when minecraft version changes case "tags/blocks": RegisterBlockTagEvent blockTagEvent = new RegisterBlockTagEvent(map); ModLoader.get().postEvent(blockTagEvent); From 79a4f47d0700b547f15a8fc174d8046fc63a63c5 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 20:10:44 +0800 Subject: [PATCH 11/16] ref: make it more 1.12-like --- src/main/java/cam72cam/mod/item/Fuzzy.java | 1 + src/main/java/cam72cam/mod/item/Recipes.java | 25 ++++++++++++-------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index 5a7daa86..63fbfdcc 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -183,6 +183,7 @@ public Fuzzy add(CustomItem item) { /** Pull other fuzzy into this one */ public Fuzzy include(Fuzzy other) { includes.add(other); + //TODO Does ordering matter? CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), other.tag)); return this; } diff --git a/src/main/java/cam72cam/mod/item/Recipes.java b/src/main/java/cam72cam/mod/item/Recipes.java index f46a8fa7..8a6473c7 100644 --- a/src/main/java/cam72cam/mod/item/Recipes.java +++ b/src/main/java/cam72cam/mod/item/Recipes.java @@ -10,7 +10,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Stream; /** Recipe registration */ public class Recipes { @@ -28,25 +27,31 @@ public static class ShapedRecipeBuilder { private ShapedRecipeBuilder(ItemStack item, int width, Fuzzy... ingredients) { CommonEvents.Recipe.REGISTER.subscribe(event -> { - boolean dependencyNotMet = dependencies.stream().anyMatch(f -> f.getTag().getAllElements().isEmpty()); - boolean hasConflict = conflicts.stream().anyMatch(f -> !f.getTag().getAllElements().isEmpty()); - - if (dependencyNotMet || hasConflict) { - // Don't register recipe - return; + for (Fuzzy dependency : dependencies) { + if (dependency.enumerate().isEmpty()) { + // Don't register recipe + return; + } } + for (Fuzzy conflict : conflicts) { + if (!conflict.enumerate().isEmpty()) { + // Don't register recipe + return; + } + } + ResourceLocation itemName = item.internal.getItem().getRegistryName(); int height = ingredients.length / width; - NonNullList result = NonNullList.withSize(ingredients.length, Ingredient.EMPTY); + NonNullList input = NonNullList.withSize(ingredients.length, Ingredient.EMPTY); for (int i = 0; i < ingredients.length; i++) { Fuzzy ingredient = ingredients[i]; if (ingredient != null && !ingredient.isEmpty()) { - result.set(i, new Ingredient(Stream.of(new Ingredient.TagList(ingredient.getTag())))); + input.set(i, Ingredient.fromTag(ingredient.getTag())); } } - ShapedRecipe recipe = new ShapedRecipe(itemName, "", width, height, result, item.internal); + ShapedRecipe recipe = new ShapedRecipe(itemName, "", width, height, input, item.internal); event.registerCraftingRecipe(recipe, ingredients); }); } From 5f056466c4b75af0d5182b1201821442b141a2a3 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 21:16:42 +0800 Subject: [PATCH 12/16] fix: add recipe trigger --- .../cam72cam/mod/event/platform/RegisterAdvancementEvent.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java index d72c5ced..2495bf3c 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterAdvancementEvent.java @@ -25,6 +25,8 @@ public RegisterAdvancementEvent(Map map) public void registerRecipeTrigger(ResourceLocation advancementIdent, ResourceLocation recipe, Fuzzy... trigger) { Advancement.Builder builder = Advancement.Builder.builder().withParentId(RECIPE_ROOT); + Criterion alreadyHasRecipe = new Criterion(new RecipeUnlockedTrigger.Instance(recipe)); + builder.withCriterion("already_has_recipe", alreadyHasRecipe); for (int i = 0; i < trigger.length; i++) { Fuzzy ingredient = trigger[i]; if (ingredient == null || ingredient.getTag() == null) continue; From 98408e1437132d1e7018769e2a129a9d51c7a4ae Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 21:39:48 +0800 Subject: [PATCH 13/16] ref: rename --- src/main/java/cam72cam/mod/event/CommonEvents.java | 14 +++++++------- .../mod/event/platform/RegisterRecipeEvent.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/cam72cam/mod/event/CommonEvents.java b/src/main/java/cam72cam/mod/event/CommonEvents.java index f3b90f32..ecc3a26a 100644 --- a/src/main/java/cam72cam/mod/event/CommonEvents.java +++ b/src/main/java/cam72cam/mod/event/CommonEvents.java @@ -62,7 +62,7 @@ public static final class Item { public static final class Recipe { public static final Event> REGISTER = new Event<>(); //TODO make event listener refreshable - public static ThreadLocal>> POST_RECIPE = ThreadLocal.withInitial(ArrayList::new); + public static ThreadLocal>> RECIPE_TRIGGERS = ThreadLocal.withInitial(ArrayList::new); } public static final class Entity { @@ -169,24 +169,24 @@ public static void registerContainers(RegistryEvent.Register> e } @SubscribeEvent - public static void registerItemTag(RegisterBlockTagEvent event) { + public static void registerBlockTags(RegisterBlockTagEvent event) { Block.TAGS.execute(x -> x.accept(event)); } @SubscribeEvent - public static void registerItemTag(RegisterItemTagEvent event) { + public static void registerItemTags(RegisterItemTagEvent event) { Item.TAGS.execute(x -> x.accept(event)); } @SubscribeEvent - public static void registerCraftingRecipe(RegisterRecipeEvent event) { + public static void registerRecipes(RegisterRecipeEvent event) { CommonEvents.Recipe.REGISTER.execute(x -> x.accept(event)); } @SubscribeEvent - public static void registerRecipeTrigger(RegisterAdvancementEvent event) { - CommonEvents.Recipe.POST_RECIPE.get().forEach(x -> x.accept(event)); - CommonEvents.Recipe.POST_RECIPE.set(new ArrayList<>()); + public static void registerAdvancements(RegisterAdvancementEvent event) { + CommonEvents.Recipe.RECIPE_TRIGGERS.get().forEach(x -> x.accept(event)); + CommonEvents.Recipe.RECIPE_TRIGGERS.set(new ArrayList<>()); } } } diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java index 48321026..ccaa5ee5 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterRecipeEvent.java @@ -23,7 +23,7 @@ public RegisterRecipeEvent(Map, ImmutableMap.Builder { + CommonEvents.Recipe.RECIPE_TRIGGERS.get().add(event -> { ResourceLocation advancement = new ResourceLocation(recipe.getId().getNamespace(), "unlock" + recipe.getId().getPath()); event.registerRecipeTrigger(advancement, recipe.getId(), triggers); }); From 102d02a6002ffb03ea32d195386f9f19f95ba7a1 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Wed, 11 Feb 2026 21:43:39 +0800 Subject: [PATCH 14/16] ref: use ArrayList.clear() instead of set --- src/main/java/cam72cam/mod/event/CommonEvents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/mod/event/CommonEvents.java b/src/main/java/cam72cam/mod/event/CommonEvents.java index ecc3a26a..ba8cd5b3 100644 --- a/src/main/java/cam72cam/mod/event/CommonEvents.java +++ b/src/main/java/cam72cam/mod/event/CommonEvents.java @@ -186,7 +186,7 @@ public static void registerRecipes(RegisterRecipeEvent event) { @SubscribeEvent public static void registerAdvancements(RegisterAdvancementEvent event) { CommonEvents.Recipe.RECIPE_TRIGGERS.get().forEach(x -> x.accept(event)); - CommonEvents.Recipe.RECIPE_TRIGGERS.set(new ArrayList<>()); + CommonEvents.Recipe.RECIPE_TRIGGERS.get().clear(); } } } From 6173ebf9ebcb05aec05fd9ed69ce04b9ac45e195 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Thu, 12 Feb 2026 13:01:46 +0800 Subject: [PATCH 15/16] ref: eliminate unnecessary fields --- .../event/platform/RegisterItemTagEvent.java | 3 ++- src/main/java/cam72cam/mod/item/Fuzzy.java | 27 ++++++------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java index 89cd9af7..76e6e140 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterItemTagEvent.java @@ -35,7 +35,8 @@ public void registerTag(ResourceLocation ident, Item item) { public void registerTag(ResourceLocation ident, Tag includes) { //Safe casting verified by event poster Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); - includes.getEntries().forEach(builder::add); + //Don't pass in direct tag reference + builder.add(new Tag.TagEntry<>(includes.getId())); map.put(ident, builder); } diff --git a/src/main/java/cam72cam/mod/item/Fuzzy.java b/src/main/java/cam72cam/mod/item/Fuzzy.java index 63fbfdcc..4aa5ad1a 100644 --- a/src/main/java/cam72cam/mod/item/Fuzzy.java +++ b/src/main/java/cam72cam/mod/item/Fuzzy.java @@ -14,7 +14,7 @@ import java.util.*; import java.util.stream.Collectors; -/** OreDict / Tag abstraction. Use for item equivalence */ +/** Vanilla/Forge tag abstraction. Use for item equivalence */ public class Fuzzy { public static final Fuzzy WOOD_STICK = new Fuzzy(Tags.Items.RODS_WOODEN, "stickWood").add(Items.STICK); public static final Fuzzy WOOD_PLANK = new Fuzzy(ItemTags.PLANKS, "plankWood").add(Blocks.OAK_PLANKS); @@ -87,15 +87,14 @@ public class Fuzzy { public static final Fuzzy GLASS_PANE = new Fuzzy(Tags.Items.GLASS_PANES, "paneGlass").add(Blocks.GLASS_PANE); public static final Fuzzy NAME_TAG = new Fuzzy("nameTag").add(Items.NAME_TAG); + public static final Fuzzy TEST = new Fuzzy("test1").add(Items.EMERALD).add(Blocks.IRON_BLOCK).include(Fuzzy.NAME_TAG); static { ConfigFile.addMapper(Fuzzy.class, Fuzzy::toString, Fuzzy::get); } static Map registered; private final String ident; - final Tag tag; - private final List customItems; - private final Set includes; + private final Tag tag; public static Fuzzy get(String ident) { if (registered == null) { @@ -123,8 +122,6 @@ private Fuzzy(Tag tag, String ident) { this.ident = ident; this.tag = tag; - this.customItems = new ArrayList<>(); - includes = new HashSet<>(); registered.put(ident, this); } @@ -140,14 +137,10 @@ public boolean isEmpty() { /** List all possible itemstacks */ public List enumerate() { - Set items = tag.getAllElements().stream().map(item -> new ItemStack(new net.minecraft.item.ItemStack(item))).collect(Collectors.toSet()); - for (Item item : customItems) { - items.add(new ItemStack(new net.minecraft.item.ItemStack(item))); - } - for (Fuzzy f : includes) { - items.addAll(f.enumerate()); - } - return new ArrayList<>(items); + return tag.getAllElements().stream() + .map(item -> new ItemStack(new net.minecraft.item.ItemStack(item))) + .distinct() + .collect(Collectors.toList()); } /** Grab the first example of a item in this fuzzy */ @@ -164,13 +157,11 @@ public Fuzzy add(ItemStack itemStack) { /** Don't use directly (unless in version specific code) */ public Fuzzy add(Block block) { - add(block.asItem()); - return this; + return add(block.asItem()); } /** Don't use directly (unless in version specific code) */ public Fuzzy add(Item item) { - customItems.add(item); CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), item)); return this; } @@ -182,8 +173,6 @@ public Fuzzy add(CustomItem item) { /** Pull other fuzzy into this one */ public Fuzzy include(Fuzzy other) { - includes.add(other); - //TODO Does ordering matter? CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), other.tag)); return this; } From d9aaa2d793a624e3b11a9625c84dd039761bc949 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Thu, 12 Feb 2026 13:06:57 +0800 Subject: [PATCH 16/16] ref: change block tag include implementation --- .../java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java index 0878ca81..732e45f3 100644 --- a/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java +++ b/src/main/java/cam72cam/mod/event/platform/RegisterBlockTagEvent.java @@ -34,7 +34,7 @@ public void registerTag(ResourceLocation ident, Block block) { public void registerTag(ResourceLocation ident, Tag includes) { //Safe casting verified by event poster Tag.Builder builder = (Tag.Builder) map.getOrDefault(ident, Tag.Builder.create()); - includes.getEntries().forEach(builder::add); + builder.add(new Tag.TagEntry<>(includes.getId())); map.put(ident, builder); } } \ No newline at end of file