diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModList.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModList.java index d529ad2d379..c06a64a623d 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModList.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModList.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -53,6 +54,7 @@ public class ModList private List mods; private Map indexedMods; private List modFileScanData; + private List sortedContainers; private ModList(final List modFiles, final List sortedList) { @@ -155,6 +157,7 @@ static CompletableFuture>> gather(List modContainers) { this.mods = modContainers; + this.sortedContainers = modContainers.stream().sorted(Comparator.comparingInt(c->sortedList.indexOf(c.getModInfo()))).toList(); this.indexedMods = modContainers.stream().collect(Collectors.toMap(ModContainer::getModId, Function.identity())); } @@ -218,6 +221,10 @@ public void forEachModContainer(BiConsumer modContainerCon indexedMods.forEach(modContainerConsumer); } + public void forEachModInOrder(Consumer containerConsumer) { + this.sortedContainers.forEach(containerConsumer); + } + public Stream applyForEachModContainer(Function function) { return indexedMods.values().stream().map(function); } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java index 5dc6eca83ee..05cbe0c34d1 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java @@ -22,7 +22,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.Executor; @@ -289,7 +295,7 @@ public void runEventGenerator(Function mc.acceptEvent(generator.apply(mc))); + ModList.get().forEachModInOrder(mc -> mc.acceptEvent(generator.apply(mc))); } public void postEvent(T e) { @@ -297,14 +303,14 @@ public void postEvent(T e) { LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName()); return; } - ModList.get().forEachModContainer((id, mc) -> mc.acceptEvent(e)); + ModList.get().forEachModInOrder(mc -> mc.acceptEvent(e)); } - public void postEventWithWrap(T e, BiConsumer pre, BiConsumer post) { + public void postEventWithWrapInModOrder(T e, BiConsumer pre, BiConsumer post) { if (!loadingStateValid) { LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName()); return; } - ModList.get().forEachModContainer((id, mc) -> { + ModList.get().forEachModInOrder(mc -> { pre.accept(mc, e); mc.acceptEvent(e); post.accept(mc, e); diff --git a/src/main/java/net/minecraftforge/forge/event/lifecycle/GatherDataEvent.java b/src/main/java/net/minecraftforge/forge/event/lifecycle/GatherDataEvent.java index 3edad1e287a..e4ad029bd87 100644 --- a/src/main/java/net/minecraftforge/forge/event/lifecycle/GatherDataEvent.java +++ b/src/main/java/net/minecraftforge/forge/event/lifecycle/GatherDataEvent.java @@ -16,6 +16,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -90,7 +91,7 @@ public DataGenerator makeGenerator(final Function pathEnhancer, final } public void runAll() { - Map> paths = generators.stream().collect(Collectors.groupingBy(DataGenerator::getOutputFolder)); + Map> paths = generators.stream().collect(Collectors.groupingBy(DataGenerator::getOutputFolder, LinkedHashMap::new, Collectors.toList())); paths.values().forEach(LamdbaExceptionUtils.rethrowConsumer(lst -> { DataGenerator parent = lst.get(0); diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index e71516ed8e2..7aefa954fa8 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -40,7 +40,6 @@ import net.minecraftforge.common.loot.GlobalLootModifierSerializer; import net.minecraftforge.common.util.LogMessageAdapter; import net.minecraftforge.fluids.FluidType; -import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.StartupMessageManager; @@ -318,7 +317,7 @@ public static void postRegisterEvents() if (forgeRegistry != null) forgeRegistry.unfreeze(); - ModLoader.get().postEventWithWrap(registerEvent, (mc, e) -> ModLoadingContext.get().setActiveContainer(mc), (mc, e)-> ModLoadingContext.get().setActiveContainer(null)); + ModLoader.get().postEventWithWrapInModOrder(registerEvent, (mc, e) -> ModLoadingContext.get().setActiveContainer(mc), (mc, e)-> ModLoadingContext.get().setActiveContainer(null)); if (forgeRegistry != null) forgeRegistry.freeze(); diff --git a/src/main/java/net/minecraftforge/registries/RegistryManager.java b/src/main/java/net/minecraftforge/registries/RegistryManager.java index f2b1d512d73..a65eb10467b 100644 --- a/src/main/java/net/minecraftforge/registries/RegistryManager.java +++ b/src/main/java/net/minecraftforge/registries/RegistryManager.java @@ -153,7 +153,7 @@ public static void postNewRegistryEvent() NewRegistryEvent event = new NewRegistryEvent(); vanillaRegistryKeys = Set.copyOf(Registry.REGISTRY.keySet()); - ModLoader.get().postEventWithWrap(event, (mc, e) -> ModLoadingContext.get().setActiveContainer(mc), (mc, e) -> ModLoadingContext.get().setActiveContainer(null)); + ModLoader.get().postEventWithWrapInModOrder(event, (mc, e) -> ModLoadingContext.get().setActiveContainer(mc), (mc, e) -> ModLoadingContext.get().setActiveContainer(null)); event.fill(); }