improve mod list
All checks were successful
Publish to snapshot maven / build (push) Successful in 19s
All checks were successful
Publish to snapshot maven / build (push) Successful in 19s
This commit is contained in:
parent
8a3267ffbe
commit
e67ee70cb5
|
@ -75,7 +75,8 @@ public class LoaderGui extends JFrame {
|
|||
|
||||
public static void execUnfulfilledDep(Path reportPath, ModDependencyResolver.UnfulfilledDependencyException ex, boolean keepRunning) {
|
||||
exec(gui -> {
|
||||
gui.setHeader("Found " + ex.getDependencies().size() + " problems");
|
||||
int count = ex.getDependencies().size();
|
||||
gui.setHeader("Found " + count + " problem"+(count > 1 ? "s" : ""));
|
||||
gui.addTab("Info", new UnfulfilledDepPage(ex));
|
||||
addReport(gui, reportPath);
|
||||
}, keepRunning);
|
||||
|
@ -83,7 +84,8 @@ public class LoaderGui extends JFrame {
|
|||
|
||||
public static void execBreakingDep(Path reportPath, ModDependencyResolver.BreakingModException ex, boolean keepRunning) {
|
||||
exec(gui -> {
|
||||
gui.setHeader("Found " + ex.getBreaks().size() + " problems");
|
||||
int count = ex.getBreaks().size();
|
||||
gui.setHeader("Found " + count + " problem"+(count > 1 ? "s" : ""));
|
||||
gui.addTab("Info", new BreakingDepPage(ex));
|
||||
addReport(gui, reportPath);
|
||||
}, keepRunning);
|
||||
|
|
|
@ -15,8 +15,9 @@ public class ReportPage extends JScrollPane {
|
|||
getHorizontalScrollBar().setUnitIncrement(16);
|
||||
getVerticalScrollBar().setUnitIncrement(16);
|
||||
|
||||
JTextPane text = new JTextPane();
|
||||
JTextArea text = new JTextArea();
|
||||
text.setEditable(false);
|
||||
text.setTabSize(2);
|
||||
try {
|
||||
text.setText(Files.readString(reportPath, StandardCharsets.UTF_8));
|
||||
} catch (IOException e) {
|
||||
|
@ -25,6 +26,7 @@ public class ReportPage extends JScrollPane {
|
|||
printer.printf("Could not load contents of %s:%n", reportPath);
|
||||
e.printStackTrace(printer);
|
||||
}
|
||||
text.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
|
||||
setViewportView(text);
|
||||
SwingUtilities.invokeLater(() -> getViewport().setViewPosition(new Point(0, 0)));
|
||||
}
|
||||
|
|
|
@ -133,7 +133,7 @@ public class ModPropertiesReader {
|
|||
|
||||
for (UnmodifiableConfig entry : dependenciesConfig) {
|
||||
String entryId = entry.get("id");
|
||||
String entryVersions = entry.get("versions");
|
||||
String entryVersions = entry.get(key.equals("provides") ? "version" : "versions");
|
||||
|
||||
if (entryId == null || entryId.isEmpty())
|
||||
badProperties.add("frog.dependencies." + key + '.' + i + ".id");
|
||||
|
|
|
@ -1,52 +1,69 @@
|
|||
package dev.frogmc.frogloader.impl.mod;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import dev.frogmc.frogloader.api.FrogLoader;
|
||||
import com.electronwill.nightconfig.core.UnmodifiableConfig;
|
||||
import dev.frogmc.frogloader.api.mod.ModProperties;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class ModUtil {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ModUtil.class);
|
||||
|
||||
public static String getModList(Collection<ModProperties> mods) {
|
||||
int size = mods.size();
|
||||
if (size == 0) {
|
||||
return "No mods loaded.";
|
||||
}
|
||||
|
||||
Map<String, ModProperties> modIdMap = mods.stream().collect(Collectors.toMap(ModProperties::id, m -> m));
|
||||
AtomicInteger indent = new AtomicInteger(1);
|
||||
Map<ModProperties, Collection<String>> parentToChildIdMap = getParentMods(mods);
|
||||
Collection<String> containedIds = parentToChildIdMap.values().stream().flatMap(Collection::stream).collect(Collectors.toUnmodifiableSet());
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append("Loaded ").append(size).append(" mod");
|
||||
List<ModProperties> parents = parentToChildIdMap.keySet().stream().filter(p -> !containedIds.contains(p.id()))
|
||||
.sorted(Comparator.comparing(ModProperties::id)).toList();
|
||||
int parentCount = parents.size();
|
||||
builder.append("Loaded ").append(parentCount).append(" (").append(size).append(")").append(" mod");
|
||||
if (size > 1) {
|
||||
builder.append("s");
|
||||
}
|
||||
builder.append(":");
|
||||
AtomicInteger i = new AtomicInteger();
|
||||
mods.stream().sorted(Comparator.comparing(ModProperties::id)).forEach(p -> {
|
||||
builder.append("\n\t");
|
||||
if (i.get() < size - 1) {
|
||||
builder.append("|- ");
|
||||
} else {
|
||||
builder.append("\\- ");
|
||||
}
|
||||
builder.append(p.id()).append(" (").append(p.name()).append(") ").append(" ").append(p.version());
|
||||
i.getAndIncrement();
|
||||
});
|
||||
parents.forEach(p -> printMod(modIdMap, p, builder, indent, parentToChildIdMap));
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
public static void installMod(String url) {
|
||||
try {
|
||||
Files.copy(URI.create(url).toURL().openStream(), FrogLoader.getInstance().getModsDir().resolve(url.substring(url.lastIndexOf("/" + 1))));
|
||||
} catch (IOException e) {
|
||||
LOGGER.error("Failed to install mod:", e);
|
||||
private static void printMod(Map<String, ModProperties> mods, ModProperties p, StringBuilder builder, AtomicInteger indent, Map<ModProperties, Collection<String>> parentToChildIdMap) {
|
||||
builder.append("\n").append("\t".repeat(indent.getAndIncrement()));
|
||||
Collection<String> children = parentToChildIdMap.get(p);
|
||||
if (!children.isEmpty()) {
|
||||
builder.append("\\- ");
|
||||
} else {
|
||||
builder.append("|- ");
|
||||
}
|
||||
|
||||
builder.append(p.id()).append(" (").append(p.name()).append(") ").append(" ").append(p.version());
|
||||
for (String s : children) {
|
||||
printMod(mods, mods.get(s), builder, indent, parentToChildIdMap);
|
||||
}
|
||||
indent.getAndDecrement();
|
||||
}
|
||||
|
||||
private static Map<ModProperties, Collection<String>> getParentMods(Collection<ModProperties> mods) {
|
||||
Map<ModProperties, Collection<String>> children = new HashMap<>();
|
||||
for (ModProperties mod : mods) {
|
||||
List<List<UnmodifiableConfig>> entries = mod.extensions().get(BuiltinExtensions.INCLUDED_JARS);
|
||||
if (entries != null) {
|
||||
for (var jars : entries) {
|
||||
for (var jar : jars) {
|
||||
String id = jar.get("id");
|
||||
children.computeIfAbsent(mod, m -> new HashSet<>()).add(id);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
children.computeIfAbsent(mod, m -> new HashSet<>());
|
||||
}
|
||||
}
|
||||
|
||||
return children;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import java.net.MalformedURLException;
|
|||
import java.nio.file.*;
|
||||
import java.util.*;
|
||||
|
||||
import com.electronwill.nightconfig.core.UnmodifiableConfig;
|
||||
import com.google.gson.JsonObject;
|
||||
import dev.frogmc.frogloader.api.FrogLoader;
|
||||
import dev.frogmc.frogloader.api.extensions.PreLaunchExtension;
|
||||
|
@ -123,13 +124,13 @@ public class Minecraft implements FrogPlugin {
|
|||
ModProperties p = opt.get();
|
||||
modProperties.add(p);
|
||||
modPaths.put(mod, p);
|
||||
List<List<Map<String, String>>> entries = p.extensions().getOrDefault(BuiltinExtensions.INCLUDED_JARS, Collections.emptyList());
|
||||
List<List<UnmodifiableConfig>> entries = p.extensions().getOrDefault(BuiltinExtensions.INCLUDED_JARS, Collections.emptyList());
|
||||
if (entries.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
try (FileSystem fs = FileSystems.newFileSystem(mod)) {
|
||||
for (var jars : entries) {
|
||||
for (Map<String, String> jar : jars) {
|
||||
for (List<UnmodifiableConfig> jars : entries) {
|
||||
for (UnmodifiableConfig jar : jars) {
|
||||
Path path = fs.getPath(jar.get("path")).toAbsolutePath();
|
||||
mods.add(path);
|
||||
findJiJMods(path, mods, modPaths);
|
||||
|
|
Loading…
Reference in a new issue