mirror of
https://github.com/xfl03/MCCustomSkinLoader.git
synced 2026-11-11 23:07:31 +00:00
71 lines
3.4 KiB
Java
71 lines
3.4 KiB
Java
package customskinloader.forge.loader;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import customskinloader.forge.TransformerManager;
|
|
import customskinloader.forge.transformer.FakeInterfacesTransformer;
|
|
import customskinloader.forge.transformer.PlayerTabTransformer;
|
|
import customskinloader.forge.transformer.SkinManagerTransformer;
|
|
import customskinloader.forge.transformer.SpectatorMenuTransformer;
|
|
import net.minecraft.launchwrapper.IClassTransformer;
|
|
import org.objectweb.asm.ClassReader;
|
|
import org.objectweb.asm.ClassWriter;
|
|
import org.objectweb.asm.Opcodes;
|
|
import org.objectweb.asm.tree.ClassNode;
|
|
import org.objectweb.asm.tree.MethodNode;
|
|
|
|
//LaunchWrapper for 1.13-
|
|
public class LaunchWrapper implements IClassTransformer {
|
|
private static final TransformerManager.IClassTransformer[] CLASS_TRANSFORMERS = {
|
|
new FakeInterfacesTransformer.MinecraftTransformer(),
|
|
new FakeInterfacesTransformer.ThreadDownloadImageDataTransformer(),
|
|
new FakeInterfacesTransformer.ClientIResourceTransformer(),
|
|
new FakeInterfacesTransformer.ClientIResourceManagerTransformer(),
|
|
new FakeInterfacesTransformer.IResourceTransformer(),
|
|
new FakeInterfacesTransformer.IResourceManagerTransformer()
|
|
};
|
|
private static final TransformerManager.IMethodTransformer[] TRANFORMERS = {
|
|
new SkinManagerTransformer.InitTransformer(),
|
|
new SkinManagerTransformer.LoadSkinTransformer(),
|
|
new SkinManagerTransformer.LoadProfileTexturesTransformer(),
|
|
new SkinManagerTransformer.LoadSkinFromCacheTransformer(),
|
|
new SkinManagerTransformer.Run0Transformer(),
|
|
new SkinManagerTransformer.Run1Transformer(),
|
|
new PlayerTabTransformer.ScoreObjectiveTransformer(),
|
|
new SpectatorMenuTransformer.PlayerMenuObjectTransformer()
|
|
};
|
|
private TransformerManager transformerManager = new TransformerManager(CLASS_TRANSFORMERS, TRANFORMERS);
|
|
|
|
//From: https://github.com/RecursiveG/UniSkinMod/blob/1.9.4/src/main/java/org/devinprogress/uniskinmod/coremod/BaseAsmTransformer.java#L83-L114
|
|
public byte[] transform(String obfClassName, String className, byte[] bytes) {
|
|
if (!transformerManager.classMap.containsKey(className) && !transformerManager.map.containsKey(className)) return bytes;//Check if should be transformed
|
|
|
|
//Parse bytes to ClassNode
|
|
ClassNode cn = new ClassNode();
|
|
if (bytes != null && bytes.length > 0) {
|
|
ClassReader cr = new ClassReader(bytes);
|
|
cr.accept(cn, 0);
|
|
} else {
|
|
cn.name = className.replace(".", "/");
|
|
cn.version = Opcodes.V1_8;
|
|
cn.superName = "java/lang/Object";
|
|
}
|
|
|
|
//Transform ClassNode
|
|
cn = transformerManager.transform(cn, className);
|
|
ArrayList<MethodNode> methods = new ArrayList<>();
|
|
for (MethodNode mn : cn.methods) {
|
|
String mappedMethodName = TransformerManager.isDevelopmentEnvironment ? mn.name : TransformerManager.mapMethodName(cn.name, mn.name, mn.desc);
|
|
String mappedMethodDesc = TransformerManager.isDevelopmentEnvironment ? mn.desc : TransformerManager.mapMethodDesc(mn.desc);
|
|
methods.add(transformerManager.transform(cn, mn, className, mappedMethodName, mappedMethodDesc));
|
|
}
|
|
cn.methods.clear();
|
|
cn.methods.addAll(methods);
|
|
|
|
//Parse Class Node to bytes
|
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
|
|
cn.accept(cw);
|
|
return cw.toByteArray();
|
|
}
|
|
}
|