Jelajahi Sumber

Merge branch 'release/v23.5.0'

Daniel Gibbs 2 tahun lalu
induk
melakukan
fc36dc9526
100 mengubah file dengan 607 tambahan dan 573 penghapusan
  1. 1 1
      .github/workflows/details-check.yml
  2. 48 0
      .github/workflows/update-check.yml
  3. 6 6
      README.md
  4. 1 1
      lgsm/config-default/config-lgsm/arkserver/_default.cfg
  5. 1 1
      lgsm/config-default/config-lgsm/btlserver/_default.cfg
  6. 7 2
      lgsm/config-default/config-lgsm/inssserver/_default.cfg
  7. 1 1
      lgsm/config-default/config-lgsm/pstbsserver/_default.cfg
  8. 4 2
      lgsm/config-default/config-lgsm/pvrserver/_default.cfg
  9. 1 2
      lgsm/config-default/config-lgsm/pzserver/_default.cfg
  10. 4 1
      lgsm/config-default/config-lgsm/untserver/_default.cfg
  11. 3 3
      lgsm/config-default/config-lgsm/vintsserver/_default.cfg
  12. 2 2
      lgsm/data/almalinux-8.csv
  13. 2 2
      lgsm/data/almalinux-9.csv
  14. 2 2
      lgsm/data/centos-7.csv
  15. 2 2
      lgsm/data/centos-8.csv
  16. 2 2
      lgsm/data/centos-9.csv
  17. 2 2
      lgsm/data/debian-10.csv
  18. 2 2
      lgsm/data/debian-11.csv
  19. 2 2
      lgsm/data/debian-12.csv
  20. 2 2
      lgsm/data/debian-9.csv
  21. 2 2
      lgsm/data/rhel-7.csv
  22. 2 2
      lgsm/data/rhel-8.csv
  23. 2 2
      lgsm/data/rhel-9.csv
  24. 2 2
      lgsm/data/rocky-8.csv
  25. 2 2
      lgsm/data/rocky-9.csv
  26. 1 1
      lgsm/data/serverlist.csv
  27. 2 2
      lgsm/data/ubuntu-16.04.csv
  28. 2 2
      lgsm/data/ubuntu-18.04.csv
  29. 2 2
      lgsm/data/ubuntu-20.04.csv
  30. 0 135
      lgsm/data/ubuntu-21.04.csv
  31. 0 135
      lgsm/data/ubuntu-21.10.csv
  32. 2 2
      lgsm/data/ubuntu-22.04.csv
  33. 2 2
      lgsm/data/ubuntu-23.04.csv
  34. 11 0
      lgsm/modules/alert.sh
  35. 52 19
      lgsm/modules/check_deps.sh
  36. 7 7
      lgsm/modules/check_last_update.sh
  37. 5 0
      lgsm/modules/check_logs.sh
  38. 1 1
      lgsm/modules/check_status.sh
  39. 1 1
      lgsm/modules/check_system_requirements.sh
  40. 20 8
      lgsm/modules/command_backup.sh
  41. 6 6
      lgsm/modules/command_check_update.sh
  42. 1 1
      lgsm/modules/command_console.sh
  43. 9 9
      lgsm/modules/command_debug.sh
  44. 1 1
      lgsm/modules/command_dev_details.sh
  45. 1 1
      lgsm/modules/command_dev_detect_glibc.sh
  46. 1 1
      lgsm/modules/command_mods_remove.sh
  47. 164 49
      lgsm/modules/command_monitor.sh
  48. 1 1
      lgsm/modules/command_restart.sh
  49. 1 1
      lgsm/modules/command_send.sh
  50. 3 0
      lgsm/modules/command_skeleton.sh
  51. 51 51
      lgsm/modules/command_start.sh
  52. 26 15
      lgsm/modules/command_stop.sh
  53. 2 2
      lgsm/modules/command_ts3_server_pass.sh
  54. 9 6
      lgsm/modules/command_update.sh
  55. 4 1
      lgsm/modules/command_validate.sh
  56. 9 1
      lgsm/modules/core_dl.sh
  57. 3 1
      lgsm/modules/core_exit.sh
  58. 7 7
      lgsm/modules/core_functions.sh
  59. 1 1
      lgsm/modules/core_getopt.sh
  60. 4 0
      lgsm/modules/core_legacy.sh
  61. 12 7
      lgsm/modules/core_modules.sh
  62. 13 8
      lgsm/modules/core_steamcmd.sh
  63. 1 1
      lgsm/modules/fix.sh
  64. 1 1
      lgsm/modules/fix_ark.sh
  65. 1 1
      lgsm/modules/fix_arma3.sh
  66. 1 1
      lgsm/modules/fix_armar.sh
  67. 1 1
      lgsm/modules/fix_av.sh
  68. 1 1
      lgsm/modules/fix_bo.sh
  69. 1 1
      lgsm/modules/fix_bt.sh
  70. 1 1
      lgsm/modules/fix_cmw.sh
  71. 2 2
      lgsm/modules/fix_csgo.sh
  72. 1 1
      lgsm/modules/fix_dst.sh
  73. 1 1
      lgsm/modules/fix_hw.sh
  74. 1 1
      lgsm/modules/fix_ins.sh
  75. 1 1
      lgsm/modules/fix_kf.sh
  76. 1 1
      lgsm/modules/fix_kf2.sh
  77. 1 1
      lgsm/modules/fix_lo.sh
  78. 1 1
      lgsm/modules/fix_mcb.sh
  79. 1 1
      lgsm/modules/fix_mta.sh
  80. 14 0
      lgsm/modules/fix_pvr.sh
  81. 1 1
      lgsm/modules/fix_ro.sh
  82. 1 1
      lgsm/modules/fix_rust.sh
  83. 1 1
      lgsm/modules/fix_rw.sh
  84. 1 1
      lgsm/modules/fix_samp.sh
  85. 1 1
      lgsm/modules/fix_sdtd.sh
  86. 1 1
      lgsm/modules/fix_sfc.sh
  87. 1 1
      lgsm/modules/fix_sof2.sh
  88. 1 1
      lgsm/modules/fix_squad.sh
  89. 1 1
      lgsm/modules/fix_st.sh
  90. 1 1
      lgsm/modules/fix_steamcmd.sh
  91. 1 1
      lgsm/modules/fix_terraria.sh
  92. 1 1
      lgsm/modules/fix_tf2.sh
  93. 14 1
      lgsm/modules/fix_ts3.sh
  94. 1 1
      lgsm/modules/fix_unt.sh
  95. 1 1
      lgsm/modules/fix_ut.sh
  96. 1 1
      lgsm/modules/fix_ut2k4.sh
  97. 1 1
      lgsm/modules/fix_ut3.sh
  98. 1 1
      lgsm/modules/fix_vh.sh
  99. 1 1
      lgsm/modules/fix_wurm.sh
  100. 1 1
      lgsm/modules/fix_zmr.sh

+ 1 - 1
.github/workflows/details-check.yml

@@ -5,7 +5,7 @@ on:
   push:
 
 concurrency:
-  group: ${{ github.ref_name }}
+  group: details-check-${{ github.ref_name }}
   cancel-in-progress: true
 
 jobs:

+ 48 - 0
.github/workflows/update-check.yml

@@ -0,0 +1,48 @@
+name: Update Check
+# This action will check that LinuxGSM is picking up game server config and parameter variables.
+on:
+  workflow_dispatch:
+  push:
+
+concurrency:
+  group: update-check-${{ github.ref_name }}
+  cancel-in-progress: true
+
+jobs:
+  update-check:
+    continue-on-error: true
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix:
+        shortname: [css, fctr, jk2, mc, mcb, mta, pmc, ts3, ut99, vints]
+
+    steps:
+      - name: Download linuxgsm.sh
+        run: wget https://raw.githubusercontent.com/GameServerManagers/LinuxGSM/${GITHUB_REF#refs/heads/}/linuxgsm.sh; chmod +x linuxgsm.sh
+
+      - name: Install dependencies
+        run: sudo dpkg --add-architecture i386; sudo apt-get update;
+
+      - name: Grab server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./linuxgsm.sh ${{ matrix.shortname }}server
+
+      - name: Enable developer mode
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server developer
+
+      - name: Insert steamuser
+        if: matrix.shortname == 'jk2'
+        run: echo -e "steamuser=\"${{ secrets.STEAMCMD_USER }}\"\nsteampass='${{ secrets.STEAMCMD_PASS }}'" > lgsm/config-lgsm/${{ matrix.shortname }}server/common.cfg
+
+      - name: Install server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server auto-install
+
+      - name: Check Update server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server check-update
+
+      - name: Update server
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server update
+
+      - name: Force Update server
+        if: matrix.shortname == 'css'
+        run: LGSM_GITHUBBRANCH="${GITHUB_REF#refs/heads/}" ./${{ matrix.shortname }}server force-update

+ 6 - 6
README.md

@@ -1,7 +1,7 @@
 <p align="center">
 	<a href="https://linuxgsm.com"><img src="https://i.imgur.com/Eoh1jsi.jpg" alt="LinuxGSM">
 	<a href="https://www.codacy.com/gh/GameServerManagers/LinuxGSM/dashboard"><img src="https://img.shields.io/codacy/grade/d19c5234dc3743d8a8a14093711ca52d?style=flat-square&logo=codacy&logoColor=white" alt="Codacy grade"></a>
-	<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/GameServerManagers/LinuxGSM/git-sync.yml?color=0052CC&logo=bitbucket&style=flat-square">
+	<a href="https://bitbucket.org/GameServerManagers/linuxgsm"><img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/GameServerManagers/LinuxGSM/git-sync.yml?color=0052CC&logo=bitbucket&style=flat-square"></a>
 	<a href="https://linuxgsm.com/discord"><img alt="Discord" src="https://img.shields.io/discord/127498813903601664?color=5865F2&label=%20&logo=discord&logoColor=ffffff&style=flat-square"></a>
 	<a href="https://developer.valvesoftware.com/wiki/SteamCMD"><img src="https://img.shields.io/badge/SteamCMD-000000?style=flat-square&amp;logo=Steam&amp;logoColor=white" alt="SteamCMD"></a>
 	<a href="https://github.com/GameServerManagers/LinuxGSM/blob/main/LICENSE"><img src="https://img.shields.io/github/license/gameservermanagers/LinuxGSM?style=flat-square" alt="MIT License"></a>
@@ -11,7 +11,7 @@
 
 ## Hassle-Free Dedicated Game Servers
 
-Traditionally game servers are not easy to manage yourself. Admins often have to spend hours messing around trying to get their server working. LinuxGSM is a command-line tool designed to be as simple as possible, allowing admins to spend less time on management and more time gaming.
+Traditionally game servers are not easy to manage yourself. Admins often have to spend hours messing around trying to get their servers working. LinuxGSM is a command-line tool designed to be as simple as possible, allowing admins to spend less time on management and more time gaming.
 
 ## Main features
 
