Switch to not using service
This commit is contained in:
parent
c01ea4fcc4
commit
b806438bf9
|
|
@ -147,8 +147,6 @@ dependencies {
|
||||||
runtimeOnly fg.deobf("curse.maven:spark-361579:3767277")
|
runtimeOnly fg.deobf("curse.maven:spark-361579:3767277")
|
||||||
|
|
||||||
compileOnly fg.deobf("curse.maven:refinedstorage-243076:3807951")
|
compileOnly fg.deobf("curse.maven:refinedstorage-243076:3807951")
|
||||||
|
|
||||||
implementation group: 'net.bytebuddy', name: 'byte-buddy', version: '1.12.22'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Example for how to get properties into the manifest for reading at runtime.
|
// Example for how to get properties into the manifest for reading at runtime.
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package org.embeddedt.modernfix.core;
|
package org.embeddedt.modernfix.core;
|
||||||
|
|
||||||
|
import cpw.mods.modlauncher.*;
|
||||||
|
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.embeddedt.modernfix.classloading.ModernFixResourceFinder;
|
||||||
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
|
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
|
||||||
import org.embeddedt.modernfix.core.config.Option;
|
import org.embeddedt.modernfix.core.config.Option;
|
||||||
import org.objectweb.asm.tree.ClassNode;
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
|
|
@ -9,8 +12,11 @@ import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
||||||
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.lang.reflect.Field;
|
||||||
import java.util.Set;
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class ModernFixMixinPlugin implements IMixinConfigPlugin {
|
public class ModernFixMixinPlugin implements IMixinConfigPlugin {
|
||||||
private static final String MIXIN_PACKAGE_ROOT = "org.embeddedt.modernfix.mixin.";
|
private static final String MIXIN_PACKAGE_ROOT = "org.embeddedt.modernfix.mixin.";
|
||||||
|
|
@ -18,6 +24,54 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin {
|
||||||
private final Logger logger = LogManager.getLogger("ModernFix");
|
private final Logger logger = LogManager.getLogger("ModernFix");
|
||||||
public static ModernFixEarlyConfig config = null;
|
public static ModernFixEarlyConfig config = null;
|
||||||
|
|
||||||
|
private static final boolean USE_TRANSFORMER_CACHE = false;
|
||||||
|
|
||||||
|
public ModernFixMixinPlugin() {
|
||||||
|
/* We abuse the constructor of a mixin plugin as a safe location to start modifying the classloader */
|
||||||
|
/* Swap the transformer for ours */
|
||||||
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
|
if(!(loader instanceof TransformingClassLoader)) {
|
||||||
|
throw new IllegalStateException("Expected a TransformingClassLoader");
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if(USE_TRANSFORMER_CACHE) {
|
||||||
|
Field classTransformerField = TransformingClassLoader.class.getDeclaredField("classTransformer");
|
||||||
|
classTransformerField.setAccessible(true);
|
||||||
|
ClassTransformer t = (ClassTransformer)classTransformerField.get(loader);
|
||||||
|
TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers");
|
||||||
|
LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler");
|
||||||
|
TransformerAuditTrail trail = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "auditTrail");
|
||||||
|
classTransformerField.set(loader, new ModernFixCachingClassTransformer(store, pluginHandler, (TransformingClassLoader)loader, trail));
|
||||||
|
}
|
||||||
|
Field resourceFinderField = TransformingClassLoader.class.getDeclaredField("resourceFinder");
|
||||||
|
/* Construct a new list of resource finders, using similar logic to ML */
|
||||||
|
resourceFinderField.setAccessible(true);
|
||||||
|
Function<String, Enumeration<URL>> resourceFinder = constructResourceFinder();
|
||||||
|
resourceFinderField.set(loader, resourceFinder);
|
||||||
|
} catch(ReflectiveOperationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Function<String, Enumeration<URL>> constructResourceFinder() throws ReflectiveOperationException {
|
||||||
|
Field servicesHandlerField = Launcher.class.getDeclaredField("transformationServicesHandler");
|
||||||
|
servicesHandlerField.setAccessible(true);
|
||||||
|
Object servicesHandler = servicesHandlerField.get(Launcher.INSTANCE);
|
||||||
|
Field serviceLookupField = servicesHandler.getClass().getDeclaredField("serviceLookup");
|
||||||
|
serviceLookupField.setAccessible(true);
|
||||||
|
Map<String, TransformationServiceDecorator> serviceLookup = (Map<String, TransformationServiceDecorator>)serviceLookupField.get(servicesHandler);
|
||||||
|
Method getClassLoaderMethod = TransformationServiceDecorator.class.getDeclaredMethod("getClassLoader");
|
||||||
|
getClassLoaderMethod.setAccessible(true);
|
||||||
|
Function<String, Enumeration<URL>> resourceEnumeratorLocator = ModernFixResourceFinder::findAllURLsForResource;
|
||||||
|
for(TransformationServiceDecorator decorator : serviceLookup.values()) {
|
||||||
|
Function<String, Optional<URL>> func = (Function<String, Optional<URL>>)getClassLoaderMethod.invoke(decorator);
|
||||||
|
if(func != null)
|
||||||
|
resourceEnumeratorLocator = EnumerationHelper.mergeFunctors(resourceEnumeratorLocator, EnumerationHelper.fromOptional(func));
|
||||||
|
}
|
||||||
|
System.out.println(EnumerationHelper.firstElementOrNull(resourceEnumeratorLocator.apply("net.minecraft.client.Minecraft")));
|
||||||
|
return resourceEnumeratorLocator;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad(String mixinPackage) {
|
public void onLoad(String mixinPackage) {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
package org.embeddedt.modernfix.service;
|
|
||||||
|
|
||||||
import com.electronwill.nightconfig.toml.TomlFormat;
|
|
||||||
import cpw.mods.modlauncher.*;
|
|
||||||
import cpw.mods.modlauncher.api.IEnvironment;
|
|
||||||
import cpw.mods.modlauncher.api.TypesafeMap;
|
|
||||||
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
|
|
||||||
import net.bytebuddy.ByteBuddy;
|
|
||||||
import net.bytebuddy.implementation.MethodDelegation;
|
|
||||||
import net.bytebuddy.matcher.ElementMatchers;
|
|
||||||
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
|
||||||
import net.minecraftforge.fml.config.ConfigFileTypeHandler;
|
|
||||||
import org.embeddedt.modernfix.classloading.ModernFixResourceFinder;
|
|
||||||
import org.embeddedt.modernfix.core.config.ModernFixConfig;
|
|
||||||
import org.objectweb.asm.Type;
|
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLClassLoader;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
public class ModernFixLaunchService implements ILaunchPluginService {
|
|
||||||
|
|
||||||
private static final boolean USE_TRANSFORMER_CACHE = false;
|
|
||||||
@Override
|
|
||||||
public String name() {
|
|
||||||
return "modernfix";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initializeLaunch(ITransformerLoader transformerLoader, Path[] specialPaths) {
|
|
||||||
/* Swap the transformer for ours */
|
|
||||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
|
||||||
if(!(loader instanceof TransformingClassLoader)) {
|
|
||||||
throw new IllegalStateException("Expected a TransformingClassLoader");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if(USE_TRANSFORMER_CACHE) {
|
|
||||||
Field classTransformerField = TransformingClassLoader.class.getDeclaredField("classTransformer");
|
|
||||||
classTransformerField.setAccessible(true);
|
|
||||||
ClassTransformer t = (ClassTransformer)classTransformerField.get(loader);
|
|
||||||
TransformStore store = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "transformers");
|
|
||||||
LaunchPluginHandler pluginHandler = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "pluginHandler");
|
|
||||||
TransformerAuditTrail trail = ObfuscationReflectionHelper.getPrivateValue(ClassTransformer.class, t, "auditTrail");
|
|
||||||
classTransformerField.set(loader, new ModernFixCachingClassTransformer(store, pluginHandler, (TransformingClassLoader)loader, trail));
|
|
||||||
}
|
|
||||||
Field resourceFinderField = TransformingClassLoader.class.getDeclaredField("resourceFinder");
|
|
||||||
/* Construct a new list of resource finders, using similar logic to ML */
|
|
||||||
resourceFinderField.setAccessible(true);
|
|
||||||
Function<String, Enumeration<URL>> resourceFinder = constructResourceFinder();
|
|
||||||
resourceFinderField.set(loader, resourceFinder);
|
|
||||||
} catch(ReflectiveOperationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Function<String, Enumeration<URL>> constructResourceFinder() throws ReflectiveOperationException {
|
|
||||||
Field servicesHandlerField = Launcher.class.getDeclaredField("transformationServicesHandler");
|
|
||||||
servicesHandlerField.setAccessible(true);
|
|
||||||
Object servicesHandler = servicesHandlerField.get(Launcher.INSTANCE);
|
|
||||||
Field serviceLookupField = servicesHandler.getClass().getDeclaredField("serviceLookup");
|
|
||||||
serviceLookupField.setAccessible(true);
|
|
||||||
Map<String, TransformationServiceDecorator> serviceLookup = (Map<String, TransformationServiceDecorator>)serviceLookupField.get(servicesHandler);
|
|
||||||
Method getClassLoaderMethod = TransformationServiceDecorator.class.getDeclaredMethod("getClassLoader");
|
|
||||||
getClassLoaderMethod.setAccessible(true);
|
|
||||||
Function<String, Enumeration<URL>> resourceEnumeratorLocator = ModernFixResourceFinder::findAllURLsForResource;
|
|
||||||
for(TransformationServiceDecorator decorator : serviceLookup.values()) {
|
|
||||||
Function<String, Optional<URL>> func = (Function<String, Optional<URL>>)getClassLoaderMethod.invoke(decorator);
|
|
||||||
if(func != null)
|
|
||||||
resourceEnumeratorLocator = EnumerationHelper.mergeFunctors(resourceEnumeratorLocator, EnumerationHelper.fromOptional(func));
|
|
||||||
}
|
|
||||||
System.out.println(EnumerationHelper.firstElementOrNull(resourceEnumeratorLocator.apply("net.minecraft.client.Minecraft")));
|
|
||||||
return resourceEnumeratorLocator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final EnumSet<Phase> NEVER = EnumSet.noneOf(Phase.class);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumSet<Phase> handlesClass(Type classType, boolean isEmpty) {
|
|
||||||
return NEVER;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
org.embeddedt.modernfix.service.ModernFixLaunchService
|
|
||||||
Loading…
Reference in New Issue
Block a user