cs16-dm-server: CS 1.6 deathmatch server in Docker
One-command setup (SteamCMD + pinned, checksum-verified ReHLDS / ReGameDLL / Metamod-R / AMXX / ReAPI / ReUnion / CSDM-ReAPI / YaPB / GunGame), .env settings, ./cs menu (map, DM/GunGame mode, bots, kill counter, restart, update), own plugins (extras, rtv, mode switch), all-time kill counter, watchdog + nightly backup, docs for admins and players. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
commit
7e9cbee14d
33 files changed
+1890
No files matched your search
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Asks a CS 1.6 / GoldSrc server for its info (A2S_INFO), like the in-game server browser does.
|
||||
python3 tools/hlq.py info <host> <port>
|
||||
Prints: name | map | players x/y (bots n) | password yes/no. Exit code 1 when there's no answer.
|
||||
Works against any address (LAN, VPN, a playit tunnel), so it also tests the way in from outside."""
|
||||
import socket, sys
|
||||
|
||||
H = b"\xff\xff\xff\xff"
|
||||
|
||||
|
||||
def info(host, port, timeout=4):
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
s.settimeout(timeout)
|
||||
q = H + b"TSource Engine Query\x00"
|
||||
s.sendto(q, (host, port))
|
||||
d = s.recvfrom(65535)[0]
|
||||
if d[4:5] == b"A": # newer servers answer with a challenge first: ask again with it
|
||||
s.sendto(q + d[5:9], (host, port))
|
||||
d = s.recvfrom(65535)[0]
|
||||
if d[4:5] != b"I":
|
||||
raise ValueError("unexpected reply type %r" % d[4:5])
|
||||
name, mp, folder, game, rest = d[6:].split(b"\x00", 4)
|
||||
players, maxp, bots, pw = rest[2], rest[3], rest[4], rest[7]
|
||||
return (f"{name.decode(errors='replace')} | map {mp.decode()} | players {players}/{maxp} (bots {bots})"
|
||||
f" | password {'yes' if pw else 'no'}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 4 or sys.argv[1] != "info":
|
||||
sys.exit(__doc__)
|
||||
try:
|
||||
print("A2S_INFO ok:", info(sys.argv[2], int(sys.argv[3])))
|
||||
except (OSError, ValueError) as e:
|
||||
print("no answer:", e)
|
||||
sys.exit(1)
|
||||
Executable
+130
@@ -0,0 +1,130 @@
|
||||
#!/bin/sh
|
||||
# Puts the mod stack on top of the Valve game files in hlds/. setup.sh runs this inside the
|
||||
# image after every game download/update (a Steam "validate" puts Valve's engine back and
|
||||
# silently removes ReHLDS + Metamod, so this always has to run after it).
|
||||
# Safe to run again. Kept as they are on re-runs: maps, stats, bot navigation graphs, and your
|
||||
# edits to users.ini (admins), amxx.cfg, csdm/config.ini, mapcycle.txt and custom.cfg.
|
||||
# Mounts (see setup.sh): repo at /cs/repo (read-only) with dl/ writable, hlds at /cs/hlds.
|
||||
set -e
|
||||
R=/cs/repo; DL=$R/dl; H=/cs/hlds; C=$H/cstrike; A=$C/addons; CF=$C/addons/amxmodx/configs
|
||||
X=$(mktemp -d)
|
||||
trap 'rm -rf "$X"' EXIT
|
||||
step() { printf ' - %s\n' "$*"; }
|
||||
die() { printf '\033[31merror:\033[0m %s\n' "$*" >&2; exit 1; }
|
||||
sha() { sha256sum < "$1" | cut -c1-64; }
|
||||
|
||||
[ -x $H/hlds_linux ] || die "no game files in hlds/ (the Steam download didn't finish)"
|
||||
|
||||
step "downloads (pinned, checked against tools/versions.txt)"
|
||||
mkdir -p $DL/gg $DL/snd $DL/spawns
|
||||
grep -v '^#' $R/tools/versions.txt | while read -r f sum url; do
|
||||
[ -n "$f" ] || continue
|
||||
[ -f "$DL/$f" ] && [ "$(sha "$DL/$f")" = "$sum" ] && continue
|
||||
curl -fsSL --retry 3 -o "$DL/$f.part" "$url" || die "download failed: $url"
|
||||
got=$(sha "$DL/$f.part")
|
||||
[ "$got" = "$sum" ] || { rm -f "$DL/$f.part"; die "checksum mismatch for $f: expected $sum, got $got"; }
|
||||
mv "$DL/$f.part" "$DL/$f"
|
||||
done
|
||||
ls $DL/rehlds-bin-*.zip >/dev/null
|
||||
|
||||
# Game mode in use right now (re-run) or from .env (first install)
|
||||
if [ -f $CF/plugins-gungame.ini ]; then MODE=gg
|
||||
elif [ -f $CF/plugins-CSDM_ReAPI.ini ] || [ -f $CF/plugins-CSDM_ReAPI.ini.off ]; then MODE=dm
|
||||
else MODE=${CS_MODE:-dm}; fi
|
||||
case "$MODE" in dm|gg) ;; *) die "CS_MODE must be dm or gg (is: $MODE)" ;; esac
|
||||
|
||||
# Files people edit: save them now, put them back after the archives are unpacked
|
||||
FIRST=; [ -f $C/.cs16-dm-server ] || FIRST=1
|
||||
KEEP="addons/amxmodx/configs/users.ini addons/amxmodx/configs/amxx.cfg addons/amxmodx/configs/csdm/config.ini"
|
||||
if [ -z "$FIRST" ]; then
|
||||
for f in $KEEP; do [ -f "$C/$f" ] && mkdir -p "$X/keep/$(dirname "$f")" && cp -p "$C/$f" "$X/keep/$f"; done
|
||||
fi
|
||||
|
||||
step "ReHLDS (engine)"
|
||||
unzip -qo $DL/rehlds-bin-3.15.0.896.zip 'bin/linux32/*' -d $X/rehlds
|
||||
cp -a $X/rehlds/bin/linux32/. $H/
|
||||
chmod +x $H/hlds_linux $H/hltv # the zip has no exec bits
|
||||
|
||||
step "ReGameDLL (game logic)"
|
||||
unzip -qo $DL/regamedll-bin-5.30.0.814.zip 'bin/linux32/cstrike/*' -d $X/regame
|
||||
cp -a $X/regame/bin/linux32/cstrike/. $C/
|
||||
# game.cfg runs at every map start and would force alltalk off: server.cfg decides that instead
|
||||
sed -i 's|^sv_alltalk "0"|// sv_alltalk "0" // cs16-dm-server: set in server.cfg instead|' $C/game.cfg
|
||||
|
||||
step "Metamod-R"
|
||||
unzip -qo $DL/metamod-bin-1.3.0.149.zip 'addons/*' -d $X/mm
|
||||
cp -a $X/mm/addons/. $A/
|
||||
[ -f $C/liblist.gam.orig ] || cp $C/liblist.gam $C/liblist.gam.orig
|
||||
sed -i 's|^gamedll_linux .*|gamedll_linux "addons/metamod/metamod_i386.so"|' $C/liblist.gam
|
||||
|
||||
step "AMX Mod X + ReAPI"
|
||||
tar xzf $DL/amxmodx-1.10.0-git5486-base-linux.tar.gz -C $C
|
||||
tar xzf $DL/amxmodx-1.10.0-git5486-cstrike-linux.tar.gz -C $C
|
||||
unzip -qo $DL/reapi-bin-5.29.0.358.zip 'addons/*' -d $X/reapi
|
||||
cp -a $X/reapi/addons/. $A/
|
||||
|
||||
step "ReUnion (non-Steam clients)"
|
||||
unzip -qo $DL/reunion-0.2.0.25.zip bin/Linux/reunion_mm_i386.so reunion.cfg -d $X/reu
|
||||
mkdir -p $A/reunion
|
||||
cp $X/reu/bin/Linux/reunion_mm_i386.so $A/reunion/
|
||||
SALT=$(tr -d '\r\n' < /cs/secrets/reunion-salt.txt)
|
||||
[ -n "$SALT" ] || die "secrets/reunion-salt.txt is empty"
|
||||
# IDClientsLimit 0: several non-Steam players with the same placeholder ID can all join
|
||||
( umask 077; sed -e "s|^SteamIdHashSalt =.*|SteamIdHashSalt = $SALT|" -e 's|^IDClientsLimit = .*|IDClientsLimit = 0|' \
|
||||
$X/reu/reunion.cfg > $C/reunion.cfg )
|
||||
|
||||
step "CSDM-ReAPI (deathmatch) + spawn points"
|
||||
unzip -qo $DL/CSDM-ReAPI-v1.0.8.zip 'cstrike/*' -d $X/csdm
|
||||
cp -a $X/csdm/cstrike/. $C/
|
||||
mkdir -p $CF/csdm/spawns
|
||||
for f in $DL/spawns/*.spawns.cfg; do
|
||||
b=$(basename "$f")
|
||||
# old 6-field lines (de_prodigy, de_train) -> the 10 fields CSDM-ReAPI reads (others are skipped)
|
||||
awk 'NF==6 {print $0" 0 0 0 0"; next} {print}' "$f" > $CF/csdm/spawns/$b
|
||||
ln -sfn spawns/$b $CF/csdm/$b # GunGame looks for them one folder up
|
||||
done
|
||||
|
||||
step "YaPB (bots)"
|
||||
tar xJf $DL/yapb-4.4.957-linux.tar.xz -C $C
|
||||
find $A/yapb -type d -exec chmod 775 {} + # the tarball's dirs have no x bit
|
||||
sed -i -e 's/^yb_csdm_mode ".*"/yb_csdm_mode "2"/' -e 's/^yb_quota_mode ".*"/yb_quota_mode "fill"/' \
|
||||
$A/yapb/conf/yapb.cfg # FFA-aware bots; quota = fill up to CS_BOTS players (start.sh sets it)
|
||||
|
||||
step "GunGame + announcer sounds"
|
||||
cp $DL/gg/gungame.sma $A/amxmodx/scripting/
|
||||
cp $DL/gg/gungame.txt $A/amxmodx/data/lang/
|
||||
mkdir -p $C/sound/gungame $C/sound/misc
|
||||
cp $DL/gg/*.wav $C/sound/gungame/
|
||||
cp $DL/snd/*.wav $C/sound/misc/
|
||||
|
||||
step "configs from the repo"
|
||||
cp -a $R/cstrike/. $C/
|
||||
if [ -n "$FIRST" ]; then
|
||||
cp $R/defaults/mapcycle.txt $C/mapcycle.txt
|
||||
fi
|
||||
[ -f $C/custom.cfg ] || cp $R/defaults/custom.cfg $C/custom.cfg
|
||||
if [ -z "$FIRST" ] && [ -d $X/keep ]; then cp -a $X/keep/. $C/; fi
|
||||
|
||||
step "compiling plugins"
|
||||
cp $R/plugins/*.sma $A/amxmodx/scripting/
|
||||
cd $A/amxmodx/scripting
|
||||
for p in rtv esef_extras esef_mode gungame; do
|
||||
./amxxpc $p.sma -o../plugins/$p.amxx > $X/$p.log 2>&1 || { cat $X/$p.log; die "compiling $p.sma failed"; }
|
||||
done
|
||||
cd - >/dev/null
|
||||
|
||||
step "game mode: $MODE"
|
||||
# exactly one of the two plugin lists is active (.ini), the other one is .ini.off
|
||||
for ini in plugins-gungame.ini plugins-CSDM_ReAPI.ini; do
|
||||
[ -f $CF/$ini ] && rm -f $CF/$ini.off # fresh copy from the archive/repo wins
|
||||
[ -f $CF/$ini ] || mv $CF/$ini.off $CF/$ini
|
||||
done
|
||||
if [ "$MODE" = gg ]; then mv $CF/plugins-CSDM_ReAPI.ini $CF/plugins-CSDM_ReAPI.ini.off
|
||||
else mv $CF/plugins-gungame.ini $CF/plugins-gungame.ini.off; fi
|
||||
|
||||
# hlds looks for steamclient.so here; without it: "Unable to initialize Steam"
|
||||
mkdir -p /cs/steamcmd-home/.steam/sdk32
|
||||
ln -sfn /cs/hlds/steamclient.so /cs/steamcmd-home/.steam/sdk32/steamclient.so
|
||||
|
||||
touch $C/.cs16-dm-server
|
||||
echo " mod stack installed"
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/bin/sh
|
||||
# Container entry point: writes the .env values into the game configs, then starts the server.
|
||||
# Runs at every container start, so edit .env (not these files) and run: docker compose up -d
|
||||
set -e
|
||||
C=/cs/hlds/cstrike
|
||||
clean() { printf '%s' "$1" | tr -d '"\r'; } # no double quotes inside cfg strings
|
||||
|
||||
{
|
||||
echo "// written from .env by tools/start.sh at every start: edit .env instead"
|
||||
echo "hostname \"$(clean "$CS_HOSTNAME")\""
|
||||
} > $C/env.cfg
|
||||
|
||||
# secrets.cfg holds the RCON + join password: readable only by the server user
|
||||
umask 077
|
||||
{
|
||||
echo "// written by tools/start.sh at every start (RCON: secrets/rcon-password.txt, join: CS_PASSWORD in .env)"
|
||||
echo "rcon_password \"$(tr -d '"\r\n' < /cs/secrets/rcon-password.txt)\""
|
||||
echo "sv_password \"$(clean "$CS_PASSWORD")\""
|
||||
} > $C/secrets.cfg
|
||||
umask 022
|
||||
|
||||
sed -i -e "s/^yb_quota \".*\"/yb_quota \"${CS_BOTS:-0}\"/" \
|
||||
-e "s/^yb_difficulty \".*\"/yb_difficulty \"${CS_BOT_DIFFICULTY:-2}\"/" \
|
||||
$C/addons/yapb/conf/yapb.cfg
|
||||
|
||||
cd /cs/hlds
|
||||
exec ./hlds_run -game cstrike -port "${CS_PORT:-27015}" +maxplayers "${CS_MAXPLAYERS:-16}" \
|
||||
+map "${CS_MAP:-de_dust2}" -pingboost 2 -norestart +log on
|
||||
@@ -0,0 +1,59 @@
|
||||
# Pinned third-party downloads: <file in dl/> <sha256> <url>
|
||||
# setup.sh fetches each one into dl/ and refuses to install it if the hash differs.
|
||||
# Bump a version: change url + file name, run ./setup.sh, put the new hash it prints here.
|
||||
|
||||
# engine + game: ReHLDS, ReGameDLL_CS (MIT)
|
||||
rehlds-bin-3.15.0.896.zip 997baeb7ef3842dab3e034d82dc651ebfe560c23b158adce660a6b97976b4e2b https://github.com/rehlds/ReHLDS/releases/download/3.15.0.896/rehlds-bin-3.15.0.896.zip
|
||||
regamedll-bin-5.30.0.814.zip 457f5c96a4d10280fcad47f106cbd5be86363a47df1ccab91c514e9d1bc6fd18 https://github.com/rehlds/ReGameDLL_CS/releases/download/5.30.0.814/regamedll-bin-5.30.0.814.zip
|
||||
# plugin loaders + API: Metamod-R, AMX Mod X, ReAPI, ReUnion (GPL-3.0)
|
||||
metamod-bin-1.3.0.149.zip ede7f59c4e0220afe8c02aa348a130cce527f87d36ffdb674e37a501ce57be94 https://github.com/rehlds/Metamod-R/releases/download/1.3.0.149/metamod-bin-1.3.0.149.zip
|
||||
amxmodx-1.10.0-git5486-base-linux.tar.gz 9f5041325cc656dcc292cafb9d2c9cb4deeedb57192d8a7ed43947530e04e5b7 https://www.amxmodx.org/amxxdrop/1.10/amxmodx-1.10.0-git5486-base-linux.tar.gz
|
||||
amxmodx-1.10.0-git5486-cstrike-linux.tar.gz 686d875010792d84ac765d2f78af227ab7000c9b567995ea56b836e0a41fc7a7 https://www.amxmodx.org/amxxdrop/1.10/amxmodx-1.10.0-git5486-cstrike-linux.tar.gz
|
||||
reapi-bin-5.29.0.358.zip f33a7435540bea8706db3fa948e51a85b511f5b18c383b97402a204dc5419195 https://github.com/rehlds/ReAPI/releases/download/5.29.0.358/reapi-bin-5.29.0.358.zip
|
||||
reunion-0.2.0.25.zip 0f238276719274216bd169c578eac2db4e041946b8b9f0e407e41ef9d85efdf5 https://github.com/rehlds/ReUnion/releases/download/0.2.0.25/reunion-0.2.0.25.zip
|
||||
# deathmatch + bots: CSDM-ReAPI, YaPB (Unlicense)
|
||||
CSDM-ReAPI-v1.0.8.zip e7650204080be0819e9dfe6239fb9e9b0aca92e5e33c956053adcb5117fc5fc8 https://github.com/wopox1337/CSDM-ReAPI/releases/download/v1.0.8/CSDM-ReAPI-v1.0.8.zip
|
||||
yapb-4.4.957-linux.tar.xz 8c095ac89b9b2ccc70a66a71d608e1a570b5268c57c6083ced8c06161533a4b1 https://github.com/yapb/yapb/releases/download/4.4.957/yapb-4.4.957-linux.tar.xz
|
||||
|
||||
# GunGame 2.13c (Avalanche), github.com/fysiks1/amxx-gungame_cstrike @ 8024d1e
|
||||
gg/gungame.sma 027cae2b5c8cea14a96cd8f627b0123ac2929f725c5352739f136cab7c11f975 https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/scripting/gungame.sma
|
||||
gg/gungame.txt 7759207c3f2e397b3823cd584fce48bb5dfb7f9db17154910bb1d6d376cec8d8 https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/data/lang/gungame.txt
|
||||
gg/gg_brass_bell.wav 818ce90dc03f34664aee15f28efd30a5873e852043957b8be11c37f65c39eaa7 https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_brass_bell.wav
|
||||
gg/gg_knife_level.wav 33183e49d6a877d5b3d604838c392d904cf19eb23b675912a07558c20662f84e https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_knife_level.wav
|
||||
gg/gg_levelup.wav 7e03c12c2af7671cf6ebcfbe1cf4ad964cbeb979439afaad9a8b4b55a0976b62 https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_levelup.wav
|
||||
gg/gg_lostlead.wav e2210ef24033762ad4ea2f71b7cbc2e0c6e23dc1e0511147cdb3d14b61e1c9ca https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_lostlead.wav
|
||||
gg/gg_nade_level.wav 6f89f7b9ce94a9e7762eb3733f7b8d26dd55fe167155102081c6cd2b121054ac https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_nade_level.wav
|
||||
gg/gg_takenlead.wav c68b8dcefc4db9e22b2dc5dca6c2865a4a31744bffae268c9f0c726bf4dbb27d https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_takenlead.wav
|
||||
gg/gg_tiedlead.wav 87dfb48d7398a2c75db64e55a834ef0f7107f85d14bd62f70cc55a8652c829a5 https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_tiedlead.wav
|
||||
gg/gg_triple.wav 301d63628d74952c347b55e036914a62255a3a8a3f766db4ff61124286c3092b https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_triple.wav
|
||||
gg/gg_welcome.wav 1544afd42fc7926ce923ad499a264cec24e0aaae4884926d399457fc80956003 https://raw.githubusercontent.com/fysiks1/amxx-gungame_cstrike/8024d1ef35cddf357ce18b277bde2c6422cab56d/resources/sound/gungame/gg_welcome.wav
|
||||
|
||||
# Announcer sounds for the extras plugin, github.com/hpoon/HLDS-CS1.6 @ b0abdc3 (cstrike/sound/misc/)
|
||||
snd/dominating.wav 8cf8fa1f85b1d329e08db4f467398f6a7724eb335acf7704aa81442b34df44ae https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/dominating.wav
|
||||
snd/doublekill.wav 66e07ad6ba4ac978b401d717391d9be42d188123072c5883d4aa360ad79baed9 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/doublekill.wav
|
||||
snd/firstblood.wav 6882d8ce2fe548cc1f4464b594163196ebf0f550b03f61d8864b35ab973d5183 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/firstblood.wav
|
||||
snd/godlike.wav 924c13260a1375484d7204b64e17c0cafe9ec4981fbb3e4cb51ead5ef2620596 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/godlike.wav
|
||||
snd/headshot.wav 50993616bcc6a18de917d83181e60fc38ab9da21a29fe6e06f0f6ac6b3353580 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/headshot.wav
|
||||
snd/holyshit.wav 8fa0f0e881f166274748409f0cb932f7911e3bd38f11f455f169c029fd59dda7 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/holyshit.wav
|
||||
snd/humiliation.wav 026c862bb145486d6c87a6426e864cf45f1dd750c6c194391d2717725064da52 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/humiliation.wav
|
||||
snd/killingspree.wav 57e11e963a7bff2d4f788b0ac9f65d7805ffb78ece44ecc40564b7b682411077 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/killingspree.wav
|
||||
snd/monsterkill.wav 4aa258c88105f1e24f89b63f69a35c1d75c83d1c27d43cc948eba9b76bb3606d https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/monsterkill.wav
|
||||
snd/multikill.wav 526e1c99ee930cec729f269a916e983c18a3ce54449929f423953fb543c24b67 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/multikill.wav
|
||||
snd/rampage.wav 42063b331c00467b919accce3602446a29b226ca8111a164192cee5d88e0765a https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/rampage.wav
|
||||
snd/ultrakill.wav 842fa328d92c91cc0bd0315f78b153006b6046cbf41341c63f74663b994f96b6 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/ultrakill.wav
|
||||
snd/unstoppable.wav df525291a6db921734fa19e64b4a95e884090eea3bf29bbd906a1ba2de7374f6 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/unstoppable.wav
|
||||
snd/wickedsick.wav 8dbc96ba7961fed9d83ada3434ac5b61d41fac7a2d0c9f8ddd11e7eb2373a0b2 https://raw.githubusercontent.com/hpoon/HLDS-CS1.6/b0abdc37d1da/cstrike/sound/misc/wickedsick.wav
|
||||
|
||||
# DM spawn points (CSDM 2.1 by Arkshine), github.com/Arkshine/CSDM @ 3df2741. de_prodigy/de_train
|
||||
# are in the old 6-field format: install converts them to the 10 fields CSDM-ReAPI needs.
|
||||
spawns/cs_assault.spawns.cfg 6035adc7f5d59e5f0388936fd843a9a1fb68cdf86e2dc0454241c6390d832cce https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/cs_assault.spawns.cfg
|
||||
spawns/cs_italy.spawns.cfg b8bb8839f67b3718ac18ef97a17a403d1b0163286e5e389da4cf1d21fdf1003d https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/cs_italy.spawns.cfg
|
||||
spawns/cs_office.spawns.cfg 6d6964dd54b62e8af0904360131985ebc7b5c9111e0832798e96e2fbaaa19c52 https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/cs_office.spawns.cfg
|
||||
spawns/de_aztec.spawns.cfg 9454d9c86838e9b36b5214c15acb06af383aafdbefbab6c6494f09c8093b4cd1 https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_aztec.spawns.cfg
|
||||
spawns/de_cbble.spawns.cfg 4f32377713f03cec6086d09e4567ee9196c296b85c7b434670f243269b01db2c https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_cbble.spawns.cfg
|
||||
spawns/de_dust.spawns.cfg 3fe16dc87db890b1ad8b75bd2cada44cb7faecbca290049c05410cd6a439e532 https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_dust.spawns.cfg
|
||||
spawns/de_dust2.spawns.cfg 98eefa633147ab4e781ba957dfce6172d2bdd975191dcaf4403f69c3393870ea https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_dust2.spawns.cfg
|
||||
spawns/de_inferno.spawns.cfg a93a0b628f8079b89ceb8a845a2e2d5e8bdd775911dc569294fdb3710476866c https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_inferno.spawns.cfg
|
||||
spawns/de_nuke.spawns.cfg 39e628ea43eb00877e2006eadef9d834673a9a6a879e77199cd49e3a0899b759 https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_nuke.spawns.cfg
|
||||
spawns/de_prodigy.spawns.cfg 9e1e340b3160009824e6810fdba8ff4bf6968cdfd13ace2eceddb9c869b30ea9 https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_prodigy.spawns.cfg
|
||||
spawns/de_train.spawns.cfg 787e97ae9ed75f55eb771c8fe9871cc14be44df8f0595a851263b2468ae63d96 https://raw.githubusercontent.com/Arkshine/CSDM/3df2741b09c0e039ebd6cf96d66a5f2acd58b70f/amxmodx/configs/csdm/de_train.spawns.cfg
|
||||
Reference in new issue
Block a user