Parcourir la source

feat(workshop): add Steam Workshop downloads for Left 4 Dead 2 (#5018)

Daniel Gibbs il y a 1 semaine
Parent
commit
65de3b40d8

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

@@ -18,6 +18,12 @@ maxplayers="8"
 ## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
 startparameters="-game left4dead2 -strictportbind -ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers}"
 
+## 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 left4dead2/addons. Run ./l4d2server workshop-update after changing, or let update apply it.
+# workshopmods="3815658696"
+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}" == "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}" == "l4d2" ] || [ "${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}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${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}" == "l4d2" ] || [ "${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}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; then
+if [ "${shortname}" == "arma3" ] || [ "${shortname}" == "dayz" ] || [ "${shortname}" == "bt" ] || [ "${shortname}" == "col" ] || [ "${shortname}" == "l4d2" ] || [ "${shortname}" == "ohd" ] || [ "${shortname}" == "sb" ] || [ "${shortname}" == "squad" ] || [ "${shortname}" == "squad44" ] || [ "${shortname}" == "st" ]; then
 	currentopt+=("${cmd_workshop_update[@]}")
 fi
 

+ 18 - 4
lgsm/modules/workshop_core.sh

@@ -28,6 +28,12 @@ else
 	workshopdir="${serverfiles}/workshop"
 	workshopprefix="@"
 fi
+# Games that load mod files from their own directory get links to the installed files there.
+if [ "${shortname}" == "sb" ]; then
+	workshoplinkdir="${serverfiles}/mods"
+elif [ "${shortname}" == "l4d2" ]; then
+	workshoplinkdir="${serverfiles}/left4dead2/addons"
+fi
 workshopdldir="${tmpdir}/workshop"
 workshopmodlist="${datadir}/${selfname}-workshop.txt"
 workshopapi="https://api.steampowered.com/ISteamRemoteStorage"
@@ -319,11 +325,11 @@ fn_workshop_remove_keys() {
 	done
 }
 
-# Removes the links a mod added to the Starbound mods directory.
+# 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 "${serverfiles:?}/mods/${link}"
+		rm -f "${workshoplinkdir:?}/${link}"
 	done
 }
 
@@ -371,11 +377,19 @@ fn_workshop_install() {
 			keys+=("${key##*/}")
 		done < <(find "${dst}" -type f -name '*.bikey' -print0)
 	elif [ "${shortname}" == "sb" ]; then
-		mkdir -p "${serverfiles}/mods"
+		mkdir -p "${workshoplinkdir}"
 		while IFS= read -r -d '' pak; do
-			ln -sfn "../workshop/${workshopprefix}${item}/${pak##*/}" "${serverfiles}/mods/workshop-${item}-${pak##*/}"
+			ln -srfn "${pak}" "${workshoplinkdir}/workshop-${item}-${pak##*/}"
 			links+=("workshop-${item}-${pak##*/}")
 		done < <(find "${dst}" -maxdepth 1 -type f -name '*.pak' -print0)
+	elif [ "${shortname}" == "l4d2" ]; then
+		# Legacy Workshop items download as <hash>_legacy.bin, which is the addon's .vpk.
+		pak="$(find "${dst}" -maxdepth 1 -type f \( -name '*.vpk' -o -name '*_legacy.bin' \) -print -quit)"
+		if [ -n "${pak}" ]; then
+			mkdir -p "${workshoplinkdir}"
+			ln -srfn "${pak}" "${workshoplinkdir}/${item}.vpk"
+			links+=("${item}.vpk")
+		fi
 	fi
 	local modname=""
 	if [ "${shortname}" == "col" ] && [ -f "${dst}/modInfo.json" ]; then