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 +}