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); } } 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)