From 72a65de83fed48e9451cc188cb4572e69ace5b04 Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Sun, 3 Jul 2022 00:36:21 +0200 Subject: [PATCH] properly fix dragonapi compat --- .../endlessids/mixin/plugin/MixinPlugin.java | 4 +- .../endlessids/mixin/plugin/TargetedMod.java | 6 +- .../mixin/util/DragonAPICompat.java | 74 +++++++++++++++++++ 3 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/falsepattern/endlessids/mixin/util/DragonAPICompat.java diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/MixinPlugin.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/MixinPlugin.java index 0e10827..d1a6970 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/MixinPlugin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/MixinPlugin.java @@ -8,8 +8,10 @@ import lombok.Getter; import org.apache.logging.log4j.Logger; public class MixinPlugin implements IMixinPlugin { + public static final Logger LOG = IMixinPlugin.createLogger(Tags.MODNAME); + @Getter - private final Logger logger = IMixinPlugin.createLogger(Tags.MODNAME); + private final Logger logger = LOG; @Override public IMixin[] getMixinEnumValues() { diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java index 3635ca1..b2fc46d 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java @@ -1,5 +1,6 @@ package com.falsepattern.endlessids.mixin.plugin; +import com.falsepattern.endlessids.mixin.util.DragonAPICompat; import com.falsepattern.lib.mixin.ITargetedMod; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -15,7 +16,10 @@ public enum TargetedMod implements ITargetedMod { ATG("Alternate Terrain Generation", true, startsWith("atg")), BOP("Biomes O' Plenty", true, startsWith("biomesoplenty-")), COFHLIB("CoFH Lib", true, startsWith("cofhlib-")), - DRAGONAPI("DragonAPI", false, startsWith("dragonapi")), + DRAGONAPI("DragonAPI", false, startsWith("dragonapi").and((x) -> { + DragonAPICompat.activate(); + return true; + })), GALACTICRAFTCORE("GalactiCraftCore", false, startsWith("galacticraftcore")), MFQM("More Fun Quicksand Mod", false, startsWith("morefunquicksandmod-")), UBC("Underground Biomes Constructs", false, startsWith("undergroundbiomesconstructs-")), diff --git a/src/main/java/com/falsepattern/endlessids/mixin/util/DragonAPICompat.java b/src/main/java/com/falsepattern/endlessids/mixin/util/DragonAPICompat.java new file mode 100644 index 0000000..399bb2f --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/util/DragonAPICompat.java @@ -0,0 +1,74 @@ +package com.falsepattern.endlessids.mixin.util; + +import com.falsepattern.endlessids.mixin.plugin.MixinPlugin; +import lombok.SneakyThrows; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import cpw.mods.fml.common.Loader; + +import java.lang.reflect.Field; +import java.util.Collections; + +public class DragonAPICompat { + private static boolean activated = false; + + public static void activate() { + if (activated) return; + activated = true; + Logger LOG = LogManager.getLogger(MixinPlugin.LOG.getName() + " DragonAPI Compat Patcher"); + LOG.info("DragonAPI detected. Activating very early compatibility patches."); + int total = 1; + int complete = 0; + try { + patchFML(LOG); + complete++; + } catch (Throwable t) { + LOG.fatal("Failed to load early DragonAPI compat patches! Crash imminent! Successful: " + complete + ", Total: " + total, t); + } + LOG.info("DragonAPI early compat patching finished! Resuming normal loading."); + } + + @SneakyThrows + private static void patchFML(Logger baseLog) { + Logger LOG = LogManager.getLogger(baseLog.getName() + " FML Tweaker"); + LOG.info("Patching FML loader class..."); + try { + LOG.info("Attempting to get a reference to " + Loader.class.getName() + + ".namedMods with reflection..."); + Field f; + try { + f = Loader.class.getDeclaredField("namedMods"); + LOG.info("[OK] Reference retrieved!"); + } catch (Throwable t) { + LOG.error("[FAIL] Failed to retrieve the field!"); + throw t; + } + LOG.info("[INFO] Making the reference accessible..."); + try { + f.setAccessible(true); + LOG.info("[OK] Reference is now accessible!"); + } catch (Throwable t) { + LOG.error("[FAIL] Failed to make the reference accessible!"); + throw t; + } + + LOG.info("[INFO] Inserting placeholder Collections.emptyMap() object into the field..."); + try { + if (f.get(Loader.instance()) != null) { + LOG.info("[OK] Field already had a value, not replacing."); + } else { + f.set(Loader.instance(), Collections.emptyMap()); + LOG.info("[OK] Successfully inserted placeholder object!"); + } + } catch (Throwable t) { + LOG.error("[FAIL] Failed to insert placeholder object!"); + throw t; + } + LOG.info("FML Loader class patched successfully!"); + } catch (Throwable t) { + LOG.error("Failed to patch FML Loader class! Check the log file for debug info!"); + throw t; + } + } +}