diff --git a/pkgs/linux/vintage-story.nix b/pkgs/linux/vintage-story.nix index f859aca..295ff89 100644 --- a/pkgs/linux/vintage-story.nix +++ b/pkgs/linux/vintage-story.nix @@ -1,100 +1,129 @@ -{ pkgs }: -let - x11Support = true; - waylandSupport = true; -in pkgs.stdenv.mkDerivation (finalAttrs: - let - inherit (pkgs) lib; - in { - pname = "vintagestory"; - version = "1.22.3"; +{ + lib, + stdenv, + fetchurl, + makeWrapper, + makeDesktopItem, + copyDesktopItems, + versionCheckHook, + cairo, + libGLU, + libglvnd, + pipewire, + libpulseaudio, + dotnet-runtime_10, + x11Support ? true, + libxi, + libxcursor, + libx11, + waylandSupport ? false, + wayland ? null, + libxkbcommon ? null, +}: - src = pkgs.fetchurl { - url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${finalAttrs.version}.tar.gz"; - hash = "sha256-sa4Pj1DwT6W6LJCAYznmbyqPtMUTaLSNTkXS1imQp04="; - }; +assert x11Support || waylandSupport; +assert waylandSupport -> wayland != null; +assert waylandSupport -> libxkbcommon != null; - nativeBuildInputs = with pkgs; [ - makeWrapper - copyDesktopItems - ]; +stdenv.mkDerivation (finalAttrs: { + pname = "vintagestory"; + version = "1.22.3"; - runtimeLibs = with pkgs; [ - gtk2 - sqlite - openal + src = fetchurl { + url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${finalAttrs.version}.tar.gz"; + hash = "sha256-sa4Pj1DwT6W6LJCAYznmbyqPtMUTaLSNTkXS1imQp04="; + }; + + __structuredAttrs = true; + + nativeBuildInputs = [ + makeWrapper + copyDesktopItems + ]; + + desktopItems = [ + (makeDesktopItem { + name = "vintagestory"; + desktopName = "Vintage Story"; + exec = "vintagestory"; + icon = "vintagestory"; + comment = "Innovate and explore in a sandbox world"; + categories = [ "Game" ]; + }) + + (makeDesktopItem { + name = "vsmodinstall-handler"; + desktopName = "Vintage Story 1-click Mod Install Handler"; + comment = "Handler for vintagestorymodinstall:// URI scheme"; + exec = "vintagestory -i %u"; + mimeTypes = [ "x-scheme-handler/vintagestorymodinstall" ]; + noDisplay = true; + terminal = false; + }) + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/vintagestory $out/bin $out/share/icons/hicolor/512x512/apps $out/share/fonts/truetype + cp -r * $out/share/vintagestory + install -Dm444 $out/share/vintagestory/assets/gameicon.png $out/share/icons/hicolor/512x512/apps/vintagestory.png + cp $out/share/vintagestory/assets/game/fonts/*.ttf $out/share/fonts/truetype + + rm -rvf $out/share/vintagestory/{install,run,server}.sh + + runHook postInstall + ''; + + makeWrapperArgs = [ + "--set-default" + "mesa_glthread" + "true" + ] + ++ lib.optionals waylandSupport [ + "--set-default" + "OPENTK_4_USE_WAYLAND" + "1" + ]; + + runtimeLibraryPath = lib.makeLibraryPath finalAttrs.passthru.runtimeLibs; + preFixup = '' + makeWrapperArgs+=(--prefix LD_LIBRARY_PATH : "$runtimeLibraryPath") + + makeWrapper ${lib.meta.getExe dotnet-runtime_10} $out/bin/vintagestory \ + "''${makeWrapperArgs[@]}" \ + --add-flags $out/share/vintagestory/Vintagestory.dll + + makeWrapper ${lib.getExe dotnet-runtime_10} $out/bin/vintagestory-server \ + "''${makeWrapperArgs[@]}" \ + --add-flags $out/share/vintagestory/VintagestoryServer.dll + + find "$out/share/vintagestory/assets/" -not -path "*/fonts/*" -regex ".*/.*[A-Z].*" | while read -r file; do + local filename="$(basename -- "$file")" + ln -sf "$filename" "''${file%/*}"/"''${filename,,}" + done + ''; + + doInstallCheck = true; + installCheckInputs = [ versionCheckHook ]; + + passthru = { + updateScript = ./update.sh; + runtimeLibs = [ cairo libGLU - SDL2 - freealut libglvnd pipewire libpulseaudio ] - ++ lib.optionals x11Support (with pkgs.xorg; [ - libX11 - libXi - libXcursor - ]) - ++ lib.optionals waylandSupport (with pkgs; [ + ++ lib.optionals x11Support [ + libx11 + libxi + libxcursor + ] + ++ lib.optionals waylandSupport [ wayland libxkbcommon - ]); - - desktopItems = [ - (pkgs.makeDesktopItem { - name = "vintagestory"; - desktopName = "Vintage Story"; - exec = "vintagestory"; - icon = "vintagestory"; - comment = "Innovate and explore in a sandbox world"; - categories = [ "Game" ]; - }) - - (pkgs.makeDesktopItem { - name = "vsmodinstall-handler"; - desktopName = "Vintage Story 1-click Mod Install Handler"; - comment = "Handler for vintagestorymodinstall:// URI scheme"; - exec = "vintagestory -i %u"; - mimeTypes = [ "x-scheme-handler/vintagestorymodinstall" ]; - noDisplay = true; - terminal = false; - }) ]; - - installPhase = '' - runHook preInstall - - mkdir -p $out/share/vintagestory $out/bin $out/share/pixmaps $out/share/fonts/truetype - cp -r * $out/share/vintagestory - cp $out/share/vintagestory/assets/gameicon.xpm $out/share/pixmaps/vintagestory.xpm - cp $out/share/vintagestory/assets/game/fonts/*.ttf $out/share/fonts/truetype - - runHook postInstall - ''; - - preFixup = - let - runtimeLibs' = lib.strings.makeLibraryPath finalAttrs.runtimeLibs; - in - '' - makeWrapper ${lib.meta.getExe pkgs.dotnet-runtime_10} $out/bin/vintagestory \ - --prefix LD_LIBRARY_PATH : "${runtimeLibs'}" \ - --set-default mesa_glthread true \ - ${lib.strings.optionalString waylandSupport '' - --set-default OPENTK_4_USE_WAYLAND 1 \ - ''} \ - --add-flags $out/share/vintagestory/Vintagestory.dll - - makeWrapper ${lib.meta.getExe pkgs.dotnet-runtime_10} $out/bin/vintagestory-server \ - --prefix LD_LIBRARY_PATH : "${runtimeLibs'}" \ - --set-default mesa_glthread true \ - --add-flags $out/share/vintagestory/VintagestoryServer.dll - - find "$out/share/vintagestory/assets/" -not -path "*/fonts/*" -regex ".*/.*[A-Z].*" | while read -r file; do - local filename="$(basename -- "$file")" - ln -sf "$filename" "''${file%/*}"/"''${filename,,}" - done - ''; - } - ) + }; +})