From c291023c820d245fef75911d8370f26ae03faf48 Mon Sep 17 00:00:00 2001 From: wu-xiao-ya <176298918+wu-xiao-ya@users.noreply.github.com> Date: Sat, 4 Jul 2026 18:16:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20CraftTweaker=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E9=85=8D=E6=96=B9=E5=90=8E=E8=A2=AB=20OOI=20=E9=87=8D?= =?UTF-8?q?=E5=86=99=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../circulation/only_one_item/OOIConfig.java | 40 +++++++++++++++++++ .../only_one_item/OnlyOneItem.java | 24 +++++++++-- .../mixin/crt/MixinCraftTweaker.java | 20 ++++++++++ .../resources/mixins.only_one_item.crt.json | 3 +- 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/circulation/only_one_item/mixin/crt/MixinCraftTweaker.java diff --git a/src/main/java/com/circulation/only_one_item/OOIConfig.java b/src/main/java/com/circulation/only_one_item/OOIConfig.java index a521675..64c5d32 100644 --- a/src/main/java/com/circulation/only_one_item/OOIConfig.java +++ b/src/main/java/com/circulation/only_one_item/OOIConfig.java @@ -13,9 +13,11 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Loader; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -28,12 +30,16 @@ public class OOIConfig { public static final List items = new ObjectArrayList<>(); public static final List fluids = new ObjectArrayList<>(); public static final Set blackList = new ObjectOpenHashSet<>(); + public static boolean clearDuplicateRecipes = true; + public static boolean initializeBeforeCraftTweakerActions = true; + public static boolean processOreDictionaryAtLoadComplete = false; public static void readConfig() { var configPath = Loader.instance().getConfigDir().toPath().resolve("ooi"); var ooiPath = configPath.resolve("ooi_item.json"); var blackPath = configPath.resolve("ooi_item_black_list.json"); var ooiFluidPath = configPath.resolve("ooi_fluid.json"); + readGeneralConfig(Loader.instance().getConfigDir()); try { Files.createDirectories(configPath); @@ -99,6 +105,40 @@ public static void readConfig() { MatchFluidHandler.Init(OOIConfig.fluids); } + private static void readGeneralConfig(File configDir) { + Configuration config = new Configuration(new File(configDir, "only_one_item.cfg")); + try { + config.load(); + clearDuplicateRecipes = config.getBoolean( + "clearDuplicateRecipes", + "recipes", + true, + "Remove duplicate crafting recipes generated by ore dictionary unification. " + + "Disable this if another recipe manager or CraftTweaker scripts need to control recipe removals." + ); + initializeBeforeCraftTweakerActions = config.getBoolean( + "initializeBeforeCraftTweakerActions", + "recipes", + true, + "When CraftTweaker is installed, initialize OOI stack unification at the start of CraftTweaker postInit " + + "so CraftTweaker and ModTweaker removals see already-unified inputs." + ); + processOreDictionaryAtLoadComplete = config.getBoolean( + "processOreDictionaryAtLoadComplete", + "recipes", + false, + "Run OOI ore dictionary post-processing during FMLLoadComplete. The old behavior used true, but it can " + + "rewrite machine recipe inputs after CraftTweaker removals have already run." + ); + } catch (Exception e) { + OnlyOneItem.LOGGER.error("[OOI]The config/only_one_item.cfg file is incorrect!", e); + } finally { + if (config.hasChanged()) { + config.save(); + } + } + } + private static void addItemTargets(Set targets) { if (targets == null) return; for (ItemConversionTarget target : targets) { diff --git a/src/main/java/com/circulation/only_one_item/OnlyOneItem.java b/src/main/java/com/circulation/only_one_item/OnlyOneItem.java index 3522d8a..08a971c 100644 --- a/src/main/java/com/circulation/only_one_item/OnlyOneItem.java +++ b/src/main/java/com/circulation/only_one_item/OnlyOneItem.java @@ -25,6 +25,8 @@ public class OnlyOneItem { public static final Logger LOGGER = LogManager.getLogger(Tags.MOD_NAME); + private static boolean stackInitializationComplete = false; + @Mod.Instance(MOD_ID) public static OnlyOneItem instance = null; @@ -40,15 +42,31 @@ public void init(FMLInitializationEvent event) { @Mod.EventHandler public void postInit(FMLPostInitializationEvent event) { - InitHandler.allPreInit(); - if (!Loader.isModLoaded("unidict")) { + initializeStacksOnce("OOI postInit"); + if (!Loader.isModLoaded("unidict") && OOIConfig.clearDuplicateRecipes) { MatchItemHandler.clearRecipe(); + } else if (!OOIConfig.clearDuplicateRecipes) { + LOGGER.info("[OOI] Duplicate recipe cleanup is disabled by config."); } } @Mod.EventHandler public void loadComplete(FMLLoadCompleteEvent event) { - MatchItemHandler.postODProcess(); + if (OOIConfig.processOreDictionaryAtLoadComplete) { + MatchItemHandler.postODProcess(); + } else { + LOGGER.info("[OOI] LoadComplete ore dictionary post-processing is disabled by config."); + } } + public static synchronized void initializeStacksOnce(String phase) { + if (stackInitializationComplete) { + LOGGER.debug("[OOI] Stack initialization already completed, skipping {}.", phase); + return; + } + + LOGGER.info("[OOI] Initializing stack unification at {}.", phase); + InitHandler.allPreInit(); + stackInitializationComplete = true; + } } diff --git a/src/main/java/com/circulation/only_one_item/mixin/crt/MixinCraftTweaker.java b/src/main/java/com/circulation/only_one_item/mixin/crt/MixinCraftTweaker.java new file mode 100644 index 0000000..4ffd9a5 --- /dev/null +++ b/src/main/java/com/circulation/only_one_item/mixin/crt/MixinCraftTweaker.java @@ -0,0 +1,20 @@ +package com.circulation.only_one_item.mixin.crt; + +import com.circulation.only_one_item.OOIConfig; +import com.circulation.only_one_item.OnlyOneItem; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +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; + +@Mixin(value = crafttweaker.mc1120.CraftTweaker.class, remap = false) +public class MixinCraftTweaker { + + @Inject(method = "onPostInit", at = @At("HEAD")) + private void ooi$initializeBeforeCraftTweakerActions(FMLPostInitializationEvent event, CallbackInfo ci) { + if (OOIConfig.initializeBeforeCraftTweakerActions) { + OnlyOneItem.initializeStacksOnce("CraftTweaker postInit"); + } + } +} diff --git a/src/main/resources/mixins.only_one_item.crt.json b/src/main/resources/mixins.only_one_item.crt.json index 12615e6..428ea91 100644 --- a/src/main/resources/mixins.only_one_item.crt.json +++ b/src/main/resources/mixins.only_one_item.crt.json @@ -6,9 +6,10 @@ "minVersion": "0.8.5", "compatibilityLevel": "JAVA_8", "mixins": [ + "MixinCraftTweaker", "MixinCrtCommonProxy" ], "server": [], "client": [ ] -} \ No newline at end of file +}