diff --git a/build.gradle b/build.gradle index dc4d5d6..ce57008 100644 --- a/build.gradle +++ b/build.gradle @@ -64,6 +64,7 @@ jar { exclude 'META-INF', 'META-INF/**' } } + exclude "optifine" } reobf { diff --git a/src/main/kotlin/optifine/OptifineTweakerDevWrapper.kt b/src/main/kotlin/optifine/OptifineTweakerDevWrapper.kt new file mode 100644 index 0000000..897f6a9 --- /dev/null +++ b/src/main/kotlin/optifine/OptifineTweakerDevWrapper.kt @@ -0,0 +1,38 @@ +package optifine + +import mods.octarinecore.tryDefault +import net.minecraft.launchwrapper.IClassTransformer +import net.minecraft.launchwrapper.ITweaker +import net.minecraft.launchwrapper.LaunchClassLoader +import java.io.File +import java.net.URLClassLoader +import java.util.zip.ZipFile + +class OptifineTweakerDevWrapper : ITweaker { + override fun acceptOptions(p0: MutableList?, p1: File?, p2: File?, p3: String?) { } + override fun getLaunchArguments(): Array? = Array(0) {""} + override fun getLaunchTarget() = "net.minecraft.client.main.Main" + override fun injectIntoClassLoader(classLoader: LaunchClassLoader) { + classLoader.registerTransformer("optifine.OptifineTransformerDevWrapper") + } +} + +/** + * Replacement for OptiFine's class transformer. Implements the pre-1.8.x-H5 way of operation. + * + * This class is only used in development to debug cross-mod issues with Optifine, and + * is not part of the release! + */ +class OptifineTransformerDevWrapper : IClassTransformer { + + val ofZip = (this.javaClass.classLoader as? URLClassLoader)?.urLs?.find { + val zipFile = tryDefault(null) { ZipFile(File(it.toURI())) } + zipFile?.getEntry("optifine/OptiFineClassTransformer.class") != null + }?.let { ZipFile(File(it.toURI())) } + + /** + * Load replacement classes from the OptiFine Jar. + */ + override fun transform(name: String?, transformedName: String?, classData: ByteArray?) = + ofZip?.getEntry(name?.replace(".", "/") + ".class")?.let { ofZip.getInputStream(it).readBytes() } ?: classData +}