package io.gitlab.jfronny.inceptum.launcher.system.exporter; import io.gitlab.jfronny.commons.io.JFiles; import io.gitlab.jfronny.inceptum.common.InceptumConfig; import io.gitlab.jfronny.inceptum.launcher.model.curseforge.CurseforgeModpackManifest; import io.gitlab.jfronny.inceptum.launcher.system.instance.Instance; import io.gitlab.jfronny.inceptum.launcher.system.instance.Mod; import io.gitlab.jfronny.inceptum.launcher.system.source.CurseforgeModSource; import io.gitlab.jfronny.inceptum.launcher.system.source.ModSource; import io.gitlab.jfronny.inceptum.launcher.system.instance.ModPath; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.LinkedHashSet; import java.util.Set; public class CurseForgeExporter extends Exporter { private static final String OVERRIDES_DIR_DEFAULT = "overrides"; public CurseForgeExporter() { super("CurseForge", "zip", OVERRIDES_DIR_DEFAULT); } @Override protected CurseforgeModpackManifest generateManifests(Path root, Instance instance, String version) throws IOException { CurseforgeModpackManifest manifest = new CurseforgeModpackManifest(); manifest.minecraft = new CurseforgeModpackManifest.Minecraft(); manifest.minecraft.version = instance.meta().getMinecraftVersion(); manifest.manifestType = "minecraftModpack"; manifest.manifestVersion = 1; manifest.name = instance.getName(); manifest.version = version; manifest.author = InceptumConfig.authorName; manifest.overrides = OVERRIDES_DIR_DEFAULT; manifest.minecraft.modLoaders = new LinkedHashSet<>(); if (instance.isFabric()) { CurseforgeModpackManifest.Minecraft.ModLoader loader = new CurseforgeModpackManifest.Minecraft.ModLoader(); loader.id = "fabric-" + instance.meta().getLoaderVersion(); loader.primary = true; manifest.minecraft.modLoaders.add(loader); } JFiles.writeObject(root.resolve("manifest.json"), manifest); return manifest; } @Override protected void addMods(Path root, Instance instance, Iterable mods, CurseforgeModpackManifest manifest, Path modsOverrides) throws IOException { modsLoop: for(Mod mod : mods) { if (mod.needsInject()) { Set sources = mod.getMetadata().sources.keySet(); for (ModSource source : sources) { if (source instanceof CurseforgeModSource cms) { manifest.files.add(cms.toManifest()); continue modsLoop; } } } // Not available on CF Files.createDirectories(modsOverrides); Files.copy(mod.getJarPath(), modsOverrides.resolve(mod.getJarPath().getFileName().toString())); } JFiles.writeObject(root.resolve("manifest.json"), manifest); } }