l4d2: tickrate enabler

This commit is contained in:
CroneKorkN 2025-10-28 15:34:19 +01:00
parent b4cba98564
commit 084cf958a0
Signed by: cronekorkn
SSH key fingerprint: SHA256:v0410ZKfuO1QHdgKBsdQNF64xmTxOF8osF1LIqwTcVw
6 changed files with 102 additions and 24 deletions

View file

@ -2,6 +2,46 @@
set -xeuo pipefail set -xeuo pipefail
# -- DEFINE FUNCTIONS AND VARIABLES -- #
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 "$@"
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 getent passwd steam >/dev/null || useradd -M -d /opt/l4d2 -s /bin/bash steam
mkdir -p /opt/l4d2 /tmp/dumps mkdir -p /opt/l4d2 /tmp/dumps
chown steam:steam /opt/l4d2 /tmp/dumps chown steam:steam /opt/l4d2 /tmp/dumps
@ -9,12 +49,6 @@ dpkg --add-architecture i386
apt update apt update
DEBIAN_FRONTEND=noninteractive apt install -y libc6:i386 lib32z1 DEBIAN_FRONTEND=noninteractive apt install -y libc6:i386 lib32z1
function steam() {
# für systemd, damit es den prozess beenden kann
setpriv --reuid=steam --regid=steam --init-groups "$@"
export HOME=/opt/l4d2/steam
}
# -- STEAM -- # # -- STEAM -- #
steam mkdir -p /opt/l4d2/steam steam mkdir -p /opt/l4d2/steam
@ -77,18 +111,47 @@ net_splitpacket_maxrate 60000
EOF EOF
# admin system # admin system
steam mkdir -p /opt/l4d2/overlays/pve/left4dead2/addons install_addon pve Ions_Vocalizer
test -f /opt/l4d2/overlays/pve/left4dead2/addons/2524204971.vpk || \ install_admin_system pve
steam /opt/l4d2/steam-workshop-download 2524204971 --out /opt/l4d2/overlays/pve/left4dead2/addons install_tickrate_enabler pve
steam mkdir -p "/opt/l4d2/overlays/pve/left4dead2/ems/admin system"
steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/pve/left4dead2/ems/admin system/admins.txt"
# ions vocalizer # -- OVERLAY 100TICK -- #
test -f /opt/l4d2/overlays/pve/left4dead2/addons/698857882.vpk || \
steam /opt/l4d2/steam-workshop-download 698857882 --out /opt/l4d2/overlays/pve/left4dead2/addons
test -f /opt/l4d2/overlays/pve/left4dead2/addons/1575673903.vpk || \ # steam mkdir -p /opt/l4d2/overlays/100tick
steam /opt/l4d2/steam-workshop-download 1575673903 --out /opt/l4d2/overlays/pve/left4dead2/addons
# install_tickrate_enabler 100tick
# # server config
# steam mkdir -p /opt/l4d2/overlays/100tick/left4dead2/cfg
# steam cat <<'EOF' > /opt/l4d2/overlays/100tick/left4dead2/cfg/server.cfg
# motd_enabled 0
# sv_steamgroup "38347879"
# sv_minrate 60000
# sv_maxrate 0
# EOF
# -- 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/README.md || \
# curl -L https://github.com/SirPlease/L4D2-Competitive-Rework/archive/refs/heads/master.zip | steam unzip -d /opt/l4d2/overlays/competitive_rework/left4dead2
# # admin system
# steam mkdir -p /opt/l4d2/overlays/pve/left4dead2/addons
# test -f /opt/l4d2/overlays/pve/left4dead2/addons/2524204971.vpk || \
# steam /opt/l4d2/steam-workshop-download 2524204971 --out /opt/l4d2/overlays/pve/left4dead2/addons
# steam mkdir -p "/opt/l4d2/overlays/pve/left4dead2/ems/admin system"
# steam echo "STEAM_1:0:12376499" > "/opt/l4d2/overlays/pve/left4dead2/ems/admin system/admins.txt"
# # ions vocalizer
# test -f /opt/l4d2/overlays/pve/left4dead2/addons/698857882.vpk || \
# steam /opt/l4d2/steam-workshop-download 698857882 --out /opt/l4d2/overlays/pve/left4dead2/addons
# test -f /opt/l4d2/overlays/pve/left4dead2/addons/1575673903.vpk || \
# steam /opt/l4d2/steam-workshop-download 1575673903 --out /opt/l4d2/overlays/pve/left4dead2/addons
# -- SERVERS -- # # -- SERVERS -- #

View file

