70 lines
2.5 KiB
Java
70 lines
2.5 KiB
Java
package io.gitlab.jfronny.libjf.unsafe;
|
|
|
|
import io.gitlab.jfronny.commons.unsafe.Unsafe;
|
|
import io.gitlab.jfronny.libjf.LibJf;
|
|
import io.gitlab.jfronny.libjf.unsafe.asm.*;
|
|
import org.objectweb.asm.tree.ClassNode;
|
|
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
|
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
|
import org.spongepowered.asm.mixin.transformer.IMixinTransformer;
|
|
|
|
import java.lang.reflect.Field;
|
|
import java.util.*;
|
|
|
|
public class MixinPlugin implements IMixinConfigPlugin {
|
|
@Override
|
|
public void onLoad(String mixinPackage) {
|
|
try {
|
|
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
|
Class<?> classLoaderClass = classLoader.getClass();
|
|
|
|
Field delegateField = classLoaderClass.getDeclaredField("delegate");
|
|
delegateField.setAccessible(true);
|
|
Object delegate = delegateField.get(classLoader);
|
|
Class<?> delegateClass = delegate.getClass();
|
|
|
|
Field mixinTransformerField = delegateClass.getDeclaredField("mixinTransformer");
|
|
mixinTransformerField.setAccessible(true);
|
|
|
|
AsmTransformer.INSTANCE = Unsafe.allocateInstance(AsmTransformer.class);
|
|
AsmTransformer.INSTANCE.delegate = (IMixinTransformer) mixinTransformerField.get(delegate);
|
|
AsmTransformer.INSTANCE.asmConfigs = new HashSet<>();
|
|
DynamicEntry.execute("libjf:asm", AsmConfig.class, s -> {
|
|
LibJf.LOGGER.info("Discovered LibJF asm plugin in " + s.modId());
|
|
AsmTransformer.INSTANCE.asmConfigs.add(new BakedAsmConfig(s.instance(), s.modId()));
|
|
});
|
|
AsmTransformer.INSTANCE.init();
|
|
mixinTransformerField.set(delegate, AsmTransformer.INSTANCE);
|
|
} catch (Throwable e) {
|
|
LibJf.LOGGER.error("Could not initialize LibJF ASM", e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getRefMapperConfig() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
|
|
}
|
|
|
|
@Override
|
|
public List<String> getMixins() {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
|
|
}
|
|
|
|
@Override
|
|
public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {
|
|
}
|
|
}
|