From 180171966517080165666c6358ba4414f5a78bb1 Mon Sep 17 00:00:00 2001 From: nekristalik Date: Fri, 19 Jun 2026 07:29:44 +0200 Subject: [PATCH 1/2] feat(analysis): add DedicatedServerModInitializer support for Fabric --- .../analysis/entry/FabricModEntryPointDiscovery.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/FabricModEntryPointDiscovery.java b/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/FabricModEntryPointDiscovery.java index 9c88262bf..2c2ea90be 100644 --- a/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/FabricModEntryPointDiscovery.java +++ b/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/FabricModEntryPointDiscovery.java @@ -45,9 +45,9 @@ public List findEntryPoints(@Nonnull Workspace workspace, @Nonnull W ClassPathNode classPath = null; Boolean isModInitializer = null; for (MethodMember method : cls.getMethods()) { - // Must be a common or client initializer method name. + // Must be a common, client, or server initializer method name. String methodName = method.getName(); - if (!methodName.equals("onInitialize") && !methodName.equals("onInitializeClient")) + if (!methodName.equals("onInitialize") && !methodName.equals("onInitializeClient") && !methodName.equals("onInitializeServer")) continue; // Lazily check if this class is a mod-initializer subtype. @@ -70,6 +70,7 @@ public List findEntryPoints(@Nonnull Workspace workspace, @Nonnull W private static boolean isInitializer(@Nonnull InheritanceGraph graph, @Nonnull String className) { // Fabric and Quilt (lol) both use the same interface names return graph.isAssignableFrom("net/fabricmc/api/ClientModInitializer", className) - || graph.isAssignableFrom("net/fabricmc/api/ModInitializer", className); + || graph.isAssignableFrom("net/fabricmc/api/ModInitializer", className) + || graph.isAssignableFrom("net/fabricmc/api/DedicatedServerModInitializer", className); } } From bb485a4ee6955e94cf22c1e613edf6065fa0ba99 Mon Sep 17 00:00:00 2001 From: nekristalik Date: Fri, 19 Jun 2026 07:45:32 +0200 Subject: [PATCH 2/2] feat(analysis): add legacy FML mod init events and annotations for Forge --- .../analysis/entry/ForgeModEntryPointDiscovery.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/ForgeModEntryPointDiscovery.java b/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/ForgeModEntryPointDiscovery.java index 2b3ee5e65..3bccd27a9 100644 --- a/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/ForgeModEntryPointDiscovery.java +++ b/recaf-core/src/main/java/software/coley/recaf/services/analysis/entry/ForgeModEntryPointDiscovery.java @@ -57,7 +57,8 @@ public List findEntryPoints(@Nonnull Workspace workspace, @Nonnull W ); for (String annotation : annotations) { if ("Lnet/minecraftforge/fml/common/Mod;".equals(annotation) - || "Lnet/neoforged/fml/common/Mod;".equals(annotation)) { + || "Lnet/neoforged/fml/common/Mod;".equals(annotation) + || "Lcpw/mods/fml/common/Mod;".equals(annotation)) { classPath = PathNodes.classPath(workspace, resource, bundle, cls); classEntry = new EntryPoint(kind(), classPath, null); break; @@ -74,6 +75,14 @@ public List findEntryPoints(@Nonnull Workspace workspace, @Nonnull W || "(Lnet/neoforged/fml/event/lifecycle/FMLClientSetupEvent;)V".equals(desc) || "(Lnet/neoforged/fml/event/lifecycle/FMLCommonSetupEvent;)V".equals(desc) || "(Lnet/neoforged/fml/event/lifecycle/FMLDedicatedServerSetupEvent;)V".equals(desc) + // Legacy Forge 1.8 - 1.12.2 lifecycle events + || "(Lnet/minecraftforge/fml/common/event/FMLPreInitializationEvent;)V".equals(desc) + || "(Lnet/minecraftforge/fml/common/event/FMLInitializationEvent;)V".equals(desc) + || "(Lnet/minecraftforge/fml/common/event/FMLPostInitializationEvent;)V".equals(desc) + // Legacy Forge 1.6.4 - 1.7.10 lifecycle events + || "(Lcpw/mods/fml/common/event/FMLPreInitializationEvent;)V".equals(desc) + || "(Lcpw/mods/fml/common/event/FMLInitializationEvent;)V".equals(desc) + || "(Lcpw/mods/fml/common/event/FMLPostInitializationEvent;)V".equals(desc) // Not sure if we should consider events like this as entry points... // || "(Lnet/minecraftforge/event/server/ServerAboutToStartEvent;)V".equals(desc) // || "(Lnet/minecraftforge/event/server/ServerStartingEvent;)V".equals(desc)