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

Add 6 tutorials (6 files)

Browse Source
Daemon666 committed parent 4b97e6dc76 commit d8da18a5a12b56e5260f0b075a84c45b8dd43eae
6 changed files with 363 additions and 0 deletions
+48 -0 amx-who-and-status/en.md A
@@ -0,0 +1,48 @@
1 +---
2 +title: "amx_who, status and Finding a Player's SteamID"
3 +excerpt: "How amx_who and the engine status command list connected players, where each shows the SteamID and userid, and how to use them to target moderation actions."
4 +category: "administration"
5 +tags: "admin, steamid"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Before you can ban, kick or add an admin, you need to identify the player precisely — their SteamID for a permanent entry, their userid for an unambiguous moderation target. Two commands give you this: the AMX Mod X <code>amx_who</code> and the engine's own <code>status</code>. They overlap but each shows something the other does not, and knowing which to reach for saves time.</p>
10 +
11 +<h2>1. amx_who: the admin roster</h2>
12 +<p><code>amx_who</code> is an AMXX command that lists every connected player alongside their <em>admin</em> information — authid (SteamID), current access flags, and whether they have immunity:</p>
13 +<pre>amx_who</pre>
14 +<p>The output gives you each player's name, their SteamID, the access flags AMXX has resolved for them, and their immunity status. This is the command to run when you are checking <em>"does this person actually have admin, and what can they do?"</em> — it reflects what AMXX granted after reading <a href="/tutorials/users-ini-explained">users.ini</a>, which is not always what you intended. It typically requires the admin (<code>ADMIN_ADMIN</code>) access flag to run.</p>
15 +
16 +<h2>2. status: the engine's view</h2>
17 +<p><code>status</code> is a built-in engine command (run it from the server console or RCON) and it shows connection details AMXX does not:</p>
18 +<pre>status</pre>
19 +<p>For each player it prints the <strong>userid</strong>, name, <strong>uniqueid</strong> (the SteamID or the non-Steam authid), the IP address and port, and the current ping and packet loss. The header also shows the map, the server's own IP:port and the protocol version. This is the command for <em>"what is this player's userid and IP, and how is their connection?"</em></p>
20 +
21 +<h2>3. Reading the SteamID</h2>
22 +<p>The uniqueid column is what you copy into a ban or an admin entry. On a Steam client it looks like <code>STEAM_0:1:12345</code>, where the middle digit and the final number together identify the account. On a non-Steam server it depends on your setup: with <a href="/tutorials/install-reunion">Reunion</a> or dproto you may see a real-looking SteamID, a <code>VALVE_</code> id, or a generated one, and duplicate or <code>STEAM_ID_LAN</code> values are a known non-Steam headache — see <a href="/tutorials/fix-duplicate-steamids-nonsteam">duplicate SteamIDs</a>. Always copy the id verbatim; a single wrong digit means your ban or admin entry silently never matches, and you will spend an afternoon wondering why a banned player keeps rejoining. For a deeper walkthrough of every method, including reading the id from logs, see <a href="/tutorials/find-player-steamid">finding a player's SteamID</a>.</p>
23 +
24 +<h2>4. From identity to action</h2>
25 +<p>Put the two together in the normal moderation flow:</p>
26 +<ol>
27 +<li>Run <code>status</code> (or <code>amx_who</code>) to get the offender's <strong>userid</strong>.</li>
28 +<li>Act on it unambiguously with the hash form: <code>amx_slay #14</code>, <code>amx_kick #14</code>, <code>amx_ban #14 30 "reason"</code>.</li>
29 +<li>Copy their <strong>uniqueid</strong> for a permanent <a href="/tutorials/add-admin-by-steamid">SteamID admin entry</a> or a lasting ban.</li>
30 +</ol>
31 +<p>Using <code>#userid</code> rather than a name fragment is the habit that stops you from slaying the wrong player when two names look alike — the point hammered home in the <a href="/tutorials/amx-slap-slay-kick">slap/slay/kick guide</a>.</p>
32 +
33 +<h2>5. Do it remotely over RCON</h2>
34 +<p>You do not need to be in the game to run these. Over an <a href="/tutorials/rcon-setup-secure">RCON</a> connection, both commands work from your client console with the <code>rcon</code> prefix:</p>
35 +<pre>rcon status
36 +rcon amx_who</pre>
37 +<p>This is how you identify and act on a troublemaker from spectator or even from a second machine, without ever joining the server yourself. It is also the only way to read the player list when the server is full and will not let you connect to sort out who is causing the problem. For the full set of remote commands, see the <a href="/tutorials/rcon-commands-list">RCON commands list</a>.</p>
38 +
39 +<h2>Common errors</h2>
40 +<ul>
41 +<li><strong><code>amx_who</code> shows no access flags for an admin</strong> — AMXX did not match them to a <code>users.ini</code> entry (wrong SteamID, name mismatch, or an auth-method problem). See <a href="/tutorials/fix-admin-not-recognized">admin not recognised</a>.</li>
42 +<li><strong><code>status</code> shows <code>STEAM_ID_LAN</code> or duplicate ids</strong> — a non-Steam validation issue; the client is not presenting a unique id. See <a href="/tutorials/fix-duplicate-steamids-nonsteam">duplicate SteamIDs</a>.</li>
43 +<li><strong><code>amx_who</code> returns access denied</strong> — you lack the admin flag it requires. Run it from the server console/RCON instead, which always has full access.</li>
44 +<li><strong>Ban or admin entry never matches</strong> — you mistyped the uniqueid. Copy it exactly from <code>status</code>, digit for digit.</li>
45 +</ul>
46 +
47 +<h2>Verification</h2>
48 +<p>Run <code>status</code> and confirm you can read a userid and a uniqueid for every connected player. Cross-check one player against <code>amx_who</code> — the SteamID should match. Then target that player harmlessly with their userid, for example <code>amx_slap #&lt;id&gt; 0</code>, and confirm the correct person is slapped. Once you trust the identity you read, you can safely commit it to a permanent <a href="/tutorials/add-admin-by-steamid">SteamID admin</a> or ban entry.</p>
+21 -0 cs16-autoexec-cfg/en.md A
@@ -0,0 +1,21 @@
1 +---
2 +title: "Making an autoexec.cfg That Actually Loads"
3 +excerpt: "Where autoexec.cfg goes, why config.cfg keeps overwriting your settings, how to make an autoexec that wins, and the file-extension and quoting traps that stop it loading at all."
4 +category: "client"
5 +tags: "autoexec, config"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>An <code>autoexec.cfg</code> is how you keep your rates, crosshair, binds and net settings in one file the game runs at startup &mdash; instead of retyping them or losing them when the game rewrites <code>config.cfg</code>. The trouble is that a naive autoexec often appears to do nothing: the settings load, then <code>config.cfg</code> loads on top and clobbers them, or the file has a hidden <code>.txt</code> extension and never runs. This is how to make one that actually sticks.</p><h2>1. Put it in the right folder</h2><p>The file goes directly in your game's <code>cstrike/</code> directory, next to <code>config.cfg</code>:</p><pre>Steam/steamapps/common/Half-Life/cstrike/autoexec.cfg</pre><p>Not in a subfolder, not in the Half-Life root &mdash; in <code>cstrike/</code>. The engine looks for it there at startup and executes it as console commands.</p><h2>2. Write plain console commands</h2><p>Each line is exactly what you would type in the console. Quote multi-word values:</p><pre>// autoexec.cfg
10 +rate 25000
11 +cl_updaterate 101
12 +cl_cmdrate 101
13 +cl_interp 0.01
14 +fps_max 100
15 +hud_fastswitch 1
16 +bind "mouse4" "+voicerecord"
17 +crosshair 1
18 +// a marker so you can prove it ran:
19 +developer 0
20 +echo "autoexec.cfg loaded"</pre><p>The <code>echo</code> line is a deliberate trick: if you see <code>autoexec.cfg loaded</code> in the console at startup, the file ran. If you never see it, the file is not being found &mdash; skip to the extension trap below.</p><h2>3. Defeat the config.cfg overwrite</h2><p>Here is the core conflict: the game writes your current settings to <code>config.cfg</code> when you quit, and executes it at startup. If <code>config.cfg</code> loads <em>after</em> your autoexec, it overwrites anything you set. Two reliable fixes:</p><ul><li><strong>Set the value in-game once, then let config.cfg keep it.</strong> For settings the menu supports (crosshair, most video/audio), just set them in Options; they persist in <code>config.cfg</code> and you do not need autoexec for them at all.</li><li><strong>Make config.cfg read-only.</strong> After you have your settings the way you like, set <code>config.cfg</code> to read-only in file properties. The game can no longer overwrite it on quit, so it stops fighting your autoexec. The trade-off: changes you make in the menu no longer save, so do this only once your setup is final.</li></ul><p>For rates and binds &mdash; the things the menu does not fully cover &mdash; autoexec plus a read-only config is the combination that holds.</p><h2>4. Force it with a launch option</h2><p>To remove all doubt about load order, execute the autoexec explicitly and last via a launch option. Right-click CS in Steam &rarr; Properties &rarr; Set Launch Options:</p><pre>+exec autoexec.cfg</pre><p>This runs the file at startup regardless of the internal order, and because it is processed as a startup command it lands after the normal config load on most builds. Combined with the read-only trick, your settings win.</p><h2>5. The file-extension and encoding traps</h2><p>The single most common reason an autoexec "does not load" is that it is not actually named <code>autoexec.cfg</code>. Windows hides known extensions by default, so a file you saved as <code>autoexec.cfg</code> in Notepad is really <code>autoexec.cfg.txt</code> &mdash; the engine never sees it. Turn on "File name extensions" in Explorer's View menu and confirm the name is exactly <code>autoexec.cfg</code> with no trailing <code>.txt</code>. Save it as plain ANSI/UTF-8 text without a byte-order mark; a stray BOM or curly "smart quotes" from a word processor break the first line. This is the same trap that silently breaks <a href="/tutorials/motd-txt-html-guide">motd.txt</a> on the server side.</p><h2>Common errors</h2><ul><li><strong>No <code>echo</code> message at startup</strong> &mdash; the file is misnamed (<code>autoexec.cfg.txt</code>) or in the wrong folder. Fix the extension and location.</li><li><strong>Settings load then reset</strong> &mdash; <code>config.cfg</code> overwrote them. Make <code>config.cfg</code> read-only or add <code>+exec autoexec.cfg</code> to launch options.</li><li><strong>One bind ignored</strong> &mdash; unquoted multi-word command, or a key name typo. Quote the command and check the key name against <a href="/tutorials/cs16-binds-and-aliases">the binds guide</a>.</li><li><strong>First line errors</strong> &mdash; the file has a UTF-8 BOM or smart quotes. Re-save as plain text with straight quotes.</li><li><strong>Changes in the menu no longer save</strong> &mdash; you left <code>config.cfg</code> read-only. That is expected; toggle it writable to change menu settings, then set it back.</li></ul><h2>Verification</h2><p>Launch the game, open the console, and look for your <code>echo "autoexec.cfg loaded"</code> line at the top. Then read a value back by typing its name with no argument:</p><pre>cl_updaterate
21 +rate</pre><p>They should show what your autoexec set, not the defaults. Quit and relaunch to confirm they survive a restart &mdash; if a value reverts, <code>config.cfg</code> is still overwriting it and you need the read-only or <code>+exec</code> fix. Once it holds, build your keybinds on top with <a href="/tutorials/cs16-binds-and-aliases">binds and aliases</a>.</p>
+60 -0 cs16-custom-spray/en.md A
@@ -0,0 +1,60 @@
1 +---
2 +title: "Making and Uploading a Custom Spray in CS 1.6 (logo.bmp)"
3 +excerpt: "Build a CS 1.6 spray the game will accept: correct BMP format, power-of-two size, importing through the menu, binding the spray key, and why servers rate-limit it."
4 +category: "client"
5 +tags: "spray, custom-content"
6 +image: ""
7 +read_time: "7 min read"
8 +---
9 +<p>A custom spray is a small decal you paint on walls with a keypress. CS 1.6 is fussy about the image format, and most "my spray shows up black" complaints come from feeding it a file it cannot use. This covers the exact image requirements, how to import it, how to bind the spray, and the server-side limits that stop you spamming it.</p>
10 +
11 +<h2>1. Make the image in the right format</h2>
12 +<p>The importer accepts a <strong>BMP</strong> (or TGA), but it must meet old-engine rules:</p>
13 +<ul>
14 +<li><strong>8-bit, 256-colour indexed</strong> BMP. A 24-bit truecolour BMP imports wrong or black — convert to indexed colour in your editor first.</li>
15 +<li><strong>Power-of-two dimensions.</strong> Width and height each from the set 16, 32, 64, 128, 256. A common good size is <strong>64×64</strong>; the maximum practical is 256×256.</li>
16 +<li>Keep it simple — high-contrast art reads far better than a photo once it is on a wall at distance.</li>
17 +</ul>
18 +<p>If your editor cannot save 8-bit indexed BMP, reduce the colour depth to 256 colours (Indexed mode) before exporting.</p>
19 +
20 +<h2>2. Import it through the game menu</h2>
21 +<p>The reliable path is the in-game importer, which converts your file into the internal decal the engine uses:</p>
22 +<ol>
23 +<li>Launch CS 1.6 and open <strong>Options → Multiplayer</strong>.</li>
24 +<li>Use the <strong>Advanced</strong> / spray-logo import control and browse to your BMP.</li>
25 +<li>Confirm. The game writes the converted decal into <code>cstrike/tempdecal.wad</code> — that generated file <em>is</em> your active spray.</li>
26 +</ol>
27 +<p>You do not hand-place files for a basic spray; let the importer produce <code>tempdecal.wad</code>. If the preview looks wrong at this stage, the source image failed the format rules in step 1 — fix the BMP and re-import.</p>
28 +
29 +<h2>3. Bind the spray key</h2>
30 +<p>Spraying is the <code>impulse 201</code> command. Bind it to a comfortable key in your <a href="/tutorials/cs16-competitive-video-config">autoexec.cfg</a> so it survives restarts:</p>
31 +<pre>bind "t" "impulse 201"</pre>
32 +<p>Aim at a wall and press the key. Sprays go on solid surfaces, not on players or the sky.</p>
33 +
34 +<h2>4. Understand why it will not always appear</h2>
35 +<p>Even a perfect spray is throttled by the server and by decal settings, and this is deliberate:</p>
36 +<ul>
37 +<li><code>decalfrequency</code> — a server cvar setting the minimum seconds between a player's sprays. Spray again too soon and nothing paints. Admins raise this to curb spam; see the <a href="/tutorials/essential-server-cvars">server cvars</a> list.</li>
38 +<li><code>r_decals</code> — your own client cap on how many decals render at once. If it is very low, older decals (including sprays) are culled quickly.</li>
39 +<li>Some servers disable custom sprays entirely, or a plugin filters them. On those, your spray simply will not show for others.</li>
40 +</ul>
41 +
42 +<h2>5. Keep or swap your spray</h2>
43 +<p>Because the active spray lives in <code>tempdecal.wad</code>, keeping several is a matter of saving copies. Back up the generated file under a new name, and to switch sprays, copy the one you want over <code>tempdecal.wad</code> (with the game closed) or just re-import a different image. Note the game can regenerate <code>tempdecal.wad</code> on launch, which is why re-importing is the dependable way to change it.</p>
44 +
45 +<h2>6. Design for distance and low colour</h2>
46 +<p>A spray that looks great as a 256-colour file on your desktop can turn into an unreadable smudge on a wall across the map. Two habits keep it legible: use bold shapes and thick outlines rather than fine detail, and pick a small, high-contrast palette. Because you are limited to 256 indexed colours anyway, a design built from a handful of flat colours converts cleanly, while a gradient-heavy image bands badly during the reduction to indexed mode. Test the finished spray in-game at range before you settle on it — the wall at fifteen metres is the only preview that matters, and a logo that reads clearly there is worth more than one that only looks sharp in the importer.</p>
47 +
48 +<h2>Common errors</h2>
49 +<ul>
50 +<li><strong>Spray shows up as a black or garbled box</strong> — the source BMP was 24-bit truecolour, not 8-bit indexed. Convert to 256-colour indexed and re-import.</li>
51 +<li><strong>Import is rejected or looks stretched</strong> — dimensions are not powers of two. Resize to 64×64 (or another 16/32/64/128/256 pair).</li>
52 +<li><strong>Nothing paints when you press the key</strong> — no bind, or you sprayed again within <code>decalfrequency</code>. Confirm the bind and wait a few seconds between sprays.</li>
53 +<li><strong>Others do not see your spray</strong> — the server disabled custom sprays or a plugin blocks them. Nothing to fix client-side.</li>
54 +<li><strong>Spray reverts after restart</strong> — the game regenerated <code>tempdecal.wad</code>. Re-import the image you want as the active spray.</li>
55 +</ul>
56 +
57 +<h2>Verification</h2>
58 +<p>Host a local server or join any server that allows sprays, face a wall, and press your spray key:</p>
59 +<pre>impulse 201</pre>
60 +<p>Your logo should appear crisp and in the right colours. If it paints correctly offline but not on a particular server, that server is throttling or disabling sprays — not a problem with your file. Read your bind back with <code>bind t</code> to confirm it is set, and if the image itself is wrong, the fault is always the source BMP's format, so return to step 1.</p>
+77 -0 discord-rcon-bot/en.md A
@@ -0,0 +1,77 @@
1 +---
2 +title: "Running RCON Commands from Discord"
3 +excerpt: "Send RCON to your CS 1.6 server from a Discord channel: how GoldSrc RCON's challenge-response works over UDP, a minimal bot pattern, and the access controls that keep it from becoming a backdoor."
4 +category: "administration"
5 +tags: "discord, rcon"
6 +image: ""
7 +read_time: "9 min read"
8 +---
9 +<p>Running RCON from Discord means your admins can kick, change the map, or read <code>status</code> from their phone without opening a game client. It is genuinely useful &mdash; and genuinely dangerous, because you are exposing the most powerful control channel your server has to a chat app. Done carefully it is fine; done carelessly it hands your <code>rcon_password</code> to anyone who compromises the bot. This explains how GoldSrc RCON actually works and how to bridge it safely.</p>
10 +
11 +<h2>1. Understand GoldSrc RCON (it is UDP, not Source RCON)</h2>
12 +<p>CS 1.6 does <strong>not</strong> use the TCP Source RCON protocol that newer Source games use. Its RCON runs over the same UDP game port (default 27015) and is challenge-based. The exchange is:</p>
13 +<ol>
14 +<li>The client sends a challenge request to the server.</li>
15 +<li>The server replies with a numeric challenge token.</li>
16 +<li>The client sends the actual command with the challenge and the password.</li>
17 +</ol>
18 +<p>The raw packets look like this (each prefixed with four <code>0xFF</code> bytes):</p>
19 +<pre>--&gt; \xFF\xFF\xFF\xFF getchallenge rcon\n
20 +&lt;-- \xFF\xFF\xFF\xFF challenge rcon 1234567890\n
21 +--&gt; \xFF\xFF\xFF\xFF rcon 1234567890 "your_rcon_password" status\n
22 +&lt;-- \xFF\xFF\xFF\xFF ...command output...</pre>
23 +<p>The password travels in cleartext inside the UDP payload, so anyone who can sniff the path can read it. That single fact drives every security decision below.</p>
24 +
25 +<h2>2. The bot architecture</h2>
26 +<p>You need a small always-on process that: listens to a Discord channel, authenticates the sender, translates an allowed message into an RCON command, sends it via the challenge-response above, and posts the reply back. Keep the bot on the <em>same host or network</em> as the game server so the cleartext RCON never crosses the public internet.</p>
27 +<pre>Discord channel --&gt; bot (Discord API) --&gt; UDP RCON --&gt; CS 1.6 server
28 + (localhost / LAN)</pre>
29 +
30 +<h2>3. A minimal RCON sender</h2>
31 +<p>The core is a few lines of socket code. This Python function does the two-step challenge and returns the output &mdash; the exact same logic any language uses:</p>
32 +<pre>import socket
33 +
34 +def rcon(host, port, password, command, timeout=3):
35 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
36 + s.settimeout(timeout)
37 + s.connect((host, port))
38 + # 1) ask for a challenge
39 + s.send(b"\xff\xff\xff\xff" + b"getchallenge rcon\n")
40 + reply = s.recv(1400).decode("latin-1", "ignore")
41 + token = reply.split("challenge rcon ")[1].split()[0]
42 + # 2) send the command with challenge + password
43 + packet = b"\xff\xff\xff\xff" + (
44 + 'rcon %s "%s" %s\n' % (token, password, command)
45 + ).encode("latin-1")
46 + s.send(packet)
47 + out = s.recv(4096).decode("latin-1", "ignore")
48 + s.close()
49 + return out.lstrip("\xff").lstrip("l") # strip packet header</pre>
50 +<p>Wire that into whatever Discord library you prefer (discord.py, discord.js) so an allowed message calls <code>rcon(...)</code> and posts the return value. The Discord half is boilerplate; the security half is not.</p>
51 +
52 +<h2>4. Lock it down &mdash; this is the whole point</h2>
53 +<p>An unrestricted Discord-to-RCON bridge is a remote root shell for your server. Apply all of these:</p>
54 +<ul>
55 +<li><strong>One private channel, restricted by Discord role.</strong> The bot only reads a specific admin channel and only from users with a specific role. Ignore everything else.</li>
56 +<li><strong>Whitelist commands.</strong> Do not forward arbitrary text. Allow a fixed set &mdash; <code>status</code>, <code>changelevel</code>, <code>amx_kick</code>, <code>say</code> &mdash; and reject the rest. Never allow <code>rcon_password</code>, <code>exec</code>, or <code>quit</code>.</li>
57 +<li><strong>Keep the password out of the code.</strong> Load <code>rcon_password</code> from an environment variable or a <code>0600</code> file, never hard-coded in the bot source or committed to git.</li>
58 +<li><strong>Colocate the bot.</strong> Run it on the game host or same LAN so RCON stays off the public internet. If it must be remote, tunnel it (SSH/WireGuard) &mdash; do not send cleartext RCON across the internet.</li>
59 +<li><strong>Rate-limit and log.</strong> Log every command with the Discord user who sent it, and throttle, so a compromised account cannot spam <code>changelevel</code>.</li>
60 +</ul>
61 +
62 +<h2>5. Rotate the password if it ever leaks</h2>
63 +<p>Because RCON is cleartext and now also lives in a bot config, treat the password as exposed the moment anything goes wrong &mdash; a leaked config, a kicked admin, a suspicious log entry. Change <code>rcon_password</code> in <a href="/tutorials/setup-server-cfg-cs16">server.cfg</a>, reload, and update the bot. A long random password is assumed; see the RCON notes in the <a href="/tutorials/essential-server-cvars">essential cvars list</a>.</p>
64 +
65 +<h2>Common errors</h2>
66 +<ul>
67 +<li><strong>Bot gets no reply / timeout</strong> &mdash; wrong port, a firewall dropping UDP, or you tried Source-style TCP RCON. GoldSrc RCON is UDP on the game port; open it only to the bot host.</li>
68 +<li><strong><code>Bad rcon_password</code> in the reply</strong> &mdash; the password is wrong, or you did not quote it in the packet. It must be wrapped in double quotes.</li>
69 +<li><strong><code>Bad challenge</code></strong> &mdash; you reused an old challenge token or waited too long; request a fresh challenge for every command.</li>
70 +<li><strong>Output is truncated</strong> &mdash; long replies (a full <code>status</code>) span multiple UDP packets. Read in a loop until the socket times out, then concatenate.</li>
71 +<li><strong>Anyone in the server can run commands</strong> &mdash; you did not restrict the channel/role or whitelist commands. Fix this before you deploy, not after.</li>
72 +</ul>
73 +
74 +<h2>Verification</h2>
75 +<p>Test the sender from a shell on the bot host before touching Discord:</p>
76 +<pre>python3 -c "import bot; print(bot.rcon('127.0.0.1',27015,'PW','status'))"</pre>
77 +<p>A correct setup prints the <code>status</code> block with hostname, map and player list. Then, from Discord, send an allowed command as an authorized user and confirm the reply posts; send a forbidden command and confirm it is rejected and logged. Finally, send from an unauthorized account and confirm the bot ignores it entirely &mdash; that silent rejection is the test that matters most.</p>
+94 -0 public-server-config/en.md A
@@ -0,0 +1,94 @@
1 +---
2 +title: "A Balanced Public Server Config (Fun but Fair)"
3 +excerpt: "A complete, commented server.cfg for a public CS 1.6 server that keeps rounds fast and fun without turning into chaos: timing, economy, team balance and anti-grief."
4 +category: "administration"
5 +tags: "config, public"
6 +image: ""
7 +read_time: "9 min read"
8 +---
9 +<p>A public CS 1.6 server lives or dies on feel. Too strict and it plays like a scrim nobody asked for; too loose and it is a team-killing free-for-all. The sweet spot is a config that keeps rounds moving, gives players enough money to have fun, and quietly stops the behaviors that drive people away. This is a complete, commented starting point you can paste and tune.</p>
10 +
11 +<h2>1. The philosophy</h2>
12 +<p>Every value below leans toward pace and forgiveness over realism: shorter freezetime, a touch more starting money, generous but not silly buy time, and team-balance plus grief punishment turned on so one bad actor cannot wreck a round. It is not a competitive ruleset — for that you would tighten timing and disable the conveniences. This is tuned for a busy public box where players come and go.</p>
13 +
14 +<h2>2. Identity and networking</h2>
15 +<pre>// --- identity ---
16 +hostname "My CS 1.6 Server | Fun Public"
17 +sv_contact "[email protected]"
18 +rcon_password "USE-A-LONG-RANDOM-STRING"
19 +sv_password "" // public
20 +
21 +// --- visibility / net ---
22 +sv_lan 0 // MUST be 0 to show in the master list
23 +sv_region 255 // 255 = world; set your real region
24 +sv_maxrate 25000
25 +sv_minrate 15000
26 +sv_maxupdaterate 101
27 +sv_minupdaterate 30
28 +sv_timeout 60</pre>
29 +<p><code>sv_lan 0</code> and a long <code>rcon_password</code> are the two non-negotiables; the rest of the server-level cvars are explained in the <a href="/tutorials/essential-server-cvars">essential server cvars</a> list.</p>
30 +
31 +<h2>3. Round timing and economy</h2>
32 +<pre>// --- timing (minutes unless noted) ---
33 +mp_freezetime 3 // seconds; short so nobody waits
34 +mp_roundtime 3
35 +mp_buytime 0.5 // 30 seconds
36 +mp_c4timer 35
37 +mp_timelimit 30 // map ends every 30 min, drives the vote
38 +
39 +// --- economy ---
40 +mp_startmoney 800
41 +mp_maxrounds 0
42 +mp_winlimit 0</pre>
43 +<p>Remember <code>mp_buytime</code> and <code>mp_roundtime</code> are in <em>minutes</em> while <code>mp_freezetime</code> and <code>mp_c4timer</code> are in <em>seconds</em> — mixing them up is the classic mistake covered in the <a href="/tutorials/mp-cvars-reference">mp_ cvars reference</a>. A 30-minute <code>mp_timelimit</code> is what feeds the end-of-map vote; set it before you configure <a href="/tutorials/mapchooser-setup">MapChooser</a>.</p>
44 +
45 +<h2>4. Fair play and anti-grief</h2>
46 +<pre>// --- teams / fairness ---
47 +mp_friendlyfire 0 // off for casual public; 1 needs tkpunish
48 +mp_tkpunish 1
49 +mp_autoteambalance 1
50 +mp_limitteams 1 // block stacking beyond 1-player difference
51 +mp_hostagepenalty 5 // kick after 5 hostage kills
52 +mp_forcechasecam 0
53 +mp_fadetoblack 0 // 0 keeps freecam for dead players</pre>
54 +<p>Friendly fire off is the friendliest default for a mixed-skill public; if you turn it on for realism, keep <code>mp_tkpunish 1</code> so team-killers pay for it. <code>mp_limitteams 1</code> and <code>mp_autoteambalance 1</code> together stop the five-friends-stack-CT problem that empties a server.</p>
55 +
56 +<h2>5. Downloads, logging and spam control</h2>
57 +<pre>// --- downloads ---
58 +sv_allowdownload 1
59 +sv_allowupload 1
60 +sv_downloadurl "http://dl.example.com/cs" // see FastDL guide
61 +
62 +// --- logging ---
63 +log on
64 +mp_logmessages 1
65 +mp_logdetail 3
66 +
67 +// --- spam / griefing ---
68 +decalfrequency 30 // seconds between sprays
69 +sv_cheats 0
70 +pausable 0</pre>
71 +<p>FastDL keeps map changes fast — wire it up with the <a href="/tutorials/fastdl-setup-guide">FastDL setup guide</a>. Logging on from day one is what lets you answer "who did that?" later; see <a href="/tutorials/parse-cs16-server-logs">parsing server logs</a>.</p>
72 +
73 +<h2>6. Load your admin and map settings last</h2>
74 +<pre>// at the end of server.cfg
75 +exec mapcycle-note.cfg // optional reminders / comments
76 +// AMXX executes amxx.cfg on its own, after this file</pre>
77 +<p>Gameplay cvars belong here in <code>server.cfg</code>; AMXX-specific settings belong in <a href="/tutorials/amxx-cfg-explained">amxx.cfg</a>, which runs later and will override duplicates. Keep admin power tight per the <a href="/tutorials/prevent-admin-abuse">admin-abuse guide</a>, and add a chat-based <a href="/plugins/csb-adverts">adverts plugin</a> for rules reminders rather than a noisy HUD.</p>
78 +
79 +<h2>Troubleshooting</h2>
80 +<ul>
81 +<li><strong>Server invisible online</strong> — <code>sv_lan 1</code>. The single most common cause; it must be 0.</li>
82 +<li><strong>Rounds feel sluggish</strong> — freezetime or roundtime too high, or you set <code>mp_roundtime</code> thinking it was seconds. It is minutes.</li>
83 +<li><strong>Team stacking</strong> — <code>mp_autoteambalance</code> or <code>mp_limitteams</code> off. Turn both on.</li>
84 +<li><strong>Team-kill grief</strong> — friendly fire on without <code>mp_tkpunish 1</code>, or off but players griefing another way. Adjust to taste.</li>
85 +<li><strong>A value keeps reverting</strong> — <code>amxx.cfg</code>, a per-map config, or ReGameDLL's <code>game.cfg</code> re-sets it after server.cfg. Trace the order.</li>
86 +</ul>
87 +
88 +<h2>Verification</h2>
89 +<p>Change the map to reload the config, then read back the values that most affect feel:</p>
90 +<pre>sv_lan
91 +mp_freezetime
92 +mp_buytime
93 +mp_friendlyfire</pre>
94 +<p>Confirm each echoes what you set, then play a round or two — a stopwatch on freezetime and buy time settles any doubt about the minutes-versus-seconds cvars. Once it feels right, layer voting with <a href="/tutorials/mapchooser-setup">MapChooser</a> and lock down admin access before you invite the public in.</p>
+63 -0 what-is-amx-mod-x/en.md A
@@ -0,0 +1,63 @@
1 +---
2 +title: "What Is AMX Mod X? How the CS 1.6 Admin and Scripting Platform Works"
3 +excerpt: "A plain explanation of AMX Mod X: where it sits above the engine, how Metamod loads it, what .sma/.amxx and modules are, and the config files that run it."
4 +category: "misc"
5 +tags: "amxmodx, basics"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Almost every CS 1.6 server you have ever played on ran <strong>AMX Mod X</strong>. It is the platform that provides admin commands, ranks, menus, VIP shops, zombie modes and nearly every custom feature on a community server. But it is not a single mod you install and forget — it is a scripting engine with a specific place in a stack of layers, and understanding that stack is what turns "I pasted a plugin and it broke" into "I know exactly why".</p>
10 +
11 +<h2>1. Where AMX Mod X sits</h2>
12 +<p>Four layers stack on a CS 1.6 server, each loading the next:</p>
13 +<table>
14 +<thead><tr><th>Layer</th><th>Role</th></tr></thead>
15 +<tbody>
16 +<tr><td>Engine (<a href="/tutorials/hlds-vs-rehlds-explained">HLDS / ReHLDS</a>)</td><td>Networking, physics, entities.</td></tr>
17 +<tr><td>Game rules (CS / <a href="/tutorials/install-regamedll-cs16">ReGameDLL</a>)</td><td>Rounds, weapons, buy menu.</td></tr>
18 +<tr><td><a href="/tutorials/install-metamod-r">Metamod / Metamod-r</a></td><td>A loader that lets add-ons hook the engine.</td></tr>
19 +<tr><td><strong>AMX Mod X</strong></td><td>A Metamod plugin that runs your <code>.amxx</code> scripts.</td></tr>
20 +</tbody>
21 +</table>
22 +<p>The key fact: <strong>AMX Mod X is itself a Metamod plugin.</strong> It cannot load without Metamod, and Metamod cannot load without the engine knowing about it via <code>liblist.gam</code>/<code>plugins.ini</code>. If Metamod is not set up, AMXX does nothing — see <a href="/tutorials/fix-metamod-bad-load">fixing Metamod bad load</a>.</p>
23 +
24 +<h2>2. Plugins: .sma source and .amxx binary</h2>
25 +<p>A plugin is written in <strong>Pawn</strong>, a small C-like scripting language, and saved as a <code>.sma</code> source file. It is compiled by <code>amxxpc</code> into a <code>.amxx</code> binary that the server actually loads:</p>
26 +<pre>myplugin.sma --amxxpc--&gt; myplugin.amxx</pre>
27 +<p>You drop the <code>.amxx</code> into <code>addons/amxmodx/plugins/</code> and list it in <code>plugins.ini</code>. Compiling is covered in <a href="/tutorials/compile-sma-to-amxx">compiling .sma to .amxx</a>, and the language basics in <a href="/tutorials/pawn-basics-for-amxx">Pawn basics</a>. Our own plugin directory keeps only the source and compiles it on demand — you can read a plugin like <a href="/plugins/csb-admin-menu">CSB Admin Menu</a> before you ever run it.</p>
28 +
29 +<h2>3. Modules: the native extensions</h2>
30 +<p>Pawn on its own cannot touch the game deeply. <strong>Modules</strong> are compiled native libraries that expose extra functions to plugins. The common ones:</p>
31 +<pre>fakemeta // low-level engine hooks
32 +hamsandwich // game-logic hooks (spawn, damage, death)
33 +cstrike // CS-specific (money, team, models)
34 +csx // stats and rank events
35 +engine, fun // movement, effects, entity helpers
36 +sqlx, nvault // databases and persistent storage
37 +geoip // country lookup by IP</pre>
38 +<p>A plugin declares what it needs with <code>#include</code>; the matching modules must be enabled in <code>modules.ini</code> or the plugin fails with <a href="/tutorials/fix-amxx-module-failed-to-load">module failed to load</a>.</p>
39 +
40 +<h2>4. The config files that run it</h2>
41 +<p>AMX Mod X is driven by a handful of files under <code>addons/amxmodx/configs/</code>:</p>
42 +<ul>
43 +<li><a href="/tutorials/plugins-ini-load-order"><code>plugins.ini</code></a> — which plugins load, in what order.</li>
44 +<li><code>modules.ini</code> — which native modules load.</li>
45 +<li><a href="/tutorials/users-ini-explained"><code>users.ini</code></a> — who is an admin and what <a href="/tutorials/amxx-admin-flags-reference">access flags</a> they have.</li>
46 +<li><a href="/tutorials/amxx-cfg-explained"><code>amxx.cfg</code></a> — core cvars: access defaults, activity display, flood control.</li>
47 +</ul>
48 +
49 +<h2>5. What you get out of the box</h2>
50 +<p>A stock install already gives you the essentials: kick, ban, slap, map change, vote and menu commands (<code>amx_kick</code>, <code>amx_ban</code>, <code>amx_map</code>), plus <code>nextmap</code>, <code>timeleft</code> and <code>mapchooser</code>. Everything beyond that — ranks, shops, game modes — is third-party or CSB plugins you add on top. See <a href="/tutorials/add-admin-by-steamid">adding an admin by SteamID</a> to make yourself an admin, and <a href="/tutorials/amx-ban-commands">the ban commands</a> to moderate.</p>
51 +
52 +<h2>6. Versions</h2>
53 +<p>Three versions are in the wild: <strong>1.8.2</strong> (old but still common), <strong>1.9</strong> (the safe default), and <strong>1.10</strong> (current). Newer natives like <code>client_print_color</code> do not exist in 1.8.2, so a plugin that uses them needs 1.9 or later. If you are choosing, install <a href="/tutorials/install-amx-mod-x-1-9">1.9</a>; if you inherited an old box, consider <a href="/tutorials/upgrade-amxmodx-1-8-2-to-1-10">upgrading</a>.</p>
54 +
55 +<h2>Common misconceptions</h2>
56 +<ul>
57 +<li><strong>"AMXX is a cheat/anti-cheat."</strong> No — it is an admin and scripting platform. Anti-cheat plugins run <em>on</em> it, but AMXX itself is neutral.</li>
58 +<li><strong>"I can paste any plugin."</strong> Only if its modules are enabled and its version matches your core, and only if you trust the source — see <a href="/tutorials/spot-backdoored-amxx-plugin">spotting a backdoored plugin</a>.</li>
59 +<li><strong>"AMXX replaces the game."</strong> No — game rules are the CS/ReGameDLL layer. AMXX scripts on top of them.</li>
60 +</ul>
61 +
62 +<h2>Verification</h2>
63 +<p>From the server console, run <code>meta list</code> and confirm AMX Mod X appears as a running Metamod plugin, then <code>amxx plugins</code> and <code>amxx modules</code> to see the scripts and native modules that loaded. If AMXX is missing from <code>meta list</code>, the problem is the Metamod layer beneath it, not AMXX. Once it loads cleanly, add yourself as an admin and write your <a href="/tutorials/write-first-amxx-plugin">first plugin</a> to see the whole pipeline end to end.</p>
0 64