Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
COPY . .

ARG RELEASE_VERSION
ENV RELEASE_VERSION ${RELEASE_VERSION}

Check warning on line 26 in Dockerfile

View workflow job for this annotation

GitHub Actions / branch-build-push

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/

Check warning on line 26 in Dockerfile

View workflow job for this annotation

GitHub Actions / branch-build-push

Legacy key/value format with whitespace separator should not be used

LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format More info: https://docs.docker.com/go/dockerfile/rule/legacy-key-value-format/

RUN sed -i 's/__RELEASE_VERSION__/'${RELEASE_VERSION}'/' src/FiveStackPlugin.cs

Expand Down Expand Up @@ -66,7 +66,7 @@
ENV USER=steam

ENV STEAM_USER="anonymous"
ENV STEAM_PASSWORD=""

Check warning on line 69 in Dockerfile

View workflow job for this annotation

GitHub Actions / branch-build-push

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "STEAM_PASSWORD") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/

ENV SERVER_ID=""
ENV DEFAULT_MAP="de_inferno"
Expand All @@ -77,6 +77,11 @@

ENV METAMOD_URL=https://github.com/alliedmodders/metamod-source/releases/download/2.0.0.1402/mmsource-2.0.0-git1402-linux.tar.gz
ENV COUNTER_STRIKE_SHARP_URL=https://github.com/roflmuffin/CounterStrikeSharp/releases/download/v1.0.369/counterstrikesharp-with-runtime-linux-1.0.369.zip
ENV CS2FOW_URL=https://github.com/karola3vax/CS2FOW/releases/download/v0.1.1-preview/cs2fow-0.1.1-preview-linux-x86_64.zip
ENV CS2FOW_SHA256=517eff95d5bae15b0aa9fb79c47a6eebe3bb7033228bfe9d7d397fc9446750d6
ENV CS2FOW_PREBAKE_URL=https://github.com/karola3vax/CS2FOW/releases/download/v0.1.0-preview/cs2fow-0.1.0-preview-official-maps.zip
ENV CS2FOW_PREBAKE_SHA256=66114d74a13f933f38f81a79d2fa10ad89e2cf254b45afc5c589c8782067215c
ENV CS2FOW_PREBAKE_VERSION=0.1.0-preview

ENV METAMOD_CSGO_URL=https://mms.alliedmods.net/mmsdrop/1.12/mmsource-1.12.0-git1219-linux.tar.gz
ENV SOURCEMOD_CSGO_URL=https://sm.alliedmods.net/smdrop/1.13/sourcemod-1.13.0-git7297-linux.tar.gz
Expand Down Expand Up @@ -106,6 +111,11 @@
unzip -q /tmp/counterstrikesharp.zip -d /opt/counterstrikesharp && \
rm /tmp/counterstrikesharp.zip

RUN mkdir -p /opt/cs2fow && \
wget -q $CS2FOW_URL -O /tmp/cs2fow.zip && \
echo "${CS2FOW_SHA256} /tmp/cs2fow.zip" | sha256sum -c - && \
unzip -q /tmp/cs2fow.zip -d /opt/cs2fow && \
rm /tmp/cs2fow.zip

RUN mkdir -p /opt/csgo-metamod /opt/csgo-sourcemod /opt/csgo-no-lobby-reservation && \
wget -q $METAMOD_CSGO_URL -O /tmp/metamod-csgo.tar.gz && \
Expand All @@ -126,6 +136,10 @@
cp -R /opt/counterstrikesharp/addons/metamod /opt/addons && \
cp -R /opt/counterstrikesharp/addons/counterstrikesharp /opt/addons && \
mkdir -p /opt/addons/counterstrikesharp/plugins && \
rm -rf /opt/metamod /opt/counterstrikesharp
cp -R /opt/cs2fow/addons/cs2fow /opt/addons && \
cp /opt/cs2fow/addons/metamod/cs2fow.vdf /opt/addons/metamod/ && \
mkdir -p /opt/cs2fow-tools && \
cp -R /opt/cs2fow/tools/. /opt/cs2fow-tools/ && \
rm -rf /opt/metamod /opt/counterstrikesharp /opt/cs2fow

ENTRYPOINT ["/bin/bash", "-c", "/opt/scripts/setup.sh && /opt/scripts/server.sh"]
17 changes: 16 additions & 1 deletion Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ ENV SERVER_TYPE="Ranked"

