diff --git a/src/main/java/cc/irori/hyinit/ConfigCollector.java b/src/main/java/cc/irori/hyinit/ConfigCollector.java index a0b08c8..d259fef 100644 --- a/src/main/java/cc/irori/hyinit/ConfigCollector.java +++ b/src/main/java/cc/irori/hyinit/ConfigCollector.java @@ -35,6 +35,7 @@ public static Result collectMixinConfigs(Path workingDir, List earlyPlugin List warnings = new ArrayList<>(); Map origins = new LinkedHashMap<>(); LinkedHashSet configs = new LinkedHashSet<>(); + Set jarsWithMainClass = new LinkedHashSet<>(); for (Path dir : earlyPluginDirs) { if (!Files.isDirectory(dir)) { @@ -49,6 +50,11 @@ public static Result collectMixinConfigs(Path workingDir, List earlyPlugin if (entry == null) continue; JsonObject root = readJsonObject(jf, entry); + + if (hasMainClass(root)) { + jarsWithMainClass.add(jar); + } + List found = extractMixinConfigs(root); for (String cfg : found) { @@ -67,7 +73,11 @@ public static Result collectMixinConfigs(Path workingDir, List earlyPlugin } } - return new Result(List.copyOf(configs), Collections.unmodifiableMap(origins), List.copyOf(warnings)); + return new Result( + List.copyOf(configs), + Collections.unmodifiableMap(origins), + Collections.unmodifiableSet(jarsWithMainClass), + List.copyOf(warnings)); } private static List listJars(Path dir) { @@ -93,6 +103,12 @@ private static JsonObject readJsonObject(JarFile jar, JarEntry entry) throws IOE } } + private static boolean hasMainClass(JsonObject root) { + return root.has("Main") + && root.get("Main").isJsonPrimitive() + && !root.get("Main").getAsString().isEmpty(); + } + private static List extractMixinConfigs(JsonObject root) { if (root.has("Mixins")) { return readStringOrStringArray(root.get("Mixins")); @@ -117,11 +133,14 @@ private static String normalizeConfigPath(String raw) { public static final class Result { private final List configs; private final Map origins; + private final Set jarsWithMainClass; private final List warnings; - public Result(List configs, Map origins, List warnings) { + public Result( + List configs, Map origins, Set jarsWithMainClass, List warnings) { this.configs = Objects.requireNonNull(configs, "configs"); this.origins = Objects.requireNonNull(origins, "origins"); + this.jarsWithMainClass = Objects.requireNonNull(jarsWithMainClass, "jarsWithMainClass"); this.warnings = Objects.requireNonNull(warnings, "warnings"); } @@ -133,6 +152,10 @@ public Map origins() { return origins; } + public Set jarsWithMainClass() { + return jarsWithMainClass; + } + public List warnings() { return warnings; } diff --git a/src/main/java/cc/irori/hyinit/Main.java b/src/main/java/cc/irori/hyinit/Main.java index b929e47..3fe0a34 100644 --- a/src/main/java/cc/irori/hyinit/Main.java +++ b/src/main/java/cc/irori/hyinit/Main.java @@ -47,17 +47,18 @@ static void main(String[] args) throws Exception { earlyPluginDirs.add(cwd.resolve("earlyplugins")); earlyPluginDirs.addAll(parseEarlyPluginPaths(args)); + ConfigCollector.Result result = ConfigCollector.collectMixinConfigs(cwd, earlyPluginDirs); + result.warnings().forEach(LOGGER::warn); + for (Path dir : earlyPluginDirs) { for (Path path : collectClasspathJars(serverJar, dir)) { - classLoader.addCodeSource(path, new SourceMetadata(true)); + boolean hasMain = result.jarsWithMainClass().contains(path); + classLoader.addCodeSource(path, new SourceMetadata(true, hasMain)); } } HyinitMixinService.setGameClassLoader(classLoader); - ConfigCollector.Result result = ConfigCollector.collectMixinConfigs(cwd, earlyPluginDirs); - result.warnings().forEach(LOGGER::warn); - List configs = result.configs(); LOGGER.info("Found " + configs.size() + " Mixin config(s):"); for (String cfg : configs) { diff --git a/src/main/java/cc/irori/hyinit/ServerJarLocator.java b/src/main/java/cc/irori/hyinit/ServerJarLocator.java index 7b4d4b5..d37ec34 100644 --- a/src/main/java/cc/irori/hyinit/ServerJarLocator.java +++ b/src/main/java/cc/irori/hyinit/ServerJarLocator.java @@ -13,7 +13,8 @@ public final class ServerJarLocator { - private static final String[] ARG_KEYS = {"--server-jar", "--serverJar"}; + private static final String[] SERVER_JAR_KEYS = {"--server-jar", "--serverJar"}; + private static final String[] ARG_KEYS = {"--server-jar", "--serverJar", "--early-plugins"}; private static final String DEFAULT_SERVER_JAR = "HytaleServer.jar"; @@ -48,7 +49,7 @@ private static Optional parseServerJarArg(String[] args) { String a = args[i]; // --server-jar= / --serverJar= - for (String key : ARG_KEYS) { + for (String key : SERVER_JAR_KEYS) { String prefix = key + "="; if (a.startsWith(prefix) && a.length() > prefix.length()) { return Optional.of(Paths.get(a.substring(prefix.length()))); @@ -56,13 +57,20 @@ private static Optional parseServerJarArg(String[] args) { } // --server-jar / --serverJar - if (isKey(a) && i + 1 < args.length) { + if (isServerJarKey(a) && i + 1 < args.length) { return Optional.of(Paths.get(args[i + 1])); } } return Optional.empty(); } + private static boolean isServerJarKey(String arg) { + for (String key : SERVER_JAR_KEYS) { + if (key.equals(arg)) return true; + } + return false; + } + private static boolean isKey(String arg) { for (String key : ARG_KEYS) { String prefix = key + "="; @@ -74,9 +82,8 @@ private static boolean isKey(String arg) { private static boolean isValue(String arg, String[] args) { for (int i = 0; i < args.length; i++) { for (String key : ARG_KEYS) { - String prefix = key + "="; - if ((isKey(args[i])) && i + 1 < args.length) { - return !args[i].startsWith(prefix) && arg.equals(args[i + 1]); + if (key.equals(args[i]) && i + 1 < args.length && arg.equals(args[i + 1])) { + return true; } } } diff --git a/src/main/java/cc/irori/hyinit/mixin/impl/MixinPluginManager.java b/src/main/java/cc/irori/hyinit/mixin/impl/MixinPluginManager.java index 6482f51..1f382cb 100644 --- a/src/main/java/cc/irori/hyinit/mixin/impl/MixinPluginManager.java +++ b/src/main/java/cc/irori/hyinit/mixin/impl/MixinPluginManager.java @@ -42,7 +42,7 @@ public abstract class MixinPluginManager { } SourceMetadata meta = SourceMetaStore.get(LoaderUtil.normalizeExistingPath(jarPath)); - if (meta != null && meta.isEarlyPlugin()) { + if (meta != null && meta.isEarlyPlugin() && !meta.hasMainClass()) { continue; } } diff --git a/src/main/java/cc/irori/hyinit/shared/SourceMetadata.java b/src/main/java/cc/irori/hyinit/shared/SourceMetadata.java index 34b066d..0a095eb 100644 --- a/src/main/java/cc/irori/hyinit/shared/SourceMetadata.java +++ b/src/main/java/cc/irori/hyinit/shared/SourceMetadata.java @@ -1,3 +1,8 @@ package cc.irori.hyinit.shared; -public record SourceMetadata(boolean isEarlyPlugin) {} +public record SourceMetadata(boolean isEarlyPlugin, boolean hasMainClass) { + + public SourceMetadata(boolean isEarlyPlugin) { + this(isEarlyPlugin, false); + } +}