Procházet zdrojové kódy

feat(workshop): add Steam Workshop downloads for Barotrauma and Stationeers (#5014)

* feat(workshop): add Steam Workshop downloads for Barotrauma and Stationeers

* fix(workshop): restore an empty Barotrauma regularpackages element to its original form
Daniel Gibbs před 1 týdnem
rodič
revize
f6eb8cd47f

+ 6 - 0
lgsm/config-default/config-lgsm/btserver/_default.cfg

@@ -11,6 +11,12 @@
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters=""
 
+## Steam Workshop Mods | https://docs.linuxgsm.com/steamcmd/workshop
+# Workshop item or collection IDs, separated by spaces. Collections are expanded.
+# Installed to LocalMods and enabled in config_player.xml. Run ./btserver workshop-update after changing, or let update apply it.
+# workshopmods="3815618949"
+workshopmods=""
+
 #### LinuxGSM Settings ####
 
 ## LinuxGSM Stats

+ 6 - 0
lgsm/config-default/config-lgsm/stserver/_default.cfg

@@ -15,6 +15,12 @@ worldtype="Moon"
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters="-LOAD ${worldsave} ${worldtype}"
 
+## Steam Workshop Mods | https://docs.linuxgsm.com/steamcmd/workshop
+# Workshop item or collection IDs, separated by spaces. Collections are expanded.
+# Installed to mods, where the server enables them. Run ./stserver workshop-update after changing, or let update apply it.
+# workshopmods="3813753764"
+workshopmods=""
+
 #### LinuxGSM Settings ####
 
 ## LinuxGSM Stats

+ 1 - 1
lgsm/modules/command_check_update.sh

@@ -44,7 +44,7 @@ else
 	update_steamcmd.sh
 fi
 
-if { [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ]; } && { [ -n "${workshopmods}" ] || [ -f "${datadir}/${selfname}-workshop.txt" ]; }; then
+if { [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; } && { [ -n "${workshopmods}" ] || [ -f "${datadir}/${selfname}-workshop.txt" ]; }; then
 	workshop_core.sh
 	fn_workshop_update
 fi

+ 1 - 1
lgsm/modules/command_update.sh

@@ -45,7 +45,7 @@ else
 	update_steamcmd.sh
 fi
 
-if { [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ]; } && { [ -n "${workshopmods}" ] || [ -f "${datadir}/${selfname}-workshop.txt" ]; }; then
+if { [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; } && { [ -n "${workshopmods}" ] || [ -f "${datadir}/${selfname}-workshop.txt" ]; }; then
 	workshop_core.sh
 	fn_workshop_update
 fi

+ 1 - 1
lgsm/modules/core_getopt.sh

@@ -144,7 +144,7 @@ if [ "${engine}" == "source" ] || [ "${shortname}" == "cs2" ] || [ "${shortname}
 fi
 
 ## Workshop commands.
-if [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ]; then
+if [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; then
 	currentopt+=("${cmd_workshop_update[@]}")
 fi
 

+ 42 - 0
lgsm/modules/workshop_core.sh

@@ -15,6 +15,12 @@ elif [ "${shortname}" == "ohd" ]; then
 	workshopdir="${systemdir}/Mods"
 	workshopprefix=""
 	workshopflatten=1
+elif [ "${shortname}" == "bt" ]; then
+	workshopdir="${serverfiles}/LocalMods"
+	workshopprefix=""
+elif [ "${shortname}" == "st" ]; then
+	workshopdir="${serverfiles}/mods"
+	workshopprefix=""
 else
 	workshopdir="${serverfiles}/workshop"
 	workshopprefix="@"
@@ -395,6 +401,39 @@ fn_workshop_remove() {
 	fn_script_log_pass "Removing ${title} (${item})"
 }
 
+# Barotrauma only loads mods listed in config_player.xml. Replaces LinuxGSM's entries with the installed mods, in order.
+fn_workshop_bt_packages() {
+	local config="${serverfiles}/config_player.xml"
+	local item managed=() enabled=()
+	if [ ! -f "${config}" ]; then
+		fn_print_warn_nl "${config} not found. Start the server once, then run ./${selfname} workshop-update to enable Workshop mods"
+		fn_script_log_warn "${config} not found, Workshop mods not enabled"
+		return
+	fi
+	managed=("${workshopremovals[@]}" "${workshopitems[@]}")
+	for item in "${workshopitems[@]}"; do
+		if [ -f "${workshopdir}/${item}/filelist.xml" ]; then
+			enabled+=("${item}")
+		fi
+	done
+	python3 - "${config}" "${managed[*]}" "${enabled[*]}" << 'PYEOF'
+import re
+import sys
+
+config, managed, enabled = sys.argv[1], sys.argv[2].split(), sys.argv[3].split()
+with open(config, encoding="utf-8-sig", newline="") as f:
+    text = f.read()
+text = text.replace("<regularpackages />", "<regularpackages>\n    </regularpackages>")
+for item in managed:
+    text = re.sub(r'\s*<package\b[^>]*?path="LocalMods/' + re.escape(item) + r'/filelist\.xml"[^>]*/>', "", text)
+entries = "".join('\n      <package\n        path="LocalMods/' + item + '/filelist.xml" />' for item in enabled)
+text = re.sub(r"(\s*)</regularpackages>", entries + r"\1</regularpackages>", text, count=1)
+text = re.sub(r"<regularpackages>\s*</regularpackages>", "<regularpackages />", text)
+with open(config, "w", encoding="utf-8", newline="") as f:
+    f.write(text)
+PYEOF
+}
+
 # Installs downloaded items and removes unused ones. Downloads happen first, so the server only stops for this step.
 fn_workshop_apply() {
 	local item
@@ -404,6 +443,9 @@ fn_workshop_apply() {
 	for item in "${workshopremovals[@]}"; do
 		fn_workshop_remove "${item}"
 	done
+	if [ "${shortname}" == "bt" ]; then
+		fn_workshop_bt_packages
+	fi
 	rm -rf "${workshopdldir:?}"
 }