ENV METAMOD_URL=https://mms.alliedmods.net/mmsdrop/2.0/mmsource-2.0.0-git1374-linux.tar.gz
ENV COUNTER_STRIKE_SHARP_URL=https://github.com/roflmuffin/CounterStrikeSharp/releases/download/v1.0.369/counterstrikesharp-with-runtime-linux-1.0.369.zip
ENV CS2FOW_URL=https://github.com/karola3vax/CS2FOW/releases/download/v0.1.1-preview/cs2fow-0.1.1-preview-linux-x86_64.zip
ENV CS2FOW_SHA256=517eff95d5bae15b0aa9fb79c47a6eebe3bb7033228bfe9d7d397fc9446750d6
ENV CS2FOW_PREBAKE_URL=https://github.com/karola3vax/CS2FOW/releases/download/v0.1.0-preview/cs2fow-0.1.0-preview-official-maps.zip
ENV CS2FOW_PREBAKE_SHA256=66114d74a13f933f38f81a79d2fa10ad89e2cf254b45afc5c589c8782067215c
ENV CS2FOW_PREBAKE_VERSION=0.1.0-preview

RUN apt-get update && \
apt-get install -y --no-install-recommends \
Expand All @@ -52,12 +57,22 @@ RUN mkdir -p /opt/metamod /opt/counterstrikesharp && \
unzip -q /tmp/counterstrikesharp.zip -d /opt/counterstrikesharp && \
rm /tmp/counterstrikesharp.zip

RUN mkdir -p /opt/cs2fow && \
wget -q $CS2FOW_URL -O /tmp/cs2fow.zip && \
echo "${CS2FOW_SHA256} /tmp/cs2fow.zip" | sha256sum -c - && \
unzip -q /tmp/cs2fow.zip -d /opt/cs2fow && \
rm /tmp/cs2fow.zip

RUN mv /opt/metamod/addons /opt/addons && \
cp -R /opt/counterstrikesharp/addons/metamod /opt/addons && \
cp -R /opt/counterstrikesharp/addons/counterstrikesharp /opt/addons && \
mkdir -p /opt/addons/counterstrikesharp/plugins && \
cp -R /opt/cs2fow/addons/cs2fow /opt/addons && \
cp /opt/cs2fow/addons/metamod/cs2fow.vdf /opt/addons/metamod/ && \
mkdir -p /opt/cs2fow-tools && \
cp -R /opt/cs2fow/tools/. /opt/cs2fow-tools/ && \
mkdir -p /opt/dev && \
rm -rf /opt/metamod /opt/counterstrikesharp
rm -rf /opt/metamod /opt/counterstrikesharp /opt/cs2fow

WORKDIR /opt/5stack

Expand Down
7 changes: 7 additions & 0 deletions cfg/cs2fow.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
cs2fow_enable 1
cs2fow_update_interval_ms 10
cs2fow_max_lookahead_ms 210
cs2fow_min_lookahead_ms 120
cs2fow_peek_margin_units 21
cs2fow_visibility_hold_ms 150
cs2fow_debug 0
21 changes: 21 additions & 0 deletions scripts/setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,27 @@ done
echo "---Install Addons---"
cp -r "/opt/addons" "${INSTANCE_SERVER_DIR}/game/csgo"

echo "---Setup CS2FOW---"
if grep -qw avx /proc/cpuinfo; then
mkdir -p "${BASE_SERVER_DIR}/.cs2fow/maps"
rm -rf "${INSTANCE_SERVER_DIR}/game/csgo/addons/cs2fow/data/maps"
ln -s "${BASE_SERVER_DIR}/.cs2fow/maps" "${INSTANCE_SERVER_DIR}/game/csgo/addons/cs2fow/data/maps"

