Skip to content

Commit 6b24edb

Browse files
committed
Clean up ModRegistry
1 parent bf5035c commit 6b24edb

File tree

2 files changed

+39
-58
lines changed

2 files changed

+39
-58
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,72 @@
11
package se.icus.mag.modmenusettings;
22

3-
import com.google.common.collect.ImmutableMap;
4-
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
53
import com.terraformersmc.modmenu.api.ModMenuApi;
4+
import com.terraformersmc.modmenu.util.ModMenuApiMarker;
5+
import io.github.prospector.modmenu.api.ConfigScreenFactory;
66
import net.fabricmc.loader.api.EntrypointException;
77
import net.fabricmc.loader.api.FabricLoader;
88
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
99
import net.fabricmc.loader.api.metadata.ModMetadata;
1010
import net.minecraft.client.gui.screen.Screen;
1111
import org.apache.logging.log4j.Level;
12-
import org.apache.logging.log4j.LogManager;
13-
import org.apache.logging.log4j.Logger;
1412

1513
import java.util.*;
16-
import java.util.function.Supplier;
14+
import java.util.stream.Collectors;
1715

1816
public class ModRegistry {
19-
private static List<Supplier<Map<String, ConfigScreenFactory<?>>>> dynamicScreenFactories = new ArrayList<>();
20-
private static ImmutableMap<String, ConfigScreenFactory<?>> configScreenFactories = ImmutableMap.of();
21-
public static final Logger LOGGER = LogManager.getLogger("Mod Menu");
22-
public static final Map<String, String> CONFIGABLE_MODS = new HashMap<>();
17+
private static final Map<String, String> CONFIGABLE_MODS_NAMES = new HashMap<>();
18+
private static final Map<String, ConfigScreenFactory<?>> factories = new HashMap<>();
19+
private static final Map<String, ConfigScreenFactory<?>> overridingFactories = new HashMap<>();
2320

2421
public static void registerMods() {
25-
Map<String, ConfigScreenFactory<?>> factories = new HashMap<>();
22+
List<EntrypointContainer<ModMenuApiMarker>> modList = FabricLoader.getInstance().getEntrypointContainers("modmenu", ModMenuApiMarker.class);
2623

27-
/* Current API */
28-
List<EntrypointContainer<ModMenuApi>> modList = FabricLoader.getInstance().getEntrypointContainers("modmenu", ModMenuApi.class);
29-
for (EntrypointContainer<ModMenuApi> entryPoint : modList) {
24+
for (EntrypointContainer<ModMenuApiMarker> entryPoint : modList) {
3025
ModMetadata metadata = entryPoint.getProvider().getMetadata();
3126
String modId = metadata.getId();
27+
ModMenuSettings.LOGGER.log(Level.INFO,"found mod1: " + modId);
28+
3229
try {
33-
String modName = metadata.getName();
34-
LOGGER.log(Level.INFO,"found mod1: " + modId);
35-
ModMenuApi marker = entryPoint.getEntrypoint();
30+
ModMenuApiMarker marker = entryPoint.getEntrypoint();
31+
if (marker instanceof ModMenuApi) {
32+
ModMenuApi marker2 = (ModMenuApi) marker;
3633

37-
LOGGER.log(Level.INFO, "is new mod1: " + modId);
38-
CONFIGABLE_MODS.put(modId, modName);
34+
factories.put(modId, marker2.getModConfigScreenFactory());
35+
overridingFactories.putAll(marker2.getProvidedConfigScreenFactories());
36+
} else if (marker instanceof io.github.prospector.modmenu.api.ModMenuApi) {
37+
io.github.prospector.modmenu.api.ModMenuApi marker2 = (io.github.prospector.modmenu.api.ModMenuApi) marker;
3938

40-
factories.put(modId, marker.getModConfigScreenFactory());
41-
dynamicScreenFactories.add(marker::getProvidedConfigScreenFactories);
39+
factories.put(modId, marker2.getModConfigScreenFactory());
40+
overridingFactories.putAll(marker2.getProvidedConfigScreenFactories());
41+
} else {
42+
ModMenuSettings.LOGGER.warn("class problem with " + modId);
43+
continue;
44+
}
45+
CONFIGABLE_MODS_NAMES.put(modId, metadata.getName());
4246
} catch (EntrypointException e) {
4347
// Ignore incompatible mods, they are either broken or implement the old API
44-
LOGGER.warn("problem with " + modId + e);
48+
ModMenuSettings.LOGGER.warn("problem with " + modId + e);
4549
}
4650
}
51+
}
4752

48-
/* Legacy API */
49-
List<EntrypointContainer<io.github.prospector.modmenu.api.ModMenuApi>> mod2List = FabricLoader.getInstance().getEntrypointContainers("modmenu", io.github.prospector.modmenu.api.ModMenuApi.class);
53+
public static List<String> getAllModIds() {
54+
Comparator<String> sorter = Comparator.comparing(modId -> modId.toLowerCase(Locale.ROOT));
5055

51-
for (EntrypointContainer<io.github.prospector.modmenu.api.ModMenuApi> entryPoint : mod2List) {
52-
ModMetadata metadata = entryPoint.getProvider().getMetadata();
53-
String modId = metadata.getId();
54-
try {
55-
String modName = metadata.getName();
56-
LOGGER.log(Level.INFO,"found mod2: " + modId);
57-
io.github.prospector.modmenu.api.ModMenuApi marker = entryPoint.getEntrypoint();
58-
LOGGER.log(Level.INFO,"is old mod2: " + modId);
59-
CONFIGABLE_MODS.put(modId, modName);
60-
61-
factories.put(modId, screen -> marker.getModConfigScreenFactory().create(screen));
62-
marker.getProvidedConfigScreenFactories().forEach((id, legacyFactory) -> factories.put(id, legacyFactory::create));
63-
} catch (EntrypointException e) {
64-
// Ignore incompatible mods, they are either broken or implement the new API
65-
LOGGER.warn("problem with " + modId + e);
66-
}
67-
}
56+
return CONFIGABLE_MODS_NAMES.keySet().stream().sorted(sorter)
57+
.filter(modId -> !modId.equals("minecraft")).collect(Collectors.toList());
58+
}
6859

69-
configScreenFactories = ImmutableMap.copyOf(factories);
60+
public static String getModName(String modId) {
61+
return CONFIGABLE_MODS_NAMES.get(modId);
7062
}
7163

7264
public static Screen getConfigScreen(String modid, Screen menuScreen) {
73-
ConfigScreenFactory<?> factory = configScreenFactories.get(modid);
65+
ConfigScreenFactory<?> factory = factories.getOrDefault(modid, overridingFactories.get(modid));
7466
if (factory != null) {
7567
return factory.create(menuScreen);
7668
}
77-
for (Supplier<Map<String, ConfigScreenFactory<?>>> dynamicFactoriesSupplier : dynamicScreenFactories) {
78-
factory = dynamicFactoriesSupplier.get().get(modid);
79-
if (factory != null) {
80-
return factory.create(menuScreen);
81-
}
82-
}
69+
8370
return null;
8471
}
8572
}

src/main/java/se/icus/mag/modmenusettings/gui/ModsConfigScreen.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313
import se.icus.mag.modmenusettings.ModMenuSettings;
1414
import se.icus.mag.modmenusettings.ModRegistry;
1515

16-
import java.util.Comparator;
1716
import java.util.LinkedList;
1817
import java.util.List;
19-
import java.util.Locale;
20-
import java.util.stream.Collectors;
2118

2219
public class ModsConfigScreen extends Screen {
2320
private final Screen previous;
@@ -39,17 +36,14 @@ protected void init() {
3936

4037
private Option[] getAllModConfigOptions() {
4138
List<Option> options = new LinkedList<>();
42-
Comparator<String> sorter = Comparator.comparing(modId -> modId.toLowerCase(Locale.ROOT));
43-
for (String modId : ModRegistry.CONFIGABLE_MODS.keySet().stream().sorted(sorter).collect(Collectors.toList())) {
39+
for (String modId : ModRegistry.getAllModIds()) {
4440
try {
4541
Screen configScreen = ModRegistry.getConfigScreen(modId, this);
46-
if (configScreen != null && !modId.equals("minecraft")) {
47-
options.add(new ModConfigOption(modId, ModRegistry.CONFIGABLE_MODS.get(modId), configScreen));
42+
if (configScreen != null) {
43+
options.add(new ModConfigOption(modId, ModRegistry.getModName(modId), configScreen));
4844
}
49-
} catch (NoClassDefFoundError e) {
50-
ModMenuSettings.LOGGER.warn("The '" + modId + "' mod config screen is not available because " + e.getLocalizedMessage() + " is missing.");
5145
} catch (Throwable e) {
52-
ModMenuSettings.LOGGER.error("Error from mod '" + modId + "'", e);
46+
ModMenuSettings.LOGGER.error("Error creating Settings screen from mod '" + modId + "'", e);
5347
}
5448
}
5549
return options.toArray(new Option[0]);

0 commit comments

Comments
 (0)