more mixin compat code

This commit is contained in:
FalsePattern committed 2022-08-21 10:14:46 +02:00
1 parent 0b3c0a9b3a
commit b149723a22
4 files changed
+120 -39

No files matched your search

@@ -15,22 +15,15 @@ import java.util.List;
@Accessors(fluent = true)
@StableAPI(since = "__INTERNAL__")
public class FPTransformer implements SmartTransformer {
static final Logger LOG = LogManager.getLogger(Tags.MODNAME + " ASM");
@Getter
private final List<IClassNodeTransformer> transformers;
@Getter
private final Logger logger = LogManager.getLogger(Tags.MODNAME + " ASM");
private final Logger logger = LOG;
public FPTransformer() {
boolean obsolete;
try {
Class.forName("io.github.tox1cozz.mixinbooterlegacy.MixinBooterLegacyPlugin");
logger.info("Detected MixinBooter Legacy.");
obsolete = false;
} catch (ClassNotFoundException e) {
logger.info("Detected SpongeMixins or Grimoire. Applying legacy compat fix to IMixinPlugin.");
obsolete = true;
}
transformers = Collections.singletonList(new IMixinPluginTransformer(obsolete));
transformers = Collections.singletonList(new IMixinPluginTransformer());
}
}
@@ -2,17 +2,14 @@ package com.falsepattern.lib.internal.asm;
import com.falsepattern.lib.asm.IClassNodeTransformer;
import com.falsepattern.lib.internal.Tags;
import lombok.RequiredArgsConstructor;
import com.falsepattern.lib.mixin.MixinInfo;
import lombok.val;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.MethodNode;
import java.util.ArrayList;
@RequiredArgsConstructor
public class IMixinPluginTransformer implements IClassNodeTransformer {
private final boolean obsolete;
@Override
public String getName() {
return "IMixinPluginTransformer";
@@ -27,7 +24,16 @@ public class IMixinPluginTransformer implements IClassNodeTransformer {
public void transform(ClassNode cn, String transformedName, boolean obfuscated) {
val methods = cn.methods;
val remove = new ArrayList<MethodNode>();
if (obsolete) {
if (MixinInfo.isMixinBooterLegacy()) {
FPTransformer.LOG.info("Detected MixinBooterLegacy. Selecting proper methods in IMixinPlugin.");
for (val method : methods) {
if (method.name.equals("preApply_obsolete") || method.name.equals("postApply_obsolete")) {
remove.add(method);
}
}
methods.removeAll(remove);
} else {
FPTransformer.LOG.info("Could not detect MixinBooterLegacy. Selecting proper methods in IMixinPlugin.");
for (val method : methods) {
if (method.name.equals("preApply") || method.name.equals("postApply")) {
remove.add(method);
@@ -39,12 +45,6 @@ public class IMixinPluginTransformer implements IClassNodeTransformer {
method.name = method.name.substring(0, method.name.indexOf('_'));
}
}
} else {
for (val method : methods) {
if (method.name.equals("preApply_obsolete") || method.name.equals("postApply_obsolete")) {
remove.add(method);
}
}
}
}
}
@@ -0,0 +1,97 @@
package com.falsepattern.lib.mixin;
import com.falsepattern.lib.StableAPI;
import org.spongepowered.asm.launch.MixinBootstrap;
import java.util.Optional;
@StableAPI(since = "0.10.2")
public final class MixinInfo {
@StableAPI.Expose
public static final MixinBootstrapperType mixinBootstrapper = detect();
@StableAPI.Expose
public static boolean isMixinsInstalled() {
return mixinBootstrapper != MixinBootstrapperType.None;
}
@StableAPI.Expose
public static boolean isOfficialSpongeMixins() {
return (mixinBootstrapper == MixinBootstrapperType.SpongeMixins) && getVerUnsafe().equals("0.7.11");
}
/**
* The nh fork of spongemixins breaks some stuff since 1.5.0.
*/
@StableAPI.Expose
public static boolean isTamperedSpongeMixins() {
return (mixinBootstrapper == MixinBootstrapperType.SpongeMixins) && getVerUnsafe().equals("0.7.12");
}
@StableAPI.Expose
public static boolean isGrimoire() {
return mixinBootstrapper == MixinBootstrapperType.Grimoire;
}
@StableAPI.Expose
public static boolean isMixinBooterLegacy() {
return mixinBootstrapper == MixinBootstrapperType.MixinBooterLegacy;
}
@StableAPI.Expose
public static MixinBootstrapperType bootstrapperType() {
return mixinBootstrapper;
}
@StableAPI.Expose
public static Optional<String> mixinVersion() {
return mixinBootstrapper != MixinBootstrapperType.None ? Optional.of(getVerUnsafe()) : Optional.empty();
}
private static String getVerUnsafe() {
return MixinBootstrap.VERSION;
}
private static MixinBootstrapperType detect() {
try {
Class.forName("org.spongepowered.asm.launch.MixinBootstrap");
} catch (ClassNotFoundException ignored) {
return MixinBootstrapperType.None;
}
try {
Class.forName("ru.timeconqueror.spongemixins.core.SpongeMixinsCore");
return MixinBootstrapperType.SpongeMixins;
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("io.github.crucible.grimoire.Grimoire");
return MixinBootstrapperType.Grimoire;
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("io.github.crucible.grimoire.common.GrimoireCore");
return MixinBootstrapperType.Grimoire;
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("io.github.tox1cozz.mixinbooterlegacy.MixinBooterLegacyPlugin");
return MixinBootstrapperType.MixinBooterLegacy;
} catch (ClassNotFoundException ignored) {}
return MixinBootstrapperType.Other;
}
@StableAPI(since = "0.10.2")
public enum MixinBootstrapperType {
@StableAPI.Expose
None,
@StableAPI.Expose
SpongeMixins,
@StableAPI.Expose
Grimoire,
@StableAPI.Expose
MixinBooterLegacy,
@StableAPI.Expose
Other
}
}