diff --git a/platform/neoforge/build.gradle.kts b/platform/neoforge/build.gradle.kts index 5636adc5..a50aeb7e 100644 --- a/platform/neoforge/build.gradle.kts +++ b/platform/neoforge/build.gradle.kts @@ -4,11 +4,12 @@ plugins { } repositories { - maven("https://maven.neoforged.net/") + maven("https://maven.neoforged.net/releases/") } dependencies { compileOnly("net.neoforged.fancymodloader:language-java:1.0.2") + compileOnly("net.neoforged.fancymodloader:loader:1.0.2") } java { @@ -22,7 +23,7 @@ java { jarsNamed("jar", "slimJar") { manifest.attributes( "MixinConfigs" to "mixinextras.init.mixins.json", - "FMLModType" to "GAMELIBRARY", + "FMLModType" to "LIBRARY", "Automatic-Module-Name" to "mixinextras.neoforge", ) -} \ No newline at end of file +} diff --git a/platform/neoforge/src/main/java/com/llamalad7/mixinextras/platform/neoforge/MixinExtrasConfigPlugin.java b/platform/neoforge/src/main/java/com/llamalad7/mixinextras/platform/neoforge/MixinExtrasConfigPlugin.java index c6591438..51a9b441 100644 --- a/platform/neoforge/src/main/java/com/llamalad7/mixinextras/platform/neoforge/MixinExtrasConfigPlugin.java +++ b/platform/neoforge/src/main/java/com/llamalad7/mixinextras/platform/neoforge/MixinExtrasConfigPlugin.java @@ -1,6 +1,9 @@ package com.llamalad7.mixinextras.platform.neoforge; import com.llamalad7.mixinextras.MixinExtrasBootstrap; +import com.llamalad7.mixinextras.utils.ResourceUtils; +import cpw.mods.modlauncher.Launcher; +import cpw.mods.modlauncher.api.IModuleLayerManager; import org.objectweb.asm.tree.ClassNode; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -11,8 +14,26 @@ public class MixinExtrasConfigPlugin implements IMixinConfigPlugin { @Override public void onLoad(String mixinPackage) { + try { + Class.forName("cpw.mods.modlauncher.Launcher"); + MixinExtrasBootstrap.init(new ModLauncherConfigsFinder()); + return; + } catch (ClassNotFoundException ignored) {} MixinExtrasBootstrap.init(); } + + private static class ModLauncherConfigsFinder implements ResourceUtils.ConfigsFinder { + @Override + public ClassLoader getClassLoader() { + return Launcher.INSTANCE.findLayerManager() + // Get the game layer + .flatMap(layerManager -> layerManager.getLayer(IModuleLayerManager.Layer.GAME)) + // Get "minecraft" module or "neoforge" module off the game layer + .flatMap(layer -> layer.findModule("minecraft").or(() -> layer.findModule("neoforge"))) + .map(Module::getClassLoader) + .orElseThrow(() -> new IllegalStateException("Cannot find a ClassLoader for the game layer!")); + } + } @Override public String getRefMapperConfig() { diff --git a/src/main/java/com/llamalad7/mixinextras/MixinExtrasBootstrap.java b/src/main/java/com/llamalad7/mixinextras/MixinExtrasBootstrap.java index ce2c0afc..635ca419 100644 --- a/src/main/java/com/llamalad7/mixinextras/MixinExtrasBootstrap.java +++ b/src/main/java/com/llamalad7/mixinextras/MixinExtrasBootstrap.java @@ -2,6 +2,7 @@ import com.llamalad7.mixinextras.service.MixinExtrasService; import com.llamalad7.mixinextras.service.MixinExtrasVersion; +import com.llamalad7.mixinextras.utils.ResourceUtils; @SuppressWarnings("unused") public class MixinExtrasBootstrap { @@ -13,10 +14,14 @@ public static String getVersion() { } public static void init() { + init(ResourceUtils.ConfigsFinder.defaultConfigsFinder()); + } + + public static void init(ResourceUtils.ConfigsFinder configsFinder) { if (initialized) { return; } initialized = true; - MixinExtrasService.setup(); + MixinExtrasService.setup(configsFinder); } } diff --git a/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasService.java b/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasService.java index ac20e188..391c2860 100644 --- a/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasService.java +++ b/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasService.java @@ -2,6 +2,7 @@ import com.llamalad7.mixinextras.utils.Blackboard; import com.llamalad7.mixinextras.utils.ProxyUtils; +import com.llamalad7.mixinextras.utils.ResourceUtils; import org.spongepowered.asm.mixin.injection.InjectionPoint; import org.spongepowered.asm.mixin.injection.struct.InjectionInfo; import org.spongepowered.asm.mixin.transformer.ext.IExtension; @@ -25,15 +26,15 @@ public interface MixinExtrasService { void initialize(); - static void setup() { + static void setup(ResourceUtils.ConfigsFinder configsFinder) { Object latestImpl = Blackboard.get("MixinExtrasServiceInstance"); if (latestImpl == null) { - MixinExtrasService newImpl = new MixinExtrasServiceImpl(); + MixinExtrasService newImpl = new MixinExtrasServiceImpl(configsFinder); Blackboard.put("MixinExtrasServiceInstance", newImpl); newImpl.takeControlFrom(null); return; } - MixinExtrasService ourImpl = new MixinExtrasServiceImpl(); + MixinExtrasService ourImpl = new MixinExtrasServiceImpl(configsFinder); if (ourImpl.shouldReplace(latestImpl)) { getFrom(latestImpl).concedeTo(ourImpl, true); Blackboard.put("MixinExtrasServiceInstance", ourImpl); diff --git a/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasServiceImpl.java b/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasServiceImpl.java index f05f9c31..0848761f 100644 --- a/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasServiceImpl.java +++ b/src/main/java/com/llamalad7/mixinextras/service/MixinExtrasServiceImpl.java @@ -12,6 +12,7 @@ import com.llamalad7.mixinextras.transformer.MixinTransformerExtension; import com.llamalad7.mixinextras.utils.MixinExtrasLogger; import com.llamalad7.mixinextras.utils.MixinInternals; +import com.llamalad7.mixinextras.utils.ResourceUtils; import com.llamalad7.mixinextras.wrapper.factory.FactoryRedirectWrapperInjectionInfo; import org.apache.commons.lang3.StringUtils; import org.objectweb.asm.Type; @@ -55,9 +56,14 @@ public class MixinExtrasServiceImpl implements MixinExtrasService { ExpressionInjectorWrapperInjectionInfo.class ); private final List registeredInjectors = new ArrayList<>(); + private final ResourceUtils.ConfigsFinder mixinConfigsFinder; boolean initialized; + public MixinExtrasServiceImpl(ResourceUtils.ConfigsFinder mixinConfigsFinder) { + this.mixinConfigsFinder = mixinConfigsFinder; + } + @Override public int getVersion() { return MixinExtrasVersion.LATEST.getNumber(); @@ -250,4 +256,8 @@ private MixinExtrasVersion getBetaVersion(String packageName) { return MixinExtrasVersion.V0_2_0_BETA_1; } } + + public ResourceUtils.ConfigsFinder getMixinConfigsFinder() { + return mixinConfigsFinder; + } } diff --git a/src/main/java/com/llamalad7/mixinextras/utils/ResourceUtils.java b/src/main/java/com/llamalad7/mixinextras/utils/ResourceUtils.java index ddc9b417..474f519c 100644 --- a/src/main/java/com/llamalad7/mixinextras/utils/ResourceUtils.java +++ b/src/main/java/com/llamalad7/mixinextras/utils/ResourceUtils.java @@ -1,11 +1,12 @@ package com.llamalad7.mixinextras.utils; +import com.llamalad7.mixinextras.service.MixinExtrasService; import org.spongepowered.asm.service.MixinService; import java.io.InputStream; -class ResourceUtils { - public static InputStream getResourceAsStream(String name) { +public class ResourceUtils { + static InputStream getResourceAsStream(String name) { InputStream result = MixinService.getService().getResourceAsStream(name); if (result != null) { // Happy fast path @@ -14,7 +15,7 @@ public static InputStream getResourceAsStream(String name) { // MixinServiceModLauncher is very poorly designed and relies heavily on the current TCCL // This might not be what we expect if we're running e.g. on a common worker thread ClassLoader oldTccl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(ResourceUtils.class.getClassLoader()); + Thread.currentThread().setContextClassLoader(MixinExtrasService.getInstance().getMixinConfigsFinder().getClassLoader()); try { // See if we get a result with the transforming classloader @@ -23,4 +24,12 @@ public static InputStream getResourceAsStream(String name) { Thread.currentThread().setContextClassLoader(oldTccl); } } + + public interface ConfigsFinder { + ClassLoader getClassLoader(); + + static ConfigsFinder defaultConfigsFinder() { + return ResourceUtils.class::getClassLoader; + } + } }