mkdir -p "${INSTANCE_SERVER_DIR}/game/csgo/tools"
for cs2fow_tool in /opt/cs2fow-tools/*; do
cs2fow_tool_name="$(basename "${cs2fow_tool}")"
if [ ! -e "${INSTANCE_SERVER_DIR}/game/csgo/tools/${cs2fow_tool_name}" ]; then
ln -s "${cs2fow_tool}" "${INSTANCE_SERVER_DIR}/game/csgo/tools/${cs2fow_tool_name}"
fi
done

cp "/opt/server-cfg/cs2fow.cfg" "${INSTANCE_SERVER_DIR}/game/csgo/cfg/cs2fow.cfg"
else
echo "---CS2FOW disabled: CPU lacks AVX support---"
rm -f "${INSTANCE_SERVER_DIR}/game/csgo/addons/metamod/cs2fow.vdf"
rm -rf "${INSTANCE_SERVER_DIR}/game/csgo/addons/cs2fow"
fi

echo "---Create Symbolic Links---"

if [ "$SERVER_TYPE" = "Ranked" ]; then
Expand Down
29 changes: 28 additions & 1 deletion scripts/update.sh
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,35 @@ EOF
echo "${BUILD_ID}" > "${BUILD_TRACK_FILE}"

echo "---Done Updating Server To Version ${BUILD_ID}---"
UPDATE_RC=0

else
echo "---Update Server To Latest Version---"
"${STEAMCMD_DIR}/steamcmd.sh" +force_install_dir "${BASE_SERVER_DIR}" +login anonymous +app_update "${GAME_ID}" ${VALIDATE:+validate} +quit
fi
UPDATE_RC=$?
fi

if [ "${GAME_ID}" = "730" ] && [ -n "${CS2FOW_PREBAKE_URL:-}" ] && grep -qw avx /proc/cpuinfo; then
CS2FOW_MAPS_DIR="${BASE_SERVER_DIR}/.cs2fow/maps"
CS2FOW_MARKER="${BASE_SERVER_DIR}/.cs2fow/.prebake-version"

if [ ! -f "${CS2FOW_MARKER}" ] || [ "$(cat "${CS2FOW_MARKER}" 2>/dev/null)" != "${CS2FOW_PREBAKE_VERSION}" ]; then
echo "---Downloading CS2FOW Official Map Prebakes (${CS2FOW_PREBAKE_VERSION})---"
mkdir -p "${CS2FOW_MAPS_DIR}"
if curl -sSL -o /tmp/cs2fow-prebakes.zip "${CS2FOW_PREBAKE_URL}" \
&& echo "${CS2FOW_PREBAKE_SHA256} /tmp/cs2fow-prebakes.zip" | sha256sum -c - ; then
# -j flattens paths so this works regardless of the zip's internal layout
if unzip -o -j -q /tmp/cs2fow-prebakes.zip "*.bvh8" -d "${CS2FOW_MAPS_DIR}"; then
echo "${CS2FOW_PREBAKE_VERSION}" > "${CS2FOW_MARKER}"
echo "---CS2FOW prebakes installed: $(ls "${CS2FOW_MAPS_DIR}" | wc -l) files---"
else
echo "---CS2FOW prebake unzip failed; auto-bake will cover maps---"
fi
else
echo "---CS2FOW prebake download failed; auto-bake will cover maps---"
fi
rm -f /tmp/cs2fow-prebakes.zip
fi
fi

exit ${UPDATE_RC:-0}
1 change: 1 addition & 0 deletions src/FiveStack.Entities/MatchOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class MatchOptions
public bool coaches { get; set; } = true;
public int number_of_substitutes { get; set; } = 0;
public bool knife_round { get; set; } = true;
public bool anti_wallhack { get; set; } = true;
public bool? default_models { get; set; } = false;
public string ready_setting { get; set; } = "Players";
public string timeout_setting { get; set; } = "CoachAndPlayers";
Expand Down
48 changes: 48 additions & 0 deletions src/FiveStack.Services/MatchManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,8 @@ public void SetupMatch(MatchData match)
}
}

ApplyAntiWallhack();

Server.NextFrame(() =>
{
if (!wasAlreadySetup)
Expand Down Expand Up @@ -784,6 +786,9 @@ private void StartLive()

_gameServer.SendCommands([$"exec 5stack.{_matchData.options.type.ToLower()}.cfg"]);

ApplyAntiWallhack();
PublishAntiWallhackStatus();

Server.NextFrame(() =>
{
_gameDemos.Start();
Expand All @@ -807,6 +812,49 @@ private void StartLive()
});
}

private void ApplyAntiWallhack()
{
if (_matchData == null)
{
return;
}

if (ConVar.Find("cs2fow_enable") == null)
{
// CS2FOW is not loaded (no AVX, removed, or failed); nothing to apply
return;
}

_gameServer.SendCommands([$"cs2fow_enable {(_matchData.options.anti_wallhack ? 1 : 0)}"]);
}

private void PublishAntiWallhackStatus()
{
if (_matchData == null)
{
return;
}

bool pluginLoaded = ConVar.Find("cs2fow_enable") != null;

string bakePath = Path.Join(
Server.GameDirectory,
"csgo",
"addons",
"cs2fow",
"data",
"maps",
$"{Server.MapName}.bvh8"
);

bool active = _matchData.options.anti_wallhack && pluginLoaded && File.Exists(bakePath);

_matchEvents.PublishGameEvent(
"antiWallhackStatus",
new Dictionary<string, object> { { "active", active } }
);
}

public void EnforceMemberTeam(CCSPlayerController player, CsTeam? currentTeam = null)
{
CsTeam expectedTeam = GetExpectedTeam(player);
Expand Down
Loading