diff --git a/build.gradle b/build.gradle index a951d59..bfc96f9 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ targetCompatibility = 1.8 group = 'net.fabricmc' archivesBaseName = project.name -version = '0.1.1-SNAPSHOT' +version = '0.2.0-SNAPSHOT' def build = "local" def ENV = System.getenv() @@ -25,10 +25,6 @@ repositories { name = "Fabric" url = 'https://maven.fabricmc.net/' } - maven { - name = "SonaType" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } } dependencies { @@ -45,7 +41,7 @@ dependencies { // implementation ('org.benf:cfr:0.136') implementation ('org.jetbrains:intellij-fernflower:1.0.0.2') - implementation ('net.fabricmc:sponge-mixin:0.7.11.10') { + implementation ('net.fabricmc:sponge-mixin:0.7.11.12:full') { exclude module: 'launchwrapper' exclude module: 'guava' } diff --git a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java index 6b700a4..a44bfcf 100644 --- a/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java +++ b/src/main/java/net/fabricmc/loom/mixin/MixinServiceGradle.java @@ -25,41 +25,109 @@ package net.fabricmc.loom.mixin; import com.google.common.io.ByteStreams; -import org.spongepowered.asm.service.IClassBytecodeProvider; -import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper; +import com.strobel.collections.ImmutableList; +import org.spongepowered.asm.lib.ClassReader; +import org.spongepowered.asm.lib.tree.ClassNode; +import org.spongepowered.asm.mixin.MixinEnvironment; +import org.spongepowered.asm.service.*; +import org.spongepowered.asm.util.ReEntranceLock; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.net.URL; +import java.util.*; import java.util.jar.JarFile; import java.util.zip.ZipEntry; -public class MixinServiceGradle extends MixinServiceLaunchWrapper implements IClassBytecodeProvider { - +public class MixinServiceGradle implements IClassBytecodeProvider, IClassProvider, IMixinService { private static List jars = new ArrayList<>(); + private final ReEntranceLock lock = new ReEntranceLock(1); @Override public String getName() { return "FabricGradle"; } + @Override + public boolean isValid() { + return true; + } + + @Override + public void prepare() { + + } + + @Override + public MixinEnvironment.Phase getInitialPhase() { + return MixinEnvironment.Phase.DEFAULT; + } + + @Override + public void init() { + + } + + @Override + public void beginPhase() { + + } + + @Override + public void checkEnv(Object bootSource) { + + } + + @Override + public ReEntranceLock getReEntranceLock() { + return lock; + } + + @Override + public IClassProvider getClassProvider() { + return this; + } + @Override public InputStream getResourceAsStream(String name) { - for(JarFile file : jars){ + for (JarFile file : jars) { ZipEntry entry = file.getEntry(name); if(entry != null){ try { - InputStream stream = file.getInputStream(entry); - return stream; + return file.getInputStream(entry); } catch (IOException e) { throw new RuntimeException("Failed to read mod file", e); } } } - return super.getResourceAsStream(name); + + return getClass().getClassLoader().getResourceAsStream(name); + } + + @Override + public void registerInvalidClass(String className) { + + } + + @Override + public boolean isClassLoaded(String className) { + return true; + } + + @Override + public String getClassRestrictions(String className) { + return ""; + } + + @Override + public Collection getTransformers() { + return Collections.emptyList(); + } + + @Override + public String getSideName() { + return "UNKNOWN"; } public static void setupModFiles(Set mods, File minecraft) throws IOException { @@ -76,13 +144,48 @@ public class MixinServiceGradle extends MixinServiceLaunchWrapper implements ICl return this; } + @Override + public Collection getPlatformAgents() { + return ImmutableList.of("org.spongepowered.asm.launch.platform.MixinPlatformAgentDefault"); + } + public byte[] getClassBytes(String name, String transformedName) throws IOException { InputStream inputStream = getResourceAsStream(name.replace(".", "/") + ".class"); byte[] classBytes = ByteStreams.toByteArray(inputStream); inputStream.close(); - if(classBytes == null){ - return super.getClassBytes(name, transformedName); - } return classBytes; } + + @Override + public byte[] getClassBytes(String name, boolean runTransformers) throws ClassNotFoundException, IOException { + return getClassBytes(name, name); + } + + @Override + public ClassNode getClassNode(String name) throws ClassNotFoundException, IOException { + ClassReader reader = new ClassReader(getClassBytes(name, name)); + ClassNode node = new ClassNode(); + reader.accept(node, 0); + return node; + } + + @Override + public URL[] getClassPath() { + return new URL[0]; + } + + @Override + public Class findClass(String name) throws ClassNotFoundException { + return Class.forName(name); + } + + @Override + public Class findClass(String name, boolean initialize) throws ClassNotFoundException { + return Class.forName(name, initialize, getClass().getClassLoader()); + } + + @Override + public Class findAgentClass(String name, boolean initialize) throws ClassNotFoundException { + return Class.forName(name, initialize, getClass().getClassLoader()); + } }