Skip to content

Commit

Permalink
Add "send to mods in order" method to ModList and use it (MinecraftFo…
Browse files Browse the repository at this point in the history
…rge#8759)

* Add "send to mods in order" method to ModList and use it in RegistryEvents and DataGen..
* Also preserve order in runAll
* Do better comparator thanks @pupnewfster
* postEvent as well.
  • Loading branch information
cpw authored Jun 20, 2022
1 parent ca90bab commit 7bb97da
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 9 deletions.
7 changes: 7 additions & 0 deletions fmlcore/src/main/java/net/minecraftforge/fml/ModList.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -53,6 +54,7 @@ public class ModList
private List<ModContainer> mods;
private Map<String, ModContainer> indexedMods;
private List<ModFileScanData> modFileScanData;
private List<ModContainer> sortedContainers;

private ModList(final List<ModFile> modFiles, final List<ModInfo> sortedList)
{
Expand Down Expand Up @@ -155,6 +157,7 @@ static <V> CompletableFuture<List<Map.Entry<V, Throwable>>> gather(List<? extend
void setLoadedMods(final List<ModContainer> 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()));
}

Expand Down Expand Up @@ -218,6 +221,10 @@ public void forEachModContainer(BiConsumer<String, ModContainer> modContainerCon
indexedMods.forEach(modContainerConsumer);
}

public void forEachModInOrder(Consumer<ModContainer> containerConsumer) {
this.sortedContainers.forEach(containerConsumer);
}

public <T> Stream<T> applyForEachModContainer(Function<ModContainer, T> function) {
return indexedMods.values().stream().map(function);
}
Expand Down
16 changes: 11 additions & 5 deletions fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -289,22 +295,22 @@ public <T extends Event & IModBusEvent> void runEventGenerator(Function<ModConta
LOGGER.error("Cowardly refusing to send event generator to a broken mod state");
return;
}
ModList.get().forEachModContainer((id, mc) -> mc.acceptEvent(generator.apply(mc)));
ModList.get().forEachModInOrder(mc -> mc.acceptEvent(generator.apply(mc)));
}

public <T extends Event & IModBusEvent> void postEvent(T e) {
if (!loadingStateValid) {
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 <T extends Event & IModBusEvent> void postEventWithWrap(T e, BiConsumer<ModContainer, T> pre, BiConsumer<ModContainer, T> post) {
public <T extends Event & IModBusEvent> void postEventWithWrapInModOrder(T e, BiConsumer<ModContainer, T> pre, BiConsumer<ModContainer, T> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -90,7 +91,7 @@ public DataGenerator makeGenerator(final Function<Path,Path> pathEnhancer, final
}

public void runAll() {
Map<Path, List<DataGenerator>> paths = generators.stream().collect(Collectors.groupingBy(DataGenerator::getOutputFolder));
Map<Path, List<DataGenerator>> paths = generators.stream().collect(Collectors.groupingBy(DataGenerator::getOutputFolder, LinkedHashMap::new, Collectors.toList()));

paths.values().forEach(LamdbaExceptionUtils.rethrowConsumer(lst -> {
DataGenerator parent = lst.get(0);
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/net/minecraftforge/registries/GameData.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down

0 comments on commit 7bb97da

Please sign in to comment.