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 | ||||
| } | ||||
| 
 | ||||
| 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 -- # | ||||
| 
 | ||||
| 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 -- # | ||||
| 
 | ||||
| steam mkdir -p /opt/l4d2/overlays | ||||
| 
 | ||||
| # workshop downloader | ||||
| 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 | ||||
| for overlay in /opt/l4d2/scripts/overlays/*; do | ||||
|   bash -xeuo pipefail "$overlay" | ||||
| done | ||||
| 
 | ||||
| # -- SERVERS -- # | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,11 +7,16 @@ users = { | |||
| 
 | ||||
| directories = { | ||||
|     '/opt/l4d2': { | ||||
|         'owner': 'steam', | ||||
|         'group': 'steam', | ||||
|         'owner': 'steam', 'group': 'steam', | ||||
|     }, | ||||
|     '/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() | ||||
|         }, | ||||
|     }, | ||||
|     '/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 = { | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ defaults = { | |||
|             'libc6_i386': {}, # installs libc6:i386 | ||||
|             'lib32z1': {}, | ||||
|             'unzip': {}, | ||||
|             'p7zip-full': {}, # l4d2center_maps_sync.sh | ||||
|         }, | ||||
|     }, | ||||
|     'left4dead2': {}, | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue