Unknown ❤ RESPAWN.ZAFEST.RO | VIP FREE | FREE FOR ALL ❤ 0/32
Romania XPlayZM.CSBlackDevil.COM # Zombie Plague UltimateX [ Respawn + FDL + VIP 22-12PM + POINTS] ® 15/32
Server bewerben

Add 6 tutorials (6 files)

Browse Source
Daemon666 committed parent 7689be8da7 commit bba8874f1dc337a56c068d5dc6a88f959e50e32f
6 changed files with 180 additions and 0 deletions
+9 -0 25th-anniversary-update-recap/en.md A
@@ -0,0 +1,9 @@
1 +---
2 +title: "The 25th Anniversary Update: What Broke and What Changed"
3 +excerpt: "A recap of the November 2023 25th Anniversary update to Counter-Strike, why it broke non-Steam clients and old server stacks, and what the steam_legacy branch rolls back to."
4 +category: "misc"
5 +tags: "anniversary, history"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>In November 2023, alongside the launch of Counter-Strike 2, Valve pushed a large update to the classic Counter-Strike app on Steam &mdash; the so-called <strong>25th Anniversary update</strong>. For most players it was cosmetic. For server admins running CS 1.6 it was the most disruptive change in a decade: it rebuilt parts of the GoldSrc engine, broke a swathe of non-Steam clients and older server binaries, and forced the community tooling to scramble out compatibility releases. This is a factual recap of what actually changed and how the ecosystem responded.</p><h2>1. What the update touched</h2><p>The update modernised the underlying engine build for the classic Half-Life / CS branch. The visible symptoms admins reported were:</p><ul><li>Old <strong>Metamod</strong> and <strong>AMX Mod X</strong> setups failing to load or crashing the server on start.</li><li>Non-Steam clients unable to connect &mdash; protocol and networking behaviour shifted, so clients built against the pre-update engine mismatched.</li><li>Servers running the stock Valve <code>hlds</code> binaries crashing or refusing to boot after the update pulled a new engine.</li><li>Some networking and message-handling changes that broke plugins relying on undocumented engine behaviour.</li></ul><p>Because the classic app auto-updates, many admins arrived to a previously stable server that would no longer start, with nothing in their own configs changed.</p><h2>2. The steam_legacy escape hatch</h2><p>Valve shipped a beta branch that rolls the app back to the pre-anniversary build. In Steam, right-click the game &rarr; Properties &rarr; Betas, and select <strong><code>steam_legacy</code></strong> from the dropdown; Steam downloads the older engine. This is the single most useful fact from the whole episode: if the update broke your setup and you cannot immediately move to updated binaries, <code>steam_legacy</code> restores the old behaviour on both client and server side. The trade-off is that you are frozen on an older build. See <a href="/tutorials/cs16-steam-legacy-beta">the steam_legacy branch guide</a> for the exact steps, and <a href="/tutorials/fix-25th-anniversary-server-broken">fixing an anniversary-broken server</a> for the server-side recovery.</p><h2>3. How the community tooling responded</h2><p>Rather than stay on the legacy branch forever, the actively-maintained stack was updated to run on the new engine:</p><ul><li><strong>ReHLDS</strong> (the reverse-engineered engine replacement from the <code>rehlds</code> GitHub org) shipped builds compatible with the new client protocol &mdash; often the cleanest way to run a modern, stable server post-update. See <a href="/tutorials/hlds-vs-rehlds-explained">HLDS vs ReHLDS</a>.</li><li><strong>Metamod-r</strong> replaced classic Metamod for reliability on the new engine; see <a href="/tutorials/metamod-r-vs-metamod-p">Metamod-r vs Metamod-p</a>.</li><li><strong>ReGameDLL_CS</strong> and <strong>ReAPI</strong> continued to track the changes, keeping the modern hook-based plugin ecosystem working.</li><li><strong>Reunion</strong> (non-Steam support for ReHLDS) was the path back to accepting non-Steam clients once the engine changes settled &mdash; see <a href="/tutorials/make-server-accept-nonsteam">accepting non-Steam clients</a>.</li></ul><p>The practical upshot: a server on the modern <em>Re-</em> stack (ReHLDS + ReGameDLL + Metamod-r) weathered the update far better than one on stock Valve binaries with classic Metamod.</p><h2>4. Two viable paths today</h2><p>As of 2026 you have two supported directions:</p><ol><li><strong>Stay current.</strong> Run ReHLDS with Metamod-r and up-to-date AMX Mod X. This is the recommended path &mdash; you get the modern engine, ongoing fixes, and non-Steam support via Reunion.</li><li><strong>Roll back.</strong> Use <code>steam_legacy</code> to pin the pre-anniversary build. Reasonable as a stopgap or for a very specific legacy plugin, but you are on frozen code.</li></ol><h2>Common misconceptions</h2><ul><li><strong>&quot;The anniversary update deleted CS 1.6.&quot;</strong> No &mdash; the classic app still exists and runs. The update changed the engine build; it did not remove the game.</li><li><strong>&quot;steam_legacy is a mod.&quot;</strong> It is an official Valve beta branch selectable in Steam's Betas tab, not a third-party download.</li><li><strong>&quot;Only non-Steam servers broke.&quot;</strong> Steam servers on stock binaries with old Metamod/AMXX broke too. Non-Steam clients had the most visible connection failures, but the breakage was broader.</li><li><strong>&quot;Reinstalling fixes it.&quot;</strong> A clean install pulls the same new engine. The fix is either updated binaries (Re- stack) or the legacy branch, not reinstalling.</li><li><strong>&quot;It broke CS 1.6 permanently.&quot;</strong> The maintained tooling was updated within weeks; a current Re- stack runs fine on the new engine.</li></ul><h2>How to tell which side of the update you are on</h2><p>Check the game's branch in Steam &rarr; Properties &rarr; Betas &mdash; if it reads <code>steam_legacy</code> you are on the pre-anniversary build. On the server, if a previously-working <code>hlds</code> stack started crashing on start in late 2023 with no config change, the update is the cause; move to ReHLDS + Metamod-r or roll back. If non-Steam players suddenly cannot connect and get protocol errors, that is the same root cause &mdash; see <a href="/tutorials/protocol-47-vs-48">protocol 47 vs 48</a> for why the client/engine protocol mismatch bites.</p>
+46 -0 configure-reunion-cfg/en.md A
@@ -0,0 +1,46 @@
1 +---
2 +title: "reunion.cfg Explained: Every Setting for Steam and Non-Steam"
3 +excerpt: "A line-by-line guide to reunion.cfg on ReHLDS: the mandatory SteamIdHashSalt, the cid_ client-provider modes, how Steam and non-Steam share one identity space, and why the salt must never change."
4 +category: "installation"
5 +tags: "reunion, config"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p><a href="/tutorials/install-reunion">Reunion</a> is the non-Steam authentication provider for ReHLDS, and it is configured through one file, <code>cstrike/reunion.cfg</code>. Get this file right and a single server hands every player &mdash; genuine Steam or non-Steam &mdash; a stable <code>STEAM_</code> id that admin flags, bans and stats can trust. Get it wrong and Reunion either refuses to load or scrambles everyone's identity. This walks through the settings that matter.</p>
10 +
11 +<h2>1. SteamIdHashSalt &mdash; mandatory, 16+ characters</h2>
12 +<p>The one value Reunion will not start without is the salt used to derive SteamIDs for non-Steam players:</p>
13 +<pre>SteamIdHashSalt = a9F2kQ7pLm3xZ0Vb</pre>
14 +<p><strong>It must be at least 16 characters.</strong> Shorter, or left at a placeholder, and Reunion aborts loading &mdash; it will not appear as <code>RUN</code> in <code>meta list</code>, and the server comes up with no non-Steam support at all. Generate a long random string once.</p>
15 +
16 +<h2>2. Never change the salt</h2>
17 +<p>The salt is the seed for every generated id. A non-Steam player's <code>STEAM_</code> id is a hash of their identity <em>and</em> your salt, so if you ever edit <code>SteamIdHashSalt</code>, every non-Steam player is re-rolled onto a brand-new id in a single restart. That wipes their admin access, their rank in <a href="/tutorials/mp-cvars-reference">stats</a>, their VIP status, and it orphans every ban keyed to the old id. Treat the salt as write-once. Back up <code>reunion.cfg</code> so it cannot be lost.</p>
18 +
19 +<h2>3. The cid_ provider modes</h2>
20 +<p>Reunion detects which provider each connecting client uses &mdash; real Steam, one of several Steam emulators, a legacy revEmu client, and so on &mdash; and the <code>cid_XX</code> lines map each detected provider to how its id is generated:</p>
21 +<pre>SteamIdHashSalt = a9F2kQ7pLm3xZ0Vb
22 +cid_00 = 0
23 +cid_01 = 1
24 +cid_02 = 2</pre>
25 +<p>Each <code>cid_XX</code> is a provider index; its value selects the generation mode for that provider. Mode <code>0</code> passes through a real Steam id untouched; the other modes tell Reunion how to synthesise an id for a non-Steam provider (from the client-supplied unique id, from the name, or a hashed combination). The shipped <code>reunion.cfg</code> lists every provider index it knows about with a comment, so set these from the file you were given rather than guessing an index that may not exist in your build.</p>
26 +
27 +<h2>4. How Steam and non-Steam share one space</h2>
28 +<p>The design goal is that both audiences live in one identity system. A Steam client authenticates normally and keeps its Valve id; a non-Steam client is handed a generated <code>STEAM_0:x:xxxxxxx</code> that <em>looks</em> like a real one and stays stable across reconnects. Downstream, AMX Mod X cannot tell the difference &mdash; which is exactly why admin flags and stats "just work" for both. This is also why Reunion must load <strong>before</strong> AMXX in <code>addons/metamod/plugins.ini</code>: it has to establish the authid during the handshake, before AMXX reads it. Load it second and admins recognised by SteamID intermittently lose flags.</p>
29 +
30 +<h2>5. Protocols 47 and 48</h2>
31 +<p>Reunion answers both the modern Steam handshake (protocol 48) and the older non-Steam one (protocol 47), so you do not choose a single audience. If a specific client build is being bounced, that is a <a href="/tutorials/fix-protocol-mismatch-47-48">47/48 protocol</a> question, not a reason to lock reunion.cfg to one provider. Keep the provider set broad enough to admit the clients your community actually runs.</p>
32 +
33 +<h2>6. Admin identity on a non-Steam server</h2>
34 +<p>A generated id is only as trustworthy as the thing it is derived from. If two non-Steam players pick the same name and your generation mode leans on the name, they can collide onto one id &mdash; and if that id is an admin, admin gets shared or stolen. For admins on a non-Steam-friendly server, back the SteamID check with name+password auth in <code>users.ini</code> and the "requires password" flag, so an impostor with the same name but no password gets nothing. Never rely on the generated id alone for privileged accounts.</p>
35 +
36 +<h2>Common errors</h2>
37 +<ul>
38 +<li><strong>Reunion missing / <code>bad load</code> in <code>meta list</code></strong> &mdash; the salt is unset or under 16 characters. Fix <code>SteamIdHashSalt</code> and restart.</li>
39 +<li><strong>Everyone's admin and stats reset</strong> &mdash; the salt was changed. Restore the original value; the ids depend entirely on it.</li>
40 +<li><strong>Admins lose flags after a map change</strong> &mdash; Reunion loads after AMXX. Move it to the top of <code>plugins.ini</code>.</li>
41 +<li><strong>A whole client type cannot connect</strong> &mdash; its provider is not enabled in the <code>cid_</code> list, or you are on stock HLDS where Reunion does not belong &mdash; use <a href="/tutorials/configure-dproto-cfg">dproto</a> there.</li>
42 +<li><strong>Non-Steam ids look like <code>VALVE_ID_LAN</code></strong> &mdash; Reunion did not take effect; confirm it is <code>RUN</code> and above AMXX.</li>
43 +</ul>
44 +
45 +<h2>Verification</h2>
46 +<p>Start the server and run <code>meta list</code>: Reunion must read <code>RUN</code>, above AMXX. Connect once with a Steam client and once with a non-Steam client and check <code>status</code> &mdash; both should show a <code>STEAM_</code> id, and the non-Steam player should keep the same id after reconnecting and after a map change. When all of that holds, both audiences share one honest identity system, which is the entire purpose of reunion.cfg.</p>
+9 -0 fix-missing-black-textures/en.md A
@@ -0,0 +1,9 @@
1 +---
2 +title: "Fix: Missing or Black Textures In Game"
3 +excerpt: "Why a map shows black, purple-checkered, or missing textures in game, and how WAD embedding, client-side WADs, and correct texture names put them back."
4 +category: "mapping"
5 +tags: "textures, compiling"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>The map compiles, loads, and plays &mdash; but walls are solid black, or you see the purple/black checkerboard, or a texture is simply flat and wrong. Nothing crashes. This is almost always a <strong>WAD problem</strong>: the texture data that lives in <code>.wad</code> files did not reach the renderer, either because it was not embedded in the BSP and not present on the client, or because a texture name does not match. Here is how GoldSrc finds textures and how to make sure yours are found.</p><h2>1. Understand where textures come from</h2><p>A compiled <code>.bsp</code> references textures by name. At load time the engine resolves each name from one of two sources: textures <strong>embedded inside the BSP</strong> (via <code>-wadinclude</code> during <code>hlcsg</code>), or textures found in <code>.wad</code> files present on the machine loading the map. If a texture is neither embedded nor available in a client-side WAD, it renders black or as the missing-texture pattern. See <a href="/tutorials/wadinclude-vs-external-wads">wadinclude vs external WADs</a> for the trade-off.</p><h2>2. Decide: embed or ship the WAD</h2><p>Two clean approaches, do not half-do either:</p><ul><li><strong>Embed the custom textures</strong> so the BSP is self-contained. Add <code>-wadinclude</code> for each custom WAD in <code>hlcsg</code>:</li></ul><pre>hlcsg -wadinclude mytextures mymap</pre><p>The match is by WAD filename (without extension). Embedded textures ship inside the BSP, so players need nothing extra &mdash; ideal for a handful of custom textures. Do <em>not</em> embed the big stock WADs (<code>halflife.wad</code>, <code>cstrike.wad</code>) &mdash; every client already has those, and embedding them bloats the BSP.</p><ul><li><strong>Ship the WAD to clients</strong> via FastDL alongside the map, and leave the texture external. Then the client loads it at connect. This is covered in <a href="/tutorials/fix-missing-wad-server-side">the server-side missing WAD guide</a>.</li></ul><h2>3. Fix the black-on-server case</h2><p>If the map looks fine when you test it locally (because you have the WAD) but is black for players, the WAD is on your editor machine but neither embedded nor delivered. Either recompile with <code>-wadinclude</code> for the custom WAD, or put the WAD on your FastDL host and reference it. Stock textures being black points instead at a corrupt or wrong-path stock WAD; see <a href="/tutorials/cs16-cannot-find-wad">cannot find WAD</a>.</p><h2>4. Check for texture name mismatches</h2><p>GoldSrc matches textures by name, and names are limited to 15 characters and are case-insensitive. If you renamed a texture in the WAD after building the map, or two WADs contain a different texture under the same name, the engine grabs the wrong one or none. Rebuild your custom WAD with unique, stable names and recompile. Special tool textures &mdash; <code>SKY</code>, <code>AAATRIGGER</code>, <code>NULL</code>, <code>CLIP</code>, <code>ORIGIN</code> &mdash; are handled by the compiler and should never render in game; if you see <code>AAATRIGGER</code> on a wall, you textured a visible face with a tool texture by mistake.</p><h2>5. Rebuild custom WADs cleanly</h2><p>A truncated or half-written WAD produces black textures for exactly the textures it lost. If you author WADs in a tool like Wally, re-export the WAD, confirm every custom texture is present and named correctly, and place it where the compiler's <code>wad</code> paths point. See <a href="/tutorials/create-custom-wad-textures">creating custom WAD textures</a>.</p><p>One more detail that catches people: GoldSrc textures with dimensions that are not multiples of 16 can render as garbage or black on some hardware, and transparent (<code>{</code>-prefixed) textures need the render mode set on the brush or they show their blue key colour. If a single custom texture is black while its neighbours in the same WAD are fine, check its dimensions and its transparency flag before blaming delivery.</p><h2>Common errors</h2><ul><li><strong>Purple/black checkerboard on custom textures</strong> &mdash; the custom WAD is neither embedded nor delivered to the client. Use <code>-wadinclude</code> or ship the WAD via FastDL.</li><li><strong>Everything black including stock textures</strong> &mdash; a WAD path is broken or the stock WAD is missing; fix the <code>wad</code> paths, not the map. See <a href="/tutorials/cs16-cannot-find-wad">cannot find WAD</a>.</li><li><strong>One texture wrong, rest fine</strong> &mdash; a name collision between two WADs, or a renamed texture. Give it a unique name and recompile.</li><li><strong><code>AAATRIGGER</code> or <code>SKY</code> visible on a wall</strong> &mdash; you textured a real face with a tool texture. Re-apply the intended texture to that face.</li><li><strong>Looks fine locally, black for players</strong> &mdash; you have the WAD, they do not. Embed it or deliver it.</li></ul><h2>Verification</h2><p>The decisive test is a clean machine. Copy only the <code>.bsp</code> (and the FastDL content, if you go the external route) to a client that does <strong>not</strong> have your custom WAD in its <code>cstrike/</code>, and load the map. If the textures render, embedding or delivery is correct. If they are black on that clean client but fine on yours, the WAD is still only local &mdash; recompile with <code>-wadinclude</code> or put it on the mirror. For the full packaging flow, see <a href="/tutorials/package-map-for-fastdl">packaging a map for FastDL</a>.</p>
+53 -0 install-cs16-server-oracle-cloud-free/en.md A
@@ -0,0 +1,53 @@
1 +---
2 +title: "Free CS 1.6 Server on the Oracle Cloud Always Free Tier"
3 +excerpt: "Run a genuinely free CS 1.6 server on Oracle's Always Free tier by choosing the x86 AMD micro shape and working around Oracle's restrictive default firewall."
4 +category: "installation"
5 +tags: "oracle-cloud, free"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Oracle Cloud's Always Free tier is the only mainstream cloud that gives you a permanently free VM capable of hosting a CS 1.6 server. But two Oracle-specific traps sink most first attempts: the tempting ARM shape that cannot run HLDS natively, and a default firewall that blocks your game port in two separate places. Handle both and you get a solid free server.</p>
10 +<h2>1. Pick the x86 AMD shape, not Ampere</h2>
11 +<p>The Always Free tier offers two instance types:</p>
12 +<ul>
13 +<li><strong>VM.Standard.E2.1.Micro</strong> &mdash; AMD <strong>x86-64</strong>, up to two instances free. HLDS runs natively here. This is what you want.</li>
14 +<li><strong>VM.Standard.A1.Flex</strong> &mdash; Ampere <strong>ARM</strong>, a generous 4 OCPU / 24 GB free. But HLDS is 32-bit x86, so it will not run without <code>box86</code>/<code>box64</code> emulation, which is slow, occasionally crashes, and is not worth it for a shooter.</li>
15 +</ul>
16 +<p>The E2.1.Micro is small (1 OCPU, 1 GB RAM), but CS 1.6 is a 25-year-old game and runs comfortably on it for a moderate slot count. Be honest with yourself about the architecture limit: the ARM box is bigger, but bigger and wrong loses to smaller and native.</p>
17 +<h2>2. Create the instance</h2>
18 +<p>In the Oracle Cloud console, <strong>Compute &rarr; Instances &rarr; Create</strong>. Change the image to <strong>Ubuntu 22.04 or 24.04</strong>, change the shape to <strong>VM.Standard.E2.1.Micro</strong>, and add your SSH public key. Save the private key and connect:</p>
19 +<pre>ssh ubuntu@YOUR_PUBLIC_IP</pre>
20 +<h2>3. Open the port in the Security List</h2>
21 +<p>Oracle's virtual firewall lives in the VCN. Go to <strong>Networking &rarr; Virtual Cloud Networks &rarr; your VCN &rarr; Security Lists &rarr; Default</strong>, and add an <strong>ingress</strong> rule:</p>
22 +<pre>Source CIDR: 0.0.0.0/0
23 +IP Protocol: UDP
24 +Destination Port Range: 27015</pre>
25 +<p>CS 1.6 game and query traffic is UDP; a TCP rule here is the number-one reason the server never appears. More on ports in <a href="/tutorials/cs16-server-firewall-ports">firewall ports</a>.</p>
26 +<h2>4. Open the port again in the OS firewall</h2>
27 +<p>Here is the Oracle-specific gotcha: their Ubuntu images ship with restrictive <code>iptables</code> rules baked in, so even after the Security List allows UDP 27015, the OS still drops it. Add the OS rule and persist it:</p>
28 +<pre>sudo iptables -I INPUT 6 -p udp --dport 27015 -j ACCEPT
29 +sudo netfilter-persistent save</pre>
30 +<p>Insert it above the default REJECT rule (position 6 in Oracle's stock chain is typical, but run <code>sudo iptables -L INPUT --line-numbers</code> and place it before the reject). Miss this and the server is reachable from nowhere despite a perfect Security List.</p>
31 +<h2>5. Install dependencies and HLDS</h2>
32 +<p>Add the i386 architecture and 32-bit libraries, then install SteamCMD:</p>
33 +<pre>sudo dpkg --add-architecture i386
34 +sudo apt update
35 +sudo apt install -y lib32gcc-s1 lib32stdc++6 curl</pre>
36 +<p>The i386 libraries are mandatory &mdash; see <a href="/tutorials/install-32bit-libraries-cs16-linux">32-bit libraries for CS 1.6</a>. Then create an unprivileged user and install the server exactly as in <a href="/tutorials/install-cs16-dedicated-server-linux-steamcmd">the SteamCMD guide</a>; never run it as <code>root</code> (see <a href="/tutorials/install-hlds-without-root">HLDS without root</a>).</p>
37 +<h2>6. Launch</h2>
38 +<pre>cd ~/hlds
39 +./hlds_run -game cstrike +map de_dust2 +maxplayers 16 -port 27015</pre>
40 +<p>Keep the slot count modest on a 1 GB micro instance. Wrap it in a <a href="/tutorials/hlds-systemd-service">systemd service</a> once it runs.</p>
41 +<h2>7. Keep the free instance from being reclaimed</h2>
42 +<p>Oracle's Always Free terms allow them to reclaim <em>idle</em> Always Free compute instances &mdash; historically this applied to the ARM Ampere shapes more than the AMD micro, but it is worth knowing. An instance that is genuinely running a game server with players is not idle by any reasonable measure, so an active CS 1.6 box is safe. The risk is a server you set up and never populate: with no traffic and near-zero CPU, it can be flagged as idle and stopped. If you are provisioning ahead of launch, keep some baseline activity on it, and monitor the instance state in the console so a reclaimed VM does not silently take your server offline. Attaching a paid-tier payment method (without upgrading) also removes the idle-reclamation risk on some accounts.</p>
43 +<h2>8. Watch the memory ceiling</h2>
44 +<p>The E2.1.Micro has only 1 GB of RAM, and a fully-loaded CS 1.6 server with AMX Mod X, several plugins, and custom content can press against that. Add a small swap file as a safety valve so a memory spike does not OOM-kill the server process, and keep <code>maxplayers</code> realistic &mdash; 16 to 20 slots is a comfortable ceiling on this shape. If you consistently need more, that is the signal to move to a paid VPS rather than fighting the free tier's limits.</p>
45 +<h2>Troubleshooting</h2>
46 +<ul>
47 +<li><strong>Server unreachable despite the Security List</strong> &mdash; the OS <code>iptables</code> rule is missing. This is the Oracle trap; complete step 4.</li>
48 +<li><strong>Chose A1.Flex and HLDS will not start</strong> &mdash; that shape is ARM. Recreate on E2.1.Micro; do not pursue box86 for a game server.</li>
49 +<li><strong>Instance creation fails with "out of capacity"</strong> &mdash; the free E2.1.Micro is popular in some regions. Retry, or pick a different home region at signup.</li>
50 +<li><strong><code>No such file or directory</code> launching hlds_run</strong> &mdash; the 32-bit loader is absent; see <a href="/tutorials/fix-hlds-no-such-file-32bit">the fix</a>.</li>
51 +</ul>
52 +<h2>Verification</h2>
53 +<p>From your PC, run <code>connect YOUR_PUBLIC_IP:27015</code> in the CS console. If you join, both firewall layers are open. Then confirm it appears in the internet server list with <code>sv_lan 0</code> set. If a direct connect works but the listing does not, the master-list path is fine but you may be behind a query issue &mdash; recheck the UDP rule on both the Security List and <code>iptables</code>, since either one silently blocking is the usual cause on Oracle.</p>
+51 -0 install-linuxgsm-cs16/en.md A
@@ -0,0 +1,51 @@
1 +---
2 +title: "How to Install a CS 1.6 Server with LinuxGSM"
3 +excerpt: "Install and manage a CS 1.6 server with LinuxGSM's csserver script, which wraps SteamCMD, tmux, and a self-healing monitor."
4 +category: "installation"
5 +tags: "linuxgsm, linux"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>LinuxGSM is a bash management script that wraps the whole lifecycle of a game server &mdash; install, start, stop, update, backup and monitor &mdash; behind one command. For CS 1.6 it drives SteamCMD to download app 90 and then manages the <code>hlds</code> process for you. The CS 1.6 server code in LinuxGSM is <strong><code>csserver</code></strong>. This guide installs it from scratch on a Debian/Ubuntu box.</p>
10 +<h2>1. Create a dedicated user</h2>
11 +<p>LinuxGSM refuses to run as root and it is right to &mdash; a game server should never run with root privileges. Create a service user first:</p>
12 +<pre>sudo adduser csserver
13 +sudo su - csserver</pre>
14 +<p>Everything below runs as this unprivileged user, in its home directory.</p>
15 +<h2>2. Install dependencies</h2>
16 +<p>CS 1.6 is a 32-bit engine, so you need i386 libraries plus the tools LinuxGSM uses (<code>tmux</code>, <code>curl</code>). On a 64-bit Debian/Ubuntu host, enable i386 and install:</p>
17 +<pre>sudo dpkg --add-architecture i386
18 +sudo apt update
19 +sudo apt install -y curl wget tmux lib32gcc-s1 lib32stdc++6</pre>
20 +<p>LinuxGSM's own dependency checker will tell you exactly what is missing later, but these cover a standard CS 1.6 server. The 32-bit libs are the ones people forget, and their absence produces a silent failure to start.</p>
21 +<h2>3. Download LinuxGSM and create the instance</h2>
22 +<p>Fetch the bootstrap script and hand it the CS 1.6 server code. This does not download the game yet &mdash; it creates a tailored <code>csserver</code> management script:</p>
23 +<pre>wget -O linuxgsm.sh https://linuxgsm.sh
24 +chmod +x linuxgsm.sh
25 +./linuxgsm.sh csserver</pre>
26 +<p>You now have a <code>csserver</code> script in the home directory. Every operation from here is <code>./csserver &lt;command&gt;</code>.</p>
27 +<h2>4. Install the server</h2>
28 +<p>Run the install command. LinuxGSM checks dependencies, then invokes SteamCMD to pull down app 90:</p>
29 +<pre>./csserver install</pre>
30 +<p>This is the step that runs <code>app_update 90</code> under the hood &mdash; the same download covered manually in the <a href="/tutorials/install-steamcmd-linux">SteamCMD guide</a>. It downloads the full CS 1.6 server files into <code>serverfiles/</code>. If the <code>cstrike</code> folder comes down incomplete (a known Steam quirk on app 90), run <code>./csserver install</code> again &mdash; it resumes rather than restarts.</p>
31 +<h2>5. Configure the server</h2>
32 +<p>LinuxGSM keeps its settings separate from the game's own configs. The management config &mdash; ports, start parameters &mdash; lives here:</p>
33 +<pre>lgsm/config-lgsm/csserver/csserver.cfg</pre>
34 +<p>Copy the settings you want to override out of <code>_default.cfg</code> (never edit <code>_default.cfg</code> directly) into <code>csserver.cfg</code>. The in-game settings &mdash; hostname, rcon, cvars &mdash; still live in the normal <a href="/tutorials/setup-server-cfg-cs16">server.cfg</a> under <code>serverfiles/cstrike/</code>. LinuxGSM's <code>startparameters</code> line is where you set the map, maxplayers and port, mirroring the <a href="/tutorials/hlds-command-line-parameters">HLDS command-line parameters</a>.</p>
35 +<h2>6. Start and monitor</h2>
36 +<pre>./csserver start
37 +./csserver details
38 +./csserver monitor</pre>
39 +<p><code>start</code> launches HLDS inside a <code>tmux</code> session; <code>details</code> prints the ports, IP and query status; <code>monitor</code> checks the server is alive and responding to A2S queries, restarting it if not. Add <code>./csserver monitor</code> to cron every few minutes and LinuxGSM becomes a self-healing watchdog. To reach the live console, <code>./csserver console</code> attaches to the tmux session &mdash; detach with the tmux prefix, not Ctrl-C, or you kill the server.</p>
40 +<h2>7. Update and back up</h2>
41 +<p>LinuxGSM wraps the maintenance jobs too. <code>./csserver update</code> re-runs SteamCMD to pull any CS 1.6 update, <code>./csserver backup</code> archives the server files, and <code>./csserver restart</code> cycles the process cleanly. Put <code>update</code> and <code>backup</code> on their own cron schedules so the server stays current and recoverable without you logging in. Everything LinuxGSM does is still plain SteamCMD and <code>hlds</code> underneath &mdash; the script just gives each step a memorable command and a log under <code>log/</code>.</p>
42 +<h2>Troubleshooting</h2>
43 +<ul>
44 +<li><strong>"[ FAIL ] Checking dependencies"</strong> &mdash; a required library is missing. Let the installer list them, then <code>apt install</code> the named packages. The 32-bit libs are the usual culprit.</li>
45 +<li><strong>Server installs but will not start</strong> &mdash; almost always missing <code>lib32gcc-s1</code> or <code>lib32stdc++6</code>. Check <code>log/console/csserver-console.log</code> for a loader error.</li>
46 +<li><strong>"Counter Strike is not installed"</strong> &mdash; the SteamCMD download did not finish; the <code>cstrike</code> folder is incomplete. Re-run <code>./csserver install</code>.</li>
47 +<li><strong>Refuses to run as root</strong> &mdash; by design. Switch to the unprivileged <code>csserver</code> user.</li>
48 +<li><strong>Console detach kills the server</strong> &mdash; you pressed Ctrl-C inside the tmux console. Detach with the tmux prefix key sequence instead.</li>
49 +</ul>
50 +<h2>Verification</h2>
51 +<p>Run <code>./csserver details</code> and confirm it reports the server running with a query port responding. From another machine, add the server's IP and port in the CS browser (favourites, add by address) and confirm it appears with the right map and player count. Then run <code>./csserver monitor</code> and confirm it reports the server healthy. Once monitor passes, wire it into cron so LinuxGSM restarts the server automatically if it ever dies.</p>
+12 -0 steamcmd-download-appid-90/en.md A
@@ -0,0 +1,12 @@
1 +---
2 +title: "Downloading App 90 with SteamCMD: The Correct Commands"
3 +excerpt: "The exact SteamCMD sequence to download the CS 1.6 dedicated server as app 90, why anonymous login works, what app_update 90 validate does, and the pitfalls of the shared HLDS package."
4 +category: "installation"
5 +tags: "steamcmd, appid-90"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>App <strong>90</strong> is the Half-Life Dedicated Server package on Steam, and it is what you download to run a CS 1.6 server. It is a shared package that contains base Half-Life plus the mods (Counter-Strike, Day of Defeat, and others), which is exactly why people get it slightly wrong &mdash; the download can stall or need a specific ordering. This gives the exact commands and explains the quirks.</p><h2>1. Install SteamCMD first</h2><p>SteamCMD is the command-line downloader; it is not the game. Install it as in <a href="/tutorials/install-steamcmd-linux">installing SteamCMD on Linux</a>, then launch it:</p><pre>./steamcmd.sh</pre><p>You should land at the <code>Steam&gt;</code> prompt. Everything below is typed at that prompt.</p><h2>2. Log in anonymously</h2><p>The dedicated server for app 90 is available to anonymous accounts &mdash; you do not need your personal Steam credentials, and you should not use them for a server:</p><pre>login anonymous</pre><p>It should print <code>Waiting for user info...OK</code>. If it asks for a password, you typed a username; use the literal word <code>anonymous</code>.</p><h2>3. Set the install directory before downloading</h2><p>Choose where the files go <em>before</em> the update command, or they land in SteamCMD's default folder:</p><pre>force_install_dir /home/hlds/cstrike-server</pre><p>Use an absolute path you own. Order matters: <code>force_install_dir</code> must come before <code>app_update</code> in the same session, or the download ignores it.</p><h2>4. Download with app_update 90 validate</h2><p>This is the command that actually pulls the server:</p><pre>app_update 90 validate</pre><p>The <code>validate</code> keyword makes SteamCMD checksum every file after download and re-fetch anything corrupt or missing. Always include it on a first install and after any interrupted download. Expect a large download; app 90 brings the full Half-Life base plus the CS content.</p><h2>5. Handle the multi-mod prompt</h2><p>Because app 90 is the shared HLDS package, older SteamCMD builds sometimes stop partway and ask you to pick a game variant, or appear to hang at a percentage. If the download stalls, quit and re-run the exact same sequence &mdash; <code>validate</code> resumes from where it left off rather than restarting. Running the update two or three times to completion is normal for this package and is not a sign of a broken install.</p><h2>6. A full non-interactive one-liner</h2><p>Once you know it works, script the whole thing so it runs unattended. Everything after <code>+</code> is executed in order and <code>+quit</code> exits cleanly:</p><pre>./steamcmd.sh +force_install_dir /home/hlds/cstrike-server \
10 + +login anonymous \
11 + +app_update 90 validate \
12 + +quit</pre><p>This is the form to put in an update script or a CI job. Re-running it later pulls any server update Valve has published and re-validates the tree.</p><h2>7. Confirm you got the CS content</h2><p>After it finishes, the install directory should contain a <code>cstrike/</code> folder alongside <code>valve/</code> and the <code>hlds_run</code> launcher. If <code>cstrike/</code> is missing, the download did not complete &mdash; re-run <code>app_update 90 validate</code>. You can now start the server as covered in <a href="/tutorials/install-cs16-dedicated-server-linux-steamcmd">the full install guide</a> and pass flags per <a href="/tutorials/hlds-command-line-parameters">the command-line parameters reference</a>.</p><h2>Common errors</h2><ul><li><strong>"Invalid Password" on login anonymous</strong> &mdash; you entered a real username. The account name is literally <code>anonymous</code> with no password.</li><li><strong>Download stalls at a fixed percentage</strong> &mdash; a known quirk of the app 90 shared package. Quit and re-run the same command; <code>validate</code> resumes.</li><li><strong>Files land in the wrong folder</strong> &mdash; <code>force_install_dir</code> came after <code>app_update</code>, or was omitted. Set it first, in the same session.</li><li><strong>"ERROR! Failed to install app '90' (No subscription)"</strong> &mdash; usually a transient Steam issue or a login that did not complete; re-run <code>login anonymous</code> then the update. It does not require a purchase.</li><li><strong>No cstrike/ directory after it "finished"</strong> &mdash; the download was incomplete. Run <code>app_update 90 validate</code> again to completion.</li><li><strong>Permission denied writing files</strong> &mdash; the install path is not owned by the user running SteamCMD. Point <code>force_install_dir</code> at a directory you own.</li></ul><h2>Verification</h2><p>Re-run <code>app_update 90 validate</code> one more time; on a complete install it verifies quickly and reports the app as fully installed with nothing to download. Confirm <code>cstrike/</code> exists in your install directory and contains maps and configs, that <code>hlds_run</code> sits at the install root, and that a <code>valve/</code> folder is present alongside <code>cstrike/</code> &mdash; the shared package always brings the base game too. Then launch the server once to prove the binaries actually run and reach the map. A verification that stops at "the download finished" misses the common case where the tree is present but incomplete, which only surfaces when the engine tries to load a missing library at startup. When you later need to <a href="/tutorials/update-cs16-server-latest-build">update to the latest build</a>, you run this same command again against the same install directory.</p>
0 13