From ba492db1dc2c1e50b36a39ae7c044a3474b46705 Mon Sep 17 00:00:00 2001 From: Hileb <107909747+Ecdcaeb@users.noreply.github.com> Date: Sat, 15 Feb 2025 07:53:03 +0800 Subject: [PATCH] Update MixinBooter (#275) * update mixinbooter update mixinbooter * check if the loader loaded better solutions? * updates * merge https://github.com/CleanroomMC/MixinBooter/commit/d8139daf741d4a98410d7e3e30e3cd68377563f9, * updates * fixs * fix * fix * fixs * fixs * fix --- .../common/ForgeEarlyConfig.java | 2 +- .../fml/common/LoadController.java | 61 ++++++-- .../fml/common/MixinContainer.java | 4 +- .../EventSubscriptionTransformer.java | 1 + .../fml/common/launcher/FMLTweaker.java | 5 + .../fml/relauncher/CoreModManager.java | 3 + .../fml/relauncher/MixinBooterPlugin.java | 131 ++++++++++++++---- .../java/zone/rong/mixinbooter/Context.java | 81 +++++++++++ .../rong/mixinbooter/IEarlyMixinLoader.java | 29 +++- .../rong/mixinbooter/ILateMixinLoader.java | 35 +++-- .../mixinbooter/IMixinConfigHijacker.java | 45 ++++++ 11 files changed, 332 insertions(+), 65 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/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 62255c7e2..f77f8f594 100644 --- a/src/main/java/net/minecraftforge/fml/common/LoadController.java +++ b/src/main/java/net/minecraftforge/fml/common/LoadController.java @@ -38,12 +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.Config; 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 javax.annotation.Nullable; @@ -52,6 +56,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; @@ -165,22 +170,45 @@ 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('.', '/'))) { - 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 { + 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); + } + } + + // mark config owners : for earlys, lates, and mfAttributes. + for (Config config : Mixins.getConfigs()) { + if (!config.getConfig().hasDecoration(ModUtil.OWNER_DECORATOR)) { + 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 = owners.get(0).getModId(); // better assign ? + config.getConfig().decorate(ModUtil.OWNER_DECORATOR, (Supplier) () -> owner); + } } } @@ -421,8 +449,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) @@ -430,6 +457,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/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 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/CoreModManager.java b/src/main/java/net/minecraftforge/fml/relauncher/CoreModManager.java index 00d416b5d..a1c99ed24 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.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 06040159e..bb01d556e 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/MixinBooterPlugin.java @@ -3,21 +3,34 @@ 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 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; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.List; +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") @IFMLLoadingPlugin.MCVersion(ForgeVersion.mcVersion) @IFMLLoadingPlugin.SortingIndex(1) public final class MixinBooterPlugin implements IFMLLoadingPlugin { + static Set earlyMixinLoaders = new HashSet<>(); + public MixinBooterPlugin() { } @@ -38,31 +51,8 @@ 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);; - } - } - } - } catch (Throwable t) { - FMLLog.log.error("Unexpected error handling early mixins", t); - } - } - } + loadEarlyLoaders(earlyMixinLoaders); + earlyMixinLoaders = null; } @Override @@ -70,6 +60,87 @@ public String getAccessTransformerClass() { return null; } + static void queneEarlyMixinLoader(IFMLLoadingPlugin plugin) { + if (plugin instanceof IEarlyMixinLoader earlyMixinLoader) earlyMixinLoaders.add(earlyMixinLoader); + 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 {}.", hijacker.getClass().getName()); + for (String hijacked : hijacker.getHijackedMixinConfigs(context)) { + disabledConfigs.add(hijacked); + FMLLog.log.info("{} will hijack the mixin config {}", hijacker.getClass().getName(), hijacked); + } + } + } + + 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, modlist); + if (queuedLoader.shouldMixinConfigQueue(context)) { + FMLLog.log.info("Adding {} mixin configuration.", mixinConfig); + Mixins.addConfiguration(mixinConfig); + queuedLoader.onMixinConfigQueued(context); + } + } + } + } + + 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"); + } + + return presentMods; + + } + + 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 new file mode 100644 index 000000000..d1a9fa716 --- /dev/null +++ b/src/main/java/zone/rong/mixinbooter/Context.java @@ -0,0 +1,81 @@ +package zone.rong.mixinbooter; + +import net.minecraft.launchwrapper.Launch; +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; + private final Collection presentMods; + + public Context(String mixinConfigIn, Collection presentModsIn) { + this.mixinConfig = mixinConfigIn; + this.presentMods = presentModsIn; + } + + public Context(String mixinConfigIn) { + this(mixinConfigIn, null); + } + + /** + * @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 presentMods == null ? Loader.isModLoaded(modId) : presentMods.contains(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..2b9293323 --- /dev/null +++ b/src/main/java/zone/rong/mixinbooter/IMixinConfigHijacker.java @@ -0,0 +1,45 @@ +package zone.rong.mixinbooter; + +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(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