Skip to content

Support for packwiz-based modpacks #577

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

jcotton42
Copy link

Part of itzg/docker-minecraft-server#1818.

Still needs tests and fixing of TODOs, but opening this in draft as @ryleu expressed interest.

jcotton42 added 5 commits May 23, 2025 19:35
diff --git a/src/main/java/me/itzg/helpers/packwiz/InstallPackwizModpackCommand.java b/src/main/java/me/itzg/helpers/packwiz/InstallPackwizModpackCommand.java
index 84d9a0d..032bd27 100644
--- a/src/main/java/me/itzg/helpers/packwiz/InstallPackwizModpackCommand.java
+++ b/src/main/java/me/itzg/helpers/packwiz/InstallPackwizModpackCommand.java
@@ -2,15 +2,21 @@ package me.itzg.helpers.packwiz;

 import com.fasterxml.jackson.dataformat.toml.TomlMapper;
 import lombok.extern.slf4j.Slf4j;
+import me.itzg.helpers.errors.GenericException;
 import me.itzg.helpers.errors.InvalidParameterException;
+import me.itzg.helpers.fabric.FabricLauncherInstaller;
 import me.itzg.helpers.files.Manifests;
 import me.itzg.helpers.files.ResultsFileWriter;
+import me.itzg.helpers.forge.ForgeInstaller;
+import me.itzg.helpers.forge.ForgeInstallerResolver;
+import me.itzg.helpers.forge.NeoForgeInstallerResolver;
 import me.itzg.helpers.http.Fetch;
 import me.itzg.helpers.http.SharedFetch;
 import me.itzg.helpers.http.SharedFetchArgs;
 import me.itzg.helpers.modrinth.ModrinthModpackManifest;
 import me.itzg.helpers.packwiz.model.PackwizModLoader;
 import me.itzg.helpers.packwiz.model.PackwizPack;
+import me.itzg.helpers.quilt.QuiltInstaller;
 import org.apache.commons.lang3.tuple.Pair;
 import picocli.CommandLine.ArgGroup;
 import picocli.CommandLine.Command;
@@ -61,15 +67,19 @@ public final class InstallPackwizModpackCommand implements Callable<Integer> {
                 return ExitCode.OK;
             }

+            final String minecraftVersion = newManifest.minecraftVersion();
+            if (minecraftVersion == null) {
+                throw new GenericException("Minecraft version not set in packwiz pack");
+            }
+            // TODO might need to set/save the Minecraft version somewhere
+
             final Pair<PackwizModLoader, String> loaderInfo = getModLoader(newManifest);
             if (loaderInfo != null) {
                 final PackwizModLoader loader = loaderInfo.getLeft();
                 final String version = loaderInfo.getRight();
-                // TODO install modloader, see ModrinthPackInstaller::applyModLoader
+                installModLoader(fetch, loader, version, minecraftVersion);
             }

-            // might need to set the Minecraft version somewhere
-            final String minecraftVersion = newManifest.minecraftVersion();
             // populate the results file
             // run packwiz bootstrap
         }
@@ -80,6 +90,35 @@ public final class InstallPackwizModpackCommand implements Callable<Integer> {
         return ExitCode.OK;
     }

+    private void installModLoader(SharedFetch fetch, PackwizModLoader loader, String loaderVersion, String minecraftVersion) {
+        // TODO support forceReinstall parameters (the falses)
+        switch (loader) {
+            case NEOFORGE:
+                new ForgeInstaller(new NeoForgeInstallerResolver(fetch, minecraftVersion, loaderVersion))
+                    .install(outputDirectory, resultsFile, false, "NeoForge");
+                break;
+            case FORGE:
+                new ForgeInstaller(new ForgeInstallerResolver(fetch, minecraftVersion, loaderVersion))
+                    .install(outputDirectory, resultsFile, false, "Forge");
+                break;
+            case FABRIC:
+                new FabricLauncherInstaller(outputDirectory)
+                    .setResultsFile(resultsFile)
+                    .installUsingVersions(sharedFetchArgs.options(), minecraftVersion, loaderVersion, null);
+                break;
+            case QUILT:
+                try (QuiltInstaller installer = new QuiltInstaller(
+                    QuiltInstaller.DEFAULT_REPO_URL,
+                    sharedFetchArgs.options(),
+                    outputDirectory,
+                    minecraftVersion
+                ).setResultsFile(resultsFile)) {
+                    installer.installWithVersion(null, loaderVersion);
+                }
+                break;
+        }
+    }
+
     private Pair<PackwizModLoader, String> getModLoader(PackwizModpackManifest manifest) {
         // check NeoForge and Forge first, in case the pack is using Fabric mods on (Neo)Forge via Sinytra Connector or similar
         // (packwiz requires you to declare a fabric version in your pack.toml to add fabric mods to a (neo)forge-based pack)
@jcotton42 jcotton42 changed the title Pack type packwiz Support for packwiz-based modpacks Jun 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant