Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 25 additions & 2 deletions src/main/java/cc/irori/hyinit/ConfigCollector.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public static Result collectMixinConfigs(Path workingDir, List<Path> earlyPlugin
List<String> warnings = new ArrayList<>();
Map<String, Path> origins = new LinkedHashMap<>();
LinkedHashSet<String> configs = new LinkedHashSet<>();
Set<Path> jarsWithMainClass = new LinkedHashSet<>();

for (Path dir : earlyPluginDirs) {
if (!Files.isDirectory(dir)) {
Expand All @@ -49,6 +50,11 @@ public static Result collectMixinConfigs(Path workingDir, List<Path> earlyPlugin
if (entry == null) continue;

JsonObject root = readJsonObject(jf, entry);

if (hasMainClass(root)) {
jarsWithMainClass.add(jar);
}

List<String> found = extractMixinConfigs(root);

for (String cfg : found) {
Expand All @@ -67,7 +73,11 @@ public static Result collectMixinConfigs(Path workingDir, List<Path> 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<Path> listJars(Path dir) {
Expand All @@ -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<String> extractMixinConfigs(JsonObject root) {
if (root.has("Mixins")) {
return readStringOrStringArray(root.get("Mixins"));
Expand All @@ -117,11 +133,14 @@ private static String normalizeConfigPath(String raw) {
public static final class Result {
private final List<String> configs;
private final Map<String, Path> origins;
private final Set<Path> jarsWithMainClass;
private final List<String> warnings;

public Result(List<String> configs, Map<String, Path> origins, List<String> warnings) {
public Result(
List<String> configs, Map<String, Path> origins, Set<Path> jarsWithMainClass, List<String> 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");
}

Expand All @@ -133,6 +152,10 @@ public Map<String, Path> origins() {
return origins;
}

public Set<Path> jarsWithMainClass() {
return jarsWithMainClass;
}

public List<String> warnings() {
return warnings;
}
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/cc/irori/hyinit/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> configs = result.configs();
LOGGER.info("Found " + configs.size() + " Mixin config(s):");
for (String cfg : configs) {
Expand Down
19 changes: 13 additions & 6 deletions src/main/java/cc/irori/hyinit/ServerJarLocator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -48,21 +49,28 @@ private static Optional<Path> parseServerJarArg(String[] args) {
String a = args[i];

// --server-jar=<path> / --serverJar=<path>
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())));
}
}

// --server-jar <path> / --serverJar <path>
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 + "=";
Expand All @@ -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;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/cc/irori/hyinit/shared/SourceMetadata.java
Original file line number Diff line number Diff line change
@@ -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);
}
}