From 5d2310bda447852a74511040e4963d236042c916 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 19 Jun 2023 18:54:26 -0400 Subject: [PATCH 1/2] Fix incorrect classname in Valhelsia Structures patch Looks like this was broken during the multiloader refactor Related: #135 --- .../modernfix/platform/forge/ModernFixPlatformHooksImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java index 8b31a33e..41d79846 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -209,7 +209,7 @@ public class ModernFixPlatformHooksImpl { } public static void applyASMTransformers(String mixinClassName, ClassNode targetClass) { - if(mixinClassName.equals("org.embeddedt.modernfix.forge.valhesia.chunk_deadlock.bugfix.mixin.BlockStateBaseMixin")) { + if(mixinClassName.equals("org.embeddedt.modernfix.forge.mixin.bugfix.chunk_deadlock.valhesia.BlockStateBaseMixin")) { // We need to destroy Valhelsia's callback so it can never run getBlockState for(MethodNode m : targetClass.methods) { if(m.name.contains("valhelsia_placeDousedTorch")) { From aa3fa93a9f7493ac8c4d3851b78676e5ffe6ed24 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 19 Jun 2023 20:57:07 -0400 Subject: [PATCH 2/2] Add framework to load specific mod classes sequentially, preventing deadlocks --- .../forge/classloading/ClassLoadHack.java | 26 +++++++++++++++++++ .../modernfix/forge/init/ModernFixForge.java | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java new file mode 100644 index 00000000..169de148 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.forge.classloading; + +/** + * Sometimes mods have classes that circularly reference each other. If each of these classes ends up being loaded + * from two mods, a deadlock occurs. + * + * To avoid this problem we maintain a list of classes that should be loaded early and do it via Class.forName. + */ +public class ClassLoadHack { + private static final String[] classesToLoadEarly = new String[] { + "team.creative.creativecore.common.config.ConfigTypeConveration", + "team.creative.creativecore.common.util.ingredient.CreativeIngredient" + }; + + public static void loadModClasses() { + for(String clzName : classesToLoadEarly) { + try { + Class.forName(clzName); + } catch(Throwable e) { + if(!(e instanceof ClassNotFoundException)) { + e.printStackTrace(); + } + } + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java index 4354ff49..570f5242 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java @@ -21,6 +21,7 @@ import net.minecraftforge.fml.server.ServerLifecycleHooks; import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.tuple.Pair; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.forge.classloading.ClassLoadHack; import org.embeddedt.modernfix.forge.classloading.ModFileScanDataDeduplicator; import org.embeddedt.modernfix.forge.ModernFixConfig; import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; @@ -46,6 +47,7 @@ public class ModernFixForge { MinecraftForge.EVENT_BUS.register(KubeUtil.class); PacketHandler.register(); ModFileScanDataDeduplicator.deduplicate(); + ClassLoadHack.loadModClasses(); } @SubscribeEvent