4
0
Эх сурвалжийг харах

feat(workshop): add Steam Workshop downloads for Soldat (#5020)

Daniel Gibbs 1 долоо хоног өмнө
parent
commit
b081a57190

+ 7 - 0
lgsm/config-default/config-lgsm/solserver/_default.cfg

@@ -15,6 +15,13 @@ maplist="mapslist.txt"
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters="-b ${ip} -m ${maplist} -c ${servercfg}"
 
+## Steam Workshop Mods | https://docs.linuxgsm.com/steamcmd/workshop
+# Workshop item or collection IDs, separated by spaces. Collections are expanded.
+# Installed to serverfiles/workshop and linked into maps, textures and scenery-gfx. Add the maps you want to mapslist.txt.
+# Run ./solserver workshop-update after changing, or let update apply it.
+# workshopmods="2049686708"
+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}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "hw" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; } && { [ -n "${workshopmods}" ] || [ -f "${datadir}/${selfname}-workshop.txt" ]; }; then
+if { [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "hw" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "sol" ] || [ "${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}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "hw" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; } && { [ -n "${workshopmods}" ] || [ -f "${datadir}/${selfname}-workshop.txt" ]; }; then
+if { [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "hw" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "sol" ] || [ "${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}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "hw" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; then
+if [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "hw" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "sol" ] || [ "${shortname}" == "st" ]; then
 	currentopt+=("${cmd_workshop_update[@]}")
 fi
 

+ 26 - 5
lgsm/modules/workshop_core.sh

@@ -37,6 +37,8 @@ if [ "${shortname}" == "sb" ]; then
 	workshoplinkdir="${serverfiles}/mods"
 elif [ "${shortname}" == "l4d2" ]; then
 	workshoplinkdir="${serverfiles}/left4dead2/addons"
+elif [ "${shortname}" == "sol" ]; then
+	workshoplinkdir="${serverfiles}"
 fi
 workshopdldir="${tmpdir}/workshop"
 workshopmodlist="${datadir}/${selfname}-workshop.txt"
@@ -337,9 +339,11 @@ fn_workshop_remove_keys() {
 # Removes the links a mod added to the game's mod directory.
 fn_workshop_remove_links() {
 	local link
-	for link in $(fn_workshop_state "$1" links); do
-		rm -f "${workshoplinkdir:?}/${link}"
-	done
+	while IFS= read -r link; do
+		if [ -n "${link}" ]; then
+			rm -f "${workshoplinkdir:?}/${link}"
+		fi
+	done < <(fn_workshop_state "$1" link)
 }
 
 # Moves a downloaded item into the game's mod directory and prepares it for the game.
@@ -350,7 +354,7 @@ fn_workshop_install() {
 	local installed
 	local keys=()
 	local links=()
-	local key pak
+	local key pak file rel
 	fn_print_dots "Installing ${workshoptitle[${item}]} (${item})"
 	installed="$(fn_workshop_moddir "${item}")"
 	if [ -n "${installed}" ]; then
@@ -403,6 +407,21 @@ fn_workshop_install() {
 			ln -srfn "${pak}" "${workshoplinkdir}/${item}.vpk"
 			links+=("${item}.vpk")
 		fi
+	elif [ "${shortname}" == "sol" ]; then
+		# Soldat items mirror the server's maps, textures and scenery-gfx directories. The server only finds lowercase .pms maps.
+		while IFS= read -r -d '' file; do
+			rel="${file#"${dst}/"}"
+			if [[ "${rel,,}" == maps/*.pms ]]; then
+				rel="${rel%.*}.pms"
+			fi
+			if [ -e "${workshoplinkdir}/${rel}" ] || [ -L "${workshoplinkdir}/${rel}" ]; then
+				fn_script_log_warn "Not linking ${rel} from ${workshoptitle[${item}]} (${item}): file already exists"
+				continue
+			fi
+			mkdir -p "${workshoplinkdir}/${rel%/*}"
+			ln -sr "${file}" "${workshoplinkdir}/${rel}"
+			links+=("${rel}")
+		done < <(find "${dst}" -mindepth 2 -type f -print0)
 	fi
 	local modname=""
 	if [ "${shortname}" == "col" ] && [ -f "${dst}/modInfo.json" ]; then
@@ -414,7 +433,9 @@ fn_workshop_install() {
 		echo "title=${workshoptitle[${item}]}"
 		echo "timeupdated=${workshoptimeupdated[${item}]}"
 		echo "keys=${keys[*]}"
-		echo "links=${links[*]}"
+		if [ "${#links[@]}" -gt 0 ]; then
+			printf 'link=%s\n' "${links[@]}"
+		fi
 	} > "${dst}/.lgsm-workshop"
 	fn_print_ok_nl "Installing ${workshoptitle[${item}]} (${item})"
 	fn_script_log_pass "Installing ${workshoptitle[${item}]} (${item})"