mirror of
https://github.com/FalsePattern/FalsePatternLib.git
synced 2026-11-11 07:57:45 +00:00
more mixin compat code
This commit is contained in:
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
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user