From 15740ade43c8934c94e9f9d6cec776312687006d Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Tue, 31 Dec 2024 23:36:54 +0800 Subject: [PATCH 01/11] update mixinbooter update mixinbooter --- .../fml/common/LoadController.java | 39 +++++++--- .../fml/relauncher/CoreModManager.java | 3 + .../fml/relauncher/MixinBooterPlugin.java | 74 +++++++++++------- .../java/zone/rong/mixinbooter/Context.java | 78 +++++++++++++++++++ .../rong/mixinbooter/IEarlyMixinLoader.java | 29 +++++-- .../rong/mixinbooter/ILateMixinLoader.java | 35 ++++++--- .../mixinbooter/IMixinConfigHijacker.java | 30 +++++++ 7 files changed, 229 insertions(+), 59 deletions(-) create mode 100644 src/main/java/zone/rong/mixinbooter/Context.java create mode 100644 src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index 62255c7e2..47530fd0f 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -44,7 +44,9 @@ import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; import org.spongepowered.asm.util.Constants; +import zone.rong.mixinbooter.Context; import zone.rong.mixinbooter.ILateMixinLoader; +import zone.rong.mixinbooter.IMixinConfigHijacker; import javax.annotation.Nullable; import java.io.File; @@ -167,20 +169,33 @@ public void distributeStateMessage(LoaderState state, Object... eventData) FMLLog.log.info("Instantiating all ILateMixinLoader implemented classes..."); for (ASMDataTable.ASMData asmData : asmDataTable.getAll(ILateMixinLoader.class.getName().replace('.', '/'))) { - modClassLoader.addFile(asmData.getCandidate().getModContainer()); // Add to path before `newInstance` - Class clazz = Class.forName(asmData.getClassName().replace('/', '.')); - FMLLog.log.info("Instantiating {} for its mixins.", clazz); - ILateMixinLoader loader = (ILateMixinLoader) clazz.getConstructor().newInstance(); - for (String mixinConfig : loader.getMixinConfigs()) { - if (loader.shouldMixinConfigQueue(mixinConfig)) { - FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); - try { - Mixins.addConfiguration(mixinConfig); - loader.onMixinConfigQueued(mixinConfig); - } catch (Throwable t) { - FMLLog.log.error("Error adding mixin configuration for {}", mixinConfig, t); + try { + modClassLoader.addFile(asmData.getCandidate().getModContainer()); // Add to path before `newInstance` + Class clazz = Class.forName(asmData.getClassName().replace('/', '.')); + FMLLog.log.info("Instantiating {} for its mixins.", clazz); + @SuppressWarnings("deprecation") + ILateMixinLoader loader = (ILateMixinLoader) clazz.getConstructor().newInstance(); + for (String mixinConfig : loader.getMixinConfigs()) { + @SuppressWarnings("deprecation") + Context context = new Context(mixinConfig); + if (loader.shouldMixinConfigQueue(context)) { + try { + @SuppressWarnings("deprecation") + IMixinConfigHijacker hijacker = MixinBooterPlugin.getHijacker(mixinConfig); + if (hijacker != null) { + FMLLog.log.info("Mixin configuration {} intercepted by {}.", mixinConfig, hijacker.getClass().getName()); + } else { + FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); + Mixins.addConfiguration(mixinConfig); + loader.onMixinConfigQueued(context); + } + } catch (Throwable t) { + FMLLog.log.error("Error adding mixin configuration for {}", mixinConfig, t); + } } } + } catch (ClassNotFoundException | ClassCastException | InstantiationException | IllegalAccessException e) { + FMLLog.log.error("Unable to load the ILateMixinLoader", e); } } diff --git a/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java b/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java index 00d416b5d..15d952fed 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java @@ -43,6 +43,8 @@ import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; import org.spongepowered.asm.util.Constants; +import zone.rong.mixinbooter.IEarlyMixinLoader; +import zone.rong.mixinbooter.IMixinConfigHijacker; import java.io.*; import java.net.MalformedURLException; @@ -621,6 +623,7 @@ else if (deobfuscatedEnvironment && location == null) // This is probably a mod FMLPluginWrapper wrap = new FMLPluginWrapper(coreModName, plugin, location, sortIndex, dependencies); loadPlugins.add(wrap); FMLLog.log.debug("Enqueued coremod {}", coreModName); + MixinBooterPlugin.loadEarlyMixinLoader(plugin); return wrap; } catch (ClassNotFoundException cnfe) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java index 06040159e..502e47feb 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java @@ -1,24 +1,30 @@ package net.minecraftforge.fml.relauncher; -import net.minecraft.launchwrapper.Launch; import net.minecraftforge.common.ForgeVersion; import net.minecraftforge.fml.common.FMLLog; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.launch.GlobalProperties; import org.spongepowered.asm.mixin.Mixins; +import zone.rong.mixinbooter.Context; import zone.rong.mixinbooter.IEarlyMixinLoader; +import zone.rong.mixinbooter.IMixinConfigHijacker; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.List; +import java.util.Collection; +import java.util.HashSet; +import java.util.HashMap; +import java.util.Set; import java.util.Map; +@SuppressWarnings("deprecation") @IFMLLoadingPlugin.Name("MixinBooter") @IFMLLoadingPlugin.MCVersion(ForgeVersion.mcVersion) @IFMLLoadingPlugin.SortingIndex(1) public final class MixinBooterPlugin implements IFMLLoadingPlugin { + static final Set earlyMixinLoaders = new HashSet<>(); + static final Map configHijackers = new HashMap<>(); + public MixinBooterPlugin() { + GlobalProperties.put(GlobalProperties.Keys.CLEANROOM_DISABLE_MIXIN_CONFIGS, new HashSet<>()); } @Override @@ -38,36 +44,44 @@ public String getSetupClass() { @Override public void injectData(Map data) { - Object coremodList = data.get("coremodList"); - if (coremodList instanceof List) { - Field fmlPluginWrapper$coreModInstance = null; - for (Object coremod : (List) coremodList) { - try { - if (fmlPluginWrapper$coreModInstance == null) { - fmlPluginWrapper$coreModInstance = coremod.getClass().getField("coreModInstance"); - fmlPluginWrapper$coreModInstance.setAccessible(true); - } - Object theMod = fmlPluginWrapper$coreModInstance.get(coremod); - if (theMod instanceof IEarlyMixinLoader loader) { - FMLLog.log.info("Grabbing {} for its mixins.", loader.getClass()); - for (String mixinConfig : loader.getMixinConfigs()) { - if (loader.shouldMixinConfigQueue(mixinConfig)) { - FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); - Mixins.addConfiguration(mixinConfig); - loader.onMixinConfigQueued(mixinConfig);; - } - } + loadEarlyLoaders(earlyMixinLoaders); + } + + @Override + public String getAccessTransformerClass() { + return null; + } + + static void loadEarlyMixinLoader(IFMLLoadingPlugin plugin) { + if (plugin instanceof IEarlyMixinLoader earlyMixinLoader) earlyMixinLoaders.add(earlyMixinLoader); + if (plugin instanceof IMixinConfigHijacker hijacker) { + for (String hijacked : hijacker.getHijackedMixinConfigs()) { + configHijackers.put(hijacked, hijacker); + } + } + } + + private void loadEarlyLoaders(Collection queuedLoaders) { + for (IEarlyMixinLoader queuedLoader : queuedLoaders) { + FMLLog.log.info("Loading early loader {} for its mixins.", queuedLoader.getClass().getName()); + for (String mixinConfig : queuedLoader.getMixinConfigs()) { + Context context = new Context(mixinConfig); + if (queuedLoader.shouldMixinConfigQueue(context)) { + IMixinConfigHijacker hijacker = getHijacker(mixinConfig); + if (hijacker != null) { + FMLLog.log.info("Mixin configuration {} intercepted by {}.", mixinConfig, hijacker.getClass().getName()); + } else { + FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); + Mixins.addConfiguration(mixinConfig); + queuedLoader.onMixinConfigQueued(context); } - } catch (Throwable t) { - FMLLog.log.error("Unexpected error handling early mixins", t); } } } } - @Override - public String getAccessTransformerClass() { - return null; + public static IMixinConfigHijacker getHijacker(String configName) { + return configHijackers.get(configName); } diff --git a/src/main/java/zone/rong/mixinbooter/Context.java b/src/main/java/zone/rong/mixinbooter/Context.java new file mode 100644 index 000000000..777050a07 --- /dev/null +++ b/src/main/java/zone/rong/mixinbooter/Context.java @@ -0,0 +1,78 @@ +package zone.rong.mixinbooter; + +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.relauncher.FMLLaunchHandler; + +import java.util.Collection; + +/** + * This class contains loading context for callers + * + * + * @since 10.0 + * @deprecated We forked Mixin. + *
New approach: + * Check Fugue.
+ * Summary:
+ * If you are coremod, just call {@link org.spongepowered.asm.mixin.Mixins#addConfigurations(String...)} in loadingPluging or Tweaker, and handle shouldApply in IMixinConfigPlugin
+ * If you aren't coremod:
+ * Group mixins by phase, add target env in config, use @env(MOD) for mod mixins.
+ * Add {"MixinConfigs": "modid.mod.mixin.json,modid.default.mixin.json"} to your jar manifest.
+ * Handle shouldApply in IMixinConfigPlugin. You can call {@link net.minecraftforge.fml.common.Loader#isModLoaded(String)} for {@link org.spongepowered.asm.mixin.MixinEnvironment.Phase#MOD} mixin.
+ * Recommend to group target mod name by package name. You can also get config instance from {@link org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin#injectConfig(org.spongepowered.asm.mixin.transformer.Config)}. + */ +@Deprecated +public final class Context { + + public enum ModLoader { + FORGE, + CLEANROOM; + } + + private final String mixinConfig; + + public Context(String mixinConfig, Collection presentMods) { + this(mixinConfig); // TODO : better presentMods scan? + } + + public Context(String mixinConfig) { + this.mixinConfig = mixinConfig; + } + + /** + * @return the current mod loader + */ + public ModLoader modLoader() { + return ModLoader.CLEANROOM; + } + + /** + * @return if the current environment is in-dev + */ + public boolean inDev() { + return FMLLaunchHandler.isDeobfuscatedEnvironment(); + } + + /** + * @return name of the mixin config that is currently being processed + */ + public String mixinConfig() { + return mixinConfig; + } + + /** + *

For early contexts, the list of mods are gathered from culling the classloader + * for any jars that has the mcmod.info file. The mod IDs are obtained from the mcmod.info file. + * This means mostly, if not only coremods are queryable here, + * make sure to test a normal mod's existence in your mixin plugin or in the mixin itself.

+ * + *

For late contexts, it comes from {@link net.minecraftforge.fml.common.Loader#getActiveModList} + * akin to {@link net.minecraftforge.fml.common.Loader#isModLoaded(String)}

+ * @param modId to check against the list of present mods in the context + * @return whether the mod is present + */ + public boolean isModPresent(String modId) { + return Loader.isModLoaded(modId); + } + +} \ No newline at end of file diff --git a/src/main/java/zone/rong/mixinbooter/IEarlyMixinLoader.java b/src/main/java/zone/rong/mixinbooter/IEarlyMixinLoader.java index 25f0502fc..34f49259b 100644 --- a/src/main/java/zone/rong/mixinbooter/IEarlyMixinLoader.java +++ b/src/main/java/zone/rong/mixinbooter/IEarlyMixinLoader.java @@ -1,10 +1,6 @@ package zone.rong.mixinbooter; import java.util.List; -import org.spongepowered.asm.mixin.MixinEnvironment.Phase; -import net.minecraftforge.fml.common.Loader; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.transformer.Config; /** * @deprecated We forked Mixin. @@ -15,8 +11,8 @@ * If you aren't coremod:
* Group mixins by phase, add target env in config, use @env(MOD) for mod mixins.
* Add {"MixinConfigs": "modid.mod.mixin.json,modid.default.mixin.json"} to your jar manifest.
- * Handle shouldApply in IMixinConfigPlugin. You can call {@link Loader#isModLoaded(String)} for {@link Phase#MOD} mixin.
- * Recommend to group target mod name by package name. You can also get config instance from {@link IMixinConfigPlugin#injectConfig(Config)}. + * Handle shouldApply in IMixinConfigPlugin. You can call {@link net.minecraftforge.fml.common.Loader#isModLoaded(String)} for {@link org.spongepowered.asm.mixin.MixinEnvironment.Phase#MOD} mixin.
+ * Recommend to group target mod name by package name. You can also get config instance from {@link org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin#injectConfig(org.spongepowered.asm.mixin.transformer.Config)}. */ @Deprecated public interface IEarlyMixinLoader { @@ -26,6 +22,17 @@ public interface IEarlyMixinLoader { */ List getMixinConfigs(); + /** + * Runs when a mixin config is successfully queued and sent to Mixin library. + * + * @since 10.0 + * @param context current context of the loading process. + * @return true if the mixinConfig should be queued, false if it should not. + */ + default boolean shouldMixinConfigQueue(Context context) { + return this.shouldMixinConfigQueue(context.mixinConfig()); + } + /** * Runs when a mixin config is successfully queued and sent to Mixin library. * @@ -36,10 +43,18 @@ default boolean shouldMixinConfigQueue(String mixinConfig) { return true; } + /** + * Runs when a mixin config is successfully queued and sent to Mixin library. + * @since 10.0 + * @param context current context of the loading process. + */ + default void onMixinConfigQueued(Context context) { + this.onMixinConfigQueued(context.mixinConfig()); + } + /** * Runs when a mixin config is successfully queued and sent to Mixin library. * @param mixinConfig mixin config name, queried via {@link IEarlyMixinLoader#getMixinConfigs()}. */ default void onMixinConfigQueued(String mixinConfig) { } - } diff --git a/src/main/java/zone/rong/mixinbooter/ILateMixinLoader.java b/src/main/java/zone/rong/mixinbooter/ILateMixinLoader.java index a2f30b437..f774b2499 100644 --- a/src/main/java/zone/rong/mixinbooter/ILateMixinLoader.java +++ b/src/main/java/zone/rong/mixinbooter/ILateMixinLoader.java @@ -1,10 +1,5 @@ package zone.rong.mixinbooter; -import net.minecraftforge.fml.common.Loader; -import org.spongepowered.asm.mixin.MixinEnvironment; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.transformer.Config; - import java.util.List; /** @@ -12,12 +7,12 @@ *
New approach: * Check Fugue.
* Summary:
- * If you are coremod, just call {@link org.spongepowered.asm.mixin.Mixins#addConfigurations(String...)} in loadingPluging or Tweaker, and handle shouldApply in IMixinConfigPlugin
+ * If you are coremod, just call {@link org.spongepowered.asm.mixin.Mixins#addConfigurations(String...)} in loadingPlugin or Tweaker, and handle shouldApply in IMixinConfigPlugin
* If you aren't coremod:
* Group mixins by phase, add target env in config, use @env(MOD) for mod mixins.
* Add {"MixinConfigs": "modid.mod.mixin.json,modid.default.mixin.json"} to your jar manifest.
- * Handle shouldApply in IMixinConfigPlugin. You can call {@link Loader#isModLoaded(String)} for {@link MixinEnvironment.Phase#MOD} mixin.
- * Recommend to group target mod name by package name. You can also get config instance from {@link IMixinConfigPlugin#injectConfig(Config)}. + * Handle shouldApply in IMixinConfigPlugin. You can call {@link net.minecraftforge.fml.common.Loader#isModLoaded(String)} for {@link org.spongepowered.asm.mixin.MixinEnvironment.Phase#MOD} mixin.
+ * Recommend to group target mod name by package name. You can also get config instance from {@link org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin#injectConfig(org.spongepowered.asm.mixin.transformer.Config)}. */ @Deprecated public interface ILateMixinLoader { @@ -30,7 +25,18 @@ public interface ILateMixinLoader { /** * Runs when a mixin config is successfully queued and sent to Mixin library. * - * @param mixinConfig mixin config name, queried via {@link ILateMixinLoader#getMixinConfigs()}. + * @since 10.0 + * @param context current context of the loading process. + * @return true if the mixinConfig should be queued, false if it should not. + */ + default boolean shouldMixinConfigQueue(Context context) { + return this.shouldMixinConfigQueue(context.mixinConfig()); + } + + /** + * Runs when a mixin config is successfully queued and sent to Mixin library. + * + * @param mixinConfig mixin config name, queried via {@link IEarlyMixinLoader#getMixinConfigs()}. * @return true if the mixinConfig should be queued, false if it should not. */ default boolean shouldMixinConfigQueue(String mixinConfig) { @@ -39,7 +45,16 @@ default boolean shouldMixinConfigQueue(String mixinConfig) { /** * Runs when a mixin config is successfully queued and sent to Mixin library. - * @param mixinConfig mixin config name, queried via {@link ILateMixinLoader#getMixinConfigs()}. + * @since 10.0 + * @param context current context of the loading process. + */ + default void onMixinConfigQueued(Context context) { + this.onMixinConfigQueued(context.mixinConfig()); + } + + /** + * Runs when a mixin config is successfully queued and sent to Mixin library. + * @param mixinConfig mixin config name, queried via {@link IEarlyMixinLoader#getMixinConfigs()}. */ default void onMixinConfigQueued(String mixinConfig) { } diff --git a/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java b/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java new file mode 100644 index 000000000..b2ccc0d96 --- /dev/null +++ b/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java @@ -0,0 +1,30 @@ +package zone.rong.mixinbooter; + +import org.spongepowered.asm.mixin.transformer.Config; + +import java.util.Set; + +/** + * Hijackers are used to stop certain mixin configurations from ever being applied. + * Usage is similar to {@link IEarlyMixinLoader}, implement it in your coremod class. + * Requested by: @Desoroxxx + * + * @since 9.0 + * @deprecated We forked Mixin. + *
New approach: + * Check Fugue.
+ * Summary:
+ * If you are coremod, just call {@link org.spongepowered.asm.mixin.Mixins#addConfigurations(String...)} in loadingPlugin or Tweaker, and handle shouldApply in IMixinConfigPlugin
+ * If you aren't coremod:
+ * Group mixins by phase, add target env in config, use @env(MOD) for mod mixins.
+ * Add {"MixinConfigs": "modid.mod.mixin.json,modid.default.mixin.json"} to your jar manifest.
+ * Handle shouldApply in IMixinConfigPlugin. You can call {@link net.minecraftforge.fml.common.Loader#isModLoaded(String)} for {@link org.spongepowered.asm.mixin.MixinEnvironment.Phase#MOD} mixin.
+ * Recommend to group target mod name by package name. You can also get config instance from {@link org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin#injectConfig(Config)}. + */ + +@Deprecated +public interface IMixinConfigHijacker { + + Set getHijackedMixinConfigs(); + +} \ No newline at end of file From 91f2fd424fd0f94dec5de5a433737bdffba94818 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Wed, 1 Jan 2025 13:13:12 +0800 Subject: [PATCH 02/11] check if the loader loaded better solutions? --- src/main/java/zone/rong/mixinbooter/Context.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/zone/rong/mixinbooter/Context.java b/src/main/java/zone/rong/mixinbooter/Context.java index 777050a07..cd3670762 100644 --- a/src/main/java/zone/rong/mixinbooter/Context.java +++ b/src/main/java/zone/rong/mixinbooter/Context.java @@ -1,5 +1,6 @@ package zone.rong.mixinbooter; +import net.minecraft.launchwrapper.Launch; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.relauncher.FMLLaunchHandler; @@ -72,7 +73,7 @@ public String mixinConfig() { * @return whether the mod is present */ public boolean isModPresent(String modId) { - return Loader.isModLoaded(modId); + return Launch.classLoader.isClassLoaded("net.minecraftforge.fml.common.Loader") && Loader.isModLoaded(modId); } } \ No newline at end of file From 4c295de77b8e830c545ea56eb5b567da030e0309 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Fri, 10 Jan 2025 23:51:40 +0800 Subject: [PATCH 03/11] updates --- .../common/ForgeEarlyConfig.java | 2 +- .../fml/common/LoadController.java | 38 +++++++++++++------ .../fml/common/MixinContainer.java | 4 +- .../fml/common/launcher/FMLTweaker.java | 5 +++ .../fml/relauncher/MixinBooterPlugin.java | 32 +++++++--------- .../mixinbooter/IMixinConfigHijacker.java | 21 ++++++++-- 6 files changed, 64 insertions(+), 38 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java b/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java index cc8733557..8c3b8f7da 100644 --- a/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java +++ b/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java @@ -56,7 +56,7 @@ public class ForgeEarlyConfig { public static String COCOA_FRAME_NAME = "minecraft"; public static String CONFIG_ANY_TIME_VERSION = "3.0"; - public static String MIXIN_BOOTER_VERSION = "10.2"; + public static String MIXIN_BOOTER_VERSION = "10.3"; @Config.Comment(""" Mods in this list have one or more of the problems list below: diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index 47530fd0f..1b756a78a 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -38,15 +38,16 @@ import net.minecraftforge.fml.relauncher.libraries.LibraryManager; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.message.FormattedMessage; + import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Mixins; +import org.spongepowered.asm.mixin.ModUtil; import org.spongepowered.asm.mixin.transformer.Proxy; import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; import org.spongepowered.asm.util.Constants; import zone.rong.mixinbooter.Context; import zone.rong.mixinbooter.ILateMixinLoader; -import zone.rong.mixinbooter.IMixinConfigHijacker; import javax.annotation.Nullable; import java.io.File; @@ -167,6 +168,7 @@ public void distributeStateMessage(LoaderState state, Object... eventData) FMLContextQuery.init(); // Initialize FMLContextQuery and add it to the global list + // Load late mixins FMLLog.log.info("Instantiating all ILateMixinLoader implemented classes..."); for (ASMDataTable.ASMData asmData : asmDataTable.getAll(ILateMixinLoader.class.getName().replace('.', '/'))) { try { @@ -180,15 +182,9 @@ public void distributeStateMessage(LoaderState state, Object... eventData) Context context = new Context(mixinConfig); if (loader.shouldMixinConfigQueue(context)) { try { - @SuppressWarnings("deprecation") - IMixinConfigHijacker hijacker = MixinBooterPlugin.getHijacker(mixinConfig); - if (hijacker != null) { - FMLLog.log.info("Mixin configuration {} intercepted by {}.", mixinConfig, hijacker.getClass().getName()); - } else { - FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); - Mixins.addConfiguration(mixinConfig); - loader.onMixinConfigQueued(context); - } + FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); + Mixins.addConfiguration(mixinConfig); + loader.onMixinConfigQueued(context); } catch (Throwable t) { FMLLog.log.error("Error adding mixin configuration for {}", mixinConfig, t); } @@ -199,6 +195,19 @@ public void distributeStateMessage(LoaderState state, Object... eventData) } } + // mark config owners : for earlys, lates, and mfAttributes. + for (Config config : Mixins.getConfigs()) { + if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { + List owners = getPackageOwners(); + if (owners.isEmpty()) { + config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); + } else { + final String owner = owner.getFirst().getModId(); // TODO : better assign ? + config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); + } + } + } + for (ModContainer container : this.loader.getActiveModList()) { modClassLoader.addFile(container.getSource()); } @@ -436,8 +445,7 @@ private ModContainer findActiveContainerFromStack() return StackWalker.getInstance() .walk(frames -> frames.map(StackWalker.StackFrame::getClassName) .filter(name -> name.lastIndexOf('.') != -1) - .map(name -> name.substring(0, name.lastIndexOf('.'))) - .map(pkg -> packageOwners.get(pkg)) + .map(name -> packageOwners.get(name.substring(0, name.lastIndexOf('.')))) .filter(l -> !l.isEmpty()) .findFirst() .map(List::getFirst) @@ -445,6 +453,12 @@ private ModContainer findActiveContainerFromStack() ); } + @Nullable + public List getPackageOwners(String pkg) + { + return packageOwners.get(pkg); + } + LoaderState getState() { return state; diff --git a/src/main/java/net/minecraftforge/fml/common/MixinContainer.java b/src/main/java/net/minecraftforge/fml/common/MixinContainer.java index ef45d8707..764924a1a 100644 --- a/src/main/java/net/minecraftforge/fml/common/MixinContainer.java +++ b/src/main/java/net/minecraftforge/fml/common/MixinContainer.java @@ -19,13 +19,11 @@ public MixinContainer() { @Override public boolean registerBus(EventBus bus, LoadController controller) { - bus.register(this); return true; } @Override - public File getSource() - { + public File getSource() { return FMLSanityChecker.fmlLocation; } } diff --git a/src/main/java/net/minecraftforge/fml/common/launcher/FMLTweaker.java b/src/main/java/net/minecraftforge/fml/common/launcher/FMLTweaker.java index 9e896f730..e530a1852 100644 --- a/src/main/java/net/minecraftforge/fml/common/launcher/FMLTweaker.java +++ b/src/main/java/net/minecraftforge/fml/common/launcher/FMLTweaker.java @@ -27,6 +27,8 @@ import net.minecraft.launchwrapper.LaunchClassLoader; import net.minecraftforge.fml.relauncher.FMLLaunchHandler; import org.apache.logging.log4j.LogManager; + +import org.spongepowered.asm.launch.GlobalProperties; import org.spongepowered.asm.launch.MixinBootstrap; import java.io.File; @@ -35,6 +37,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -55,6 +58,8 @@ public FMLTweaker() MixinBootstrap.init(); LogManager.getLogger("FML.TWEAK").info("Initializing MixinExtras..."); MixinExtrasBootstrap.init(); + + GlobalProperties.put(GlobalProperties.Keys.CLEANROOM_DISABLE_MIXIN_CONFIGS, new HashSet<>()); } @SuppressWarnings("unchecked") @Override diff --git a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java index 502e47feb..13de5cedf 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java @@ -2,7 +2,7 @@ import net.minecraftforge.common.ForgeVersion; import net.minecraftforge.fml.common.FMLLog; -import org.spongepowered.asm.launch.GlobalProperties; + import org.spongepowered.asm.mixin.Mixins; import zone.rong.mixinbooter.Context; import zone.rong.mixinbooter.IEarlyMixinLoader; @@ -20,11 +20,9 @@ @IFMLLoadingPlugin.SortingIndex(1) public final class MixinBooterPlugin implements IFMLLoadingPlugin { - static final Set earlyMixinLoaders = new HashSet<>(); - static final Map configHijackers = new HashMap<>(); + static Set earlyMixinLoaders = new HashSet<>(); public MixinBooterPlugin() { - GlobalProperties.put(GlobalProperties.Keys.CLEANROOM_DISABLE_MIXIN_CONFIGS, new HashSet<>()); } @Override @@ -45,6 +43,7 @@ public String getSetupClass() { @Override public void injectData(Map data) { loadEarlyLoaders(earlyMixinLoaders); + earlyMixinLoaders = null; } @Override @@ -52,11 +51,15 @@ public String getAccessTransformerClass() { return null; } - static void loadEarlyMixinLoader(IFMLLoadingPlugin plugin) { + static void queneEarlyMixinLoader(IFMLLoadingPlugin plugin) { if (plugin instanceof IEarlyMixinLoader earlyMixinLoader) earlyMixinLoaders.add(earlyMixinLoader); if (plugin instanceof IMixinConfigHijacker hijacker) { - for (String hijacked : hijacker.getHijackedMixinConfigs()) { - configHijackers.put(hijacked, hijacker); + Collection disabledConfigs = GlobalProperties.get(GlobalProperties.Keys.CLEANROOM_DISABLE_MIXIN_CONFIGS); + Context context = new Context(null); + FMLLog.log.info("Loading config hijacker {}.", interceptor.getClass().getName()); + for (String hijacked : interceptor.getHijackedMixinConfigs(context)) { + disabledConfigs.add(hijacked); + FMLLog.log.info("{} will hijack the mixin config {}", interceptor.getClass().getName(), hijacked); } } } @@ -67,23 +70,14 @@ private void loadEarlyLoaders(Collection queuedLoaders) { for (String mixinConfig : queuedLoader.getMixinConfigs()) { Context context = new Context(mixinConfig); if (queuedLoader.shouldMixinConfigQueue(context)) { - IMixinConfigHijacker hijacker = getHijacker(mixinConfig); - if (hijacker != null) { - FMLLog.log.info("Mixin configuration {} intercepted by {}.", mixinConfig, hijacker.getClass().getName()); - } else { - FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); - Mixins.addConfiguration(mixinConfig); - queuedLoader.onMixinConfigQueued(context); - } + FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); + Mixins.addConfiguration(mixinConfig); + queuedLoader.onMixinConfigQueued(context); } } } } - public static IMixinConfigHijacker getHijacker(String configName) { - return configHijackers.get(configName); - } - } diff --git a/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java b/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java index b2ccc0d96..2b9293323 100644 --- a/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java +++ b/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java @@ -1,7 +1,5 @@ package zone.rong.mixinbooter; -import org.spongepowered.asm.mixin.transformer.Config; - import java.util.Set; /** @@ -19,12 +17,29 @@ * Group mixins by phase, add target env in config, use @env(MOD) for mod mixins.
* Add {"MixinConfigs": "modid.mod.mixin.json,modid.default.mixin.json"} to your jar manifest.
* Handle shouldApply in IMixinConfigPlugin. You can call {@link net.minecraftforge.fml.common.Loader#isModLoaded(String)} for {@link org.spongepowered.asm.mixin.MixinEnvironment.Phase#MOD} mixin.
- * Recommend to group target mod name by package name. You can also get config instance from {@link org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin#injectConfig(Config)}. + * Recommend to group target mod name by package name. You can also get config instance from {@link org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin#injectConfig(org.spongepowered.asm.mixin.transformer.Config)}. + * + * If you what to block a mixin config, {@code GlobalProperties.get(GlobalProperties.Keys.CLEANROOM_DISABLE_MIXIN_CONFIGS)#add(String)} */ @Deprecated public interface IMixinConfigHijacker { + /** + * Return a set of mixin config names to not be loaded by the mixin environment. + * + * @since 9.0 + */ Set getHijackedMixinConfigs(); + /** + * Return a set of mixin config names to not be loaded by the mixin environment. + * + * @since 10.3 + * @param context current context of the loading process. Mixin config will be null as it is not applicable. + */ + default Set getHijackedMixinConfigs(Context context) { + return getHijackedMixinConfigs(); + } + } \ No newline at end of file From fb49be254b8cc134163909a8e450480ca106bd1e Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Mon, 3 Feb 2025 21:34:28 +0800 Subject: [PATCH 04/11] merge https://github.com/CleanroomMC/MixinBooter/commit/d8139daf741d4a98410d7e3e30e3cd68377563f9, --- .../common/asm/transformers/EventSubscriptionTransformer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/minecraftforge/fml/common/asm/transformers/EventSubscriptionTransformer.java b/src/main/java/net/minecraftforge/fml/common/asm/transformers/EventSubscriptionTransformer.java index 5e342214a..41b777c6c 100644 --- a/src/main/java/net/minecraftforge/fml/common/asm/transformers/EventSubscriptionTransformer.java +++ b/src/main/java/net/minecraftforge/fml/common/asm/transformers/EventSubscriptionTransformer.java @@ -64,6 +64,7 @@ public class EventSubscriptionTransformer implements IClassTransformer { public EventSubscriptionTransformer() { + new Event(); // make sure the base event class loaded and initialized. } @Override From cc5f2a73dcd32580768a5cee7e4327a4dde60d7a Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:02:48 +0800 Subject: [PATCH 05/11] updates --- .../fml/common/LoadController.java | 26 ++++---- .../fml/relauncher/CoreModManager.java | 2 +- .../fml/relauncher/MixinBooterPlugin.java | 64 ++++++++++++++++++- .../java/zone/rong/mixinbooter/Context.java | 12 ++-- 4 files changed, 83 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index 1b756a78a..fd30c2efd 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -41,7 +41,6 @@ import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Mixins; -import org.spongepowered.asm.mixin.ModUtil; import org.spongepowered.asm.mixin.transformer.Proxy; import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; @@ -195,18 +194,19 @@ public void distributeStateMessage(LoaderState state, Object... eventData) } } - // mark config owners : for earlys, lates, and mfAttributes. - for (Config config : Mixins.getConfigs()) { - if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { - List owners = getPackageOwners(); - if (owners.isEmpty()) { - config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); - } else { - final String owner = owner.getFirst().getModId(); // TODO : better assign ? - config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); - } - } - } + // // org.spongepowered.asm.mixin.ModUtil + // // mark config owners : for earlys, lates, and mfAttributes. + // for (Config config : Mixins.getConfigs()) { + // if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { + // List owners = getPackageOwners(); + // if (owners.isEmpty()) { + // config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); + // } else { + // final String owner = owner.getFirst().getModId(); // TODO : better assign ? + // config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); + // } + // } + // } for (ModContainer container : this.loader.getActiveModList()) { modClassLoader.addFile(container.getSource()); diff --git a/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java b/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java index 15d952fed..a1c99ed24 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java @@ -623,7 +623,7 @@ else if (deobfuscatedEnvironment && location == null) // This is probably a mod FMLPluginWrapper wrap = new FMLPluginWrapper(coreModName, plugin, location, sortIndex, dependencies); loadPlugins.add(wrap); FMLLog.log.debug("Enqueued coremod {}", coreModName); - MixinBooterPlugin.loadEarlyMixinLoader(plugin); + MixinBooterPlugin.queneEarlyMixinLoader(plugin); return wrap; } catch (ClassNotFoundException cnfe) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java index 13de5cedf..66e6bb4c3 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java @@ -1,18 +1,26 @@ package net.minecraftforge.fml.relauncher; +import net.minecraft.launchwrapper.Launch; import net.minecraftforge.common.ForgeVersion; import net.minecraftforge.fml.common.FMLLog; +import com.google.gson.*; + import org.spongepowered.asm.mixin.Mixins; import zone.rong.mixinbooter.Context; import zone.rong.mixinbooter.IEarlyMixinLoader; import zone.rong.mixinbooter.IMixinConfigHijacker; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.HashMap; import java.util.Set; import java.util.Map; +import java.util.Enumeration; +import java.io.InputStreamReader; +import java.net.URL; + @SuppressWarnings("deprecation") @IFMLLoadingPlugin.Name("MixinBooter") @@ -64,11 +72,12 @@ static void queneEarlyMixinLoader(IFMLLoadingPlugin plugin) { } } - private void loadEarlyLoaders(Collection queuedLoaders) { + private static void loadEarlyLoaders(Collection queuedLoaders) { + Set modlist = speculatedModList(); for (IEarlyMixinLoader queuedLoader : queuedLoaders) { FMLLog.log.info("Loading early loader {} for its mixins.", queuedLoader.getClass().getName()); for (String mixinConfig : queuedLoader.getMixinConfigs()) { - Context context = new Context(mixinConfig); + Context context = new Context(mixinConfig, modlist); if (queuedLoader.shouldMixinConfigQueue(context)) { FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); Mixins.addConfiguration(mixinConfig); @@ -78,6 +87,57 @@ private void loadEarlyLoaders(Collection queuedLoaders) { } } + public static Set speculatedModList() { + HashSet presentMods = new HashSet<>(); + + // buildIn mods : + presentMods.add("minecraft"); + presentMods.add("fml"); + presentMods.add("forge"); + presentMods.add("mixinbooter"); + presentMods.add("configanytime"); + + // mcmod.info + try { + Enumeration resources = Launch.classLoader.getResources("mcmod.info"); + while (resources.hasMoreElements()) { + presentMods.addAll(parseMcmodInfo(resources.nextElement())); + } + } catch (Exception e) { + throw new RuntimeException("Failed to gather present mods from mcmod.info (s)", e); + } + + // optifine : + if (Launch.classLoader.isClassExist("optifine.OptiFineTweaker")) { + presentMods.add("optifine"); + } + + } + + private static Set parseMcmodInfo(URL url) { + try { + HashSet ids = new HashSet<>(); + JsonElement root = JsonParser.parseReader(new InputStreamReader(url.openStream())); + if (root.isJsonArray()) { + for (JsonElement element : root.getAsJsonArray()) { + if (element.isJsonObject()) { + ids.add(element.getAsJsonObject().get("modid").getAsString()); + } + } + } else { + for (JsonElement element : root.getAsJsonObject().get("modList").getAsJsonArray()) { + if (element.isJsonObject()) { + ids.add(element.getAsJsonObject().get("modid").getAsString()); + } + } + } + return ids; + } catch (Throwable t) { + FMLLog.log.error("Failed to parse mcmod.info for " + url, t); + } + return Collections.emptySet(); + } + } diff --git a/src/main/java/zone/rong/mixinbooter/Context.java b/src/main/java/zone/rong/mixinbooter/Context.java index cd3670762..d1a9fa716 100644 --- a/src/main/java/zone/rong/mixinbooter/Context.java +++ b/src/main/java/zone/rong/mixinbooter/Context.java @@ -31,13 +31,15 @@ public enum ModLoader { } private final String mixinConfig; + private final Collection presentMods; - public Context(String mixinConfig, Collection presentMods) { - this(mixinConfig); // TODO : better presentMods scan? + public Context(String mixinConfigIn, Collection presentModsIn) { + this.mixinConfig = mixinConfigIn; + this.presentMods = presentModsIn; } - public Context(String mixinConfig) { - this.mixinConfig = mixinConfig; + public Context(String mixinConfigIn) { + this(mixinConfigIn, null); } /** @@ -73,7 +75,7 @@ public String mixinConfig() { * @return whether the mod is present */ public boolean isModPresent(String modId) { - return Launch.classLoader.isClassLoaded("net.minecraftforge.fml.common.Loader") && Loader.isModLoaded(modId); + return presentMods == null ? Loader.isModLoaded(modId) : presentMods.contains(modId); } } \ No newline at end of file From 04efd65c4ac5b7cee7834b948a8d369b9a84fb8c Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Wed, 5 Feb 2025 22:41:26 +0800 Subject: [PATCH 06/11] fixs --- .../minecraftforge/fml/relauncher/MixinBooterPlugin.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java index 66e6bb4c3..c40debfdc 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java @@ -7,6 +7,7 @@ import com.google.gson.*; import org.spongepowered.asm.mixin.Mixins; +import org.spongepowered.asm.launch.GlobalProperties; import zone.rong.mixinbooter.Context; import zone.rong.mixinbooter.IEarlyMixinLoader; import zone.rong.mixinbooter.IMixinConfigHijacker; @@ -64,10 +65,10 @@ static void queneEarlyMixinLoader(IFMLLoadingPlugin plugin) { if (plugin instanceof IMixinConfigHijacker hijacker) { Collection disabledConfigs = GlobalProperties.get(GlobalProperties.Keys.CLEANROOM_DISABLE_MIXIN_CONFIGS); Context context = new Context(null); - FMLLog.log.info("Loading config hijacker {}.", interceptor.getClass().getName()); - for (String hijacked : interceptor.getHijackedMixinConfigs(context)) { + FMLLog.log.info("Loading config hijacker {}.", hijacker.getClass().getName()); + for (String hijacked : hijacker.getHijackedMixinConfigs(context)) { disabledConfigs.add(hijacked); - FMLLog.log.info("{} will hijack the mixin config {}", interceptor.getClass().getName(), hijacked); + FMLLog.log.info("{} will hijack the mixin config {}", hijacker.getClass().getName(), hijacked); } } } From bc541318e335f619a60649b1a6604e4833c7e0b9 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Wed, 5 Feb 2025 23:25:03 +0800 Subject: [PATCH 07/11] fix --- .../net/minecraftforge/fml/relauncher/MixinBooterPlugin.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java index c40debfdc..bb01d556e 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java @@ -113,6 +113,8 @@ public static Set speculatedModList() { presentMods.add("optifine"); } + return presentMods; + } private static Set parseMcmodInfo(URL url) { From 41e687e4ef4d17facb7f7a59db22c8df7dd8f1c7 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Fri, 14 Feb 2025 22:35:33 +0800 Subject: [PATCH 08/11] fix --- .../fml/common/LoadController.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index fd30c2efd..1b756a78a 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -41,6 +41,7 @@ import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Mixins; +import org.spongepowered.asm.mixin.ModUtil; import org.spongepowered.asm.mixin.transformer.Proxy; import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; @@ -194,19 +195,18 @@ public void distributeStateMessage(LoaderState state, Object... eventData) } } - // // org.spongepowered.asm.mixin.ModUtil - // // mark config owners : for earlys, lates, and mfAttributes. - // for (Config config : Mixins.getConfigs()) { - // if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { - // List owners = getPackageOwners(); - // if (owners.isEmpty()) { - // config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); - // } else { - // final String owner = owner.getFirst().getModId(); // TODO : better assign ? - // config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); - // } - // } - // } + // mark config owners : for earlys, lates, and mfAttributes. + for (Config config : Mixins.getConfigs()) { + if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { + List owners = getPackageOwners(); + if (owners.isEmpty()) { + config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); + } else { + final String owner = owner.getFirst().getModId(); // TODO : better assign ? + config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); + } + } + } for (ModContainer container : this.loader.getActiveModList()) { modClassLoader.addFile(container.getSource()); From 2e591e1d8aca4c12389d7c8bddeef35770f5950a Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Fri, 14 Feb 2025 23:32:36 +0800 Subject: [PATCH 09/11] fixs --- .../java/net/minecraftforge/fml/common/LoadController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index 1b756a78a..2fd5bab01 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -55,6 +55,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; +import java.util.function.Supplier; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.stream.Collectors; @@ -198,11 +199,13 @@ public void distributeStateMessage(LoaderState state, Object... eventData) // mark config owners : for earlys, lates, and mfAttributes. for (Config config : Mixins.getConfigs()) { if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { - List owners = getPackageOwners(); + String pkg = config.getConfig().getMixinPackage(); + pkg = pkg.charAt(pkg.length() - 1) == '.' ? pkg.substring(0, pkg.length() - 1) : pkg; + List owners = getPackageOwners(pkg); if (owners.isEmpty()) { config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); } else { - final String owner = owner.getFirst().getModId(); // TODO : better assign ? + final String owner = owner.getFirst().getModId(); // better assign ? config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); } } From b0ae5016a9287341cb29e95821c68155833d03ef Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Sat, 15 Feb 2025 06:52:09 +0800 Subject: [PATCH 10/11] fixs --- .../java/net/minecraftforge/fml/common/LoadController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index 2fd5bab01..69af43c46 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -42,6 +42,7 @@ import org.spongepowered.asm.mixin.MixinEnvironment; import org.spongepowered.asm.mixin.Mixins; import org.spongepowered.asm.mixin.ModUtil; +import org.spongepowered.asm.mixin.transformer.Config; import org.spongepowered.asm.mixin.transformer.Proxy; import org.spongepowered.asm.service.MixinService; import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; @@ -205,7 +206,7 @@ public void distributeStateMessage(LoaderState state, Object... eventData) if (owners.isEmpty()) { config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); } else { - final String owner = owner.getFirst().getModId(); // better assign ? + final String owner = owner.get(0).getModId(); // better assign ? config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); } } From 1a53c868646b1523d00ac66fc8350b9245951f62 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Sat, 15 Feb 2025 07:02:26 +0800 Subject: [PATCH 11/11] fix --- src/main/java/net/minecraftforge/fml/common/LoadController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/common/LoadController.java b/src/main/java/net/minecraftforge/fml/common/LoadController.java index 69af43c46..f77f8f594 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -206,7 +206,7 @@ public void distributeStateMessage(LoaderState state, Object... eventData) if (owners.isEmpty()) { config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> ModUtil.UNKNOWN_OWNER); } else { - final String owner = owner.get(0).getModId(); // better assign ? + final String owner = owners.get(0).getModId(); // better assign ? config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); } }