Backport installer changes
This commit is contained in:
parent
d0abf775ae
commit
888fe12add
@ -28,6 +28,7 @@ import java.nio.file.FileSystems;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.security.AccessControlContext;
|
import java.security.AccessControlContext;
|
||||||
import java.util.AbstractMap;
|
import java.util.AbstractMap;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -89,16 +90,16 @@ public class ForgeInstaller {
|
|||||||
var installForge = !Files.exists(path) || forgeClasspathMissing(path);
|
var installForge = !Files.exists(path) || forgeClasspathMissing(path);
|
||||||
if (!suppliers.isEmpty() || installForge) {
|
if (!suppliers.isEmpty() || installForge) {
|
||||||
System.out.println("Downloading missing libraries ...");
|
System.out.println("Downloading missing libraries ...");
|
||||||
ExecutorService pool = Executors.newFixedThreadPool(8);
|
ExecutorService pool = Executors.newWorkStealingPool(8);
|
||||||
CompletableFuture<?>[] array = suppliers.stream().map(reportSupply(pool, System.out::println)).toArray(CompletableFuture[]::new);
|
CompletableFuture<?>[] array = suppliers.stream().map(reportSupply(pool, System.out::println)).toArray(CompletableFuture[]::new);
|
||||||
if (installForge) {
|
if (installForge) {
|
||||||
CompletableFuture<?>[] futures = installForge(installInfo, pool, System.out::println);
|
var futures = installForge(installInfo, pool, System.out::println);
|
||||||
handleFutures(System.out::println, futures);
|
handleFutures(System.out::println, futures);
|
||||||
System.out.println("Forge installation is starting, please wait... ");
|
System.out.println("Forge installation is starting, please wait... ");
|
||||||
try {
|
try {
|
||||||
ProcessBuilder builder = new ProcessBuilder();
|
ProcessBuilder builder = new ProcessBuilder();
|
||||||
File file = new File(System.getProperty("java.home"), "bin/java");
|
File file = new File(System.getProperty("java.home"), "bin/java");
|
||||||
builder.command(file.getCanonicalPath(), "-Djava.net.useSystemProxies=true", "-jar", String.format("forge-%s-%s-installer.jar", installInfo.installer.minecraft, installInfo.installer.forge), "--installServer", ".", "--debug");
|
builder.command(file.getCanonicalPath(), "-Djava.net.useSystemProxies=true", "-jar", futures[0].join().toString(), "--installServer", ".", "--debug");
|
||||||
builder.inheritIO();
|
builder.inheritIO();
|
||||||
Process process = builder.start();
|
Process process = builder.start();
|
||||||
process.waitFor();
|
process.waitFor();
|
||||||
@ -126,11 +127,12 @@ public class ForgeInstaller {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CompletableFuture<?>[] installForge(InstallInfo info, ExecutorService pool, Consumer<String> logger) throws Exception {
|
@SuppressWarnings("unchecked")
|
||||||
|
private static CompletableFuture<Path>[] installForge(InstallInfo info, ExecutorService pool, Consumer<String> logger) throws Exception {
|
||||||
String format = String.format(INSTALLER_URL, info.installer.minecraft, info.installer.forge, info.installer.minecraft, info.installer.forge);
|
String format = String.format(INSTALLER_URL, info.installer.minecraft, info.installer.forge, info.installer.minecraft, info.installer.forge);
|
||||||
String dist = String.format("forge-%s-%s-installer.jar", info.installer.minecraft, info.installer.forge);
|
String dist = String.format("forge-%s-%s-installer.jar", info.installer.minecraft, info.installer.forge);
|
||||||
FileDownloader fd = new FileDownloader(format, dist, info.installer.hash);
|
FileDownloader fd = new FileDownloader(format, dist, info.installer.hash);
|
||||||
CompletableFuture<?> installerFuture = reportSupply(pool, logger).apply(fd).thenAccept(path -> {
|
var installerFuture = reportSupply(pool, logger).apply(fd).thenApply(path -> {
|
||||||
try {
|
try {
|
||||||
FileSystem system = FileSystems.newFileSystem(path, (ClassLoader) null);
|
FileSystem system = FileSystems.newFileSystem(path, (ClassLoader) null);
|
||||||
Map<String, Map.Entry<String, String>> map = new HashMap<>();
|
Map<String, Map.Entry<String, String>> map = new HashMap<>();
|
||||||
@ -144,12 +146,55 @@ public class ForgeInstaller {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
return stripDownloadMapping(path, logger);
|
||||||
});
|
});
|
||||||
CompletableFuture<?> serverFuture = reportSupply(pool, logger).apply(
|
var serverFuture = reportSupply(pool, logger).apply(
|
||||||
new FileDownloader(String.format(SERVER_URL, info.installer.minecraft),
|
new FileDownloader(String.format(SERVER_URL, info.installer.minecraft),
|
||||||
String.format("libraries/net/minecraft/server/%1$s/server-%1$s.jar", info.installer.minecraft), VERSION_HASH.get(info.installer.minecraft))
|
String.format("libraries/net/minecraft/server/%1$s/server-%1$s.jar", info.installer.minecraft), VERSION_HASH.get(info.installer.minecraft))
|
||||||
);
|
);
|
||||||
return new CompletableFuture<?>[]{installerFuture, serverFuture};
|
return new CompletableFuture[]{installerFuture, serverFuture};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Path stripDownloadMapping(Path installer, Consumer<String> logger) {
|
||||||
|
try {
|
||||||
|
logger.accept("Processing forge installer...");
|
||||||
|
var path = Paths.get(".arclight", "installer_stripped.jar");
|
||||||
|
if (!Files.isDirectory(path.getParent())) {
|
||||||
|
Files.createDirectories(path.getParent());
|
||||||
|
}
|
||||||
|
Files.copy(installer, path, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
try (var fs = FileSystems.newFileSystem(path)) {
|
||||||
|
// strip signature
|
||||||
|
Files.walk(fs.getPath("META-INF"))
|
||||||
|
.filter(it -> !Files.isDirectory(it))
|
||||||
|
.filter(it -> it.toString().endsWith(".SF") || it.toString().endsWith(".DSA") || it.toString().endsWith(".RSA"))
|
||||||
|
.forEach(it -> {
|
||||||
|
try {
|
||||||
|
Files.delete(it);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var profile = fs.getPath("install_profile.json");
|
||||||
|
var element = new JsonParser().parse(Files.readString(profile));
|
||||||
|
var processors = element.getAsJsonObject().getAsJsonArray("processors");
|
||||||
|
outer:
|
||||||
|
for (var i = 0; i < processors.size(); i++) {
|
||||||
|
var processor = processors.get(i).getAsJsonObject();
|
||||||
|
var args = processor.getAsJsonArray("args");
|
||||||
|
for (var arg : args) {
|
||||||
|
if (arg.getAsString().equals("DOWNLOAD_MOJMAPS")) {
|
||||||
|
processors.remove(i);
|
||||||
|
break outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Files.writeString(profile, new Gson().toJson(element));
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new CompletionException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void handleFutures(Consumer<String> logger, CompletableFuture<?>... futures) {
|
private static void handleFutures(Consumer<String> logger, CompletableFuture<?>... futures) {
|
||||||
@ -182,7 +227,7 @@ public class ForgeInstaller {
|
|||||||
var data = object.getAsJsonObject("data");
|
var data = object.getAsJsonObject("data");
|
||||||
if (data.has("MOJMAPS")) {
|
if (data.has("MOJMAPS")) {
|
||||||
var serverMapping = data.getAsJsonObject("MOJMAPS").get("server").getAsString();
|
var serverMapping = data.getAsJsonObject("MOJMAPS").get("server").getAsString();
|
||||||
ret.put(serverMapping.substring(1, serverMapping.length() -1),
|
ret.put(serverMapping.substring(1, serverMapping.length() - 1),
|
||||||
new AbstractMap.SimpleImmutableEntry<>(MAPPING_HASH.get(minecraft), MAPPING_URL.formatted(minecraft)));
|
new AbstractMap.SimpleImmutableEntry<>(MAPPING_HASH.get(minecraft), MAPPING_URL.formatted(minecraft)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,8 @@ import java.util.function.Supplier;
|
|||||||
public class MavenDownloader implements Supplier<Path> {
|
public class MavenDownloader implements Supplier<Path> {
|
||||||
|
|
||||||
private static final Function<String, String> FORGE_TO_BMCLAPI =
|
private static final Function<String, String> FORGE_TO_BMCLAPI =
|
||||||
s -> s.replace("https://files.minecraftforge.net/maven/", "https://download.mcbbs.net/maven/");
|
s -> s.replace("https://files.minecraftforge.net/maven/", "https://download.mcbbs.net/maven/")
|
||||||
|
.replace("https://maven.minecraftforge.net/", "https://download.mcbbs.net/maven/");
|
||||||
|
|
||||||
private final LinkedList<String> urls;
|
private final LinkedList<String> urls;
|
||||||
private final String coord;
|
private final String coord;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user