Wtf why this is not added
This commit is contained in:
parent
aff457258e
commit
65ed2913f6
|
@ -0,0 +1,76 @@
|
||||||
|
package io.izzel.arclight.common.mod.util.remapper.resource;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import io.izzel.arclight.api.Unsafe;
|
||||||
|
import io.izzel.arclight.common.mod.util.remapper.ArclightRemapper;
|
||||||
|
import io.izzel.arclight.common.mod.util.remapper.GlobalClassRepo;
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.tree.ClassNode;
|
||||||
|
import org.spongepowered.asm.service.MixinService;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.net.URLStreamHandler;
|
||||||
|
import java.util.Hashtable;
|
||||||
|
|
||||||
|
public class RemapSourceHandler extends URLStreamHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected URLConnection openConnection(URL u) throws IOException {
|
||||||
|
return new RemapSourceConnection(new URL(u.getFile()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class RemapSourceConnection extends URLConnection {
|
||||||
|
|
||||||
|
private byte[] array;
|
||||||
|
|
||||||
|
protected RemapSourceConnection(URL url) {
|
||||||
|
super(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void connect() throws IOException {
|
||||||
|
byte[] bytes = ByteStreams.toByteArray(url.openStream());
|
||||||
|
String className = new ClassReader(bytes).getClassName();
|
||||||
|
if (className.startsWith("net/minecraft/")) {
|
||||||
|
try {
|
||||||
|
ClassNode classNode = MixinService.getService().getBytecodeProvider().getClassNode(className);
|
||||||
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
|
||||||
|
classNode.accept(cw);
|
||||||
|
bytes = cw.toByteArray();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.array = ArclightRemapper.getResourceMapper().remapClassFile(bytes, GlobalClassRepo.INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InputStream getInputStream() throws IOException {
|
||||||
|
connect();
|
||||||
|
if (this.array == null) {
|
||||||
|
throw new FileNotFoundException(this.url.getFile());
|
||||||
|
} else {
|
||||||
|
return new ByteArrayInputStream(this.array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static void register() {
|
||||||
|
try {
|
||||||
|
Unsafe.ensureClassInitialized(URL.class);
|
||||||
|
MethodHandle getter = Unsafe.lookup().findStaticGetter(URL.class, "handlers", Hashtable.class);
|
||||||
|
Hashtable<String, URLStreamHandler> handlers = (Hashtable<String, URLStreamHandler>) getter.invokeExact();
|
||||||
|
handlers.put("remap", new RemapSourceHandler());
|
||||||
|
} catch (Throwable e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user