From d1e5bf884ee7418b767e15a131114530c39fd836 Mon Sep 17 00:00:00 2001 From: Traben Date: Sun, 9 Nov 2025 21:24:22 +1000 Subject: [PATCH 1/2] add stage 2 compatibility for FabricLoader subclasses e.g. lunar client Linear: EM-3472 --- .../loader/stage2/EssentialLoader.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java b/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java index 1ba2058..9848867 100644 --- a/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java +++ b/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java @@ -347,10 +347,26 @@ private Object createCandidate(Path path, URL url, Object metadata) throws Class } } + private Class findFabricLoaderClass(FabricLoader fabricLoader) throws ClassNotFoundException { + Class clazz = fabricLoader.getClass(); + while (clazz != null) { + try { + clazz.getDeclaredField("modMap"); + clazz.getDeclaredField("mods"); + clazz.getDeclaredField("entrypointStorage"); + clazz.getDeclaredField("adapterMap"); + return clazz; + } catch (NoSuchFieldException ignored) { + clazz = clazz.getSuperclass(); + } + } + throw new ClassNotFoundException("Could not find the required fields [modMap, mods, entrypointStorage, adapterMap] anywhere in the class hierarchy of FabricLoader.getInstance()"); + } + @SuppressWarnings("unchecked") private void injectFakeMod(final Path path, final URL url, final ModMetadata metadata) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException, InstantiationException { FabricLoader fabricLoader = FabricLoader.getInstance(); - Class fabricLoaderClass = fabricLoader.getClass(); + Class fabricLoaderClass = findFabricLoaderClass(fabricLoader); Class ModContainerImpl; try { // fabric-loader 0.12 From 4e584e7243978ffa00478bb07e1f8ad8d526f270 Mon Sep 17 00:00:00 2001 From: Traben Date: Wed, 7 Jan 2026 16:35:56 +1000 Subject: [PATCH 2/2] accumulate exceptions thrown at each step Linear: EM-3472 --- .../java/gg/essential/loader/stage2/EssentialLoader.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java b/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java index 9848867..fd9cb28 100644 --- a/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java +++ b/stage2/fabric/src/main/java/gg/essential/loader/stage2/EssentialLoader.java @@ -349,6 +349,7 @@ private Object createCandidate(Path path, URL url, Object metadata) throws Class private Class findFabricLoaderClass(FabricLoader fabricLoader) throws ClassNotFoundException { Class clazz = fabricLoader.getClass(); + Exception ex = null; while (clazz != null) { try { clazz.getDeclaredField("modMap"); @@ -356,11 +357,14 @@ private Class findFabricLoaderClass(FabricLoader fabricLoader) throws ClassNo clazz.getDeclaredField("entrypointStorage"); clazz.getDeclaredField("adapterMap"); return clazz; - } catch (NoSuchFieldException ignored) { + } catch (NoSuchFieldException e) { + if (ex == null) ex = e; + else ex.addSuppressed(e); // Accumulate exceptions to provide more context + clazz = clazz.getSuperclass(); } } - throw new ClassNotFoundException("Could not find the required fields [modMap, mods, entrypointStorage, adapterMap] anywhere in the class hierarchy of FabricLoader.getInstance()"); + throw new ClassNotFoundException("Could not find the required fields [modMap, mods, entrypointStorage, adapterMap] anywhere in the class hierarchy of FabricLoader.getInstance()", ex); } @SuppressWarnings("unchecked")