From 1b5ca64f20d660ccdaa3839c67c17156dc0bb9a1 Mon Sep 17 00:00:00 2001 From: Paint_Ninja Date: Tue, 2 Dec 2025 20:17:33 +0000 Subject: [PATCH] Fix `BusGroup.DEFAULT` not being trimmed after mod loading completes, also trim mod BusGroups now too (#10721) Saves some memory by trimming various backing collections of loaded EventBuses on the default BusGroup --- .../java/net/minecraftforge/fml/ModContainer.java | 9 +++++++++ .../java/net/minecraftforge/fml/ModLoader.java | 15 ++++++++++++++- .../fml/javafmlmod/FMLModContainer.java | 6 ++++-- .../minecraftforge/fml/core/ModStateProvider.java | 3 +-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java index 380c3b9f54..cf6a35a3af 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java @@ -5,6 +5,7 @@ package net.minecraftforge.fml; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.config.IConfigEvent; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.IModBusEvent; @@ -157,6 +158,14 @@ public abstract class ModContainer { */ public abstract Object getMod(); + /** + * @return the mod bus group for this specific mod, or null if there is none. + * Leave null if you use {@link BusGroup#DEFAULT} for your mod lifecycle events. + */ + public BusGroup getModBusGroup() { + return null; + } + /** * Accept an arbitrary event for processing by the mod. Probably posted to an event bus in the lower level container. * @param e Event to accept diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java index 2f82d8fc45..b43a761f47 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java @@ -6,6 +6,7 @@ package net.minecraftforge.fml; import com.google.common.collect.ImmutableList; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.fml.loading.FMLLoader; @@ -232,7 +233,19 @@ public class ModLoader { for (IModLoadingState mls : stateList) { dispatchAndHandleError(mls, syncExecutor, parallelExecutor, periodicTask, progress); } - statusConsumer.accept(String.format("Mod loading complete - %d mods loaded", this.modList.size())); + + var modBusGroups = Set.of( + modList.getLoadedMods().stream() + .map(ModContainer::getModBusGroup) + .filter(Objects::nonNull) + .toArray(BusGroup[]::new) + ); + for (var modBusGroup : modBusGroups) { + parallelExecutor.execute(modBusGroup::trim); + } + parallelExecutor.execute(BusGroup.DEFAULT::trim); + + statusConsumer.accept("Mod loading complete - %d mods loaded".formatted(this.modList.size())); progress.complete(); } diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java index b8616f90d3..a77b6c5a64 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java @@ -47,8 +47,9 @@ public class FMLModContainer extends ModContainer { this.contextExtension = () -> context; try { var moduleName = info.getOwningFile().moduleName(); - var module = gameLayer.findModule(moduleName) - .orElseThrow(() -> new IllegalStateException("Failed to find " + moduleName + " in " + gameLayer)); + var module = gameLayer.findModule(moduleName).orElse(null); + if (module == null) + throw new IllegalStateException("Failed to find " + moduleName + " in " + gameLayer); openModules(gameLayer, module, info.getOwningFile().getFile().getSecureJar()); @@ -166,6 +167,7 @@ public class FMLModContainer extends ModContainer { return modInstance; } + @Override public BusGroup getModBusGroup() { return this.eventBusGroup; } diff --git a/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java b/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java index 48fc552dd9..22928054f9 100644 --- a/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java +++ b/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java @@ -136,8 +136,7 @@ public class ModStateProvider implements IModStateProvider { * * @see ModLoadingStage#DONE */ - public static final ModLoadingState DONE = ModLoadingState.of("DONE", ModLoadingPhase.DONE) - .withInline(ml -> BusGroup.DEFAULT.trim()); + public static final ModLoadingState DONE = ModLoadingState.of("DONE", ModLoadingPhase.DONE).empty(); @Override public List getAllStates() {