Hack modlauncher a little to load
This commit is contained in:
parent
7ed1b5d245
commit
754e668bbd
|
@ -5,6 +5,11 @@ import io.izzel.arclight.api.Unsafe;
|
||||||
import io.izzel.arclight.boot.AbstractBootstrap;
|
import io.izzel.arclight.boot.AbstractBootstrap;
|
||||||
import io.izzel.arclight.i18n.ArclightConfig;
|
import io.izzel.arclight.i18n.ArclightConfig;
|
||||||
import io.izzel.arclight.i18n.ArclightLocale;
|
import io.izzel.arclight.i18n.ArclightLocale;
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
import org.objectweb.asm.ClassVisitor;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
@ -36,6 +41,7 @@ public class ApplicationBootstrap extends AbstractBootstrap implements Consumer<
|
||||||
try {
|
try {
|
||||||
this.setupMod();
|
this.setupMod();
|
||||||
this.dirtyHacks();
|
this.dirtyHacks();
|
||||||
|
this.hackModlauncher();
|
||||||
ServiceLoader.load(getClass().getModule().getLayer(), Consumer.class).stream()
|
ServiceLoader.load(getClass().getModule().getLayer(), Consumer.class).stream()
|
||||||
.filter(it -> !it.type().getName().contains("arclight"))
|
.filter(it -> !it.type().getName().contains("arclight"))
|
||||||
.findFirst().orElseThrow().get().accept(args);
|
.findFirst().orElseThrow().get().accept(args);
|
||||||
|
@ -44,4 +50,31 @@ public class ApplicationBootstrap extends AbstractBootstrap implements Consumer<
|
||||||
System.err.println("Fail to launch Arclight.");
|
System.err.println("Fail to launch Arclight.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void hackModlauncher() throws Exception {
|
||||||
|
try (var in = getClass().getClassLoader().getResourceAsStream("cpw/mods/modlauncher/TransformerClassWriter$SuperCollectingVisitor.class")) {
|
||||||
|
var cw = new ClassWriter(0);
|
||||||
|
var cr = new ClassReader(in);
|
||||||
|
cr.accept(new ClassVisitor(Opcodes.ASM9, cw) {
|
||||||
|
@Override
|
||||||
|
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
|
||||||
|
var mv = super.visitMethod(access, name, descriptor, signature, exceptions);
|
||||||
|
if (name.equals("<init>")) {
|
||||||
|
return new MethodVisitor(Opcodes.ASM9, mv) {
|
||||||
|
@Override
|
||||||
|
public void visitLdcInsn(Object value) {
|
||||||
|
if (value.equals(Opcodes.ASM7)) {
|
||||||
|
super.visitLdcInsn(Opcodes.ASM9);
|
||||||
|
} else {
|
||||||
|
super.visitLdcInsn(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else return mv;
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
var bytes = cw.toByteArray();
|
||||||
|
Unsafe.defineClass(cr.getClassName(), bytes, 0, bytes.length, getClass().getClassLoader(), getClass().getProtectionDomain());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user