From c1651cdff0a590f29b231e8a21ba925f80e31c45 Mon Sep 17 00:00:00 2001 From: Jan-Bulthuis Date: Sun, 18 May 2025 06:28:46 +0200 Subject: [PATCH] Create nix-modpack --- README.md | 25 ++++++++++++++++ flake.nix | 30 ++++++++++++++++++++ packages/mkClient.nix | 66 +++++++++++++++++++++++++++++++++++++++++++ packages/mkServer.nix | 17 +++++++++++ 4 files changed, 138 insertions(+) create mode 100644 flake.nix create mode 100644 packages/mkClient.nix create mode 100644 packages/mkServer.nix diff --git a/README.md b/README.md index 073b972..2a43290 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ # nix-modpack +Create a modpack server or MultiMC client from a packwiz toml. + +## Creating a server +A server derivation can be created as follows: +```nix +nix-modpack.packages.${system}.mkServer { + packUrl = ""; + server = nix-minecraft.legacyPackages.${system}.${server} +} +``` +When this is added as a package to a flake, it can be started with `nix run`. + +## Creating a client +A client derivation can be created as follows: +```nix +nix-modpack.packages.${system}.mkClient { + packUrl = ""; + gameVersion = ""; + loaderUid = ""; + loaderVersion = ""; +} +``` +To use it you need to `nix build` it before importing the resulting `modpack.zip` into prism launcher. + +The `loaderUid` depends on the modloader, for NeoForge it is `net.neoforged`. It can be found experimentally by exporting an empty instance with the loader installed from prism launcher and inspecting the mmc-pack.json inside of it. \ No newline at end of file diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..42ef18b --- /dev/null +++ b/flake.nix @@ -0,0 +1,30 @@ +{ + description = "Create nix derivations from a packwiz modpack"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = + inputs: + let + lib = inputs.nixpkgs.lib; + eachSystem = + fn: lib.genAttrs lib.systems.flakeExposed (system: fn (import inputs.nixpkgs { inherit system; })); + in + { + packages = eachSystem ( + pkgs: + let + bootstrap = pkgs.fetchurl { + url = "https://github.com/packwiz/packwiz-installer-bootstrap/releases/download/v0.0.3/packwiz-installer-bootstrap.jar"; + sha256 = "qPuyTcYEJ46X9GiOgtPZGjGLmO/AjV2/y8vKtkQ9EWw="; + }; + in + { + mkServer = pkgs.callPackage ./packages/mkServer.nix { inherit bootstrap; }; + mkClient = pkgs.callPackage ./packages/mkClient.nix { inherit bootstrap; }; + } + ); + }; +} diff --git a/packages/mkClient.nix b/packages/mkClient.nix new file mode 100644 index 0000000..1ee7075 --- /dev/null +++ b/packages/mkClient.nix @@ -0,0 +1,66 @@ +{ + pkgs, + bootstrap, + ... +}: + +{ + packUrl, + gameVersion, + loaderUid, + loaderVersion, +}: + +pkgs.stdenvNoCC.mkDerivation { + name = "minecraft-client"; + + dontUnpack = true; + + mmcpack = '' + { + "components": [ + { + "important": true, + "uid": "net.minecraft", + "version": "${gameVersion}" + }, + { + "uid": "${loaderUid}", + "version": "${loaderVersion}" + } + ], + "formatVersion": 1 + } + ''; + + instancecfg = pkgs.writeText "instance.cfg" '' + [General] + ConfigVersion=1.2 + InstanceType=OneSix + OverrideCommands=true + PreLaunchCommand=\"$INST_JAVA\" -jar packwiz-installer-bootstrap.jar ${packUrl} + ''; + + buildPhase = '' + # Remove env-vars + rm env-vars + + # Add the mmc-pack + echo $mmcpack > ./mmc-pack.json + + # Add the instance-cfg + cp $instancecfg ./instance.cfg + + # Add the bootstrap jar + mkdir ./minecraft + cp ${bootstrap} ./minecraft/packwiz-installer-bootstrap.jar + + # Zip everything together + ${pkgs.zip}/bin/zip -r modpack.zip ./* + ''; + + installPhase = '' + mkdir $out + mv modpack.zip $out/ + ''; +} diff --git a/packages/mkServer.nix b/packages/mkServer.nix new file mode 100644 index 0000000..1ef6d9d --- /dev/null +++ b/packages/mkServer.nix @@ -0,0 +1,17 @@ +{ + lib, + pkgs, + bootstrap, + ... +}: + +{ + packUrl, + server, + jre ? pkgs.jre, +}: + +pkgs.writeShellScriptBin "minecraft-server" '' + ${lib.getExe jre} -jar ${bootstrap} -g -s server ${packUrl} + ${server}/bin/${server.name} +''