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:
esefandClaude Opus 5.5 committed 2026-10-11 05:03:07 +03:00
commit 7e9cbee14d
33 files changed
+1890

No files matched your search

Executable
+35
View File
@@ -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)
+130
View File
@@ -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
View File
@@ -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
+59
View File
@@ -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