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 1/6] 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 2/6] 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 3/6] 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 4/6] 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 5/6] 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 6/6] 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); }