From e5dbf8deb2fdfccdbd984f7f36fa1aa89b2af6a2 Mon Sep 17 00:00:00 2001 From: caley <195605706+cqley@users.noreply.github.com> Date: Wed, 22 Jul 2026 01:58:52 +0200 Subject: changing 'gms' to 'games' --- nixos/modules/games/dayz.nix | 1808 ++++++++++++++++++++++++++++++++++++++++++ nixos/modules/games/mc.nix | 80 ++ nixos/modules/gms/dayz.nix | 1808 ------------------------------------------ nixos/modules/gms/mc.nix | 80 -- 4 files changed, 1888 insertions(+), 1888 deletions(-) create mode 100644 nixos/modules/games/dayz.nix create mode 100644 nixos/modules/games/mc.nix delete mode 100644 nixos/modules/gms/dayz.nix delete mode 100644 nixos/modules/gms/mc.nix (limited to 'nixos/modules') diff --git a/nixos/modules/games/dayz.nix b/nixos/modules/games/dayz.nix new file mode 100644 index 0000000..128a10c --- /dev/null +++ b/nixos/modules/games/dayz.nix @@ -0,0 +1,1808 @@ +{ config, pkgs, ... }: + +let + dayzDir = "${config.home.homeDirectory}/.local/share/Steam/steamapps/compatdata/221100/pfx/drive_c/users/steamuser/Documents/DayZ"; +in +{ + home.packages = [ (pkgs.writeShellApplication { + name = "meowz"; + runtimeInputs = with pkgs; [ curl jq fzf steamcmd ]; + excludeShellChecks = [ "SC2155" "SC2162" "SC2207" "SC2086" "SC2178" "SC2128" ]; + text = '' + +config="$HOME/.config/dayz" +favfile="$config/favorites" +logfile="$config/last_launch.log" +steamapps="$HOME/.local/share/Steam/steamapps" +workshop="$steamapps/workshop/content/221100" +d=$'\x1f' + +mkdir -p "$config" +touch "$favfile" +sed -i '/^[[:space:]]*$/d' "$favfile" +awk -F"$d" 'NF==4' "$favfile" > "$favfile.tmp" && mv "$favfile.tmp" "$favfile" + +log() { printf '%s\n' "$*"; } +err() { printf '%s\n' "$*" >&2; } + +api() { + curl -sg -A "mozilla" "https://api.battlemetrics.com$1" +} + +fetch_servers() { + local path="/servers?filter[game]=dayz&page[size]=100$1" + local pages=0 + while [ -n "$path" ] && [ "$pages" -lt 4 ]; do + local resp=$(api "$path") + echo "$resp" | jq -e . >/dev/null 2>&1 || break + echo "$resp" | jq -r '.data[]? | "\(.id)|\(.attributes.ip):\(.attributes.port)|\(.attributes.name) [\(.attributes.players)/\(.attributes.maxPlayers)]"' + path=$(echo "$resp" | jq -r '.links.next // empty' | sed 's|.*battlemetrics.com||') + pages=$((pages + 1)) + done +} + +if [ "''${1:-}" = "--fetch" ]; then + fetch_servers "''${2:+&filter[search]=$2}" + exit 0 +fi + +steamuser="" +[ -f "$config/steamuser" ] && steamuser=$(cat "$config/steamuser") +if [ -z "$steamuser" ]; then + read -p "steam username: " steamuser + echo "$steamuser" > "$config/steamuser" +fi + +steampass="" +[ -f "$config/steampass" ] && steampass=$(cat "$config/steampass") +if [ -z "$steampass" ]; then + read -rsp "steam password (stored in plaintext, blank to skip caching): " steampass + echo + if [ -n "$steampass" ]; then + (umask 177; echo "$steampass" > "$config/steampass") + fi +fi + +loginmarker="$config/steam_authenticated" + +get_mods_by_id() { + api "/servers/$1" | jq -r '.data?.attributes?.details?.modIds[]? // empty' | paste -sd, - +} + +get_mods() { + local ip="$1" port="$2" + local m=$(curl -s "https://dayzsalauncher.com/api/v1/server/$ip:$port" | jq -r '.result?.mods[]?.steamWorkshopId // empty' | paste -sd, -) + if [ -z "$m" ]; then + local id=$(api "/servers?filter[game]=dayz&filter[search]=$ip:$port" | jq -r '.data[0]?.id // empty') + [ -n "$id" ] && m=$(get_mods_by_id "$id") + fi + echo "$m" +} + +download_mods() { + local mods=($(echo "$1" | tr ',' '\n')) + [ "''${#mods[@]}" -eq 0 ] && return 0 + + touch "$config/blacklist" + local missing=() + for mod in "''${mods[@]}"; do + grep -qx "$mod" "$config/blacklist" && continue + find "$workshop/$mod" -mindepth 1 2>/dev/null | grep -q . || missing+=("$mod") + done + [ "''${#missing[@]}" -eq 0 ] && { log "mods already present"; return 0; } + + local runner="steamcmd" + command -v steamcmd >/dev/null 2>&1 || { err "steamcmd not found"; return 1; } + + mods=("''${missing[@]}") + local cmds="" + for mod in "''${mods[@]}"; do + cmds="$cmds +workshop_download_item 221100 $mod" + done + + if pgrep -x steam >/dev/null; then + log "closing steam..." + steam -shutdown + while pgrep -x steam >/dev/null; do sleep 1; done + fi + + log "downloading mods..." + local attempt=1 + while [ "$attempt" -le 4 ]; do + [ "$attempt" -gt 1 ] && log "retry $attempt/4, ''${#mods[@]} mods" + local out + local login_args=("$steamuser") + if [ ! -f "$loginmarker" ] && [ -n "$steampass" ]; then + login_args=("$steamuser" "$steampass") + fi + out=$($runner +@sSteamCmdForcePlatformType linux -forceipv4 +login "''${login_args[@]}" $cmds +quit | tee /dev/tty) || true + + if echo "$out" | grep -q "Waiting for user info"; then + touch "$loginmarker" + fi + if echo "$out" | grep -q "FAILED"; then + rm -f "$loginmarker" + fi + + if echo "$out" | grep -q "Invalid Password"; then + err "wrong password, clearing cache" + rm -f "$config/steampass" + steampass="" + fi + + local failed=() + for mod in "''${mods[@]}"; do + if echo "$out" | grep -q "Success. Downloaded item $mod "; then + continue + fi + if echo "$out" | grep -qE "Download item $mod failed \((Access Denied|No match|File Not Found)\)"; then + err "mod $mod unavailable, blacklisting" + grep -qx "$mod" "$config/blacklist" || echo "$mod" >> "$config/blacklist" + continue + fi + failed+=("$mod") + done + + [ "''${#failed[@]}" -eq 0 ] && { log "mods downloaded"; return 0; } + + mods=("''${failed[@]}") + cmds="" + for mod in "''${mods[@]}"; do + cmds="$cmds +workshop_download_item 221100 $mod" + done + attempt=$((attempt + 1)) + sleep 3 + done + + err "failed to download: ''${mods[*]}" + return 1 +} + +launch() { + local ip="$1" port="$2" mods="$3" mod_arg="" + + if [ -z "$ip" ] || [ -z "$port" ]; then + err "invalid ip/port" + return 1 + fi + + log "verifying server..." + local verify + verify=$(api "/servers?filter[game]=dayz&filter[search]=$ip:$port" | jq -r --arg ip "$ip" --arg port "$port" '.data[]? | select(.attributes.ip == $ip and (.attributes.port | tostring) == $port) | "\(.attributes.name) [\(.attributes.players)/\(.attributes.maxPlayers)]"' | head -n 1) + if [ -n "$verify" ]; then + log "found: $verify" + else + err "server not found on battlemetrics, connecting anyway" + fi + + if [ -z "$mods" ]; then + log "no mod list found, may still require mods" + else + log "downloading mods..." + download_mods "$mods" || err "some mods failed, launching anyway" + for m in $(echo "$mods" | tr ',' '\n'); do + [ -z "$m" ] && continue + local folder=$(find "$workshop/$m" -maxdepth 1 -type d -name "@*" 2>/dev/null | head -n 1) + [ -z "$folder" ] && folder="$workshop/$m" + find "$folder" -iname "*.pbo" 2>/dev/null | grep -q . || { err "missing pbo for $m, skipping"; continue; } + mod_arg="$mod_arg;z:''${folder//\//\\}" + done + mod_arg="''${mod_arg#;}" + [ -n "$mod_arg" ] && mod_arg="-mod=$mod_arg" + sleep 3 + fi + + echo "$(date '+%F %T') connect=$ip:$port $mod_arg" >> "$logfile" + + if ! pgrep -x steam >/dev/null; then + log "starting steam..." + if [ ! -f "$loginmarker" ]; then + if [ -n "$steampass" ]; then + steam -login "$steamuser" "$steampass" >>"$config/steam.log" 2>&1 & disown + else + steam -login "$steamuser" >>"$config/steam.log" 2>&1 & disown + fi + else + steam >>"$config/steam.log" 2>&1 & disown + fi + while ! pgrep -x steam >/dev/null; do sleep 1; done + sleep 5 + fi + + log "connecting to $ip:$port..." + if [ -n "$mod_arg" ]; then + steam -applaunch 221100 -noLauncher "-connect=$ip" "-port=$port" "$mod_arg" >>"$config/steam.log" 2>&1 + else + steam -applaunch 221100 -noLauncher "-connect=$ip" "-port=$port" >>"$config/steam.log" 2>&1 + fi +} + +pick_server() { + fzf --prompt="server> " --delimiter="|" --with-nth=3.. --layout=reverse \ + --disabled --ansi \ + --bind "start:reload:$0 --fetch" \ + --bind "change:reload:sleep 0.4; $0 --fetch {q}" +} + +save_favorite() { + local ip="$1" port="$2" name="$3" + if grep -qF "$ip$d$port$d" "$favfile"; then + err "already saved" + return + fi + local mods=$(get_mods "$ip" "$port") + printf "%s%s%s%s%s%s%s\n" "$ip" "$d" "$port" "$d" "$mods" "$d" "$name" >> "$favfile" + log "saved $name" +} + +show_favorites() { + grep -vE '^[[:space:]]*$' "$favfile" | fzf --prompt="fav> " --delimiter="$d" --with-nth=4 --layout=reverse +} + +while true; do + action=$(printf "favorites\nbrowse\nadd manual\nremove\nrefresh mods\nquit\n" | fzf --prompt="dayz> " --layout=reverse) + + case "$action" in + browse) + selection=$(pick_server) + [ -z "$selection" ] && continue + id=$(echo "$selection" | cut -d'|' -f1) + ip_port=$(echo "$selection" | cut -d'|' -f2) + name=$(echo "$selection" | cut -d'|' -f3- | sed 's/ \[[0-9]*\/[0-9]*\]$//') + ip=''${ip_port%%:*} + port=''${ip_port##*:} + confirm=$(printf "play\nsave to favorites\n" | fzf --prompt="$name> " --layout=reverse) + case "$confirm" in + play) mods=$(get_mods_by_id "$id"); launch "$ip" "$port" "$mods"; exit 0 ;; + "save to favorites") save_favorite "$ip" "$port" "$name"; show_favorites ;; + esac + ;; + favorites) + selection=$(show_favorites) + [ -z "$selection" ] && continue + ip=$(echo "$selection" | cut -d"$d" -f1) + port=$(echo "$selection" | cut -d"$d" -f2) + mods=$(echo "$selection" | cut -d"$d" -f3) + launch "$ip" "$port" "$mods" + exit 0 + ;; + "add manual") + read -p "ip: " ip + read -p "port: " port + read -p "name: " name + save_favorite "$ip" "$port" "$name" + show_favorites + ;; + remove) + selection=$(show_favorites) + [ -z "$selection" ] && continue + grep -vF "$selection" "$favfile" | grep -vE '^[[:space:]]*$' > "$favfile.tmp" && mv "$favfile.tmp" "$favfile" + show_favorites + ;; + "refresh mods") + selection=$(show_favorites) + [ -z "$selection" ] && continue + ip=$(echo "$selection" | cut -d"$d" -f1) + port=$(echo "$selection" | cut -d"$d" -f2) + name=$(echo "$selection" | cut -d"$d" -f4) + mods=$(get_mods "$ip" "$port") + grep -vF "$selection" "$favfile" | grep -vE '^[[:space:]]*$' > "$favfile.tmp" && mv "$favfile.tmp" "$favfile" + printf "%s%s%s%s%s%s%s\n" "$ip" "$d" "$port" "$d" "$mods" "$d" "$name" >> "$favfile" + show_favorites + ;; + quit|"") break ;; + esac +done + ''; + }) ]; + + xdg.desktopEntries.meowz = { + name = "MeowZ"; + comment = "dayz server launcher"; + exec = "kitty --hold -e meowz"; + icon = "applications-games"; + terminal = false; + categories = [ "Game" ]; + }; + + home.file."${dayzDir}/DayZ.cfg".text = '' + language="English"; + adapter=-1; + 3D_Performance=57692; + Resolution_Bpp=32; + WinX=0; + WinY=0; + WindowWidth=1920; + WindowHeight=1080; + MSAA=0; + PostFX=0; + VSync=1; + FXAO=0; + AToC=0; + AnisoFilter=4; + TerrainDetail=2; + FXAA=0; + refreshMode=200; + maxGPUToRenderFrames=1; + ''; + + home.file."${dayzDir}/steamuser_settings.DayZProfile".text = '' + version=1; + blood=1; + singleVoice=0; + gamma=1; + lastMPServer=""; + lastMPServerName=""; + lastMPMission=""; + inputVersion=1; + perspective=1; + trackIR=1; + freeTrack=1; + mouseSmoothing=0; + maxSamplesPlayed=96; + vonInputMode=0; + TexQuality=1; + WaterQuality=1; + tripleHead=0; + showTitles=1; + vehicleFreelook=0; + pauseMode=0; + shadowQuality=1; + headBob=0; + fov=0.95993; + sceneComplexity=150000; + shadowZDistance=80; + viewDistance=1200; + preferredObjectViewDistance=1200; + terrainGrid=12.5; + volumeMaster=5; + volumeCD=0.5; + volumeFX=4; + volumeSpeech=5; + volumeVoN=10; + vonRecThreshold=0.029999999; + brightness=1; + uiTopLeftX=0.12500001; + uiTopLeftY=0; + uiBottomRightX=0.875; + uiBottomRightY=1; + IGUIScale=0.55000001; + showHUD=1; + hudBrightness=1.0; + showCrosshair=0; + showQuickbar=1; + showVehicleHUD=1; + showServerInfo=0; + ''; + + home.file."${dayzDir}/steamuser.dayz_preset_User.xml".text = '' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ''; +} diff --git a/nixos/modules/games/mc.nix b/nixos/modules/games/mc.nix new file mode 100644 index 0000000..d8c6734 --- /dev/null +++ b/nixos/modules/games/mc.nix @@ -0,0 +1,80 @@ +{ config, pkgs, ... }: + +{ + home.packages = [ pkgs.prismlauncher ]; + + home.file.".local/share/PrismLauncher/prismlauncher.cfg" = { + text = pkgs.lib.generators.toINI {} { + General = { + ApplicationTheme = "dark"; + AutoCloseConsole = false; + AutomaticJavaDownload = false; + AutomaticJavaSwitch = true; + CatFit = "fit"; + CatOpacity = 100; + CentralModsDir = "mods"; + CloseAfterLaunch = false; + ConfigVersion = "1.3"; + ConsoleFont = "DejaVu Sans Mono"; + ConsoleFontSize = 11; + ConsoleMaxLines = 100000; + ConsoleOverflowStop = true; + DownloadsDir = "/home/cat/Downloads"; + DownloadsDirWatchRecursive = false; + EnableFeralGamemode = false; + EnableMangoHud = false; + Env = "{}"; + FallbackMRBlockedMods = 2; + IconTheme = "OSX"; + IconsDir = "icons"; + IgnoreJavaCompatibility = false; + IgnoreJavaWizard = false; + InstRenamingMode = "AskEverytime"; + InstSortMode = "Name"; + InstanceDir = "instances"; + JavaArchitecture = "64"; + JavaDir = "java"; + JavaPath = "/nix/store/55mw2ly3dxh5008li72rx6ilc75hgvr0-openjdk-8u502-b01/bin/java"; + Language = "en_US"; + LaunchMaximized = false; + LowMemWarning = true; + MaxMemAlloc = 6016; + MinMemAlloc = 2048; + MinecraftWinHeight = 480; + MinecraftWinWidth = 854; + ModDependenciesDisabled = false; + ModMetadataDisabled = false; + MoveModsFromDownloadsDir = true; + NumberOfConcurrentDownloads = 6; + NumberOfConcurrentTasks = 10; + NumberOfManualRetries = 1; + OnlineFixes = false; + PastebinType = 3; + PermGen = 128; + ProxyAddr = "127.0.0.1"; + ProxyPort = 8080; + ProxyType = "None"; + QuitAfterGameStop = false; + RecordGameTime = true; + RequestTimeout = 60; + ShowConsole = false; + ShowConsoleOnError = true; + ShowGameTime = true; + ShowGameTimeWithoutDays = false; + ShowGlobalGameTime = true; + ShowModIncompat = false; + SkinsDir = "skins"; + SkipModpackUpdatePrompt = false; + StatusBarVisible = false; + TheCat = false; + ToolbarsLocked = true; + UseDiscreteGpu = false; + UseNativeGLFW = false; + UseNativeOpenAL = false; + UseZink = false; + UserAskedAboutAutomaticJavaDownload = true; + }; + }; + force = true; + }; +} diff --git a/nixos/modules/gms/dayz.nix b/nixos/modules/gms/dayz.nix deleted file mode 100644 index 128a10c..0000000 --- a/nixos/modules/gms/dayz.nix +++ /dev/null @@ -1,1808 +0,0 @@ -{ config, pkgs, ... }: - -let - dayzDir = "${config.home.homeDirectory}/.local/share/Steam/steamapps/compatdata/221100/pfx/drive_c/users/steamuser/Documents/DayZ"; -in -{ - home.packages = [ (pkgs.writeShellApplication { - name = "meowz"; - runtimeInputs = with pkgs; [ curl jq fzf steamcmd ]; - excludeShellChecks = [ "SC2155" "SC2162" "SC2207" "SC2086" "SC2178" "SC2128" ]; - text = '' - -config="$HOME/.config/dayz" -favfile="$config/favorites" -logfile="$config/last_launch.log" -steamapps="$HOME/.local/share/Steam/steamapps" -workshop="$steamapps/workshop/content/221100" -d=$'\x1f' - -mkdir -p "$config" -touch "$favfile" -sed -i '/^[[:space:]]*$/d' "$favfile" -awk -F"$d" 'NF==4' "$favfile" > "$favfile.tmp" && mv "$favfile.tmp" "$favfile" - -log() { printf '%s\n' "$*"; } -err() { printf '%s\n' "$*" >&2; } - -api() { - curl -sg -A "mozilla" "https://api.battlemetrics.com$1" -} - -fetch_servers() { - local path="/servers?filter[game]=dayz&page[size]=100$1" - local pages=0 - while [ -n "$path" ] && [ "$pages" -lt 4 ]; do - local resp=$(api "$path") - echo "$resp" | jq -e . >/dev/null 2>&1 || break - echo "$resp" | jq -r '.data[]? | "\(.id)|\(.attributes.ip):\(.attributes.port)|\(.attributes.name) [\(.attributes.players)/\(.attributes.maxPlayers)]"' - path=$(echo "$resp" | jq -r '.links.next // empty' | sed 's|.*battlemetrics.com||') - pages=$((pages + 1)) - done -} - -if [ "''${1:-}" = "--fetch" ]; then - fetch_servers "''${2:+&filter[search]=$2}" - exit 0 -fi - -steamuser="" -[ -f "$config/steamuser" ] && steamuser=$(cat "$config/steamuser") -if [ -z "$steamuser" ]; then - read -p "steam username: " steamuser - echo "$steamuser" > "$config/steamuser" -fi - -steampass="" -[ -f "$config/steampass" ] && steampass=$(cat "$config/steampass") -if [ -z "$steampass" ]; then - read -rsp "steam password (stored in plaintext, blank to skip caching): " steampass - echo - if [ -n "$steampass" ]; then - (umask 177; echo "$steampass" > "$config/steampass") - fi -fi - -loginmarker="$config/steam_authenticated" - -get_mods_by_id() { - api "/servers/$1" | jq -r '.data?.attributes?.details?.modIds[]? // empty' | paste -sd, - -} - -get_mods() { - local ip="$1" port="$2" - local m=$(curl -s "https://dayzsalauncher.com/api/v1/server/$ip:$port" | jq -r '.result?.mods[]?.steamWorkshopId // empty' | paste -sd, -) - if [ -z "$m" ]; then - local id=$(api "/servers?filter[game]=dayz&filter[search]=$ip:$port" | jq -r '.data[0]?.id // empty') - [ -n "$id" ] && m=$(get_mods_by_id "$id") - fi - echo "$m" -} - -download_mods() { - local mods=($(echo "$1" | tr ',' '\n')) - [ "''${#mods[@]}" -eq 0 ] && return 0 - - touch "$config/blacklist" - local missing=() - for mod in "''${mods[@]}"; do - grep -qx "$mod" "$config/blacklist" && continue - find "$workshop/$mod" -mindepth 1 2>/dev/null | grep -q . || missing+=("$mod") - done - [ "''${#missing[@]}" -eq 0 ] && { log "mods already present"; return 0; } - - local runner="steamcmd" - command -v steamcmd >/dev/null 2>&1 || { err "steamcmd not found"; return 1; } - - mods=("''${missing[@]}") - local cmds="" - for mod in "''${mods[@]}"; do - cmds="$cmds +workshop_download_item 221100 $mod" - done - - if pgrep -x steam >/dev/null; then - log "closing steam..." - steam -shutdown - while pgrep -x steam >/dev/null; do sleep 1; done - fi - - log "downloading mods..." - local attempt=1 - while [ "$attempt" -le 4 ]; do - [ "$attempt" -gt 1 ] && log "retry $attempt/4, ''${#mods[@]} mods" - local out - local login_args=("$steamuser") - if [ ! -f "$loginmarker" ] && [ -n "$steampass" ]; then - login_args=("$steamuser" "$steampass") - fi - out=$($runner +@sSteamCmdForcePlatformType linux -forceipv4 +login "''${login_args[@]}" $cmds +quit | tee /dev/tty) || true - - if echo "$out" | grep -q "Waiting for user info"; then - touch "$loginmarker" - fi - if echo "$out" | grep -q "FAILED"; then - rm -f "$loginmarker" - fi - - if echo "$out" | grep -q "Invalid Password"; then - err "wrong password, clearing cache" - rm -f "$config/steampass" - steampass="" - fi - - local failed=() - for mod in "''${mods[@]}"; do - if echo "$out" | grep -q "Success. Downloaded item $mod "; then - continue - fi - if echo "$out" | grep -qE "Download item $mod failed \((Access Denied|No match|File Not Found)\)"; then - err "mod $mod unavailable, blacklisting" - grep -qx "$mod" "$config/blacklist" || echo "$mod" >> "$config/blacklist" - continue - fi - failed+=("$mod") - done - - [ "''${#failed[@]}" -eq 0 ] && { log "mods downloaded"; return 0; } - - mods=("''${failed[@]}") - cmds="" - for mod in "''${mods[@]}"; do - cmds="$cmds +workshop_download_item 221100 $mod" - done - attempt=$((attempt + 1)) - sleep 3 - done - - err "failed to download: ''${mods[*]}" - return 1 -} - -launch() { - local ip="$1" port="$2" mods="$3" mod_arg="" - - if [ -z "$ip" ] || [ -z "$port" ]; then - err "invalid ip/port" - return 1 - fi - - log "verifying server..." - local verify - verify=$(api "/servers?filter[game]=dayz&filter[search]=$ip:$port" | jq -r --arg ip "$ip" --arg port "$port" '.data[]? | select(.attributes.ip == $ip and (.attributes.port | tostring) == $port) | "\(.attributes.name) [\(.attributes.players)/\(.attributes.maxPlayers)]"' | head -n 1) - if [ -n "$verify" ]; then - log "found: $verify" - else - err "server not found on battlemetrics, connecting anyway" - fi - - if [ -z "$mods" ]; then - log "no mod list found, may still require mods" - else - log "downloading mods..." - download_mods "$mods" || err "some mods failed, launching anyway" - for m in $(echo "$mods" | tr ',' '\n'); do - [ -z "$m" ] && continue - local folder=$(find "$workshop/$m" -maxdepth 1 -type d -name "@*" 2>/dev/null | head -n 1) - [ -z "$folder" ] && folder="$workshop/$m" - find "$folder" -iname "*.pbo" 2>/dev/null | grep -q . || { err "missing pbo for $m, skipping"; continue; } - mod_arg="$mod_arg;z:''${folder//\//\\}" - done - mod_arg="''${mod_arg#;}" - [ -n "$mod_arg" ] && mod_arg="-mod=$mod_arg" - sleep 3 - fi - - echo "$(date '+%F %T') connect=$ip:$port $mod_arg" >> "$logfile" - - if ! pgrep -x steam >/dev/null; then - log "starting steam..." - if [ ! -f "$loginmarker" ]; then - if [ -n "$steampass" ]; then - steam -login "$steamuser" "$steampass" >>"$config/steam.log" 2>&1 & disown - else - steam -login "$steamuser" >>"$config/steam.log" 2>&1 & disown - fi - else - steam >>"$config/steam.log" 2>&1 & disown - fi - while ! pgrep -x steam >/dev/null; do sleep 1; done - sleep 5 - fi - - log "connecting to $ip:$port..." - if [ -n "$mod_arg" ]; then - steam -applaunch 221100 -noLauncher "-connect=$ip" "-port=$port" "$mod_arg" >>"$config/steam.log" 2>&1 - else - steam -applaunch 221100 -noLauncher "-connect=$ip" "-port=$port" >>"$config/steam.log" 2>&1 - fi -} - -pick_server() { - fzf --prompt="server> " --delimiter="|" --with-nth=3.. --layout=reverse \ - --disabled --ansi \ - --bind "start:reload:$0 --fetch" \ - --bind "change:reload:sleep 0.4; $0 --fetch {q}" -} - -save_favorite() { - local ip="$1" port="$2" name="$3" - if grep -qF "$ip$d$port$d" "$favfile"; then - err "already saved" - return - fi - local mods=$(get_mods "$ip" "$port") - printf "%s%s%s%s%s%s%s\n" "$ip" "$d" "$port" "$d" "$mods" "$d" "$name" >> "$favfile" - log "saved $name" -} - -show_favorites() { - grep -vE '^[[:space:]]*$' "$favfile" | fzf --prompt="fav> " --delimiter="$d" --with-nth=4 --layout=reverse -} - -while true; do - action=$(printf "favorites\nbrowse\nadd manual\nremove\nrefresh mods\nquit\n" | fzf --prompt="dayz> " --layout=reverse) - - case "$action" in - browse) - selection=$(pick_server) - [ -z "$selection" ] && continue - id=$(echo "$selection" | cut -d'|' -f1) - ip_port=$(echo "$selection" | cut -d'|' -f2) - name=$(echo "$selection" | cut -d'|' -f3- | sed 's/ \[[0-9]*\/[0-9]*\]$//') - ip=''${ip_port%%:*} - port=''${ip_port##*:} - confirm=$(printf "play\nsave to favorites\n" | fzf --prompt="$name> " --layout=reverse) - case "$confirm" in - play) mods=$(get_mods_by_id "$id"); launch "$ip" "$port" "$mods"; exit 0 ;; - "save to favorites") save_favorite "$ip" "$port" "$name"; show_favorites ;; - esac - ;; - favorites) - selection=$(show_favorites) - [ -z "$selection" ] && continue - ip=$(echo "$selection" | cut -d"$d" -f1) - port=$(echo "$selection" | cut -d"$d" -f2) - mods=$(echo "$selection" | cut -d"$d" -f3) - launch "$ip" "$port" "$mods" - exit 0 - ;; - "add manual") - read -p "ip: " ip - read -p "port: " port - read -p "name: " name - save_favorite "$ip" "$port" "$name" - show_favorites - ;; - remove) - selection=$(show_favorites) - [ -z "$selection" ] && continue - grep -vF "$selection" "$favfile" | grep -vE '^[[:space:]]*$' > "$favfile.tmp" && mv "$favfile.tmp" "$favfile" - show_favorites - ;; - "refresh mods") - selection=$(show_favorites) - [ -z "$selection" ] && continue - ip=$(echo "$selection" | cut -d"$d" -f1) - port=$(echo "$selection" | cut -d"$d" -f2) - name=$(echo "$selection" | cut -d"$d" -f4) - mods=$(get_mods "$ip" "$port") - grep -vF "$selection" "$favfile" | grep -vE '^[[:space:]]*$' > "$favfile.tmp" && mv "$favfile.tmp" "$favfile" - printf "%s%s%s%s%s%s%s\n" "$ip" "$d" "$port" "$d" "$mods" "$d" "$name" >> "$favfile" - show_favorites - ;; - quit|"") break ;; - esac -done - ''; - }) ]; - - xdg.desktopEntries.meowz = { - name = "MeowZ"; - comment = "dayz server launcher"; - exec = "kitty --hold -e meowz"; - icon = "applications-games"; - terminal = false; - categories = [ "Game" ]; - }; - - home.file."${dayzDir}/DayZ.cfg".text = '' - language="English"; - adapter=-1; - 3D_Performance=57692; - Resolution_Bpp=32; - WinX=0; - WinY=0; - WindowWidth=1920; - WindowHeight=1080; - MSAA=0; - PostFX=0; - VSync=1; - FXAO=0; - AToC=0; - AnisoFilter=4; - TerrainDetail=2; - FXAA=0; - refreshMode=200; - maxGPUToRenderFrames=1; - ''; - - home.file."${dayzDir}/steamuser_settings.DayZProfile".text = '' - version=1; - blood=1; - singleVoice=0; - gamma=1; - lastMPServer=""; - lastMPServerName=""; - lastMPMission=""; - inputVersion=1; - perspective=1; - trackIR=1; - freeTrack=1; - mouseSmoothing=0; - maxSamplesPlayed=96; - vonInputMode=0; - TexQuality=1; - WaterQuality=1; - tripleHead=0; - showTitles=1; - vehicleFreelook=0; - pauseMode=0; - shadowQuality=1; - headBob=0; - fov=0.95993; - sceneComplexity=150000; - shadowZDistance=80; - viewDistance=1200; - preferredObjectViewDistance=1200; - terrainGrid=12.5; - volumeMaster=5; - volumeCD=0.5; - volumeFX=4; - volumeSpeech=5; - volumeVoN=10; - vonRecThreshold=0.029999999; - brightness=1; - uiTopLeftX=0.12500001; - uiTopLeftY=0; - uiBottomRightX=0.875; - uiBottomRightY=1; - IGUIScale=0.55000001; - showHUD=1; - hudBrightness=1.0; - showCrosshair=0; - showQuickbar=1; - showVehicleHUD=1; - showServerInfo=0; - ''; - - home.file."${dayzDir}/steamuser.dayz_preset_User.xml".text = '' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ''; -} diff --git a/nixos/modules/gms/mc.nix b/nixos/modules/gms/mc.nix deleted file mode 100644 index d8c6734..0000000 --- a/nixos/modules/gms/mc.nix +++ /dev/null @@ -1,80 +0,0 @@ -{ config, pkgs, ... }: - -{ - home.packages = [ pkgs.prismlauncher ]; - - home.file.".local/share/PrismLauncher/prismlauncher.cfg" = { - text = pkgs.lib.generators.toINI {} { - General = { - ApplicationTheme = "dark"; - AutoCloseConsole = false; - AutomaticJavaDownload = false; - AutomaticJavaSwitch = true; - CatFit = "fit"; - CatOpacity = 100; - CentralModsDir = "mods"; - CloseAfterLaunch = false; - ConfigVersion = "1.3"; - ConsoleFont = "DejaVu Sans Mono"; - ConsoleFontSize = 11; - ConsoleMaxLines = 100000; - ConsoleOverflowStop = true; - DownloadsDir = "/home/cat/Downloads"; - DownloadsDirWatchRecursive = false; - EnableFeralGamemode = false; - EnableMangoHud = false; - Env = "{}"; - FallbackMRBlockedMods = 2; - IconTheme = "OSX"; - IconsDir = "icons"; - IgnoreJavaCompatibility = false; - IgnoreJavaWizard = false; - InstRenamingMode = "AskEverytime"; - InstSortMode = "Name"; - InstanceDir = "instances"; - JavaArchitecture = "64"; - JavaDir = "java"; - JavaPath = "/nix/store/55mw2ly3dxh5008li72rx6ilc75hgvr0-openjdk-8u502-b01/bin/java"; - Language = "en_US"; - LaunchMaximized = false; - LowMemWarning = true; - MaxMemAlloc = 6016; - MinMemAlloc = 2048; - MinecraftWinHeight = 480; - MinecraftWinWidth = 854; - ModDependenciesDisabled = false; - ModMetadataDisabled = false; - MoveModsFromDownloadsDir = true; - NumberOfConcurrentDownloads = 6; - NumberOfConcurrentTasks = 10; - NumberOfManualRetries = 1; - OnlineFixes = false; - PastebinType = 3; - PermGen = 128; - ProxyAddr = "127.0.0.1"; - ProxyPort = 8080; - ProxyType = "None"; - QuitAfterGameStop = false; - RecordGameTime = true; - RequestTimeout = 60; - ShowConsole = false; - ShowConsoleOnError = true; - ShowGameTime = true; - ShowGameTimeWithoutDays = false; - ShowGlobalGameTime = true; - ShowModIncompat = false; - SkinsDir = "skins"; - SkipModpackUpdatePrompt = false; - StatusBarVisible = false; - TheCat = false; - ToolbarsLocked = true; - UseDiscreteGpu = false; - UseNativeGLFW = false; - UseNativeOpenAL = false; - UseZink = false; - UserAskedAboutAutomaticJavaDownload = true; - }; - }; - force = true; - }; -} -- cgit v1.3.1