Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions platform/neoforge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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",
)
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -55,9 +56,14 @@ public class MixinExtrasServiceImpl implements MixinExtrasService {
ExpressionInjectorWrapperInjectionInfo.class
);
private final List<String> 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();
Expand Down Expand Up @@ -250,4 +256,8 @@ private MixinExtrasVersion getBetaVersion(String packageName) {
return MixinExtrasVersion.V0_2_0_BETA_1;
}
}

public ResourceUtils.ConfigsFinder getMixinConfigsFinder() {
return mixinConfigsFinder;
}
}
15 changes: 12 additions & 3 deletions src/main/java/com/llamalad7/mixinextras/utils/ResourceUtils.java
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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;
}
}
}