forked from MeteorDevelopment/meteor-client
-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathMixinPlugin.java
More file actions
115 lines (92 loc) · 4.06 KB
/
Copy pathMixinPlugin.java
File metadata and controls
115 lines (92 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/
package meteordevelopment.meteorclient;
import meteordevelopment.meteorclient.asm.Asm;
import net.fabricmc.loader.api.FabricLoader;
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.List;
import java.util.Set;
public class MixinPlugin implements IMixinConfigPlugin {
private static final String mixinPackage = "meteordevelopment.meteorclient.mixin";
private static boolean loaded;
private static boolean isOriginsPresent;
private static boolean isIndigoPresent;
public static boolean isSodiumPresent;
private static boolean isLithiumPresent;
public static boolean isIrisPresent;
private static boolean isVFPPresent;
@Override
public void onLoad(String mixinPackage) {
if (loaded) return;
try {
// Get class loader
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class<?> classLoaderClass = classLoader.getClass();
// Get delegate
Field delegateField = classLoaderClass.getDeclaredField("delegate");
delegateField.setAccessible(true);
Object delegate = delegateField.get(classLoader);
Class<?> delegateClass = delegate.getClass();
// Get mixinTransformer field
Field mixinTransformerField = delegateClass.getDeclaredField("mixinTransformer");
mixinTransformerField.setAccessible(true);
// Create Asm
Asm.init();
// Change delegate
Asm.Transformer mixinTransformer = new Asm.Transformer();
mixinTransformer.delegate = (IMixinTransformer) mixinTransformerField.get(delegate);
mixinTransformerField.set(delegate, mixinTransformer);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
isIndigoPresent = FabricLoader.getInstance().isModLoaded("fabric-renderer-indigo");
isOriginsPresent = FabricLoader.getInstance().isModLoaded("origins");
isSodiumPresent = FabricLoader.getInstance().isModLoaded("sodium");
isLithiumPresent = FabricLoader.getInstance().isModLoaded("lithium");
isIrisPresent = FabricLoader.getInstance().isModLoaded("iris");
isVFPPresent = FabricLoader.getInstance().isModLoaded("viafabricplus");
loaded = true;
}
@Override
public String getRefMapperConfig() {
return null;
}
@Override
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
if (!mixinClassName.startsWith(mixinPackage)) {
throw new RuntimeException("Mixin " + mixinClassName + " is not in the mixin package");
}
else if (mixinClassName.endsWith("PlayerEntityRendererMixin")) {
return !isOriginsPresent;
}
else if (mixinClassName.startsWith(mixinPackage + ".sodium")) {
return isSodiumPresent;
}
else if (mixinClassName.startsWith(mixinPackage + ".indigo")) {
return isIndigoPresent;
}
else if (mixinClassName.startsWith(mixinPackage + ".lithium")) {
return isLithiumPresent;
}
else if (mixinClassName.startsWith(mixinPackage + ".viafabricplus")) {
return isVFPPresent;
}
return true;
}
@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) {}
}