@@ -45,12 +45,12 @@ Documentation is found at [linuxgsm.com](https://linuxgsm.com) and [docs.linuxgs
 
 ## :question: Support
 
-There are various ways to get support, check out the [support](https://linuxgsm.com/support/) page to the right support.
+There are various ways to get support, check out the [support](https://linuxgsm.com/support/) page for the right support.
 
 ## :heart: Sponsor
 
-If you would like to [sponsor](https://linuxgsm.com/sponsor) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who sponsors me. Since 2012 LinuxGSM has been steadily growing with new servers, features and improvements added regularly.
+If you would like to [sponsor](https://linuxgsm.com/sponsor) to the project there are several ways you can, via [GitHub Sponsors](https://github.com/sponsors/dgibbs64) and [PayPal](https://www.paypal.me/dgibbs64). I would like to thank everyone who sponsors me. Since 2012 LinuxGSM has been steadily growing with new servers, features, and improvements added regularly.
 
-## Contributors
+## 🧙‍♂️ Contributors
 
-A big thank you goes to all the wonderful people who contribute ideas, code, docs and support to this project.
+A big thank you goes to all the wonderful people who contribute ideas, code, docs, and support to this project.

+ 1 - 1
lgsm/config-default/config-lgsm/arkserver/_default.cfg

@@ -19,7 +19,7 @@ altsavedirectoryname="${defaultmap}"
 maxplayers="70"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${ip}"
+startparameters="${defaultmap}?AltSaveDirectoryName=${altsavedirectoryname}?listen?MultiHome=${ip}?MaxPlayers=${maxplayers}?QueryPort=${queryport}?RCONPort=${rconport}?Port=${port} -automanagedmods -crossplay -PublicIPForEpic=${publicip}"
 
 #### LinuxGSM Settings ####
 

+ 1 - 1
lgsm/config-default/config-lgsm/btlserver/_default.cfg

@@ -14,7 +14,7 @@ port="7777"
 queryport="7780"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${extip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\""
+startparameters="/Game/Maps/Final_Maps/Derailed?Game=/Script/ShooterGame.WartideGameMode?listen -log -broadcastip=\"${publicip}\" -PORT=${port} -QueryPort=${queryport} -defgameini=\"${servercfgfullpath}\""
 
 #### LinuxGSM Settings ####
 

+ 7 - 2
lgsm/config-default/config-lgsm/inssserver/_default.cfg

@@ -19,9 +19,14 @@ defaultmap="Canyon"
 defaultscenario="Scenario_Crossing_Push_Security"
 maxplayers="28"
 
+## Game Server Login Token (GSLT): Optional
+# GSLT can be used for running a public server.
+# More info: https://docs.linuxgsm.com/steamcmd/gslt
+gslt=""
+
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 ## Parameter Docs | https://mod.io/g/insurgencysandstorm/r/server-admin-guide
-startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -Rcon -RconPassword=${rconpassword} -RconListenPort=${rconport} -log"
+startparameters="${defaultmap}?Scenario=${defaultscenario}?MaxPlayers=${maxplayers} -Port=${port} -QueryPort=${queryport} -hostname='${servername}' -Rcon -RconPassword=${rconpassword} -RconListenPort=${rconport} -GSLTToken=${gslt} -log"
 
 #### LinuxGSM Settings ####
 
@@ -127,7 +132,7 @@ steamcmdforcewindows="no"
 branch=""
 betapassword=""
 # Master Server | https://docs.linuxgsm.com/steamcmd/steam-master-server
-steammaster="false"
+steammaster="true"
 
 ## Stop Mode | https://docs.linuxgsm.com/features/stop-mode
 # 1: tmux kill

+ 1 - 1
lgsm/config-default/config-lgsm/pstbsserver/_default.cfg

@@ -155,7 +155,7 @@ consoleinteract="no"
 
 ## Game Server Details
 # Do not edit
-gamename="pstbsserver"
+gamename="Post Scriptum"
 engine="unreal4"
 glibc="2.17"
 

+ 4 - 2
lgsm/config-default/config-lgsm/pvrserver/_default.cfg

@@ -14,9 +14,11 @@ port="7777"
 
 # Maps: bridge, datacenter, sand
 defaultmap="datacenter"
+# Get an API key from https://pavlov-ms.vankrupt.com/servers/v1/key
+apikey=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="${defaultmap} -log -MultiHome=${ip} -Port=${port}"
+startparameters="Pavlov ${defaultmap} -log -MultiHome=${ip} -Port=${port} ApiKey=${apikey}"
 
 #### LinuxGSM Settings ####
 
@@ -163,7 +165,7 @@ glibc="2.17"
 ## Game Server Directories
 systemdir="${serverfiles}/Pavlov"
 executabledir="${systemdir}/Binaries/Linux"
-executable="./PavlovServer"
+executable="./PavlovServer-Linux-Shipping"
 servercfgdir="${systemdir}/Saved/Config/LinuxServer"
 servercfg="Game.ini"
 servercfgdefault="Game.ini"

+ 1 - 2
lgsm/config-default/config-lgsm/pzserver/_default.cfg

@@ -10,11 +10,10 @@
 
 ## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
 ip="0.0.0.0"
-javaram="8192" # -Xmx$8192M
 adminpassword="CHANGE_ME"
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="--ip ${ip} -adminpassword \"${adminpassword}\" -servername ${selfname} -Xmx${javaram}M"
+startparameters="-servername ${selfname}"
 
 #### LinuxGSM Settings ####
 

+ 4 - 1
lgsm/config-default/config-lgsm/untserver/_default.cfg

@@ -13,6 +13,9 @@ ip="0.0.0.0"
 port="27015"
 maxplayers="20"
 defaultmap="PEI"
+servername="LinuxGSM"
+perspective="first" # Values: first, third, vehicle, Both.
+gamemode="normal" # Values: normal, easy, gold.
 
 ## Game Server Login Token (GSLT): Required
 # GSLT is required for running a public server.
@@ -20,7 +23,7 @@ defaultmap="PEI"
 gslt=""
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="-nographics -batchmode -bind ${ip} -port ${port} -maxplayers ${maxplayers} -map ${defaultmap} -gslt ${gslt} +InternetServer/${selfname}"
+startparameters="-nographics -batchmode -bind ${ip} -port ${port} -maxplayers ${maxplayers} -perspective ${perspective} -mode ${gamemode} -name ${servername} -map ${defaultmap} -gslt ${gslt} +InternetServer/${selfname}"
 
 #### LinuxGSM Settings ####
 

+ 3 - 3
lgsm/config-default/config-lgsm/vintsserver/_default.cfg

@@ -9,7 +9,7 @@
 #### Game Server Settings ####
 
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
-startparameters="--datapath ${servercfgdir}"
+startparameters="--dataPath ${servercfgdir}"
 
 ## Release Settings | https://docs.linuxgsm.com/game-servers/vintagestory#release-settings
 # Branch (stable|unstable)
@@ -150,8 +150,8 @@ glibc="2.17"
 ## Game Server Directories
 systemdir="${serverfiles}"
 executabledir="${systemdir}"
-preexecutable="mono"
-executable="./VintagestoryServer.exe"
+preexecutable=""
+executable="./VintagestoryServer"
 servercfgdir="${serverfiles}/data/${selfname}"
 servercfg="serverconfig.json"
 servercfgdefault="serverconfig.json"

+ 2 - 2
lgsm/data/almalinux-8.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/almalinux-9.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/centos-7.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-11-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-11-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/centos-8.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/centos-9.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/debian-10.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-11-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-11-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
 wet

+ 2 - 2
lgsm/data/debian-11.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
 wet

+ 2 - 2
lgsm/data/debian-12.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vs
 wet

+ 2 - 2
lgsm/data/debian-9.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-8-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-8-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-8-jre
 vs
 wet

+ 2 - 2
lgsm/data/rhel-7.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-11-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-11-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/rhel-8.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/rhel-9.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/rocky-8.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 2 - 2
lgsm/data/rocky-9.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,java-17-openjdk
-pstbs,GConf2
+ps,GConf2
 pvkii
 pvr,libcxx
 pz,java-11-openjdk rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,glibc-devel
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,java-17-openjdk
 vs
 wet

+ 1 - 1
lgsm/data/serverlist.csv

@@ -82,7 +82,7 @@ opfor,opforserver,Opposing Force,ubuntu-22.04
 pc,pcserver,Project Cars,ubuntu-22.04
 pc2,pc2server,Project Cars 2,ubuntu-22.04
 pmc,pmcserver,PaperMC,ubuntu-22.04
-pstbs,pstbsserver,Post Scriptum: The Bloody Seventh,ubuntu-22.04
+ps,psserver,Post Scriptum,ubuntu-22.04
 pvkii,pvkiiserver,Pirates Vikings & Knights II,ubuntu-22.04
 pvr,pvrserver,Pavlov VR,ubuntu-22.04
 pz,pzserver,Project Zomboid,ubuntu-22.04

+ 2 - 2
lgsm/data/ubuntu-16.04.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-8-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-8-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-8-jre
 vs
 wet

+ 2 - 2
lgsm/data/ubuntu-18.04.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-11-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-11-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
 wet

+ 2 - 2
lgsm/data/ubuntu-20.04.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-11-jre
 vs
 wet

+ 0 - 135
lgsm/data/ubuntu-21.04.csv

@@ -1,135 +0,0 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils
-steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
-ac
-ahl
-ahl2
-ark
-arma3
-armar,libcurl4
-ats
-av
-bb
-bb2,libcurl4-gnutls-dev:i386
-bd
-bf1942,libncurses5:i386,libtinfo5:i386
-bfv,libncurses5:i386,libstdc++5:i386
-bmdm,libncurses5:i386
-bo
-bs
-bt,libicu-dev,dos2unix,libxml2-utils
-btl
-cc
-cd
-ck,xvfb,libxi6
-cmw
-cod,libstdc++5:i386
-cod2,libstdc++5:i386
-cod4
-coduo,libstdc++5:i386
-codwaw
-col
-cs
-cscz
-csgo
-css,libtinfo5:i386
-ct
-dab
-dayz
-dmc
-dod
-dodr
-dods
-doi
-dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
-em
-etl
-ets2
-fctr
-fof
-gmod,libtinfo5:i386
-hcu
-hl2dm
-hldm
-hldms
-hw,lib32z1
-ins
-inss
-ios
-jc2
-jc3
-jk2
-kf
-kf2
-l4d
-l4d2
-lo
-mc,openjdk-17-jre
-mcb
-mh
-mohaa,libstdc++5:i386
-mom
-mta,libncursesw5,libxml2-utils
-nd
-nec
-nmrih,libtinfo5:i386
-ns
-ns2,speex,libtbb2
-ns2c,speex:i386,libtbb2
-ohd
-onset,libmariadb-dev
-opfor
-pc
-pc2
-pmc,openjdk-17-jre
-pstbs,libgconf-2-4
-pvkii
-pvr,libc++1
-pz,openjdk-17-jre,rng-tools
-q2
-q3
-ql
-qw
-ricochet
-ro
-rtcw
-rust,lib32z1
-rw,openjdk-17-jre
-samp
-sb
-sbots
-scpsl,mono-complete
-scpslsm,mono-complete
-sdtd,telnet,expect,libxml2-utils
-sf
-sfc,libtinfo5:i386
-sof2
-sol
-squad
-st,libxml2-utils
-stn
-sven,libssl1.1:i386,zlib1g:i386
-terraria
-tf2,libcurl4-gnutls-dev:i386
-tfc
-ti
-ts
-ts3
-tu
-tw
-unt
-ut
-ut2k4
-ut3
-ut99
-vh,libc6-dev
-vints,mono-complete
-vpmc,openjdk-11-jre
-vs
-wet
-wf
-wmc,openjdk-17-jre
-wurm,xvfb
-zmr,libtinfo5:i386
-zps,libtinfo5:i386

+ 0 - 135
lgsm/data/ubuntu-21.10.csv

@@ -1,135 +0,0 @@
-all,bc,binutils,bsdmainutils,bzip2,ca-certificates,cpio,curl,distro-info,file,gzip,hostname,jq,lib32gcc-s1,lib32stdc++6,netcat,python3,tar,tmux,unzip,util-linux,wget,xz-utils
-steamcmd,lib32gcc-s1,lib32stdc++6,libsdl2-2.0-0:i386,steamcmd
-ac
-ahl
-ahl2
-ark
-arma3
-armar,libcurl4
-ats
-av
-bb
-bb2,libcurl4-gnutls-dev:i386
-bd
-bf1942,libncurses5:i386,libtinfo5:i386
-bfv,libncurses5:i386,libstdc++5:i386
-bmdm,libncurses5:i386
-bo
-bs
-bt,libicu-dev,dos2unix,libxml2-utils
-btl
-cc
-cd
-ck,xvfb,libxi6
-cmw
-cod,libstdc++5:i386
-cod2,libstdc++5:i386
-cod4
-coduo,libstdc++5:i386
-codwaw
-col
-cs
-cscz
-csgo
-css,libtinfo5:i386
-ct
-dab
-dayz
-dmc
-dod
-dodr
-dods
-doi
-dst,libcurl4-gnutls-dev:i386
-dys
-eco,libgdiplus
-em
-etl
-ets2
-fctr
-fof
-gmod,libtinfo5:i386
-hcu
-hl2dm
-hldm
-hldms
-hw,lib32z1
-ins
-inss
-ios
-jc2
-jc3
-jk2
-kf
-kf2
-l4d
-l4d2
-lo
-mc,openjdk-17-jre
-mcb
-mh
-mohaa,libstdc++5:i386
-mom
-mta,libncursesw5,libxml2-utils
-nd
-nec
-nmrih,libtinfo5:i386
-ns
-ns2,speex,libtbb2
-ns2c,speex:i386,libtbb2
-ohd
-onset,libmariadb-dev
-opfor
-pc
-pc2
-pmc,openjdk-17-jre
-pstbs,libgconf-2-4
-pvkii
-pvr,libc++1
-pz,openjdk-17-jre,rng-tools
-q2
-q3
-ql
-qw
-ricochet
-ro
-rtcw
-rust,lib32z1
-rw,openjdk-17-jre
-samp
-sb
-sbots
-scpsl,mono-complete
-scpslsm,mono-complete
-sdtd,telnet,expect,libxml2-utils
-sf
-sfc,libtinfo5:i386
-sof2
-sol
-squad
-st,libxml2-utils
-stn
-sven,libssl1.1:i386,zlib1g:i386
-terraria
-tf2,libcurl4-gnutls-dev:i386
-tfc
-ti
-ts
-ts3
-tu
-tw
-unt
-ut
-ut2k4
-ut3
-ut99
-vh,libc6-dev
-vints,mono-complete
-vpmc,openjdk-11-jre
-vs
-wet
-wf
-wmc,openjdk-17-jre
-wurm,xvfb
-zmr,libtinfo5:i386
-zps,libtinfo5:i386

+ 2 - 2
lgsm/data/ubuntu-22.04.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vs
 wet

+ 2 - 2
lgsm/data/ubuntu-23.04.csv

@@ -83,7 +83,7 @@ opfor
 pc
 pc2
 pmc,openjdk-17-jre
-pstbs,libgconf-2-4
+ps,libgconf-2-4
 pvkii
 pvr,libc++1
 pz,openjdk-17-jre,rng-tools5
@@ -124,7 +124,7 @@ ut2k4
 ut3
 ut99
 vh,libc6-dev
-vints,mono-complete
+vints,aspnetcore-runtime-7.0
 vpmc,openjdk-17-jre
 vs
 wet

+ 11 - 0
lgsm/modules/alert.sh

@@ -72,6 +72,15 @@ fn_alert_check_update() {
 	alertbody="${gamename} update available: ${remotebuildversion}"
 }
 
+fn_alert_update_restart() {
+	fn_script_log_info "Sending alert: Restarted"
+	alertsubject="Alert - ${selfname} - Restarted"
+	alertemoji="🎮"
+	alertsound="1"
+	alerturl="not enabled"
+	alertbody="${gamename} received update: ${remotebuildversion} and required restarting"
+}
+
 fn_alert_permissions() {
 	fn_script_log_info "Sending alert: Permissions error"
 	alertsubject="Alert - ${selfname}: Permissions error"
@@ -102,6 +111,8 @@ elif [ "${alert}" == "update" ]; then
 	fn_alert_update
 elif [ "${alert}" == "check-update" ]; then
 	fn_alert_check_update
+elif [ "${alert}" == "update-restart" ]; then
+	fn_alert_update_restart
 elif [ "${alert}" == "config" ]; then
 	fn_alert_config
 fi

+ 52 - 19
lgsm/modules/check_deps.sh

@@ -7,6 +7,19 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
+fn_install_dotnet_repo() {
+	if [ "${distroid}" == "ubuntu" ]; then
+		# if package aspnetcore-runtime-7.0 is unavailable in ubuntu repos, add the microsoft repo.
+		if ! apt-cache show aspnetcore-runtime-7.0 > /dev/null 2>&1; then
+			fn_fetch_file "https://packages.microsoft.com/config/ubuntu/${distroversion}/packages-microsoft-prod.deb" "" "" "" "/tmp" "packages-microsoft-prod.deb" "" "" "" ""
+			sudo dpkg -i /tmp/packages-microsoft-prod.deb
+		fi
+	elif [ "${distroid}" == "debian" ]; then
+		fn_fetch_file "https://packages.microsoft.com/config/debian/${distroversion}/packages-microsoft-prod.deb" "" "" "" "/tmp" "packages-microsoft-prod.deb" "" "" "" ""
+		sudo dpkg -i /tmp/packages-microsoft-prod.deb
+	fi
+}
+
 fn_install_mono_repo() {
 	if [ "${autodepinstall}" == "0" ]; then
 		fn_print_information_nl "Automatically adding Mono repository."
@@ -19,20 +32,26 @@ fn_install_mono_repo() {
 		sleep 1
 		echo -en "   \r"
 		if [ "${distroid}" == "ubuntu" ]; then
-			if [ "${distroversion}" == "20.04" ]; then
-				cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			if [ "${distroversion}" == "22.04" ]; then
+				cmd="sudo apt-get install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-jammy main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			elif [ "${distroversion}" == "20.04" ]; then
+				cmd="sudo apt-get install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-focal main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			elif [ "${distroversion}" == "18.04" ]; then
-				cmd="sudo apt install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+				cmd="sudo apt-get install gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/ubuntu stable-bionic main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			elif [ "${distroversion}" == "16.04" ]; then
 				cmd="sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;sudo apt install apt-transport-https ca-certificates;echo 'deb https://download.mono-project.com/repo/ubuntu stable-xenial main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			else
 				monoautoinstall="1"
 			fi
 		elif [ "${distroid}" == "debian" ]; then
-			if [ "${distroversion}" == "10" ]; then
-				cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			if [ "${distroversion}" == "12" ]; then
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-bookworm main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			elif [ "${distroversion}" == "11" ]; then
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-bullseye main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+			elif [ "${distroversion}" == "10" ]; then
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-buster main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			elif [ "${distroversion}" == "9" ]; then
-				cmd="sudo apt install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
+				cmd="sudo apt-get install apt-transport-https dirmngr gnupg ca-certificates;sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF;echo 'deb https://download.mono-project.com/repo/debian stable-stretch main' | sudo tee /etc/apt/sources.list.d/mono-official-stable.list;sudo apt update"
 			else
 				monoautoinstall="1"
 			fi
@@ -93,16 +112,16 @@ fn_deps_email() {
 				array_deps_required+=(exim4)
 			elif [ -d /etc/sendmail ]; then
 				array_deps_required+=(sendmail)
-			elif [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				array_deps_required+=(mailutils postfix)
-			elif [ "$(command -v rpm 2> /dev/null)" ]; then
+			elif [ "$(command -v yum 2> /dev/null)" ] || [ "$(command -v dnf 2> /dev/null)" ]; then
 				array_deps_required+=(mailx postfix)
+			elif [ "$(command -v apt 2> /dev/null)" ]; then
+				array_deps_required+=(mailutils postfix)
 			fi
 		else
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
-				array_deps_required+=(mailutils postfix)
-			elif [ "$(command -v rpm 2> /dev/null)" ]; then
+			if [ "$(command -v yum 2> /dev/null)" ] || [ "$(command -v dnf 2> /dev/null)" ]; then
 				array_deps_required+=(mailx postfix)
+			elif [ "$(command -v apt 2> /dev/null)" ]; then
+				array_deps_required+=(mailutils postfix)
 			fi
 		fi
 	fi
@@ -129,10 +148,14 @@ fn_install_missing_deps() {
 		fi
 		autodepinstall="$?"
 
-		if [ "${monostatus}" == "1" ]; then
+		if [ "${monoinstalled}" == "false" ]; then
 			fn_install_mono_repo
 		fi
 
+		if [ "${dotnetinstalled}" == "false" ]; then
+			fn_install_dotnet_repo
+		fi
+
 		if [ "${commandname}" == "INSTALL" ]; then
 			if [ "${autodepinstall}" == "0" ]; then
 				fn_print_information_nl "$(whoami) has sudo access."
@@ -144,7 +167,7 @@ fn_install_missing_deps() {
 		fi
 
 		# Add sudo dpkg --add-architecture i386 if using i386 packages.
-		if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+		if [ "$(command -v apt 2> /dev/null)" ]; then
 			if printf '%s\n' "${array_deps_required[@]}" | grep -q -P 'i386'; then
 				i386installcommand="sudo dpkg --add-architecture i386; "
 			fi
@@ -161,7 +184,7 @@ fn_install_missing_deps() {
 			echo -en "...\r"
 			sleep 1
 			echo -en "   \r"
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+			if [ "$(command -v apt 2> /dev/null)" ]; then
 				cmd="echo steamcmd steam/question select \"I AGREE\" | sudo debconf-set-selections; echo steamcmd steam/license note '' | sudo debconf-set-selections; ${i386installcommand}sudo apt-get update; sudo apt-get -y install ${array_deps_missing[*]}"
 				eval "${cmd}"
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
@@ -181,7 +204,7 @@ fn_install_missing_deps() {
 
 		# If automatic dependency install is unavailable.
 		if [ "${autodepinstall}" != "0" ]; then
-			if [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+			if [ "$(command -v apt 2> /dev/null)" ]; then
 				echo -e "${i386installcommand}sudo apt update; sudo apt install ${array_deps_missing[*]}"
 			elif [ "$(command -v dnf 2> /dev/null)" ]; then
 				echo -e "sudo dnf install ${array_deps_missing[*]}"
@@ -248,13 +271,23 @@ fn_deps_detector() {
 		if [ -n "${monoversion}" ] && [ "${monoversion}" -ge "5" ]; then
 			# Mono >= 5.0.0 already installed.
 			depstatus=0
-			monostatus=0
+			monoinstalled=true
 		else
 			# Mono not installed or installed Mono < 5.0.0.
 			depstatus=1
-			monostatus=1
+			monoinstalled=false
+		fi
+	# .NET Core: A .NET Core repo needs to be installed.
+	elif [ "${deptocheck}" == "aspnetcore-runtime-7.0" ]; then
+		# .NET is not installed.
+		if [ -n "${dotnetversion}" ]; then
+			depstatus=0
+			dotnetinstalled=true
+		else
+			depstatus=1
+			dotnetinstalled=false
 		fi
-	elif [ "$(command -v dpkg-query 2> /dev/null)" ]; then
+	elif [ "$(command -v apt 2> /dev/null)" ]; then
 		dpkg-query -W -f='${Status}' "${deptocheck}" 2> /dev/null | grep -q -P '^install ok installed'
 		depstatus=$?
 	elif [ "$(command -v dnf 2> /dev/null)" ]; then

+ 7 - 7
lgsm/modules/check_last_update.sh

@@ -3,21 +3,21 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Checks lock file to see when last update happened.
+# Description: Checks Lockfile to see when last update happened.
 # Will reboot server if instance not rebooted since update.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-if [ -f "${lockdir}/${selfname}-laststart.lock" ]; then
-	laststart=$(cat "${lockdir}/${selfname}-laststart.lock")
+if [ -f "${lockdir}/${selfname}-last-started.lock" ]; then
+	laststart=$(cat "${lockdir}/${selfname}-last-started.lock")
 fi
-if [ -f "${lockdir}/lastupdate.lock" ]; then
-	lastupdate=$(cat "${lockdir}/lastupdate.lock")
+if [ -f "${lockdir}/last-updated.lock" ]; then
+	lastupdate=$(cat "${lockdir}/last-updated.lock")
 fi
 
 check_status.sh
-if [ -f "${lockdir}/lastupdate.lock" ] && [ "${status}" != "0" ]; then
-	if [ ! -f "${lockdir}/${selfname}-laststart.lock" ] || [ "${laststart}" -lt "${lastupdate}" ]; then
+if [ -f "${lockdir}/last-updated.lock" ] && [ "${status}" != "0" ]; then
+	if [ ! -f "${lockdir}/${selfname}-last-started.lock" ] || [ "${laststart}" -lt "${lastupdate}" ]; then
 		fn_print_info "${selfname} has not been restarted since last update"
 		fn_script_log_info "${selfname} has not been restarted since last update"
 		command_restart.sh

+ 5 - 0
lgsm/modules/check_logs.sh

@@ -24,3 +24,8 @@ fi
 if [ "${gamelogdir}" ] && [ -d "${gamelogdir}" ] && [ ! -d "${logdir}/server" ]; then
 	fn_check_logs
 fi
+
+# Create Steam log symlink if missing
+if [ ! -d "${logdir}/steam" ] && [ -n "${appid}" ]; then
+	fn_check_logs
+fi

+ 1 - 1
lgsm/modules/check_status.sh

@@ -7,4 +7,4 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-status=$(tmux -L "${sessionname}" list-sessions -F "#{session_name}" 2> /dev/null | grep -Ecx "^${sessionname}")
+status=$(tmux -L "${socketname}" list-sessions -F "#{session_name}" 2> /dev/null | grep -Ecx "^${sessionname}")

+ 1 - 1
lgsm/modules/check_system_requirements.sh

@@ -29,7 +29,7 @@ elif [ "${shortname}" == "rust" ]; then
 elif [ "${shortname}" == "mc" ] || [ "${shortname}" == "pmc" ] || [ "${shortname}" == "wmc" ]; then
 	ramrequirementmb="1000"
 	ramrequirementgb="1"
-elif [ "${shortname}" == "pstbs" ]; then
+elif [ "${shortname}" == "ps" ]; then
 	ramrequirementmb="2000"
 	ramrequirementgb="2"
 elif [ "${shortname}" == "ns2" ] || [ "${shortname}" == "ns2c" ]; then

+ 20 - 8
lgsm/modules/command_backup.sh

@@ -22,7 +22,7 @@ fn_backup_trap() {
 	echo -en "backup ${backupname}.tar.gz..."
 	fn_print_removed_eol_nl
 	fn_script_log_info "Backup ${backupname}.tar.gz: REMOVED"
-	# Remove lock file.
+	# Remove backup lockfile.
 	rm -f "${lockdir:?}/backup.lock"
 	fn_backup_start_server
 	unset exitbypass
@@ -31,9 +31,21 @@ fn_backup_trap() {
 
 # Check if a backup is pending or has been aborted using backup.lock.
 fn_backup_check_lockfile() {
+	# Remove stale lockfile.
 	if [ -f "${lockdir}/backup.lock" ]; then
-		fn_print_info_nl "Lock file found: Backup is currently running"
-		fn_script_log_error "Lock file found: Backup is currently running: ${lockdir}/backup.lock"
+		if [ "$(find "${lockdir}/backup.lock" -mmin +60)" ]; then
+			fn_print_dots "Lockfile found: "
+			fn_print_checking_eol
+			fn_print_warn "Lockfile found: Removing stale lockfile: "
+			fn_print_warn_eol
+			fn_script_log_warn "Lockfile found: Removing stale lockfile"
+			rm -f "${lockdir:?}/backup.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/backup.lock" ]; then
+		fn_print_info_nl "Lockfile found: Backup is currently running"
+		fn_script_log_error "Lockfile found: Backup is currently running: ${lockdir}/backup.lock"
 		core_exit.sh
 	fi
 }
@@ -117,8 +129,8 @@ fn_backup_migrate_olddir() {
 
 fn_backup_create_lockfile() {
 	# Create lockfile.
-	date '+%s' > "${lockdir}/backup.lock"
-	fn_script_log_info "Lockfile generated"
+	date '+%s' > "${lockdir:?}/backup.lock"
+	fn_script_log_info "Backup lockfile generated"
 	fn_script_log_info "${lockdir}/backup.lock"
 	# trap to remove lockfile on quit.
 	trap fn_backup_trap INT
@@ -140,7 +152,7 @@ fn_backup_compression() {
 		core_exit.sh
 	fi
 
-	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}/backup.lock" ./.
+	tar -czf "${backupdir}/${backupname}.tar.gz" -C "${rootdir}" --exclude "${excludedir}" --exclude "${lockdir}" ./.
 	local exitcode=$?
 	if [ "${exitcode}" != 0 ]; then
 		fn_print_fail_eol
@@ -153,8 +165,6 @@ fn_backup_compression() {
 		fn_print_ok_nl "Completed: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 		fn_script_log_pass "Backup created: ${backupname}.tar.gz, total size $(du -sh "${backupdir}/${backupname}.tar.gz" | awk '{print $1}')"
 	fi
-	# Remove lock file
-	rm -f "${lockdir:?}/backup.lock"
 }
 
 # Clear old backups according to maxbackups and maxbackupdays variables.
@@ -265,4 +275,6 @@ fn_backup_compression
 fn_backup_prune
 fn_backup_start_server
 
+# Remove backup lockfile.
+rm -f "${lockdir:?}/backup.lock"
 core_exit.sh

+ 6 - 6
lgsm/modules/command_check_update.sh

@@ -17,19 +17,19 @@ core_logs.sh
 if [ "${shortname}" == "ts3" ]; then
 	update_ts3.sh
 elif [ "${shortname}" == "mc" ]; then
-	update_minecraft.sh
+	update_mc.sh
 elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
+	update_mcb.sh
 elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-	update_papermc.sh
+	update_pmc.sh
 elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
+	update_fctr.sh
 elif [ "${shortname}" == "mta" ]; then
 	update_mta.sh
 elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
+	update_jk2.sh
 elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
+	update_vints.sh
 elif [ "${shortname}" == "ut99" ]; then
 	update_ut99.sh
 else

+ 1 - 1
lgsm/modules/command_console.sh

@@ -42,7 +42,7 @@ check_status.sh
 if [ "${status}" != "0" ]; then
 	fn_print_ok_nl "Accessing console"
 	fn_script_log_pass "Console accessed"
-	tmux -L "${sessionname}" attach-session -t "${sessionname}"
+	tmux -L "${socketname}" attach-session -t "${sessionname}"
 	fn_print_ok_nl "Closing console"
 	fn_script_log_pass "Console closed"
 else

+ 9 - 9
lgsm/modules/command_debug.sh

@@ -13,7 +13,7 @@ fn_firstcommand_set
 # Trap to remove lockfile on quit.
 fn_lockfile_trap() {
 	# Remove lockfile.
-	rm -f "${lockdir:?}/${selfname}.lock"
+	rm -f "${lockdir:?}/${selfname}-started.lock"
 	# resets terminal. Servers can sometimes mess up the terminal on exit.
 	reset
 	fn_print_dots "Stopping debug"
@@ -58,9 +58,9 @@ fi
 echo -e "${lightblue}Game Server IP:\t${default}${ip}:${port}"
 
 # External server IP.
-if [ "${extip}" ]; then
-	if [ "${ip}" != "${extip}" ]; then
-		echo -e "${lightblue}Internet IP:\t${default}${extip}:${port}"
+if [ "${publicip}" ]; then
+	if [ "${ip}" != "${publicip}" ]; then
+		echo -e "${lightblue}Internet IP:\t${default}${publicip}:${port}"
 	fi
 fi
 
@@ -98,12 +98,12 @@ fn_print_dots "Starting debug"
 fn_script_log_info "Starting debug"
 fn_print_ok_nl "Starting debug"
 
-# Create lockfile.
-date '+%s' > "${lockdir}/${selfname}.lock"
-echo "${version}" >> "${lockdir}/${selfname}.lock"
-echo "${port}" >> "${lockdir}/${selfname}.lock"
+# Create started lockfile.
+date '+%s' > "${lockdir:?}/${selfname}-started.lock"
+echo "${version}" >> "${lockdir}/${selfname}-started.lock"
+echo "${port}" >> "${lockdir}/${selfname}-started.lock"
 fn_script_log_info "Lockfile generated"
-fn_script_log_info "${lockdir}/${selfname}.lock"
+fn_script_log_info "${lockdir}/${selfname}-started.lock"
 
 if [ "${shortname}" == "av" ]; then
 	cd "${systemdir}" || exit

+ 1 - 1
lgsm/modules/command_dev_details.sh

@@ -44,7 +44,7 @@ declare -A server_details=(
 	['HTTP Password']="${httppassword}"
 	['HTTP Port']="${httpport}"
 	['HTTP User']="${httpuser}"
-	['Internet IP']="${extip}"
+	['Internet IP']="${publicip}"
 	['LAN Port']="${lanport}"
 	['Master Port']="${masterport}"
 	['Master']="${master}"

+ 1 - 1
lgsm/modules/command_dev_detect_glibc.sh

@@ -15,7 +15,7 @@ echo -e "================================="
 echo -e "glibc Requirements Checker"
 echo -e "================================="
 
-if [ ! "$(command -v objdump)" ]; then
+if [ ! "$(command -v objdump 2> /dev/null)" ]; then
 	fn_print_failure_nl "objdump is missing"
 	fn_script_log_fatal "objdump is missing"
 	core_exit.sh

+ 1 - 1
lgsm/modules/command_mods_remove.sh

@@ -131,7 +131,7 @@ fi
 if [ "${engine}" == "unity3d" ] && [[ "${modprettyname}" == *"Oxide"* ]]; then
 	fn_print_information_nl "Validating to restore original ${gamename} files replaced by Oxide"
 	fn_script_log "Validating to restore original ${gamename} files replaced by Oxide"
-	exitbypass="1"
+	exitbypass=1
 	command_validate.sh
 	fn_firstcommand_reset
 	unset exitbypass

+ 164 - 49
lgsm/modules/command_monitor.sh

@@ -11,76 +11,152 @@ commandaction="Monitoring"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set
 
-fn_monitor_check_lockfile() {
-	# Monitor does not run if lockfile is not found.
-	if [ ! -f "${lockdir}/${selfname}.lock" ]; then
+fn_monitor_check_monitoring() {
+	if [ -f "${lockdir}/${selfname}.lock" ]; then
+		# Part of migration to v23.5.0. #4296
+		rm -f "${lockdir:?}/${selfname}.lock"
+		date '+%s' > "${lockdir:?}/${selfname}-monitoring.lock"
+	elif [ ! -f "${lockdir}/${selfname}-monitoring.lock" ]; then
+		# Monitor does not run if lockfile is not found.
 		fn_print_dots "Checking lockfile: "
 		fn_print_checking_eol
 		fn_script_log_info "Checking lockfile: CHECKING"
-		fn_monitor_check_update
-		fn_monitor_check_backup
-		fn_monitor_check_debug
 		fn_print_error "Checking lockfile: No lockfile found: "
 		fn_print_error_eol_nl
 		fn_script_log_error "Checking lockfile: No lockfile found: ERROR"
 		echo -e "* Start ${selfname} to run monitor."
 		core_exit.sh
 	fi
+}
 
-	# Fix if lockfile is not unix time or contains letters
-	if [ -f "${lockdir}/${selfname}.lock" ] && [[ "$(head -n 1 "${lockdir}/${selfname}.lock")" =~ [A-Za-z] ]]; then
-		date '+%s' > "${lockdir}/${selfname}.lock"
-		echo "${version}" >> "${lockdir}/${selfname}.lock"
-		echo "${port}" >> "${lockdir}/${selfname}.lock"
+fn_monitor_check_install() {
+	if [ "$(pgrep -fc -u "${USER}" "/bin/bash ./${selfname} install")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} i")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} auto-install")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} ai")" != "0" ]; then
+		fn_print_dots "Checking installer: "
+		fn_print_checking_eol
+		fn_script_log_info "Checking installer: CHECKING"
+		fn_print_info "Checking installer: LinuxGSM is installing: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking installer: LinuxGSM is installing"
+		core_exit.sh
 	fi
 }
 
-fn_monitor_check_backup() {
-	# Monitor will check if backup is running.
-	if [ "$(pgrep "${selfname} backup" | wc -l)" != "0" ] || [ "$(pgrep "${selfname} b" | wc -l)" != "0" ]; then
-		fn_print_info "Checking lockfile: LinuxGSM is currently running a backup: "
-		fn_print_info_eol
-		fn_script_log_info "Checking lockfile: LinuxGSM is currently running a backup"
+fn_monitor_check_debug() {
+	if [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} debug")" != "0" ] || [ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} d")" != "0" ]; then
+		fn_print_dots "Checking debug: "
+		fn_print_checking_eol
+		fn_print_info "Checking debug: Debug is running: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking debug: Debug is running"
 		core_exit.sh
 	fi
 }
 
-fn_monitor_check_debug() {
-	# Monitor will check if backup is running.
-	if [ "$(pgrep -fc "${selfname} backup")" != "0" ] || [ "$(pgrep -fc "${selfname} b")" != "0" ]; then
-		fn_print_info "Checking lockfile: LinuxGSM is currently in debug mode: "
-		fn_print_info_eol
-		fn_script_log_pass "Checking lockfile: LinuxGSM is currently in debug mode"
+fn_monitor_check_starting() {
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/${selfname}-starting.lock" ]; then
+		if [ "$(find "${lockdir}/${selfname}-starting.lock" -mmin +5)" ]; then
+			fn_print_dots "Checking start: "
+			fn_print_checking_eol
+			fn_print_warn "Checking start: Removing stale lockfile: "
+			fn_print_warn_eol_nl
+			fn_script_log_warn "Checking start: Removing stale lockfile"
+			rm -f "${lockdir:?}/${selfname}-starting.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/${selfname}-starting.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} start")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} s")" != "0" ]]; then
+		fn_print_dots "Checking start: "
+		fn_print_checking_eol
+		fn_print_info "Checking start: LinuxGSM is starting: "
+		fn_print_info_eol_nl
+		fn_script_log_info "Checking backup: LinuxGSM is starting"
 		core_exit.sh
 	fi
 }
 
-fn_monitor_check_install() {
-	# Monitor will check if update is running.
-	if [ "$(pgrep -fc "${selfname} install")" != "0" ] || [ "$(pgrep -fc "${selfname} i")" != "0" ] || [ "$(pgrep -fc "${selfname} auto-install")" != "0" ] || [ "$(pgrep -fc "${selfname} ai")" != "0" ]; then
-		fn_print_dots "Checking for installer: "
+fn_monitor_check_stopping() {
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/${selfname}-stopping.lock" ]; then
+		if [ "$(find "${lockdir}/${selfname}-stopping.lock" -mmin +5)" ]; then
+			fn_print_dots "Checking stop: "
+			fn_print_checking_eol
+			fn_print_warn "Checking stop: Removing stale lockfile: "
+			fn_print_warn_eol_nl
+			fn_script_log_warn "Checking stop: Removing stale lockfile"
+			rm -f "${lockdir:?}/${selfname}-stopping.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/${selfname}-stopping.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} stop")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} s")" != "0" ]]; then
+		fn_print_dots "Checking stop: "
+		fn_print_checking_eol
+		fn_print_info "Checking stop: LinuxGSM is stopping: "
+		fn_print_info_eol_nl
+		fn_script_log_info "Checking backup: LinuxGSM is stopping"
+		core_exit.sh
+	fi
+}
+
+fn_monitor_check_backup() {
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/backup.lock" ]; then
+		if [ "$(find "${lockdir}/backup.lock" -mmin +60)" ]; then
+			fn_print_dots "Checking backup: "
+			fn_print_checking_eol
+			fn_print_warn "Checking backup: Removing stale lockfile: "
+			fn_print_warn_eol
+			fn_script_log_warn "Checking backup: Removing stale lockfile"
+			rm -f "${lockdir:?}/backup.lock"
+		fi
+	fi
+
+	if [ -f "${lockdir}/backup.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} backup")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} b")" != "0" ]]; then
+		fn_print_dots "Checking backup: "
 		fn_print_checking_eol
-		fn_script_log_info "Checking for installer: CHECKING"
-		fn_print_info "Checking for installer: LinuxGSM is currently installing: "
-		fn_print_info_eol
-		fn_script_log_pass "Checking for installer: LinuxGSM is currently installing"
+		fn_print_info "Checking backup: Backup is running: "
+		fn_print_info_eol_nl
+		fn_script_log_info "Checking backup: Backup is running"
 		core_exit.sh
 	fi
 }
 
 fn_monitor_check_update() {
-	# Specific check for docker. Will ignore the command watch -n 1800 ./csgoserver update
-	monitorps=0
-	if [ "$(pgrep -fc "n*${selfname} update")" != "0" ]; then
-		monitorps="$((monitorps - 1))"
+	# Remove stale lockfile.
+	if [ -f "${lockdir}/update.lock" ]; then
+		if [ "$(find "${lockdir}/update.lock" -mmin +15)" ]; then
+			fn_print_dots "Checking update: "
+			fn_print_checking_eol
+			fn_print_warn "Checking update: Removing stale lockfile: "
+			fn_print_warn_eol_nl
+			fn_script_log_warn "Checking update: Removing stale lockfile"
+			rm -f "${lockdir:?}/update.lock"
+		fi
 	fi
-	# Monitor will check if an update is running.
-	if [ "$(pgrep -fc "${selfname} update")" != "0" ] || [ "$(pgrep -fc "${selfname} u")" != "0" ] || [ "$(pgrep -fc "${selfname} validate")" != "0" ] || [ "$(pgrep -fc "${selfname} v")" != "0" ]; then
-		monitorps="$((monitorps + 2))"
-		if [ "${monitorps}" != "0" ]; then
-			fn_print_info_nl "Checking lockfile: LinuxGSM is currently updating: "
-			fn_print_info_eol
-			fn_script_log_pass "Checking lockfile: LinuxGSM is currently updating"
+
+	if [ -f "${lockdir}/update.lock" ] && [[ "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} update")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} validate")" != "0" || "$(pgrep -fcx -u "${USER}" "/bin/bash ./${selfname} v")" != "0" || "$(pgrep -fc force-update "${USER}" "/bin/bash ./${selfname} fu")" != "0" ]]; then
+		fn_print_dots "Checking update: "
+		fn_print_checking_eol
+		fn_print_info "Checking update: LinuxGSM is updating the game server: "
+		fn_print_info_eol_nl
+		fn_script_log_pass "Checking update: LinuxGSM is updating the game server"
+		core_exit.sh
+	fi
+}
+
+# Source engine games may display a messages to indicate the server needs restarting.
+fn_monitor_check_update_source() {
+	if [ -f "${consolelogdir}/${selfname}-console.log" ] && [ "${engine}" == "source" ]; then
+		if grep -q "Your server needs to be restarted in order to receive the latest update." "${consolelogdir}/${selfname}-console.log"; then
+			fn_print_dots "Checking update: "
+			fn_print_checking_eol
+			fn_script_log_info "Checking update: CHECKING"
+			fn_print_ok "Checking update: "
+			fn_print_ok_eol_nl
+			fn_script_log_info "Checking update: Monitor is restarting ${selfname} to apply update"
+			alert="update-restart"
+			alert.sh
+			command_restart.sh
 			core_exit.sh
 		fi
 	fi
@@ -90,8 +166,40 @@ fn_monitor_check_session() {
 	fn_print_dots "Checking session: "
 	fn_print_checking_eol
 	fn_script_log_info "Checking session: CHECKING"
-	# uses status var from check_status.sh
-	if [ "${status}" != "0" ]; then
+	# Tmux session width and height needs to be reviewed as may no longer be required.
+	sessionwidth="80"
+	sessionheight="23"
+	# Check for PIDS with identical tmux sessions running.
+	if [ "$(pgrep -fcx "tmux -L ${socketname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}")" -ge "2" ]; then
+		fn_print_error "Checking session: There are PIDS with identical tmux sessions running: "
+		fn_print_error_eol_nl
+		fn_script_log_error "Checking session: ERROR"
+		fn_script_log_error "Checking session: There are PIDS with identical tmux sessions running"
+		fn_script_log_error "Checking session: Killing all tmux sessions with the socketname name ${socketname} and session name ${sessionname}"
+		pkill -f "tmux -L ${socketname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}"
+		command_restart.sh
+		core_exit.sh
+	# Check for tmux pids with the same tmux session and socket names. This will reduce issues with migration to release v23.5.0. #4296
+	elif [ "$(pgrep -fc -u "${USER}" "tmux -L ${sessionname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}")" != "0" ]; then
+		fn_print_error "Checking session: PIDS with the same tmux session and socket names are running: "
+		fn_print_error_eol_nl
+		fn_script_log_error "Checking session: ERROR"
+		fn_script_log_error "Checking session: PIDS with the same tmux session and socket names are running"
+		fn_script_log_error "Checking session: Killing session with the socketname name ${sessionname} and session name ${sessionname}"
+		pkill -f "tmux -L ${sessionname} new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}"
+		command_restart.sh
+		core_exit.sh
+	# Check for tmux pids that are using the old type of tmux session. This will reduce issues with migration to release v23.5.0. #4296
+	elif [ "$(pgrep -fc -u "${USER}" "tmux new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}")" != "0" ]; then
+		fn_print_error "Checking session: PIDS with old type tmux session are running: "
+		fn_print_error_eol_nl
+		fn_script_log_error "Checking session: ERROR"
+		fn_script_log_error "Checking session: PIDS with old type tmux session are running"
+		fn_script_log_error "Checking session: Killing session with the session name ${sessionname}"
+		pkill -f "tmux new-session -d -x ${sessionwidth} -y ${sessionheight} -s ${sessionname}"
+		command_restart.sh
+		core_exit.sh
+	elif [ "${status}" != "0" ]; then
 		fn_print_ok "Checking session: "
 		fn_print_ok_eol_nl
 		fn_script_log_pass "Checking session: OK"
@@ -107,8 +215,8 @@ fn_monitor_check_session() {
 	fi
 }
 
+# Monitor will check queryport is set before continuing.
 fn_monitor_check_queryport() {
-	# Monitor will check queryport is set before continuing.
 	if [ -z "${queryport}" ] || [ "${queryport}" == "0" ]; then
 		fn_print_dots "Checking port: "
 		fn_print_checking_eol
@@ -133,7 +241,7 @@ fn_query_gsquery() {
 }
 
 fn_query_tcp() {
-	bash -c 'exec 3<> /dev/tcp/'${queryip}'/'${queryport}'' > /dev/null 2>&1
+	bash -c "exec 3<> /dev/tcp/'${queryip}'/'${queryport}'" > /dev/null 2>&1
 	querystatus="$?"
 }
 
@@ -147,12 +255,12 @@ fn_monitor_query() {
 			fn_print_querying_eol
 			fn_script_log_info "Querying port: ${querymethod}: ${queryip}:${queryport} : ${queryattempt} : QUERYING"
 			# querydelay
-			if [ "$(head -n 1 "${lockdir}/${selfname}.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then
+			if [ "$(head -n 1 "${lockdir}/${selfname}-started.lock")" -gt "$(date "+%s" -d "${querydelay} mins ago")" ]; then
 				fn_print_ok "Querying port: ${querymethod}: ${ip}:${queryport} : ${totalseconds}/${queryattempt}: "
 				fn_print_delay_eol_nl
 				fn_script_log_info "Querying port: ${querymethod}: ${ip}:${queryport} : ${queryattempt} : DELAY"
 				fn_script_log_info "Query bypassed: ${gameservername} started less than ${querydelay} minutes ago"
-				fn_script_log_info "Server started: $(date -d @$(head -n 1 "${lockdir}/${selfname}.lock"))"
+				fn_script_log_info "Server started: $(date -d "@$(head -n 1 "${lockdir}/${selfname}-started.lock")")"
 				fn_script_log_info "Current time: $(date)"
 				monitorpass=1
 				core_exit.sh
@@ -271,8 +379,15 @@ core_logs.sh
 info_game.sh
 
 # query pre-checks
-fn_monitor_check_lockfile
+fn_monitor_check_update_source
+fn_monitor_check_update
+fn_monitor_check_backup
+fn_monitor_check_debug
+fn_monitor_check_monitoring
+fn_monitor_check_starting
+fn_monitor_check_stopping
 fn_monitor_check_session
+
 # Monitor will not continue if session only check.
 if [ "${querymode}" != "1" ]; then
 	fn_monitor_check_queryport

+ 1 - 1
lgsm/modules/command_restart.sh

@@ -5,7 +5,7 @@
 # Website: https://linuxgsm.com
 # Description: Restarts the server.
 
-commandname="MODS-INSTALL"
+commandname="RESTART"
 commandaction="Restarting"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 fn_firstcommand_set

+ 1 - 1
lgsm/modules/command_send.sh

@@ -26,7 +26,7 @@ if [ "${status}" != "0" ]; then
 	fi
 	echo ""
 	fn_print_dots "Sending command to console: \"${commandtosend}\""
-	tmux -L "${sessionname}" send-keys -t "${servicename}" "${commandtosend}" ENTER
+	tmux -L "${socketname}" send-keys -t "${servicename}" "${commandtosend}" ENTER
 	fn_print_ok_nl "Sending command to console: \"${commandtosend}\""
 	fn_script_log_pass "Command \"${commandtosend}\" sent to console"
 else

+ 3 - 0
lgsm/modules/command_skeleton.sh

@@ -5,7 +5,10 @@
 # Website: https://linuxgsm.com
 # Description: Creates an copy of a game servers directorys.
 
+commandname="SKELETON"
+commandaction="Skeleton"
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+fn_firstcommand_set
 
 fn_print_dots "Creating skeleton directory"
 check.sh

+ 51 - 51
lgsm/modules/command_start.sh

@@ -11,39 +11,14 @@ moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 addtimestamp="gawk '{ print strftime(\\\"[$logtimestampformat]\\\"), \\\$0 }'"
 fn_firstcommand_set
 
-fn_start_teamspeak3() {
-	if [ ! -f "${servercfgfullpath}" ]; then
-		fn_print_warn_nl "${servercfgfullpath} is missing"
-		fn_script_log_warn "${servercfgfullpath} is missing"
-		echo "	* Creating blank ${servercfg}"
-		fn_script_log_info "Creating blank ${servercfg}"
-		fn_sleep_time
-		echo "	* ${servercfg} can remain blank by default."
-		fn_script_log_info "${servercfgfullpath} can remain blank by default."
-		fn_sleep_time
-		echo "	* ${servercfg} is located in ${servercfgfullpath}."
-		fn_script_log_info "${servercfg} is located in ${servercfgfullpath}."
-		sleep 5
-		touch "${servercfgfullpath}"
-	fi
-	# Accept license.
-	if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then
-		install_eula.sh
-	fi
-	fn_start_tmux
-}
-
 # This will allow the Jedi Knight 2 version to be printed in console on start.
 # Used to allow update to detect JK2MV server version.
 fn_start_jk2() {
 	fn_start_tmux
-	tmux -L "${sessionname}" end -t "${sessionname}" version ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" end -t "${sessionname}" version ENTER > /dev/null 2>&1
 }
 
 fn_start_tmux() {
-	if [ "${parmsbypass}" ]; then
-		startparameters=""
-	fi
 	# check for tmux size variables.
 	if [[ "${servercfgtmuxwidth}" =~ ^[0-9]+$ ]]; then
 		sessionwidth="${servercfgtmuxwidth}"
@@ -68,35 +43,44 @@ fn_start_tmux() {
 		mv "${consolelog}" "${consolelogdate}"
 	fi
 
-	# Create lockfile
-	date '+%s' > "${lockdir}/${selfname}.lock"
-	echo "${version}" >> "${lockdir}/${selfname}.lock"
-	echo "${port}" >> "${lockdir}/${selfname}.lock"
+	# Create a starting lockfile that only exists while the start command is running.
+	date '+%s' > "${lockdir:?}/${selfname}-starting.lock"
+
 	fn_reload_startparameters
 
+	# Create uid to ensure unique tmux socket name.
+	if [ ! -f "${datadir}/${selfname}.uid" ]; then
+		check_status.sh
+		if [ "${status}" != "0" ]; then
+			# stop running server (if running) to prevent lingering tmux sessions.
+			exitbypass=1
+			command_stop.sh
+		fi
+		uid=$(date '+%s' | sha1sum | head -c 8)
+		echo "${uid}" > "${datadir}/${selfname}.uid"
+		socketname="${sessionname}-$(cat "${datadir}/${selfname}.uid")"
+	fi
+
 	if [ "${shortname}" == "av" ]; then
 		cd "${systemdir}" || exit
 	else
 		cd "${executabledir}" || exit
 	fi
 
-	tmux -L "${sessionname}" new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
+	tmux -L "${socketname}" new-session -d -x "${sessionwidth}" -y "${sessionheight}" -s "${sessionname}" "${preexecutable} ${executable} ${startparameters}" 2> "${lgsmlogdir}/.${selfname}-tmux-error.tmp"
 
 	# Create logfile.
 	touch "${consolelog}"
 
-	# Create last start lock file
-	date +%s > "${lockdir}/${selfname}-laststart.lock"
-
 	# tmux compiled from source will return "master", therefore ignore it.
 	if [ "${tmuxv}" == "master" ]; then
 		fn_script_log "tmux version: master (user compiled)"
 		echo -e "tmux version: master (user compiled)" >> "${consolelog}"
 		if [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "$logtimestamp" == "on" ]; then
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
+			if [ "${logtimestamp}" == "on" ]; then
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
 			else
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
 			fi
 		fi
 
@@ -114,10 +98,10 @@ fn_start_tmux() {
 			Currently installed: $(tmux -V)" > "${consolelog}"
 		# Console logging enable or not set.
 		elif [ "${consolelogging}" == "on" ] || [ -z "${consolelogging}" ]; then
-			if [ "$logtimestamp" == "on" ]; then
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
+			if [ "${logtimestamp}" == "on" ]; then
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec bash -c \"cat | $addtimestamp\" >> '${consolelog}'"
 			else
-				tmux -L "${sessionname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
+				tmux -L "${socketname}" pipe-pane -o -t "${sessionname}" "exec cat >> '${consolelog}'"
 			fi
 		fi
 	else
@@ -127,7 +111,7 @@ fn_start_tmux() {
 
 	# Console logging disabled.
 	if [ "${consolelogging}" == "off" ]; then
-		echo -e "Console logging disabled by user" >> "${consolelog}"
+		echo -e "Console logging disabled in settings" >> "${consolelog}"
 		fn_script_log_info "Console logging disabled by user"
 	fi
 	fn_sleep_time
@@ -176,8 +160,20 @@ fn_start_tmux() {
 				fi
 			fi
 		fi
+		# Remove starting lockfile when command ends.
+		rm -f "${lockdir:?}/${selfname}-starting.lock"
 		core_exit.sh
 	else
+		# Create start lockfile that exists only when the server is running.
+		date '+%s' > "${lockdir:?}/${selfname}-started.lock"
+		echo "${version}" >> "${lockdir}/${selfname}-started.lock"
+		echo "${port}" >> "${lockdir}/${selfname}-started.lock"
+		fn_print_ok "${servername}"
+		fn_script_log_pass "Started ${servername}"
+
+		# Create last started Lockfile.
+		date +%s > "${lockdir}/${selfname}-last-started.lock"
+
 		fn_print_ok "${servername}"
 		fn_script_log_pass "Started ${servername}"
 	fi
@@ -185,25 +181,30 @@ fn_start_tmux() {
 	echo -en "\n"
 }
 
+# If user ran the start command monitor will become enabled.
+if [ "${firstcommandname}" == "START" ] || [ "${firstcommandname}" == "RESTART" ]; then
+	date '+%s' > "${lockdir:?}/${selfname}-monitoring.lock"
+fi
+
 check.sh
 
-# Is the server already started.
-# $status comes from check_status.sh, which is run by check.sh for this command
+# If the server already started dont start again.
 if [ "${status}" != "0" ]; then
 	fn_print_dots "${servername}"
 	fn_print_info_nl "${servername} is already running"
 	fn_script_log_error "${servername} is already running"
 	if [ -z "${exitbypass}" ]; then
+		# Remove starting lockfile when command ends.
+		rm -f "${lockdir:?}/${selfname}-starting.lock"
 		core_exit.sh
 	fi
 fi
-if [ -z "${fixbypass}" ]; then
-	fix.sh
-fi
+
+fix.sh
 info_game.sh
 core_logs.sh
 
-# Will check for updates is updateonstart is yes.
+# Will check for updates if updateonstart is yes.
 if [ "${updateonstart}" == "yes" ] || [ "${updateonstart}" == "1" ] || [ "${updateonstart}" == "on" ]; then
 	exitbypass=1
 	unset updateonstart
@@ -212,13 +213,12 @@ if [ "${updateonstart}" == "yes" ] || [ "${updateonstart}" == "1" ] || [ "${upda
 fi
 
 fn_print_dots "${servername}"
-
-if [ "${shortname}" == "ts3" ]; then
-	fn_start_teamspeak3
-elif [ "${shortname}" == "jk2" ]; then
+if [ "${shortname}" == "jk2" ]; then
 	fn_start_jk2
 else
 	fn_start_tmux
 fi
 
+# Remove starting lockfile when command ends.
+rm -f "${lockdir:?}/${selfname}-starting.lock"
 core_exit.sh

+ 26 - 15
lgsm/modules/command_stop.sh

@@ -15,7 +15,7 @@ fn_stop_graceful_ctrlc() {
 	fn_print_dots "Graceful: CTRL+c"
 	fn_script_log_info "Graceful: CTRL+c"
 	# Sends quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
+	tmux -L "${socketname}" send-keys -t "${sessionname}" C-c > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	for seconds in {1..30}; do
 		check_status.sh
@@ -43,7 +43,7 @@ fn_stop_graceful_cmd() {
 	fn_print_dots "Graceful: sending \"${1}\""
 	fn_script_log_info "Graceful: sending \"${1}\""
 	# Sends specific stop command.
-	tmux -L "${sessionname}" send -t "${sessionname}" ENTER "${1}" ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send -t "${sessionname}" ENTER "${1}" ENTER > /dev/null 2>&1
 	# Waits up to ${seconds} seconds giving the server time to shutdown gracefully.
 	for ((seconds = 1; seconds <= ${2}; seconds++)); do
 		check_status.sh
@@ -71,7 +71,7 @@ fn_stop_graceful_goldsrc() {
 	fn_print_dots "Graceful: sending \"quit\""
 	fn_script_log_info "Graceful: sending \"quit\""
 	# sends quit
-	tmux -L "${sessionname}" send -t "${sessionname}" quit ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send -t "${sessionname}" quit ENTER > /dev/null 2>&1
 	# Waits 3 seconds as goldsrc servers restart with the quit command.
 	for seconds in {1..3}; do
 		sleep 1
@@ -184,10 +184,10 @@ fn_stop_graceful_avorion() {
 	fn_print_dots "Graceful: /save /stop"
 	fn_script_log_info "Graceful: /save /stop"
 	# Sends /save.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send-keys -t "${sessionname}" /save ENTER > /dev/null 2>&1
 	sleep 5
 	# Sends /quit.
-	tmux -L "${sessionname}" send-keys -t "${sessionname}" /stop ENTER > /dev/null 2>&1
+	tmux -L "${socketname}" send-keys -t "${sessionname}" /stop ENTER > /dev/null 2>&1
 	# Waits up to 30 seconds giving the server time to shutdown gracefuly.
 	for seconds in {1..30}; do
 		check_status.sh
@@ -240,7 +240,7 @@ fn_stop_tmux() {
 	fn_print_dots "${servername}"
 	fn_script_log_info "tmux kill-session: ${sessionname}: ${servername}"
 	# Kill tmux session.
-	tmux -L "${sessionname}" kill-session -t "${sessionname}" > /dev/null 2>&1
+	tmux -L "${socketname}" kill-session -t "${sessionname}" > /dev/null 2>&1
 	sleep 0.5
 	check_status.sh
 	if [ "${status}" == "0" ]; then
@@ -256,28 +256,39 @@ fn_stop_tmux() {
 fn_stop_pre_check() {
 	if [ "${status}" == "0" ]; then
 		fn_print_info_nl "${servername} is already stopped"
-		fn_script_log_error "${servername} is already stopped"
+		fn_script_log_info "${servername} is already stopped"
 	else
 		# Select graceful shutdown.
 		fn_stop_graceful_select
-	fi
-	# Check status again, a kill tmux session if graceful shutdown failed.
-	check_status.sh
-	if [ "${status}" != "0" ]; then
-		fn_stop_tmux
+		# Check status again, a kill tmux session if graceful shutdown failed.
+		check_status.sh
+		if [ "${status}" != "0" ]; then
+			fn_stop_tmux
+		fi
 	fi
 }
 
 check.sh
+
+# Create a stopping lockfile that only exists while the stop command is running.
+date '+%s' > "${lockdir:?}/${selfname}-stopping.lock"
+
 fn_print_dots "${servername}"
 
 info_game.sh
 fn_stop_pre_check
-# Remove lockfile.
-if [ -f "${lockdir}/${selfname}.lock" ]; then
-	rm -f "${lockdir:?}/${selfname}.lock"
+
+# Remove started lockfile.
+rm -f "${lockdir:?}/${selfname}-started.lock"
+
+# If user ran the stop command monitor will become disabled.
+if [ "${firstcommandname}" == "STOP" ]; then
+	rm -f "${lockdir:?}/${selfname}-monitoring.lock"
 fi
 
+# Remove stopping lockfile.
+rm -f "${lockdir:?}/${selfname}-stopping.lock"
+
 if [ -z "${exitbypass}" ]; then
 	core_exit.sh
 fi

+ 2 - 2
lgsm/modules/command_ts3_server_pass.sh

@@ -28,7 +28,7 @@ fn_serveradmin_password_prompt() {
 fn_serveradmin_password_set() {
 	# Start server in "new password mode".
 	ts3serverpass="1"
-	exitbypass="1"
+	exitbypass=1
 	command_start.sh
 	fn_firstcommand_reset
 	fn_print_ok_nl "New password applied"
@@ -40,7 +40,7 @@ check.sh
 fn_serveradmin_password_prompt
 if [ "${status}" != "0" ]; then
 	# Stop any running server.
-	exitbypass="1"
+	exitbypass=1
 	command_stop.sh
 	fn_firstcommand_reset
 	fn_serveradmin_password_set

+ 9 - 6
lgsm/modules/command_update.sh

@@ -18,23 +18,26 @@ check_last_update.sh
 if [ "${shortname}" == "ts3" ]; then
 	update_ts3.sh
 elif [ "${shortname}" == "mc" ]; then
-	update_minecraft.sh
+	update_mc.sh
 elif [ "${shortname}" == "mcb" ]; then
-	update_minecraft_bedrock.sh
+	update_mcb.sh
 elif [ "${shortname}" == "pmc" ] || [ "${shortname}" == "vpmc" ] || [ "${shortname}" == "wmc" ]; then
-	update_papermc.sh
+	update_pmc.sh
 elif [ "${shortname}" == "fctr" ]; then
-	update_factorio.sh
+	update_fctr.sh
 elif [ "${shortname}" == "mta" ]; then
 	update_mta.sh
 elif [ "${shortname}" == "jk2" ]; then
-	update_jediknight2.sh
+	update_jk2.sh
 elif [ "${shortname}" == "vints" ]; then
-	update_vintagestory.sh
+	update_vints.sh
 elif [ "${shortname}" == "ut99" ]; then
 	update_ut99.sh
 else
 	update_steamcmd.sh
 fi
 
+# remove update lockfile.
+rm -f "${lockdir:?}/update.lock"
+
 core_exit.sh

+ 4 - 1
lgsm/modules/command_validate.sh

@@ -23,7 +23,7 @@ fn_validate() {
 		fi
 	done
 	fn_print_warn_nl "Validate might overwrite some customised files"
-
+	date '+%s' > "${lockdir:?}/update.lock"
 	fn_dl_steamcmd
 }
 
@@ -46,4 +46,7 @@ else
 	fn_validate
 fi
 
+# remove update lockfile
+rm -f "${lockdir:?}/update.lock"
+
 core_exit.sh

+ 9 - 1
lgsm/modules/core_dl.sh

@@ -36,7 +36,7 @@ fn_dl_steamcmd() {
 
 	# Unbuffer will allow the output of steamcmd not buffer allowing a smooth output.
 	# unbuffer us part of the expect package.
-	if [ "$(command -v unbuffer)" ]; then
+	if [ "$(command -v unbuffer 2> /dev/null)" ]; then
 		unbuffer="unbuffer"
 	fi
 
@@ -119,6 +119,14 @@ fn_dl_steamcmd() {
 			elif [ -n "$(grep "0x402" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
 				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
 				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Update required but not completed - check network"
+			# Disk write failure.
+			elif [ -n "$(grep "0x606" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x602" "${steamcmdlog}" | tail -1)" ]; then
+				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Disk write failure"
+				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Disk write failure"
+			# Missing update files.
+			elif [ -n "$(grep "0x626" "${steamcmdlog}" | tail -1)" ] || [ -n "$(grep "0x626" "${steamcmdlog}" | tail -1)" ]; then
+				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Missing update files"
+				fn_script_log_error "${commandaction} ${selfname}: ${remotelocation}: Missing update files"
 			else
 				fn_print_error2_nl "${commandaction} ${selfname}: ${remotelocation}: Unknown error occured"
 				echo -en "Please provide content log to LinuxGSM developers https://linuxgsm.com/steamcmd-error"

+ 3 - 1
lgsm/modules/core_exit.sh

@@ -12,7 +12,7 @@ fn_exit_dev_debug() {
 		echo -e ""
 		echo -e "${moduleselfname} exiting with code: ${exitcode}"
 		if [ -f "${rootdir}/dev-debug.log" ]; then
-			grep "modulefile=" "${rootdir}/dev-debug.log" | sed 's/modulefile=//g' > "${rootdir}/dev-debug-module-order.log"
+			grep -a "modulefile=" "${rootdir}/dev-debug.log" | sed 's/modulefile=//g' > "${rootdir}/dev-debug-module-order.log"
 		fi
 	fi
 }
@@ -35,7 +35,9 @@ elif [ "${exitcode}" != "0" ]; then
 	elif [ "${exitcode}" == "3" ]; then
 		fn_script_log_warn "${moduleselfname} exiting with code: ${exitcode}"
 	else
+		# if exit code is not set assume error.
 		fn_script_log_warn "${moduleselfname} exiting with code: ${exitcode}"
+		exitcode=4
 	fi
 	fn_exit_dev_debug
 	# remove trap.

+ 7 - 7
lgsm/modules/core_functions.sh

@@ -8,7 +8,7 @@
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.4.0"
+modulesversion="v23.5.0"
 
 # Core
 
@@ -640,17 +640,17 @@ update_ts3.sh() {
 	fn_fetch_function
 }
 
-update_minecraft.sh() {
+update_mc.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 }
 
-update_minecraft_bedrock.sh() {
+update_mcb.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 }
 
-update_papermc.sh() {
+update_pmc.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 }
@@ -660,12 +660,12 @@ update_mta.sh() {
 	fn_fetch_function
 }
 
-update_factorio.sh() {
+update_fctr.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 }
 
-update_jediknight2.sh() {
+update_jk2.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 }
@@ -675,7 +675,7 @@ update_steamcmd.sh() {
 	fn_fetch_function
 }
 
-update_vintagestory.sh() {
+update_vints.sh() {
 	functionfile="${FUNCNAME[0]}"
 	fn_fetch_function
 }

+ 1 - 1
lgsm/modules/core_getopt.sh

@@ -55,7 +55,7 @@ cmd_dev_detect_deps=("dd;detect-deps" "command_dev_detect_deps.sh" "Detect requi
 cmd_dev_detect_glibc=("dg;detect-glibc" "command_dev_detect_glibc.sh" "Detect required glibc.")
 cmd_dev_detect_ldd=("dl;detect-ldd" "command_dev_detect_ldd.sh" "Detect required dynamic dependencies.")
 cmd_dev_query_raw=("qr;query-raw" "command_dev_query_raw.sh" "The raw output of gamedig and gsquery.")
-cmd_dev_clear_modules=("cf;clear-modules" "command_dev_clear_modules.sh" "Delete the contents of the modules dir.")
+cmd_dev_clear_modules=("cm;clear-modules" "command_dev_clear_modules.sh" "Delete the contents of the modules dir.")
 
 ### Set specific opt here.
 

+ 4 - 0
lgsm/modules/core_legacy.sh

@@ -15,6 +15,10 @@ for legacy_version in "${legacy_versions_array[@]}"; do
 	fi
 done
 
+if [ -z "${socketname}" ]; then
+	socketname="${sessionname}"
+fi
+
 if [ -n "${webadminuser}" ]; then
 	httpuser="${webadminuser}"
 fi

+ 12 - 7
lgsm/modules/core_modules.sh

@@ -8,7 +8,7 @@
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
-modulesversion="v23.4.0"
+modulesversion="v23.5.0"
 
 # Core
 
@@ -421,6 +421,11 @@ fix_onset.sh() {
 	fn_fetch_module
 }
 
+fix_pvr.sh() {
+	modulefile="${FUNCNAME[0]}"
+	fn_fetch_module
+}
+
 fix_ro.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
@@ -645,17 +650,17 @@ update_ts3.sh() {
 	fn_fetch_module
 }
 
-update_minecraft.sh() {
+update_mc.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }
 
-update_minecraft_bedrock.sh() {
+update_mcb.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }
 
-update_papermc.sh() {
+update_pmc.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }
@@ -665,12 +670,12 @@ update_mta.sh() {
 	fn_fetch_module
 }
 
-update_factorio.sh() {
+update_fctr.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }
 
-update_jediknight2.sh() {
+update_jk2.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }
@@ -680,7 +685,7 @@ update_steamcmd.sh() {
 	fn_fetch_module
 }
 
-update_vintagestory.sh() {
+update_vints.sh() {
 	modulefile="${FUNCNAME[0]}"
 	fn_fetch_module
 }

+ 13 - 8
lgsm/modules/core_steamcmd.sh

@@ -151,11 +151,6 @@ fn_update_steamcmd_localbuild() {
 	# Uses appmanifest to find local build.
 	localbuild=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f3)
 
-	# Set branch to public if no custom branch.
-	if [ -z "${branch}" ]; then
-		branch="public"
-	fi
-
 	# Checks if localbuild variable has been set.
 	if [ -z "${localbuild}" ]; then
 		fn_print_fail "Checking local build: ${remotelocation}: missing local build info"
@@ -178,6 +173,13 @@ fn_update_steamcmd_remotebuild() {
 		find "${HOME}" -type f -name "appinfo.vdf" -exec rm -f {} \; 2> /dev/null
 	fi
 
+	# Set branch to public if no custom branch.
+	if [ -z "${branch}" ]; then
+		branch="public"
+	fi
+
+	# added as was failing GitHub Actions test. Running SteamCMD twice seems to fix it.
+	${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +quit 2> /dev/null
 	# password for branch not needed to check the buildid
 	remotebuildversion=$(${steamcmdcommand} +login "${steamuser}" "${steampass}" +app_info_update 1 +app_info_print "${appid}" +quit | sed -e '/"branches"/,/^}/!d' | sed -n "/\"${branch}\"/,/}/p" | grep -m 1 buildid | tr -cd '[:digit:]')
 
@@ -204,7 +206,10 @@ fn_update_steamcmd_remotebuild() {
 
 fn_update_steamcmd_compare() {
 	fn_print_dots "Checking for update: ${remotelocation}"
+	# Update has been found or force update.
 	if [ "${localbuild}" != "${remotebuildversion}" ] || [ "${forceupdate}" == "1" ]; then
+		# Create update lockfile.
+		date '+%s' > "${lockdir:?}/update.lock"
 		fn_print_ok_nl "Checking for update: ${remotelocation}"
 		echo -en "\n"
 		echo -e "Update available"
@@ -248,7 +253,7 @@ fn_update_steamcmd_compare() {
 				fn_firstcommand_reset
 			fi
 			unset exitbypass
-			date +%s > "${lockdir}/lastupdate.lock"
+			date +%s > "${lockdir:?}/last-updated.lock"
 			alert="update"
 		elif [ "${commandname}" == "CHECK-UPDATE" ]; then
 			alert="check-update"
@@ -352,8 +357,8 @@ fn_check_steamcmd_appmanifest() {
 	if [ "${engine}" == "goldsrc" ]; then
 		shareddepotsexists=$(grep -c SharedDepots "${serverfiles}/steamapps/appmanifest_90.acf")
 		if [ ! -f "${serverfiles}/steamapps/appmanifest_90.acf" ] || [ "${shareddepotsexists}" == "0" ]; then
-			fn_print_error_nl "SharedDepots missing from appmanifest_${appid}.acf"
-			fn_script_log_error "SharedDepots missing from appmanifest_${appid}.acf"
+			fn_print_error_nl "SharedDepots missing from appmanifest_90.acf"
+			fn_script_log_error "SharedDepots missing from appmanifest_90.acf"
 			fn_print_info_nl "Forcing update to correct issue"
 			fn_script_log_info "Forcing update to correct issue"
 			if [ "${shortname}" == "ahl" ]; then

+ 1 - 1
lgsm/modules/fix.sh

@@ -52,7 +52,7 @@ fn_apply_fix() {
 	fi
 }
 
-apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
+apply_pre_start_fix=(arma3 armar ark av bt bo csgo cmw dst hw ins nmrih onset pvr rust rw sdtd sfc sof2 squad st tf2 terraria ts3 mcb mta unt vh wurm zmr)
 apply_post_install_fix=(av kf kf2 lo ro samp ut2k4 ut ut3)
 
 # validate registered fixes for safe development

+ 1 - 1
lgsm/modules/fix_ark.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with ARK: Survival Evolved.
+# Description: Resolves issues with ARK: Survival Evolved.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_arma3.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with ARMA3.
+# Description: Resolves issues with ARMA3.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_armar.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with Arma Reforger.
+# Description: Resolves issues with Arma Reforger.
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_av.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Avorion
+# Description: Resolves issues with Avorion.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_bo.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Ballistic Overkill.
+# Description: Resolves issues with Ballistic Overkill.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_bt.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with Barotrauma.
+# Description: Resolves issues with Barotrauma.
 
 module_selfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_cmw.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves the issue of the not starting server on linux
+# Description: Resolves issues with Chivalry: Medieval Warfare.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 2 - 2
lgsm/modules/fix_csgo.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with CS:GO.
+# Description: Resolves issues with Counter-Strike: Global Offensive.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
@@ -37,6 +37,6 @@ libgccc_so="${serverfiles}/bin/libgcc_s.so.1"
 if [ -f "${libgccc_so}" ]; then
 	fixname="libgcc_s.so.1 move away"
 	fn_fix_msg_start
-	mv -v "${libgccc_so}" "${libgccc_so}.bck"
+	mv "${libgccc_so}" "${libgccc_so}.bak"
 	fn_fix_msg_end
 fi

+ 1 - 1
lgsm/modules/fix_dst.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Don't Starve Together.
+# Description: Resolves issues with Don't Starve Together.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_hw.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Hurtworld.
+# Description: Resolves issues with Hurtworld.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_ins.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Insurgency.
+# Description: Resolves issues with Insurgency.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_kf.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Killing Floor.
+# Description: Resolves issues with Killing Floor.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_kf2.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Killing Floor 2.
+# Description: Resolves issues with Killing Floor 2.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_lo.sh

@@ -2,7 +2,7 @@
 # LinuxGSM fix_lo.sh module
 # Author: Daniel Gibbs
 # Website: https://linuxgsm.com
-# Description: Resolves installation issue with Last Oasis
+# Description: Resolves various issues with Last Oasis.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_mcb.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves possible startup issue with Minecraft Bedrock.
+# Description: Resolves various issues with Minecraft Bedrock.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_mta.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Installs the libmysqlclient for database functions on the server.
+# Description: Resolves various issues with Multi Theft Auto.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 14 - 0
lgsm/modules/fix_pvr.sh

@@ -0,0 +1,14 @@
+#!/bin/bash
+# LinuxGSM fix_pvr.sh module
+# Author: Daniel Gibbs
+# Contributors: http://linuxgsm.com/contrib
+# Website: https://linuxgsm.com
+# Description: Resolves various issues with Pavlov VR.
+
+moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+if [ ! -f "${serverfiles}/linux64/libc++.so" ] && [ -f "/usr/lib/x86_64-linux-gnu/libc++.so.1" ]; then
+	cp "/usr/lib/x86_64-linux-gnu/libc++.so.1" "${serverfiles}/linux64/libc++.so"
+fi
+
+export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${serverfiles}:${serverfiles}/linux64"

+ 1 - 1
lgsm/modules/fix_ro.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Red Orchestra.
+# Description: Resolves issues with Red Orchestra.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_rust.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Rust.
+# Description: Resolves issues with Rust.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_rw.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Rising World.
+# Description: Resolves issues with Rising World.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_samp.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves issue that the default rcon password is not changed
+# Description: Resolves issue that the default rcon password is not changed.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_sdtd.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with 7 Days to Die.
+# Description: Resolves issues with 7 Days to Die.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_sfc.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Source Forts Classic.
+# Description: Resolves issues with Source Forts Classic.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_sof2.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Soldier of Fortune 2.
+# Description: Resolves issues with Soldier of Fortune 2.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_squad.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Squad.
+# Description: Resolves issues with Squad.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_st.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Stationeers.
+# Description: Resolves issues with Stationeers.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_steamcmd.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues related to SteamCMD.
+# Description: Resolves issues with SteamCMD.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_terraria.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves an issue with Terraria.
+# Description: Resolves issues with Terraria.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_tf2.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Team Fortress 2.
+# Description: Resolves issues with Team Fortress 2.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 14 - 1
lgsm/modules/fix_ts3.sh

@@ -3,10 +3,23 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Teamspeak 3.
+# Description: Resolves issues with Teamspeak 3.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 
+# Creates a blank ts3server.ini if it does not exist.
+if [ ! -f "${servercfgfullpath}" ]; then
+	fixname="create blank ${servercfg}"
+	fn_fix_msg_start
+	touch "${servercfgfullpath}"
+	fn_fix_msg_end
+fi
+
+# Accept license.
+if [ ! -f "${executabledir}/.ts3server_license_accepted" ]; then
+	install_eula.sh
+fi
+
 # Fixes: makes libmariadb2 available #1924.
 if [ ! -f "${serverfiles}/libmariadb.so.2" ]; then
 	fixname="libmariadb.so.2"

+ 1 - 1
lgsm/modules/fix_unt.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Unturned.
+# Description: Resolves issues with Unturned.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_ut.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament.
+# Description: Resolves issues with Unreal Tournament.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_ut2k4.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament 2004.
+# Description: Resolves issues with Unreal Tournament 2004.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_ut3.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Unreal Tournament 3.
+# Description: Resolves issues with Unreal Tournament 3.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_vh.sh

@@ -2,7 +2,7 @@
 # LinuxGSM fix_rust.sh module
 # Author: Alasdair Haig
 # Website: https://linuxgsm.com
-# Description: Resolves startup issue with Valheim
+# Description: Resolves issues with Valheim.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_wurm.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Wurm Unlimited.
+# Description: Resolves issues with Wurm Unlimited.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

+ 1 - 1
lgsm/modules/fix_zmr.sh

@@ -3,7 +3,7 @@
 # Author: Daniel Gibbs
 # Contributors: http://linuxgsm.com/contrib
 # Website: https://linuxgsm.com
-# Description: Resolves various issues with Zombie Master: Reborn.
+# Description: Resolves issues with Zombie Master: Reborn.
 
 moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
 

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini