# Does not touch paths inside xplanePathStr. # Setup needed to integrate the addons. # HeadShake # Create the following softlink: # ln -sf /xplane-extra/HeadShake $xplanePathStr/Resources/plugins # Beautiful Roads: # Rename the following directory in "$xplanePathStr/Resources/default scenery/1000 roads": # mv textures textures.orig # # and create the following softlink to textures: # ln -sf /xplane-extra/beautiful-roads textures # # To switch to the old roads, callPackage this file with the beautifulRoads # attribute set to null. { stdenv, writeScript, buildFHSUserEnv, lib , xplanePathStr, unzip , addons ? []}: let inherit (lib) concatMapStrings optionalString unique; runScript = writeScript "x-plane-script" '' #!${stdenv.shell} usage() { cat <&2 x-plane-env OPT X-Plane run X-Plane (default) Airfoil run Airfoil Maker Plane run Plane Maker Installer run Installer SHELL run bash inside FHS environment prepare prepare all currently activated addons revert [ADDON]... remove modifications from named addons navdata FILE [OLDCYCLE] update navigation DB ortho update links to zOrtho4XP scenery files /abs/path [ARG]... run /abs/path inside FHS environment rel/path [ARG]... run $XPLANEPATH/rel/path inside FHS environment EOF } sys=${stdenv.targetPlatform.system} sys=''${sys%-linux} bin=$1 : ''${XPLANEPATH:=${xplanePathStr}} export XPLANEPATH case "$bin" in --help) usage; exit ;; X-Plane) exec "''${XPLANEPATH}/X-Plane-$sys" ;; Airfoil*) exec "''${XPLANEPATH}/Airfoil Maker-$sys" ;; Plane*) exec "''${XPLANEPATH}/Plane Maker-$sys" ;; Installer*) exec "''${XPLANEPATH}/X-Plane 11 Installer Linux" ;; ''') exec "''${XPLANEPATH}/X-Plane-$sys" ;; SHELL) exec "bash" ;; prepare) exec ${prepareScript} ;; revert) shift; exec ${revertScript} "$@" ;; navdata) shift; exec ${navdbScript} "$@" ;; ortho) exec ${orthoScript} ;; /*) exec "$@" ;; *) shift; exec "''${XPLANEPATH}/$bin" "$@" ;; esac ''; uniqueAddons = unique addons; prepareScript = writeScript "x-plane-addons-prepare" ('' #!${stdenv.shell} set -e : ''${XPLANEPATH:=${xplanePathStr}} printf "Preparing %s for accessing addons\n" "$XPLANEPATH" >&2 mkdir -p "$XPLANEPATH/.addons" if [ -f "$XPLANEPATH/.addons/dont-prepare" ]; then printf "Warning: %s found. Not preparing tree.\n" "$XPLANEPATH/.addons/dont-prepare" >&2 exit 1 fi '' + (concatMapStrings (addon: optionalString (addon.passthru ? prepare) ('' # Addon ${addon.pname}-${addon.version} ADDONPATH=${addon} printf "Preparing %s\n" "${addon.pname}-${addon.version}" >&2 if [ -f "$XPLANEPATH/.addons/revert-${addon.pname}" ]; then printf "Warning: Old revert script found. Not modifying X-Plane tree. Revert first.\n" >&2 else ${addon.passthru.prepare} '' + (if (addon.passthru ? revert) then '' cat <<'EOF' >"$XPLANEPATH/.addons/revert-${addon.pname}" #!/usr/bin/env bash set -e ${addon.passthru.revert} rm $0 EOF chmod +x "$XPLANEPATH/.addons/revert-${addon.pname}" fi '' else '' fi ''))) uniqueAddons)); revertScript = writeScript "x-plane-addons-revert" '' #!/bin/sh set -e : ''${XPLANEPATH:=${xplanePathStr}} printf "Reverting modifications made to %s\n" "$XPLANEPATH"; if [ $# -eq 0 ]; then printf "Reverting all modifications\n" for f in "$XPLANEPATH/.addons"/revert-* ; do printf "Reverting %s\n" "''${f##*/revert-}" "''${f}" done else for f in "$@" ; do printf "Reverting %s\n" "''${f##*/revert-}" "$XPLANEPATH"/.addons/revert-"''${f##*/revert-}" done fi ''; navdbScript = writeScript "update-navdata" '' #!/usr/bin/env bash set -euo pipefail : ''${XPLANEPATH:=${xplanePathStr}} [ $# -ne 0 ] || { printf "usage: update-navdata FILE [OLDCYCLE]\n\nFILE xplane11_native_CYCL.zip file\nOLDCYCLE old cycle ID for backup (default auto detect)\n" >&2 exit 1; } if [ $# -ge 2 ]; then oldcycle=$2 elif [ -e "$XPLANEPATH/Custom Data/cycle_info.txt" ]; then oldcycle=$(head -n1 "$XPLANEPATH/Custom Data/cycle_info.txt" | sed -E -n -e "s/^AIRAC cycle[ :]+([0-9]+)\r$/\1/p") [ -n "$oldcycle" ] || { printf "Unable to determine old AIRAC cycle\n" >&2; exit 1; } fi f=$1 [ -e "$f" ] || { printf "No such file or directory\n" >&2; exit 1; } cycle=''${1##*_} cycle=''${cycle%.zip} newpath="$XPLANEPATH/Custom Data AIRAC$cycle" if [ ! -h "$XPLANEPATH/Custom Data" ]; then mv "$XPLANEPATH/Custom Data" "$XPLANEPATH/Custom Data AIRAC$oldcycle" fi if [ -d "$newpath" ]; then rm -rf "$newpath" fi ${lib.getBin unzip}/bin/unzip -d "$newpath" "$f" cat <"$newpath/Readme.txt" Place newer navigational data for the global database in THIS folder. If you want to replace any of X-Plane's earth_nav.dat earth_awy.dat earth_fix.dat CIFP/* with newer data, then place them HERE IN THIS FOLDER to avoid conflicts with the X-Plane updater. Note that this database is also used by X-Plane’s GPS and previously needed files in other subfolders are now ignored. Also, you can place the FAACIFP18 file here, which you can get from the FAA website: https://www.faa.gov/air_traffic/flight_info/aeronav/digital_products/cifp/ If the file FAACIFP18 is found in this folder, X-Plane will load instrument flight procedures from this file. EOF rm "$XPLANEPATH/Custom Data" ln -sf "$newpath" "$XPLANEPATH/Custom Data" ''; orthoScript = writeScript "update-scenery-packs-ini" '' : ''${XPLANEPATH:=${xplanePathStr}} ( cd "$XPLANEPATH" sed -i -e '/^SCENERY_PACK Custom Scenery\/zOrtho4XP_.*$/d' "Custom Scenery/scenery_packs.ini" for f in "Custom Scenery/zOrtho4XP_"*; do echo "SCENERY_PACK $f" done >>"Custom Scenery/scenery_packs.ini" ) ''; in buildFHSUserEnv rec { name = "x-plane-env"; passthru = { inherit addons; }; # Also add GAppsWrapper environment stuff such that binaries see the GTK theme... targetPkgs = pkgs: (with pkgs; [ unzip atk gdk_pixbuf cairo pango mesa_glu libGL openalSoft gtk2 glib dbus pulseaudio vulkan-tools vulkan-loader ] ++ (with xorg; [ libX11 libXext libXrandr libXcursor libXinerama ]) ++ # For reality expansion pack [ stdenv.cc.cc.lib curl openssl ] ++ # For fly with lua [ freeglut libudev ]); extraBuildCommands = '' chmod u+w $out/etc mkdir $out/etc/openal chmod u-w $out/etc echo "drivers=pulse" > $out/etc/openal/alsoft.conf mkdir $out/xplane-extra '' + (concatMapStrings (addon: optionalString (addon.passthru ? build) '' ADDONPATH=${addon} printf "Addon ${addon.pname}\n" >&2 ${addon.passthru.build} '') uniqueAddons); inherit runScript; }