l4d overlay split scripts
This commit is contained in:
		
							parent
							
								
									a9e4013d86
								
							
						
					
					
						commit
						a59d33ec03
					
				
					 8 changed files with 243 additions and 88 deletions
				
			
		
							
								
								
									
										38
									
								
								bundles/left4dead2/files/scripts/helpers
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								bundles/left4dead2/files/scripts/helpers
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | set -xeuo pipefail | ||||||
|  | 
 | ||||||
|  | function steam() { | ||||||
|  |     # for systemd, so it can terminate the process (for other things sudo would have been enough) | ||||||
|  |     setpriv --reuid=steam --regid=steam --init-groups "$@" <&0 | ||||||
|  |     export HOME=/opt/l4d2/steam | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | declare -A addons=( | ||||||
|  |     [Ions_Vocalizer]=698857882 | ||||||
|  |     [EMS_Admin_System]=1376314661 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | function install_addon() { | ||||||
|  |     local overlay="$1" | ||||||
|  |     local addon_name="$2" | ||||||
|  |     local addon_id="${addons[${addon_name}]}" | ||||||
|  |     steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" | ||||||
|  |     test -f "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${addon_id}.vpk" || \ | ||||||
|  |         steam /opt/l4d2/steam-workshop-download "${addon_id}" --out "/opt/l4d2/overlays/${overlay}/left4dead2/addons" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function install_admin_system() { | ||||||
|  |     local overlay="$1" | ||||||
|  |     install_addon "${overlay}" EMS_Admin_System | ||||||
|  |     steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system" | ||||||
|  |     steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system/admins.txt" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function install_tickrate_enabler() { | ||||||
|  |     local overlay="$1" | ||||||
|  |     steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" | ||||||
|  |     for file in tickrate_enabler.dll tickrate_enabler.so tickrate_enabler.vdf | ||||||
|  |     do | ||||||
|  |         curl -L "https://github.com/SirPlease/L4D2-Competitive-Rework/raw/refs/heads/master/addons/${file}" -o "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${file}" | ||||||
|  |     done | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								bundles/left4dead2/files/scripts/overlays/competitive_rework
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								bundles/left4dead2/files/scripts/overlays/competitive_rework
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | set -xeuo pipefail | ||||||
|  | source /opt/l4d2/scripts/helpers | ||||||
|  | overlay=$(basename "$0") | ||||||
|  | 
 | ||||||
|  | # https://github.com/SirPlease/L4D2-Competitive-Rework | ||||||
|  | 
 | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay | ||||||
|  | 
 | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2 | ||||||
|  | test -d /opt/l4d2/overlays/$overlay/left4dead2/cfg/cfgogl || \ | ||||||
|  |     curl -L https://github.com/SirPlease/L4D2-Competitive-Rework/archive/refs/heads/master.tar.gz | steam tar -xz --strip-components=1 -C /opt/l4d2/overlays/$overlay/left4dead2 | ||||||
							
								
								
									
										128
									
								
								bundles/left4dead2/files/scripts/overlays/l4d2center_maps
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								bundles/left4dead2/files/scripts/overlays/l4d2center_maps
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,128 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | set -xeuo pipefail | ||||||
|  | source /opt/l4d2/scripts/helpers | ||||||
|  | overlay=$(basename "$0") | ||||||
|  | 
 | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/addons | ||||||
|  | cd /opt/l4d2/overlays/$overlay/left4dead2/addons | ||||||
|  | 
 | ||||||
|  | # https://l4d2center.com/maps/servers/l4d2center_maps_sync.sh.txt -> | ||||||
|  | 
 | ||||||
|  | # Exit immediately if a command exits with a non-zero status. | ||||||
|  | set -e | ||||||
|  | 
 | ||||||
|  | # Function to print error messages | ||||||
|  | error_exit() { | ||||||
|  |     echo "Error: $1" >&2 | ||||||
|  |     exit 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Check if the current directory ends with /left4dead2/addons | ||||||
|  | current_dir=$(pwd) | ||||||
|  | expected_dir="/left4dead2/addons" | ||||||
|  | 
 | ||||||
|  | if [[ ! "$current_dir" == *"$expected_dir" ]]; then | ||||||
|  |     error_exit "Script must be run from your L4D2 \"addons\" folder. Current directory: $current_dir" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Check for required commands | ||||||
|  | for cmd in curl md5sum 7z; do | ||||||
|  |     if ! command -v "$cmd" >/dev/null 2>&1; then | ||||||
|  |         error_exit "Required command '$cmd' is not installed. Please install it and retry." | ||||||
|  |     fi | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | # URL of the CSV file | ||||||
|  | CSV_URL="https://l4d2center.com/maps/servers/index.csv" | ||||||
|  | 
 | ||||||
|  | # Temporary file to store CSV | ||||||
|  | TEMP_CSV=$(mktemp) | ||||||
|  | 
 | ||||||
|  | # Ensure temporary file is removed on exit | ||||||
|  | trap 'rm -f "$TEMP_CSV"' EXIT | ||||||
|  | 
 | ||||||
|  | echo "Downloading CSV from $CSV_URL..." | ||||||
|  | curl -sSL -o "$TEMP_CSV" "$CSV_URL" || error_exit "Failed to download CSV." | ||||||
|  | 
 | ||||||
|  | declare -A map_md5 | ||||||
|  | declare -A map_links | ||||||
|  | 
 | ||||||
|  | # Read CSV and populate associative arrays | ||||||
|  | { | ||||||
|  |     # Skip the first line (header) | ||||||
|  |     IFS= read -r header | ||||||
|  | 
 | ||||||
|  |     while IFS=';' read -r Name Size MD5 DownloadLink || [[ $Name ]]; do | ||||||
|  |         # Trim whitespace | ||||||
|  |         Name=$(echo "$Name" | xargs) | ||||||
|  |         MD5=$(echo "$MD5" | xargs) | ||||||
|  |         DownloadLink=$(echo "$DownloadLink" | xargs) | ||||||
|  | 
 | ||||||
|  |         # Populate associative arrays | ||||||
|  |         map_md5["$Name"]="$MD5" | ||||||
|  |         map_links["$Name"]="$DownloadLink" | ||||||
|  |     done | ||||||
|  | } < "$TEMP_CSV" | ||||||
|  | 
 | ||||||
|  | # Get list of expected VPK files | ||||||
|  | expected_vpk=("${!map_md5[@]}") | ||||||
|  | 
 | ||||||
|  | # Remove VPK files not in expected list or with mismatched MD5 | ||||||
|  | echo "Cleaning up existing VPK files..." | ||||||
|  | for file in *.vpk; do | ||||||
|  |     # Check if it's a regular file | ||||||
|  |     if [[ -f "$file" ]]; then | ||||||
|  |         if [[ -z "${map_md5["$file"]}" ]]; then | ||||||
|  |             echo "Removing unexpected file: $file" | ||||||
|  |             rm -f "$file" | ||||||
|  |         else | ||||||
|  |             # Calculate MD5 | ||||||
|  |             echo "Calculating MD5 for existing file: $file..." | ||||||
|  |             current_md5=$(md5sum "$file" | awk '{print $1}') | ||||||
|  |             expected_md5="${map_md5["$file"]}" | ||||||
|  | 
 | ||||||
|  |             if [[ "$current_md5" != "$expected_md5" ]]; then | ||||||
|  |                 echo "MD5 mismatch for $file. Removing." | ||||||
|  |                 rm -f "$file" | ||||||
|  |             fi | ||||||
|  |         fi | ||||||
|  |     fi | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | # Download and extract missing or updated VPK files | ||||||
|  | echo "Processing required VPK files..." | ||||||
|  | for vpk in "${expected_vpk[@]}"; do | ||||||
|  |     if [[ ! -f "$vpk" ]]; then | ||||||
|  |         echo "Downloading and extracting $vpk..." | ||||||
|  |         download_url="${map_links["$vpk"]}" | ||||||
|  | 
 | ||||||
|  |         if [[ -z "$download_url" ]]; then | ||||||
|  |             echo "No download link found for $vpk. Skipping." | ||||||
|  |             continue | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         encoded_url=$(echo "$download_url" | sed 's/ /%20/g') | ||||||
|  | 
 | ||||||
|  |         # Download the .7z file to a temporary location | ||||||
|  |         TEMP_7Z=$(mktemp --suffix=.7z) | ||||||
|  |         curl -# -L -o "$TEMP_7Z" "$encoded_url" | ||||||
|  | 
 | ||||||
|  |         # Check if the download was successful | ||||||
|  |         if [[ $? -ne 0 ]]; then | ||||||
|  |             echo "Failed to download $download_url. Skipping." | ||||||
|  |             rm -f "$TEMP_7Z" | ||||||
|  |             continue | ||||||
|  |         fi | ||||||
|  | 
 | ||||||
|  |         # Extract the .7z file | ||||||
|  |         7z x -y "$TEMP_7Z" || { echo "Failed to extract $TEMP_7Z. Skipping."; rm -f "$TEMP_7Z"; continue; } | ||||||
|  | 
 | ||||||
|  |         # Remove the temporary .7z file | ||||||
|  |         rm -f "$TEMP_7Z" | ||||||
|  | 
 | ||||||
|  |     else | ||||||
|  |         echo "$vpk is already up to date." | ||||||
|  |     fi | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | echo "Synchronization complete." | ||||||
							
								
								
									
										21
									
								
								bundles/left4dead2/files/scripts/overlays/tickrate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								bundles/left4dead2/files/scripts/overlays/tickrate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | set -xeuo pipefail | ||||||
|  | source /opt/l4d2/scripts/helpers | ||||||
|  | overlay=$(basename "$0") | ||||||
|  | 
 | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay | ||||||
|  | 
 | ||||||
|  | # server config | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/cfg | ||||||
|  | steam cat <<'EOF' > /opt/l4d2/overlays/$overlay/left4dead2/cfg/server.cfg | ||||||
|  | # https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69 | ||||||
|  | sv_minrate 100000 | ||||||
|  | sv_maxrate 100000 | ||||||
|  | nb_update_frequency 0.014 | ||||||
|  | net_splitpacket_maxrate 50000 | ||||||
|  | net_maxcleartime 0.0001 | ||||||
|  | fps_max 0 | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | # admin system | ||||||
|  | install_tickrate_enabler $overlay | ||||||
							
								
								
									
										16
									
								
								bundles/left4dead2/files/scripts/overlays/vanilla
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								bundles/left4dead2/files/scripts/overlays/vanilla
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | set -xeuo pipefail | ||||||
|  | source /opt/l4d2/scripts/helpers | ||||||
|  | overlay=$(basename "$0") | ||||||
|  | 
 | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay | ||||||
|  | 
 | ||||||
|  | # server config | ||||||
|  | steam mkdir -p /opt/l4d2/overlays/$overlay/left4dead2/cfg | ||||||
|  | steam cat <<'EOF' > /opt/l4d2/overlays/$overlay/left4dead2/cfg/server.cfg | ||||||
|  | motd_enabled 0 | ||||||
|  | EOF | ||||||
|  | 
 | ||||||
|  | # admin system | ||||||
|  | install_addon $overlay Ions_Vocalizer | ||||||
|  | install_admin_system $overlay | ||||||
|  | @ -10,36 +10,6 @@ function steam() { | ||||||
|     export HOME=/opt/l4d2/steam |     export HOME=/opt/l4d2/steam | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| declare -A addons=( |  | ||||||
|     [Ions_Vocalizer]=698857882 |  | ||||||
|     [EMS_Admin_System]=1376314661 |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| function install_addon() { |  | ||||||
|     local overlay="$1" |  | ||||||
|     local addon_name="$2" |  | ||||||
|     local addon_id="${addons[${addon_name}]}" |  | ||||||
|     steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" |  | ||||||
|     test -f "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${addon_id}.vpk" || \ |  | ||||||
|         steam /opt/l4d2/steam-workshop-download "${addon_id}" --out "/opt/l4d2/overlays/${overlay}/left4dead2/addons" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function install_admin_system() { |  | ||||||
|     local overlay="$1" |  | ||||||
|     install_addon "${overlay}" EMS_Admin_System |  | ||||||
|     steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system" |  | ||||||
|     steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/${overlay}/left4dead2/ems/admin system/admins.txt" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function install_tickrate_enabler() { |  | ||||||
|     local overlay="$1" |  | ||||||
|     steam mkdir -p "/opt/l4d2/overlays/${overlay}/left4dead2/addons" |  | ||||||
|     for file in tickrate_enabler.dll tickrate_enabler.so tickrate_enabler.vdf |  | ||||||
|     do |  | ||||||
|         curl -L "https://github.com/SirPlease/L4D2-Competitive-Rework/raw/refs/heads/master/addons/${file}" -o "/opt/l4d2/overlays/${overlay}/left4dead2/addons/${file}" |  | ||||||
|     done |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # -- PREPARE SYSTEM -- # | # -- PREPARE SYSTEM -- # | ||||||
| 
 | 
 | ||||||
| getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam | getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam | ||||||
|  | @ -83,61 +53,9 @@ steam /opt/l4d2/steam/steamcmd.sh \ | ||||||
| 
 | 
 | ||||||
| # -- OVERLAYS -- # | # -- OVERLAYS -- # | ||||||
| 
 | 
 | ||||||
| steam mkdir -p /opt/l4d2/overlays | for overlay in /opt/l4d2/scripts/overlays/*; do | ||||||
| 
 |   bash -xeuo pipefail "$overlay" | ||||||
| # workshop downloader | done | ||||||
| test -f /opt/l4d2/steam-workshop-download || \ |  | ||||||
|     steam wget -4 https://git.sublimity.de/cronekorkn/steam-workshop-downloader/raw/branch/master/steam-workshop-download -P /opt/l4d2 |  | ||||||
| steam chmod +x /opt/l4d2/steam-workshop-download |  | ||||||
| 
 |  | ||||||
| # -- OVERLAY VANILLA -- # |  | ||||||
| 
 |  | ||||||
| steam mkdir -p /opt/l4d2/overlays/vanilla |  | ||||||
| 
 |  | ||||||
| # server config |  | ||||||
| steam mkdir -p /opt/l4d2/overlays/vanilla/left4dead2/cfg |  | ||||||
| steam cat <<'EOF' > /opt/l4d2/overlays/vanilla/left4dead2/cfg/server.cfg |  | ||||||
| motd_enabled 0 |  | ||||||
| 
 |  | ||||||
| EOF |  | ||||||
| 
 |  | ||||||
| # admin system |  | ||||||
| install_addon vanilla Ions_Vocalizer |  | ||||||
| install_admin_system vanilla |  | ||||||
| 
 |  | ||||||
| # -- OVERLAY TICKRATE -- # |  | ||||||
| 
 |  | ||||||
| steam mkdir -p /opt/l4d2/overlays/tickrate |  | ||||||
| 
 |  | ||||||
| # server config |  | ||||||
| steam mkdir -p /opt/l4d2/overlays/tickrate/left4dead2/cfg |  | ||||||
| steam cat <<'EOF' > /opt/l4d2/overlays/tickrate/left4dead2/cfg/server.cfg |  | ||||||
| # https://github.com/SirPlease/L4D2-Competitive-Rework/blob/7ecc3a32a5e2180d6607a40119ff2f3c072502a9/cfg/server.cfg#L58-L69 |  | ||||||
| sv_minrate 100000 |  | ||||||
| sv_maxrate 100000 |  | ||||||
| nb_update_frequency 0.014 |  | ||||||
| net_splitpacket_maxrate 50000 |  | ||||||
| net_maxcleartime 0.0001 |  | ||||||
| fps_max 0 |  | ||||||
| EOF |  | ||||||
| 
 |  | ||||||
| # admin system |  | ||||||
| install_tickrate_enabler tickrate |  | ||||||
| 
 |  | ||||||
| # -- OVERLAY COMPETITIVE REWORK WIP -- # |  | ||||||
| 
 |  | ||||||
| # https://github.com/SirPlease/L4D2-Competitive-Rework |  | ||||||
| 
 |  | ||||||
| steam mkdir -p /opt/l4d2/overlays/competitive_rework |  | ||||||
| steam mkdir -p /opt/l4d2/overlays/competitive_rework/left4dead2 |  | ||||||
| test -d /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/cfgogl || \ |  | ||||||
|     curl -L https://github.com/SirPlease/L4D2-Competitive-Rework/archive/refs/heads/master.tar.gz | steam tar -xz --strip-components=1 -C /opt/l4d2/overlays/competitive_rework/left4dead2 |  | ||||||
| 
 |  | ||||||
| # if ! test -f /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server_original.cfg |  | ||||||
| # then |  | ||||||
| #     steam mv /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server.cfg /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server_original.cfg |  | ||||||
| #     steam echo -e "exec server_original.cfg\nsm_forcematch zonemod" > /opt/l4d2/overlays/competitive_rework/left4dead2/cfg/server.cfg |  | ||||||
| # fi |  | ||||||
| 
 | 
 | ||||||
| # -- SERVERS -- # | # -- SERVERS -- # | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,11 +7,16 @@ users = { | ||||||
| 
 | 
 | ||||||
| directories = { | directories = { | ||||||
|     '/opt/l4d2': { |     '/opt/l4d2': { | ||||||
|         'owner': 'steam', |         'owner': 'steam', 'group': 'steam', | ||||||
|         'group': 'steam', |  | ||||||
|     }, |     }, | ||||||
|     '/opt/l4d2/configs': { |     '/opt/l4d2/configs': { | ||||||
|         'owner': 'steam', |         'owner': 'steam', 'group': 'steam', | ||||||
|  |     }, | ||||||
|  |     '/opt/l4d2/scripts': { | ||||||
|  |         'owner': 'steam', 'group': 'steam', | ||||||
|  |     }, | ||||||
|  |     '/opt/l4d2/scripts/overlays': { | ||||||
|  |         'owner': 'steam', 'group': 'steam', | ||||||
|     }, |     }, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -29,6 +34,22 @@ files = { | ||||||
|                 for server_name in node.metadata.get('left4dead2').keys() |                 for server_name in node.metadata.get('left4dead2').keys() | ||||||
|         }, |         }, | ||||||
|     }, |     }, | ||||||
|  |     '/opt/l4d2/scripts/helpers': { | ||||||
|  |         'source': 'scripts/helpers', | ||||||
|  |         'mode': '755', | ||||||
|  |         'triggers': { | ||||||
|  |             'svc_systemd:left4dead2-initialize.service:restart', | ||||||
|  |         }, | ||||||
|  |     }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | for overlay in ['vanilla', 'tickrate', 'competitive_rework', 'l4d2center_maps']: | ||||||
|  |     files[f'/opt/l4d2/scripts/overlays/{overlay}'] = { | ||||||
|  |         'source': f'scripts/overlays/{overlay}', | ||||||
|  |         'mode': '755', | ||||||
|  |         'triggers': { | ||||||
|  |             'svc_systemd:left4dead2-initialize.service:restart', | ||||||
|  |         }, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| svc_systemd = { | svc_systemd = { | ||||||
|  |  | ||||||
|  | @ -7,6 +7,7 @@ defaults = { | ||||||
|             'libc6_i386': {}, # installs libc6:i386 |             'libc6_i386': {}, # installs libc6:i386 | ||||||
|             'lib32z1': {}, |             'lib32z1': {}, | ||||||
|             'unzip': {}, |             'unzip': {}, | ||||||
|  |             'p7zip-full': {}, # l4d2center_maps_sync.sh | ||||||
|         }, |         }, | ||||||
|     }, |     }, | ||||||
|     'left4dead2': {}, |     'left4dead2': {}, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue