From 77dad892b02db122f540ec3a9ae46d2ba9a034cd Mon Sep 17 00:00:00 2001 From: poizzy Date: Sat, 21 Feb 2026 01:07:47 +0100 Subject: [PATCH 1/6] [feat] Added library block to UMC setup --- .../cam72cam/universalmodcore/Config.java | 82 ++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/src/main/java/cam72cam/universalmodcore/Config.java b/src/main/java/cam72cam/universalmodcore/Config.java index 98d6fbe..be87e08 100644 --- a/src/main/java/cam72cam/universalmodcore/Config.java +++ b/src/main/java/cam72cam/universalmodcore/Config.java @@ -1,5 +1,6 @@ package cam72cam.universalmodcore; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -11,6 +12,8 @@ import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; public class Config { public final Mod mod; @@ -26,6 +29,7 @@ public static class Mod { public final String id; public final String version; public final List dependencies; + public final List libraries = new ArrayList<>(); public static class Dependency { public final String id; @@ -49,6 +53,7 @@ public Mod(JsonObject data) { this.dependencies = data.get("dependencies").getAsJsonObject().entrySet().stream() .map((e) -> new Dependency(e.getKey(), e.getValue().getAsJsonObject())) .collect(Collectors.toList()); + data.get("libraries").getAsJsonArray().forEach(e -> libraries.add(new Library(e.getAsJsonObject()))); } } @@ -74,6 +79,41 @@ public UMC(JsonObject data) { } } + public static class Library { + public final boolean isPath; + public final String id; + public final String repo; + public final boolean hasRelocation; + public String relocateFrom; + public String relocateTo; + public final String type; + public final List onlyIn = new ArrayList<>(); + + public Library(JsonObject data) { + this.isPath = data.has("path"); + this.id = isPath ? data.get("path").getAsString() : data.get("artifact").getAsString(); + + this.hasRelocation = data.has("relocate"); + + this.type = data.get("type").getAsString(); + + if (data.has("onlyIn")) { + data.get("onlyIn").getAsJsonArray().forEach(e -> onlyIn.add(e.getAsString())); + } + + if (hasRelocation) { + String[] path = data.get("relocate").getAsString().replaceAll(" ", "").split("\\|"); + if (path.length != 2) { + throw new IllegalArgumentException("Relocate needs needs two paths separated by a '|'"); + } + relocateFrom = path[0]; + relocateTo = path[1]; + } + + this.repo = isPath ? "" : data.get("repository").getAsString(); + } + } + public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIException, IOException { mod = new Mod(data.get("mod").getAsJsonObject()); integration = data.has("integration") ? new Integration(data.get("integration").getAsJsonObject()) : null; @@ -91,6 +131,36 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce vars.put("MINECRAFT", mcVersion); vars.put("LOADER", brand.toString()); + StringBuilder libRepos = new StringBuilder(); + StringBuilder depends = new StringBuilder(); + StringBuilder relocate = new StringBuilder(); + + if (!mod.libraries.isEmpty()) { + for (Library library : mod.libraries) { + if (!library.onlyIn.isEmpty() && !library.onlyIn.contains(minecraftLoader)) { + continue; + } + + if (!library.repo.isEmpty()) { + libRepos.append(String.format("\tmaven { url = \"%s\" }", library.repo)).append("\n"); + } + + if (library.hasRelocation) { + relocate.append(String.format("\trelocate '%s', \"%s\"", library.relocateFrom, library.relocateTo)).append("\n"); + } + + if (library.isPath) { + depends.append(String.format("\t%s files('%s')", library.type, library.id)).append("\n"); + } else { + depends.append(String.format("\t%s '%s'", library.type, library.id)).append("\n"); + } + } + } + + vars.put("LIB_REPOS", stripNewline(libRepos)); + vars.put("SHADOW", stripNewline(depends)); + vars.put("RELOCATE", stripNewline(relocate)); + String version = require("umc.version", umc.version); if (version.equals("latest")) { @@ -131,11 +201,11 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce if (!jar.exists()) { throw new RuntimeException(String.format("Unable to find UMC jar: %s", jar)); } - vars.put("UMC_REPO", String.format("repositories { flatDir { dirs '%s' } }", jar.getParent())); + vars.put("UMC_REPO", String.format("flatDir { dirs '%s' }", jar.getParent())); vars.put("UMC_DEPENDENCY", String.format("name: '%s'", jar.getName().replace(".jar", ""))); vars.put("UMC_FILE", jar.getPath()); } else { - vars.put("UMC_REPO", "repositories { maven { url = \"https://teamopenindustry.cc/maven\" }}"); + vars.put("UMC_REPO", "maven { url = \"https://teamopenindustry.cc/maven\" }"); vars.put("UMC_DEPENDENCY", String.format("'cam72cam.universalmodcore:UniversalModCore:%s-%s'", minecraftLoader, version)); vars.put("UMC_DOWNLOAD", String.format("https://teamopenindustry.cc/maven/cam72cam/universalmodcore/UniversalModCore/%s-%s/UniversalModCore-%s-%s.jar", minecraftLoader, version, minecraftLoader, version)); } @@ -182,6 +252,14 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce vars.put("FABRIC_SOMETHING_DEPENDENCIES", "TODO"); } + private String stripNewline(StringBuilder sb) { + int len = sb.length(); + if (len > 0 && sb.charAt(len - 1) == '\n') { + sb.deleteCharAt(len - 1); + } + return sb.toString(); + } + private String require(String name, String s) { if (s == null || s.trim().isEmpty()) { From 2d79704830e4684222c79f772a2a52a0cbd1c17b Mon Sep 17 00:00:00 2001 From: poizzy Date: Sat, 21 Feb 2026 01:30:02 +0100 Subject: [PATCH 2/6] [cleanup] Remove unnecessary imports --- src/main/java/cam72cam/universalmodcore/Config.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/cam72cam/universalmodcore/Config.java b/src/main/java/cam72cam/universalmodcore/Config.java index be87e08..d9c1045 100644 --- a/src/main/java/cam72cam/universalmodcore/Config.java +++ b/src/main/java/cam72cam/universalmodcore/Config.java @@ -1,6 +1,5 @@ package cam72cam.universalmodcore; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -12,8 +11,6 @@ import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; public class Config { public final Mod mod; From 21ceb0faa6dfb1d7048c8bb645d60e97942c9e2f Mon Sep 17 00:00:00 2001 From: poizzy Date: Sat, 21 Feb 2026 01:32:50 +0100 Subject: [PATCH 3/6] [fix] Fixed NullPointer when missing the libraries block --- src/main/java/cam72cam/universalmodcore/Config.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/universalmodcore/Config.java b/src/main/java/cam72cam/universalmodcore/Config.java index d9c1045..45eb02a 100644 --- a/src/main/java/cam72cam/universalmodcore/Config.java +++ b/src/main/java/cam72cam/universalmodcore/Config.java @@ -50,7 +50,9 @@ public Mod(JsonObject data) { this.dependencies = data.get("dependencies").getAsJsonObject().entrySet().stream() .map((e) -> new Dependency(e.getKey(), e.getValue().getAsJsonObject())) .collect(Collectors.toList()); - data.get("libraries").getAsJsonArray().forEach(e -> libraries.add(new Library(e.getAsJsonObject()))); + if (data.has("libraries")) { + data.get("libraries").getAsJsonArray().forEach(e -> libraries.add(new Library(e.getAsJsonObject()))); + } } } From a3ab1705577f2594dedb2f1176b5c2eadcba4d93 Mon Sep 17 00:00:00 2001 From: poizzy Date: Fri, 27 Feb 2026 16:39:20 +0100 Subject: [PATCH 4/6] [fix] Renamed var patterns --- src/main/java/cam72cam/universalmodcore/Config.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/cam72cam/universalmodcore/Config.java b/src/main/java/cam72cam/universalmodcore/Config.java index 45eb02a..c33b65e 100644 --- a/src/main/java/cam72cam/universalmodcore/Config.java +++ b/src/main/java/cam72cam/universalmodcore/Config.java @@ -157,8 +157,8 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce } vars.put("LIB_REPOS", stripNewline(libRepos)); - vars.put("SHADOW", stripNewline(depends)); - vars.put("RELOCATE", stripNewline(relocate)); + vars.put("MOD_DEPENDENCIES", stripNewline(depends)); + vars.put("RELOCATION", stripNewline(relocate)); String version = require("umc.version", umc.version); From 269ad7635706476aa250ab242889eaadc71f7ee3 Mon Sep 17 00:00:00 2001 From: poizzy Date: Sat, 28 Feb 2026 03:25:54 +0100 Subject: [PATCH 5/6] [feat] Changed from files() to flatDir --- .../cam72cam/universalmodcore/Config.java | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/src/main/java/cam72cam/universalmodcore/Config.java b/src/main/java/cam72cam/universalmodcore/Config.java index c33b65e..9810c92 100644 --- a/src/main/java/cam72cam/universalmodcore/Config.java +++ b/src/main/java/cam72cam/universalmodcore/Config.java @@ -79,7 +79,7 @@ public UMC(JsonObject data) { } public static class Library { - public final boolean isPath; + public final boolean isDir; public final String id; public final String repo; public final boolean hasRelocation; @@ -89,8 +89,16 @@ public static class Library { public final List onlyIn = new ArrayList<>(); public Library(JsonObject data) { - this.isPath = data.has("path"); - this.id = isPath ? data.get("path").getAsString() : data.get("artifact").getAsString(); + this.id = data.get("artifact").getAsString(); + + String repoType = data.get("repositoryType").getAsString(); + + switch (repoType) { + case "URL": this.isDir = false; break; + case "Dir": this.isDir = true; break; + default: throw new IllegalArgumentException("The repository Type needs to be either \"URL\" or \"Dir\""); + } + this.hasRelocation = data.has("relocate"); @@ -109,7 +117,7 @@ public Library(JsonObject data) { relocateTo = path[1]; } - this.repo = isPath ? "" : data.get("repository").getAsString(); + this.repo = data.get("repository").getAsString(); } } @@ -130,35 +138,41 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce vars.put("MINECRAFT", mcVersion); vars.put("LOADER", brand.toString()); - StringBuilder libRepos = new StringBuilder(); - StringBuilder depends = new StringBuilder(); - StringBuilder relocate = new StringBuilder(); - - if (!mod.libraries.isEmpty()) { - for (Library library : mod.libraries) { - if (!library.onlyIn.isEmpty() && !library.onlyIn.contains(minecraftLoader)) { - continue; - } + List repoLines = new ArrayList<>(); + List depLines = new ArrayList<>(); + List relLines = new ArrayList<>(); + List flatDirs = new ArrayList<>(); - if (!library.repo.isEmpty()) { - libRepos.append(String.format("\tmaven { url = \"%s\" }", library.repo)).append("\n"); - } + for (Library library : mod.libraries) { + if (!library.onlyIn.isEmpty() && !library.onlyIn.contains(minecraftLoader)) { + continue; + } - if (library.hasRelocation) { - relocate.append(String.format("\trelocate '%s', \"%s\"", library.relocateFrom, library.relocateTo)).append("\n"); - } + if (library.isDir) { + flatDirs.add(library.repo); + } else { + repoLines.add("\tmaven { url = \"" + library.repo + "\""); + } - if (library.isPath) { - depends.append(String.format("\t%s files('%s')", library.type, library.id)).append("\n"); - } else { - depends.append(String.format("\t%s '%s'", library.type, library.id)).append("\n"); - } + if (library.hasRelocation) { + relLines.add("\trelocate'" + library.relocateFrom + "', \"" + library.relocateTo + "\""); } + + depLines.add("\t" + library.type + " '" + library.id + "'"); } - vars.put("LIB_REPOS", stripNewline(libRepos)); - vars.put("MOD_DEPENDENCIES", stripNewline(depends)); - vars.put("RELOCATION", stripNewline(relocate)); + if (!flatDirs.isEmpty()) { + String flatDirBlock = + "\tflatDir {\n" + + "\t\tdirs " + String.join(", ", flatDirs) + "\n" + + "\t}"; + + repoLines.add(0, flatDirBlock); + } + + vars.put("LIB_REPOS", String.join("\n", repoLines)); + vars.put("MOD_DEPENDENCIES", String.join("\n", depLines)); + vars.put("RELOCATION", String.join("\n", relLines)); String version = require("umc.version", umc.version); @@ -251,14 +265,6 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce vars.put("FABRIC_SOMETHING_DEPENDENCIES", "TODO"); } - private String stripNewline(StringBuilder sb) { - int len = sb.length(); - if (len > 0 && sb.charAt(len - 1) == '\n') { - sb.deleteCharAt(len - 1); - } - return sb.toString(); - } - private String require(String name, String s) { if (s == null || s.trim().isEmpty()) { From bfcfe1f4493d63073a841258a7c3805ad0a112af Mon Sep 17 00:00:00 2001 From: poizzy Date: Sat, 28 Feb 2026 03:32:29 +0100 Subject: [PATCH 6/6] [fix] Added missing quotes --- src/main/java/cam72cam/universalmodcore/Config.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/universalmodcore/Config.java b/src/main/java/cam72cam/universalmodcore/Config.java index 9810c92..6aaec53 100644 --- a/src/main/java/cam72cam/universalmodcore/Config.java +++ b/src/main/java/cam72cam/universalmodcore/Config.java @@ -149,7 +149,7 @@ public Config(JsonObject data, String mcVersion, Loader brand) throws GitAPIExce } if (library.isDir) { - flatDirs.add(library.repo); + flatDirs.add("'" + library.repo + "'"); } else { repoLines.add("\tmaven { url = \"" + library.repo + "\""); }