Skip to content

Commit e631fe9

Browse files
committed
Fix modmenu bridge loading client classes on server
Fixes #6
1 parent 4ed307a commit e631fe9

4 files changed

Lines changed: 69 additions & 60 deletions

File tree

geckolib-fabric-compat/src/main/resources/META-INF/mods.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ displayTest = 'IGNORE_ALL_VERSION'
2727
side="BOTH"
2828
[[dependencies.connectorextras_geckolib_fabric_compat]]
2929
modId="geckolib"
30-
mandatory=true
30+
mandatory=false
3131
versionRange="[4.2,)"
3232
ordering="NONE"
3333
side="BOTH"
Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,12 @@
11
package dev.su5ed.sinytra.connectorextras.modmenu;
22

3-
import com.mojang.logging.LogUtils;
4-
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
5-
import com.terraformersmc.modmenu.api.ModMenuApi;
6-
import net.fabricmc.loader.api.FabricLoader;
7-
import net.minecraft.client.gui.screens.Screen;
8-
import net.minecraftforge.client.ConfigScreenHandler;
9-
import net.minecraftforge.client.gui.ModListScreen;
10-
import net.minecraftforge.fml.ModList;
113
import net.minecraftforge.fml.common.Mod;
12-
import org.slf4j.Logger;
13-
14-
import java.util.ArrayList;
15-
import java.util.HashMap;
16-
import java.util.List;
17-
import java.util.Map;
184

195
@Mod(ModMenuCompat.MODID)
206
public class ModMenuCompat {
217
public static final String MODID = "connectorextras_modmenu_bridge";
22-
private static final Logger LOGGER = LogUtils.getLogger();
23-
private static final String MODMENU_MODID = "modmenu";
24-
25-
private static boolean initialized = false;
26-
27-
public static void init() {
28-
if (initialized) {
29-
return;
30-
}
31-
initialized = true;
32-
33-
Map<String, ConfigScreenFactory<?>> modFactories = new HashMap<>();
34-
List<Map<String, ConfigScreenFactory<?>>> providedFactories = new ArrayList<>();
35-
FabricLoader.getInstance().getEntrypointContainers(MODMENU_MODID, ModMenuApi.class).forEach(container -> {
36-
String modId = container.getProvider().getMetadata().getId();
37-
try {
38-
ModMenuApi entry = container.getEntrypoint();
39-
modFactories.put(modId, entry.getModConfigScreenFactory());
40-
providedFactories.add(entry.getProvidedConfigScreenFactories());
41-
} catch (Throwable t) {
42-
LOGGER.error("Failed to load ModMenuApi entrypoint for {}", modId, t);
43-
}
44-
});
45-
46-
providedFactories.forEach(map -> map.forEach(modFactories::putIfAbsent));
47-
providedFactories.clear();
488

49-
Screen dummyParent = new ModListScreen(null);
50-
modFactories.forEach((modId, factory) -> {
51-
// Ensure factory is active. This is required to avoid cases where the integration conditionally
52-
// disables itself (e.g. when cloth config is absent) and returns a dummy factory.
53-
try {
54-
if (factory.create(dummyParent) == null) {
55-
return;
56-
}
57-
} catch (Throwable t) {
58-
// If an error occurs, it might be due to us creating the factory so early.
59-
// Since we can't be sure about the factory's status, continue ahead
60-
LOGGER.warn("Error testing config screen factory status for mod {}", modId, t);
61-
}
9+
public ModMenuCompat() {
6210

63-
ModList.get().getModContainerById(modId).ifPresent(fmlContainer ->
64-
fmlContainer.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
65-
() -> new ConfigScreenHandler.ConfigScreenFactory((mc, screen) -> factory.create(screen))));
66-
});
6711
}
6812
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dev.su5ed.sinytra.connectorextras.modmenu;
2+
3+
import com.mojang.logging.LogUtils;
4+
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
5+
import com.terraformersmc.modmenu.api.ModMenuApi;
6+
import net.fabricmc.loader.api.FabricLoader;
7+
import net.minecraft.client.gui.screens.Screen;
8+
import net.minecraftforge.client.ConfigScreenHandler;
9+
import net.minecraftforge.client.gui.ModListScreen;
10+
import net.minecraftforge.fml.ModList;
11+
import org.slf4j.Logger;
12+
13+
import java.util.ArrayList;
14+
import java.util.HashMap;
15+
import java.util.List;
16+
import java.util.Map;
17+
18+
public class ModMenuCompatSetup {
19+
private static final Logger LOGGER = LogUtils.getLogger();
20+
private static final String MODMENU_MODID = "modmenu";
21+
22+
private static boolean initialized = false;
23+
24+
public static void init() {
25+
if (initialized) {
26+
return;
27+
}
28+
initialized = true;
29+
30+
Map<String, ConfigScreenFactory<?>> modFactories = new HashMap<>();
31+
List<Map<String, ConfigScreenFactory<?>>> providedFactories = new ArrayList<>();
32+
FabricLoader.getInstance().getEntrypointContainers(MODMENU_MODID, ModMenuApi.class).forEach(container -> {
33+
String modId = container.getProvider().getMetadata().getId();
34+
try {
35+
ModMenuApi entry = container.getEntrypoint();
36+
modFactories.put(modId, entry.getModConfigScreenFactory());
37+
providedFactories.add(entry.getProvidedConfigScreenFactories());
38+
} catch (Throwable t) {
39+
LOGGER.error("Failed to load ModMenuApi entrypoint for {}", modId, t);
40+
}
41+
});
42+
43+
providedFactories.forEach(map -> map.forEach(modFactories::putIfAbsent));
44+
providedFactories.clear();
45+
46+
Screen dummyParent = new ModListScreen(null);
47+
modFactories.forEach((modId, factory) -> {
48+
// Ensure factory is active. This is required to avoid cases where the integration conditionally
49+
// disables itself (e.g. when cloth config is absent) and returns a dummy factory.
50+
try {
51+
if (factory.create(dummyParent) == null) {
52+
return;
53+
}
54+
} catch (Throwable t) {
55+
// If an error occurs, it might be due to us creating the factory so early.
56+
// Since we can't be sure about the factory's status, continue ahead
57+
LOGGER.warn("Error testing config screen factory status for mod {}", modId, t);
58+
}
59+
60+
ModList.get().getModContainerById(modId).ifPresent(fmlContainer ->
61+
fmlContainer.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class,
62+
() -> new ConfigScreenHandler.ConfigScreenFactory((mc, screen) -> factory.create(screen))));
63+
});
64+
}
65+
}

modmenu-bridge/src/main/java/dev/su5ed/sinytra/connectorextras/modmenu/mixin/ModListScreenMixin.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.su5ed.sinytra.connectorextras.modmenu.mixin;
22

3-
import dev.su5ed.sinytra.connectorextras.modmenu.ModMenuCompat;
3+
import dev.su5ed.sinytra.connectorextras.modmenu.ModMenuCompatSetup;
44
import net.minecraftforge.client.gui.ModListScreen;
55
import org.spongepowered.asm.mixin.Mixin;
66
import org.spongepowered.asm.mixin.injection.At;
@@ -12,6 +12,6 @@ public class ModListScreenMixin {
1212

1313
@Inject(method = "init", at = @At("HEAD"))
1414
private void initModMenuCompat(CallbackInfo ci) {
15-
ModMenuCompat.init();
15+
ModMenuCompatSetup.init();
1616
}
1717
}

0 commit comments

Comments
 (0)