@ -5,6 +5,7 @@ set -xeuo pipefail
name=$1 name=$1
overlay=$2 overlay=$2
port=$3 port=$3
params=$4
function steam() { function steam() {
# für systemd, damit es den prozess beenden kann # für systemd, damit es den prozess beenden kann
@ -25,4 +26,4 @@ mount -t overlay overlay \
-o "lowerdir=/opt/l4d2/overlays/$overlay:/opt/l4d2/installation,upperdir=/opt/l4d2/servers/$name/upper,workdir=/opt/l4d2/servers/$name/work" \ -o "lowerdir=/opt/l4d2/overlays/$overlay:/opt/l4d2/installation,upperdir=/opt/l4d2/servers/$name/upper,workdir=/opt/l4d2/servers/$name/work" \
"/opt/l4d2/servers/$name/merged" "/opt/l4d2/servers/$name/merged"
steam "/opt/l4d2/servers/$name/merged/srcds_run" -norestart -pidfile "/opt/l4d2/servers/$name/pid" -game left4dead2 -ip 0.0.0.0 -port "$port" +hostname "Crone_$name" +map c1m1_hotel steam "/opt/l4d2/servers/$name/merged/srcds_run" -norestart -pidfile "/opt/l4d2/servers/$name/pid" -game left4dead2 -ip 0.0.0.0 -port "$port" $params +hostname "Crone_$name" +map c1m1_hotel

View file

@ -1,6 +1,9 @@
files = { files = {
'/opt/l4d2/setup': { '/opt/l4d2/setup': {
'mode': '755', 'mode': '755',
'triggers': {
'svc_systemd:left4dead2-initialize.service:restart',
},
}, },
'/opt/l4d2/start': { '/opt/l4d2/start': {
'mode': '755', 'mode': '755',
@ -12,6 +15,7 @@ svc_systemd = {
'enabled': True, 'enabled': True,
'running': None, 'running': None,
'needs': { 'needs': {
'file:/opt/l4d2/setup',
'file:/usr/local/lib/systemd/system/left4dead2-initialize.service', 'file:/usr/local/lib/systemd/system/left4dead2-initialize.service',
}, },
}, },
@ -27,5 +31,5 @@ for server_name in node.metadata.get('left4dead2').keys():
'needs': { 'needs': {
'svc_systemd:left4dead2-initialize.service', 'svc_systemd:left4dead2-initialize.service',
f'file:/usr/local/lib/systemd/system/left4dead2-{server_name}.service', f'file:/usr/local/lib/systemd/system/left4dead2-{server_name}.service',
} },
} }

View file

@ -46,9 +46,13 @@ def server_units(metadata):
for name, config in metadata.get('left4dead2').items(): for name, config in metadata.get('left4dead2').items():
assert match(r'^[A-z0-9-_-]+$', name) assert match(r'^[A-z0-9-_-]+$', name)
assert config["overlay"] in {'pve'} assert config["overlay"] in {'pve', '100tick'}
assert 27000 <= config["port"] <= 27100 assert 27000 <= config["port"] <= 27100
params = config.get("params", "")
if config.get("tickrate"):
params += f" -tickrate {config['tickrate']}"
units[f'left4dead2-{name}.service'] = { units[f'left4dead2-{name}.service'] = {
'Unit': { 'Unit': {
'Description': f'left4dead2 server {name}', 'Description': f'left4dead2 server {name}',
@ -57,7 +61,7 @@ def server_units(metadata):
}, },
'Service': { 'Service': {
'Type': 'simple', 'Type': 'simple',
'ExecStart': f'/opt/l4d2/start {name} {config["overlay"]} {config["port"]}', 'ExecStart': f'/opt/l4d2/start "{name}" "{config["overlay"]}" "{config["port"]}" "{params}"',
'Restart': 'on-failure', 'Restart': 'on-failure',
'Nice': -10, 'Nice': -10,
'CPUWeight': 200, 'CPUWeight': 200,
@ -67,6 +71,9 @@ def server_units(metadata):
'Install': { 'Install': {
'WantedBy': {'multi-user.target'}, 'WantedBy': {'multi-user.target'},
}, },
'triggers': {
f'svc_systemd:left4dead2-{name}.service:restart',
},
} }
return { return {

View file

@ -1,5 +1,8 @@
from bundlewrap.utils.dicts import merge_dict from bundlewrap.utils.dicts import merge_dict
files = {}
svc_systemd = {}
directories = { directories = {
'/usr/local/lib/systemd/system': { '/usr/local/lib/systemd/system': {
'purge': True, 'purge': True,
@ -42,6 +45,9 @@ for name, unit in node.metadata.get('systemd/units').items():
else: else:
raise Exception(f'unknown type {extension}') raise Exception(f'unknown type {extension}')
for attribute in ['needs', 'needed_by', 'triggers', 'triggered_by']:
if attribute in unit:
dependencies[attribute] = unit.pop(attribute)
files[path] = { files[path] = {
'content': repo.libs.systemd.generate_unitfile(unit), 'content': repo.libs.systemd.generate_unitfile(unit),

View file

@ -34,10 +34,7 @@
'server2': { 'server2': {
'overlay': 'pve', 'overlay': 'pve',
'port': 27016, 'port': 27016,
}, 'tickrate': '100',
'server3': {
'overlay': 'pve',
'port': 27017,
}, },
}, },
'bind': { 'bind': {