diff --git a/build.gradle b/build.gradle index 2b50a7d2..230df19d 100644 --- a/build.gradle +++ b/build.gradle @@ -147,8 +147,6 @@ dependencies { runtimeOnly fg.deobf("curse.maven:spark-361579:3767277") 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. diff --git a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index d22b496e..34e9c672 100644 --- a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -1,7 +1,10 @@ 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.Logger; +import org.embeddedt.modernfix.classloading.ModernFixResourceFinder; import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig; import org.embeddedt.modernfix.core.config.Option; 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 java.io.File; -import java.util.List; -import java.util.Set; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.util.*; +import java.util.function.Function; public class ModernFixMixinPlugin implements IMixinConfigPlugin { 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"); 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> resourceFinder = constructResourceFinder(); + resourceFinderField.set(loader, resourceFinder); + } catch(ReflectiveOperationException e) { + e.printStackTrace(); + } + } + + private Function> 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 serviceLookup = (Map)serviceLookupField.get(servicesHandler); + Method getClassLoaderMethod = TransformationServiceDecorator.class.getDeclaredMethod("getClassLoader"); + getClassLoaderMethod.setAccessible(true); + Function> resourceEnumeratorLocator = ModernFixResourceFinder::findAllURLsForResource; + for(TransformationServiceDecorator decorator : serviceLookup.values()) { + Function> func = (Function>)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 public void onLoad(String mixinPackage) { try { diff --git a/src/main/java/org/embeddedt/modernfix/service/ModernFixLaunchService.java b/src/main/java/org/embeddedt/modernfix/service/ModernFixLaunchService.java deleted file mode 100644 index a4b4682a..00000000 --- a/src/main/java/org/embeddedt/modernfix/service/ModernFixLaunchService.java +++ /dev/null @@ -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> resourceFinder = constructResourceFinder(); - resourceFinderField.set(loader, resourceFinder); - } catch(ReflectiveOperationException e) { - e.printStackTrace(); - } - } - - private Function> 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 serviceLookup = (Map)serviceLookupField.get(servicesHandler); - Method getClassLoaderMethod = TransformationServiceDecorator.class.getDeclaredMethod("getClassLoader"); - getClassLoaderMethod.setAccessible(true); - Function> resourceEnumeratorLocator = ModernFixResourceFinder::findAllURLsForResource; - for(TransformationServiceDecorator decorator : serviceLookup.values()) { - Function> func = (Function>)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 NEVER = EnumSet.noneOf(Phase.class); - - @Override - public EnumSet handlesClass(Type classType, boolean isEmpty) { - return NEVER; - } -} diff --git a/src/main/resources/META-INF/services/cpw.mods.modlauncher.serviceapi.ILaunchPluginService b/src/main/resources/META-INF/services/cpw.mods.modlauncher.serviceapi.ILaunchPluginService deleted file mode 100644 index 30ea21e5..00000000 --- a/src/main/resources/META-INF/services/cpw.mods.modlauncher.serviceapi.ILaunchPluginService +++ /dev/null @@ -1 +0,0 @@ -org.embeddedt.modernfix.service.ModernFixLaunchService