{ lib , stdenv , cmake , openmw , fetchFromGitHub , formats , luajit , makeWrapper , symlinkJoin , mygui , crudini }: # revisions are taken from https://github.com/GrimKriegor/TES3MP-deploy let # raknet could also be split into dev and lib outputs raknet = stdenv.mkDerivation { pname = "raknet"; version = "unstable-2020-01-19"; src = fetchFromGitHub { owner = "TES3MP"; repo = "CrabNet"; # usually fixed: # https://github.com/GrimKriegor/TES3MP-deploy/blob/af49c67317258624debe1b5a9f8792f4cc3ad2d1/tes3mp-deploy.sh#L518 rev = "19e66190e83f53bcdcbcd6513238ed2e54878a21"; sha256 = "sha256-WIaJkSQnoOm9T7GoAwmWl7fNg79coIo/ILUsWcbH+lA="; }; nativeBuildInputs = [ cmake ]; installPhase = '' install -Dm555 lib/libRakNetLibStatic.a $out/lib/libRakNetLibStatic.a ''; }; coreScripts = stdenv.mkDerivation { pname = "corescripts"; version = "unstable-2022-10-21"; src = fetchFromGitHub { owner = "TES3MP"; repo = "CoreScripts"; # usually latest in stable branch (e.g. 0.8.1) rev = "6ae0a2a5d16171de3764817a7f8b1067ecde3def"; sha256 = "sha256-8j/Sr9IRMNFPEVfFzdb42PckHS3KW7FH7x7rRxIh5gY="; }; buildCommand = '' dir=$out/share/openmw-tes3mp mkdir -p $dir cp -r $src $dir/CoreScripts ''; }; # build an unwrapped version so we don't have to rebuild it all over again in # case the scripts or wrapper scripts change. unwrapped = openmw.overrideAttrs (oldAttrs: rec { pname = "tes3mp-unwrapped"; version = "0.8.1"; src = fetchFromGitHub { owner = "TES3MP"; repo = "TES3MP"; # usually latest in stable branch (e.g. 0.8.1) rev = "68954091c54d0596037c4fb54d2812313b7582a1"; sha256 = "sha256-8/bV4sw7Q8l8bDTHGQ0t4owf6J6h9q468JFx4KegY5o="; }; nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ makeWrapper ]; buildInputs = oldAttrs.buildInputs ++ [ luajit ]; cmakeFlags = oldAttrs.cmakeFlags ++ [ "-DBUILD_OPENCS=OFF" "-DRakNet_INCLUDES=${raknet.src}/include" "-DRakNet_LIBRARY_RELEASE=${raknet}/lib/libRakNetLibStatic.a" "-DRakNet_LIBRARY_DEBUG=${raknet}/lib/libRakNetLibStatic.a" ]; prePatch = '' substituteInPlace components/process/processinvoker.cpp \ --replace "\"./\"" "\"$out/bin/\"" ''; # https://github.com/TES3MP/openmw-tes3mp/issues/552 patches = oldAttrs.patches ++ [ ./tes3mp.patch ]; NIX_CFLAGS_COMPILE = "-fpermissive"; preConfigure = '' substituteInPlace files/version.in \ --subst-var-by OPENMW_VERSION_COMMITHASH ${src.rev} ''; # move everything that we wrap out of the way postInstall = '' mkdir -p $out/libexec mv $out/bin/tes3mp-* $out/libexec ''; meta = with lib; { description = "Multiplayer for TES3:Morrowind based on OpenMW"; homepage = "https://tes3mp.com/"; license = licenses.gpl3Only; maintainers = with maintainers; [ peterhoeg ]; platforms = [ "x86_64-linux" "i686-linux" ]; }; }); cfgDir="/home/christian/.config/openmw"; serverDir="/home/christian/.local/share/openmw/server"; cfgFile = (formats.ini { }).generate "tes3mp-server.cfg" { Plugins.home = "${serverDir}"; }; in symlinkJoin rec { name = "openmw-tes3mp-${unwrapped.version}"; inherit (unwrapped) version meta; nativeBuildInputs = [ makeWrapper ]; paths = [ unwrapped ]; # crudini --merge will create the file if it doesn't exist postBuild = '' mkdir -p $out/bin makeWrapper ${unwrapped}/libexec/tes3mp-browser $out/bin/tes3mp-browser \ --chdir "$out/bin" makeWrapper ${unwrapped}/libexec/tes3mp-server $out/bin/tes3mp-server \ --run "mkdir -p ${cfgDir}" \ --run "mkdir -p ${serverDir}" \ --run "${crudini}/bin/crudini --merge ${cfgDir}/${cfgFile.name} < ${cfgFile}" \ --run "cd ${serverDir}" \ --run "rm -f lib scripts" \ --run "ln -s ${coreScripts}/share/openmw-tes3mp/CoreScripts/lib lib" \ --run "ln -s ${coreScripts}/share/openmw-tes3mp/CoreScripts/scripts scripts" \ --run "[ ! -d data ] && cp -R ${coreScripts}/share/openmw-tes3mp/CoreScripts/data data" \ --run "chmod -R u+w data" ''; }