From 16ed986576fc6cd0504b9270e9e39236acb1f044 Mon Sep 17 00:00:00 2001 From: fretuks Date: Sat, 23 May 2026 20:57:25 +0200 Subject: [PATCH] validate single skill tree provider to ensure compatibility and prevent UI overlap --- .../skilltree/SkillNodeLoader.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/net/fretux/skillengine/skilltree/SkillNodeLoader.java b/src/main/java/net/fretux/skillengine/skilltree/SkillNodeLoader.java index 0821a73..1369f5a 100644 --- a/src/main/java/net/fretux/skillengine/skilltree/SkillNodeLoader.java +++ b/src/main/java/net/fretux/skillengine/skilltree/SkillNodeLoader.java @@ -14,6 +14,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -36,6 +37,7 @@ public class SkillNodeLoader extends SimpleJsonResourceReloadListener { @NotNull ResourceManager resourceManager, @NotNull ProfilerFiller profiler) { SkillEngine.LOGGER.info("Loading skill nodes..."); + validateSingleSkillTreeProvider(jsons); SkillNodeRegistry.clear(); jsons.forEach((id, element) -> { JsonObject obj = element.getAsJsonObject(); @@ -84,4 +86,29 @@ public class SkillNodeLoader extends SimpleJsonResourceReloadListener { }); SkillEngine.LOGGER.info("Loaded {} skill nodes", SkillNodeRegistry.all().size()); } + + private static void validateSingleSkillTreeProvider(Map jsons) { + Map> providers = new LinkedHashMap<>(); + jsons.keySet().stream() + .filter(id -> !SkillEngine.MODID.equals(id.getNamespace())) + .forEach(id -> providers.computeIfAbsent(id.getNamespace(), ignored -> new ArrayList<>()).add(id)); + + if (providers.size() <= 1) { + return; + } + + StringBuilder message = new StringBuilder(); + message.append("Skill Engine detected multiple mods adding skill tree nodes: "); + providers.forEach((namespace, nodeIds) -> + message.append(namespace) + .append(" (") + .append(nodeIds.size()) + .append(" nodes), ")); + message.setLength(message.length() - 2); + message.append(". Skill Engine supports one skill tree provider at a time because multiple skill trees overlap in the same UI. Remove all but one skill tree addon."); + + String error = message.toString(); + SkillEngine.LOGGER.error(error); + throw new IllegalStateException(error); + } }