ModsMod/src/main/java/io/gitlab/jfronny/modsmod/PreLaunch.java

105 lines
4.1 KiB
Java

package io.gitlab.jfronny.modsmod;
import ai.arcblroth.mixon.api.MixonModInjector;
import ai.arcblroth.mixon.api.PrePrePreLaunch;
import me.sargunvohra.mcmods.autoconfig1u.AutoConfig;
import me.sargunvohra.mcmods.autoconfig1u.serializer.JanksonConfigSerializer;
import net.fabricmc.loader.api.FabricLoader;
import org.apache.commons.io.FileUtils;
import org.lwjgl.system.CallbackI;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class PreLaunch implements PrePrePreLaunch {
@Override
public void onPrePrePreLaunch() {
//Load config
AutoConfig.register(Cfg.class, JanksonConfigSerializer::new);
Cfg cfg = AutoConfig.getConfigHolder(Cfg.class).getConfig();
Path configDir = FabricLoader.getInstance().getConfigDir();
MixonModInjector injector = MixonModInjector.getInstance();
String modsmodCfgFileName = "ModsMod.json5";
//make sure the modsmodcache dir is ok
File path = new File(configDir.toFile(), "modsmodcache");
if (!path.isDirectory()) {
if (path.exists())
path.delete();
path.mkdir();
}
//remove modsmodcache if the cache is outdated
try {
File cfgCache = new File(path, "_basecfg");
if (cfgCache.exists()) {
if (cfgCache.isFile()) {
if (!FileUtils.contentEquals(new File(configDir.toFile(), modsmodCfgFileName), cfgCache)) {
FileUtils.deleteDirectory(path);
path.mkdir();
}
}
else {
FileUtils.deleteDirectory(path);
path.mkdir();
}
}
Files.copy(Paths.get(configDir.toString(), modsmodCfgFileName), cfgCache.toPath(), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
System.err.println("Failed to validate modsmod config cache, caching will not be available");
e.printStackTrace();
}
//Generate mods
for (int i = 0; i < cfg.modsCount; i++) {
File f = new File(path, "f" + i + ".jar");
injector.addMod(f);
//Do not load if cached
if (f.exists()) {
if (cfg.cache) continue;
else f.delete();
}
//Generate jar
ZipOutputStream out;
try {
out = new ZipOutputStream(new FileOutputStream(f));
//META-INF/MANIFEST.MF (java jar file spec)
ZipEntry e = new ZipEntry("META-INF/MANIFEST.MF");
out.putNextEntry(e);
StringBuilder sb = new StringBuilder();
sb.append("Manifest-Version: 1.0\n");
out.write(sb.toString().getBytes());
out.closeEntry();
//fabric.mod.json (fabric mod metadata)
e = new ZipEntry("fabric.mod.json");
out.putNextEntry(e);
sb = new StringBuilder();
sb.append("{");
sb.append("\"schemaVersion\": 1,");
sb.append("\"id\": \"modmod_").append(i).append("\",");
sb.append("\"version\": \"1.0\",");
sb.append("\"name\": \"ModsMod ").append(i).append("\",");
//sb.append("\"icon\": \"assets/modsmod/icon_1.png\",");
sb.append("\"entrypoints\": {},");
sb.append("\"custom\": {");
if (cfg.parent) {
sb.append("\"modmenu:parent\": \"modsmod\"");
}
sb.append("}");
sb.append("}");
out.write(sb.toString().getBytes());
out.closeEntry();
//Make file available
out.close();
} catch (IOException e) {
System.err.println("Failed to generate mod!");
e.printStackTrace();
}
}
}
}