Add 4 tutorials (4 files)
Browse Source
4 changed files
with 258 additions and 0 deletions
A
cs16-best-launch-options/en.md
+65 -0
A
fastdl-setup-guide/en.md
+87 -0
A
rehlds-performance-cvars/en.md
+25 -0
A
users-ini-explained/en.md
+81 -0
cs16-best-launch-options/en.md
A
| @@ -0,0 +1,65 @@ | ||
| 1 | +--- | |
| 2 | +title: "Best CS 1.6 Launch Options (-novid, -freq, -nofbo)" | |
| 3 | +excerpt: "A no-nonsense reference to the CS 1.6 launch options that actually matter in 2026 — what each flag does, which to use, and which to leave alone." | |
| 4 | +category: "client" | |
| 5 | +tags: "launch-options, fps" | |
| 6 | +image: "" | |
| 7 | +read_time: "7 min read" | |
| 8 | +--- | |
| 9 | +<p>Launch options are arguments passed to the CS 1.6 executable before the engine boots, so they set things the in-game menu cannot — the renderer, the refresh rate, mouse-input handling. Most "best settings" lists online are copy-pasted junk full of flags that do nothing or actively hurt. This is the short, accurate list, with what each one does and when to use it. Set them in Steam via right-click Counter-Strike, <em>Properties → Launch Options</em>.</p> | |
| 10 | + | |
| 11 | +<h2>1. The options worth setting for almost everyone</h2> | |
| 12 | +<pre>-novid -console -freq 144 -noforcemparms -noforcemaccel -noforcemspd</pre> | |
| 13 | +<ul> | |
| 14 | +<li><strong><code>-novid</code></strong> — skips the Valve intro movie. Pure convenience, zero downside.</li> | |
| 15 | +<li><strong><code>-console</code></strong> — enables the developer console immediately. You want this; half of troubleshooting happens there.</li> | |
| 16 | +<li><strong><code>-freq 144</code></strong> — sets the display refresh rate in Hz. Replace <code>144</code> with your monitor's actual rate (60, 75, 120, 144, 165, 240). If your game feels capped at 60 Hz on a high-refresh monitor, this is the fix. <code>-refresh</code> is a synonym on some builds.</li> | |
| 17 | +<li><strong><code>-noforcemparms -noforcemaccel -noforcemspd</code></strong> — tell the engine to leave your Windows mouse settings alone instead of forcing its own acceleration curve. Essential for consistent aim; without them the engine can re-apply acceleration you disabled in Windows.</li> | |
| 18 | +</ul> | |
| 19 | + | |
| 20 | +<h2>2. Fixing a black screen or bad performance: -nofbo and the renderer</h2> | |
| 21 | +<p>GoldSrc can render through an OpenGL Frame Buffer Object, and on some drivers that path produces a black screen, a black scope, or broken post-processing. Disable it:</p> | |
| 22 | +<pre>-nofbo</pre> | |
| 23 | +<p>Also choose your renderer explicitly. OpenGL is the right default on modern hardware:</p> | |
| 24 | +<pre>-gl (OpenGL, recommended) | |
| 25 | +-d3d (Direct3D, try only if OpenGL misbehaves) | |
| 26 | +-soft (software renderer, last resort for ancient/virtual GPUs)</pre> | |
| 27 | +<p>Do not stack all three — pick one. If you get a black screen after alt-tabbing, add <code>-nofbo</code> and, if it persists, run windowed (below).</p> | |
| 28 | + | |
| 29 | +<h2>3. Resolution and window mode</h2> | |
| 30 | +<pre>-w 1280 -h 960 (force a resolution) | |
| 31 | +-window / -windowed (windowed mode) | |
| 32 | +-full (fullscreen)</pre> | |
| 33 | +<p>Windowed mode alt-tabs instantly and avoids most black-screen bugs at the cost of a little input latency. <code>-w</code>/<code>-h</code> are useful when a bad resolution has left you unable to see the menu to change it.</p> | |
| 34 | + | |
| 35 | +<h2>4. Options that are situational</h2> | |
| 36 | +<pre>-high (higher process priority; minor, can help on busy systems) | |
| 37 | +-num_edicts (server-side only — does nothing for a client) | |
| 38 | +-heapsize (obsolete on modern builds; the engine sizes its own heap) | |
| 39 | +-32bpp (force 32-bit colour; already the default)</pre> | |
| 40 | +<p><code>-high</code> is the only one here worth trying, and only if you see stutter under load. <code>-heapsize</code> and friends are cargo-cult leftovers from the 2000s — modern GoldSrc ignores or auto-sizes them.</p> | |
| 41 | + | |
| 42 | +<h2>5. FPS is a cvar, not a launch option</h2> | |
| 43 | +<p>The single most requested "launch option", the FPS cap, is set in the console or config, not on the command line:</p> | |
| 44 | +<pre>fps_max 144 | |
| 45 | +fps_override 1 // required to exceed 100 on some builds</pre> | |
| 46 | +<p>Match <code>fps_max</code> to your refresh rate (or a clean multiple of it). Uncapped FPS in GoldSrc can introduce movement quirks tied to the physics tick, so a sensible cap is better than "as high as possible".</p> | |
| 47 | + | |
| 48 | +<h2>6. A clean, complete example</h2> | |
| 49 | +<p>For a 144 Hz monitor on a modern GPU, a sane full launch-options line is simply:</p> | |
| 50 | +<pre>-novid -console -freq 144 -noforcemparms -noforcemaccel -noforcemspd -gl</pre> | |
| 51 | +<p>Add <code>-nofbo</code> only if you hit a black screen or black scope, and add <code>-window</code> only if you want instant alt-tab. That is the entire list a normal player needs — everything else is either a cvar, a situational fix, or noise. Resist the urge to append flags you cannot explain; in GoldSrc, a shorter, understood launch line beats a long copied one every time.</p> | |
| 52 | + | |
| 53 | +<h2>Common mistakes</h2> | |
| 54 | +<ul> | |
| 55 | +<li><strong>Copying a 20-flag string from a forum</strong> — most of it is dead options. Every flag above has a reason; if you cannot say what one does, drop it.</li> | |
| 56 | +<li><strong>Setting <code>-freq</code> higher than the monitor supports</strong> — the display falls back to a safe rate or shows nothing. Use the real panel rate.</li> | |
| 57 | +<li><strong>Leaving <code>-nosound</code> in from a past test</strong> — silent game. See <a href="/tutorials/cs16-no-sound-windows">no sound on Windows</a>.</li> | |
| 58 | +<li><strong>Using <code>-soft</code> "for FPS"</strong> — the software renderer is slower and uglier on any GPU made this century. Use <code>-gl</code>.</li> | |
| 59 | +</ul> | |
| 60 | + | |
| 61 | +<h2>Verification</h2> | |
| 62 | +<p>Launch the game and open the console. Confirm the refresh rate took by checking your monitor's on-screen display, or run:</p> | |
| 63 | +<pre>gl_vsync 0 | |
| 64 | +net_graph 3</pre> | |
| 65 | +<p><code>net_graph 3</code> shows a live FPS counter bottom-right; it should sit at your <code>fps_max</code>. If it is pinned at 60 on a 144 Hz monitor, your <code>-freq</code> did not apply — recheck the value and that V-Sync is off. With input, renderer and refresh sorted, tune the rest of your connection with proper <code>cl_cmdrate</code>/<code>cl_updaterate</code> and <code>rate</code> settings for the servers you play.</p> |
fastdl-setup-guide/en.md
A
| @@ -0,0 +1,87 @@ | ||
| 1 | +--- | |
| 2 | +title: "FastDL Setup: sv_downloadurl with Nginx or Apache" | |
| 3 | +excerpt: "Serve maps, models and sounds over HTTP with sv_downloadurl, mirror the cstrike tree correctly, add bzip2 compression, and configure Nginx or Apache." | |
| 4 | +category: "administration" | |
| 5 | +tags: "fastdl, downloads" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>Without FastDL, custom content downloads through the game server at a crawl — a few KB/s over the old UDP transfer, so a 20 MB map map-change empties the server. FastDL moves those transfers to a normal HTTP server via <code>sv_downloadurl</code>. The setup is not hard, but one detail — where exactly the URL points relative to the <code>cstrike</code> folder — accounts for the overwhelming majority of "FastDL not working" reports.</p> | |
| 10 | + | |
| 11 | +<h2>1. How it works</h2> | |
| 12 | +<p>When a client joins and is missing a file the server references (a map, model, sound, sprite), it fetches that file over HTTP from <code>sv_downloadurl</code> instead of the game channel. Your web server just serves static files; the client reconstructs the path from the game-relative filename.</p> | |
| 13 | + | |
| 14 | +<h2>2. Set the server cvars</h2> | |
| 15 | +<pre>// server.cfg | |
| 16 | +sv_allowdownload 1 | |
| 17 | +sv_allowupload 1 | |
| 18 | +sv_downloadurl "http://dl.example.com/cs"</pre> | |
| 19 | +<p><code>sv_allowdownload 1</code> lets clients download at all; without it they join with missing textures and errors. Clients also need <code>cl_allowdownload 1</code> on their end (the default), so you cannot fix a client that disabled it.</p> | |
| 20 | + | |
| 21 | +<h2>3. Get the path right (the part everyone breaks)</h2> | |
| 22 | +<p>The engine builds the download URL as <code>sv_downloadurl</code> + the game-relative path, and that path <strong>includes the <code>cstrike/</code> folder</strong>. So if a client needs <code>cstrike/maps/de_rats.bsp</code> and your <code>sv_downloadurl</code> is <code>http://dl.example.com/cs</code>, it will request:</p> | |
| 23 | +<pre>http://dl.example.com/cs/cstrike/maps/de_rats.bsp</pre> | |
| 24 | +<p>Therefore your web root must contain a <code>cstrike/</code> directory that mirrors the server's, not the contents of <code>cstrike/</code> dumped loose. The correct layout on the web host:</p> | |
| 25 | +<pre>/var/www/fastdl/ <- sv_downloadurl points here (http://dl.example.com/cs) | |
| 26 | + cstrike/ | |
| 27 | + maps/ | |
| 28 | + de_rats.bsp | |
| 29 | + sound/ | |
| 30 | + models/ | |
| 31 | + sprites/ | |
| 32 | + gfx/ | |
| 33 | + overviews/</pre> | |
| 34 | +<p>If you point the URL <em>inside</em> <code>cstrike</code> you get a doubled or missing segment and every download 404s. This is the single most common mistake; see <a href="/tutorials/fix-fastdl-not-working">FastDL not working</a> for the diagnostic version.</p> | |
| 35 | + | |
| 36 | +<h2>4. Add bzip2 compression</h2> | |
| 37 | +<p>The engine can fetch a bzip2-compressed copy and decompress it client-side, which roughly halves map transfer size. For each file, place a <code>.bz2</code> alongside it:</p> | |
| 38 | +<pre>cd /var/www/fastdl/cstrike/maps | |
| 39 | +bzip2 -k de_rats.bsp # produces de_rats.bsp.bz2, keeps the original</pre> | |
| 40 | +<p>The client requests <code>de_rats.bsp.bz2</code> first and falls back to the plain file if it is absent. Compress the big content — maps, models, sounds. Keep the uncompressed files too; some clients still ask for them.</p> | |
| 41 | + | |
| 42 | +<h2>5. Nginx configuration</h2> | |
| 43 | +<pre>server { | |
| 44 | + listen 80; | |
| 45 | + server_name dl.example.com; | |
| 46 | + root /var/www/fastdl; | |
| 47 | + | |
| 48 | + location / { | |
| 49 | + autoindex off; | |
| 50 | + # serve unknown types as raw bytes so .bsp/.bz2 download cleanly | |
| 51 | + default_type application/octet-stream; | |
| 52 | + types { | |
| 53 | + application/octet-stream bsp bz2 mdl spr wav; | |
| 54 | + } | |
| 55 | + } | |
| 56 | +}</pre> | |
| 57 | +<p>Turn <code>autoindex</code> off so the mirror is not browsable, and make sure the server sends the files rather than trying to interpret them.</p> | |
| 58 | + | |
| 59 | +<h2>6. Apache configuration</h2> | |
| 60 | +<pre><VirtualHost *:80> | |
| 61 | + ServerName dl.example.com | |
| 62 | + DocumentRoot /var/www/fastdl | |
| 63 | + | |
| 64 | + <Directory /var/www/fastdl> | |
| 65 | + Options -Indexes | |
| 66 | + Require all granted | |
| 67 | + AddType application/octet-stream .bsp .bz2 .mdl .spr .wav | |
| 68 | + </Directory> | |
| 69 | +</VirtualHost></pre> | |
| 70 | +<p>HTTPS works fine for <code>sv_downloadurl</code> and is worth it; just make sure the certificate is valid, because a TLS error makes the client silently fall back to the slow in-game transfer.</p> | |
| 71 | + | |
| 72 | +<h2>7. Keep the mirror in sync</h2> | |
| 73 | +<p>The web mirror is a separate copy of your content, and it drifts. Every time you add a map to the <a href="/tutorials/mapcycle-txt-setup">rotation</a> or install a new model pack, the same files must land on the FastDL host, or clients download everything except the new content and join with missing textures. The lowest-friction fix is to make the mirror the same filesystem — bind-mount or symlink <code>cstrike/maps</code>, <code>cstrike/sound</code> and the rest into the web root — so there is only one copy to maintain. If the mirror is a different machine, script an <code>rsync</code> after every content change and re-run <code>bzip2 -k</code> on new files. A stale mirror is the second most common FastDL failure after the path mistake, and it is entirely self-inflicted.</p> | |
| 74 | + | |
| 75 | +<h2>Common errors</h2> | |
| 76 | +<ul> | |
| 77 | +<li><strong>Every download 404s</strong> — the <code>cstrike/</code> level is missing or doubled in your web root. The client requests <code><url>/cstrike/maps/...</code>; that exact path must resolve.</li> | |
| 78 | +<li><strong>Downloads are still slow</strong> — <code>sv_downloadurl</code> is empty or unreachable and the server fell back to the UDP transfer. Test the URL in a browser.</li> | |
| 79 | +<li><strong>Files download but are corrupt</strong> — the web server rewrote or compressed them (gzip on the fly, an HTML error page served with a 200). Serve as <code>application/octet-stream</code> and confirm the byte size matches.</li> | |
| 80 | +<li><strong>.bz2 ignored</strong> — wrong filename (<code>de_rats.bz2</code> instead of <code>de_rats.bsp.bz2</code>) or the web server refuses the extension. The compressed name is the full original name plus <code>.bz2</code>.</li> | |
| 81 | +<li><strong>Client gets missing textures anyway</strong> — <code>sv_allowdownload 0</code> on the server, or the file is not actually on the mirror.</li> | |
| 82 | +</ul> | |
| 83 | + | |
| 84 | +<h2>Verification</h2> | |
| 85 | +<p>Open the exact URL of one map in a browser and confirm it downloads with the right size:</p> | |
| 86 | +<pre>http://dl.example.com/cs/cstrike/maps/de_rats.bsp</pre> | |
| 87 | +<p>Then join the server from a client that does not have that map and watch it pull over HTTP in seconds rather than minutes. A clean test is to delete a map locally, connect, and confirm it re-downloads fast. Pair this with a well-ordered <a href="/tutorials/mapcycle-txt-setup">mapcycle</a> so the mirror always holds every map you rotate.</p> |
rehlds-performance-cvars/en.md
A
| @@ -0,0 +1,25 @@ | ||
| 1 | +--- | |
| 2 | +title: "ReHLDS Performance Cvars That Actually Matter" | |
| 3 | +excerpt: "ReHLDS adds cvars stock HLDS never had — for timing, anti-flood and network behaviour. Here are the ones that affect performance and stability, and how to set them without breaking old plugins." | |
| 4 | +category: "optimization" | |
| 5 | +tags: "rehlds, cvars" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>The biggest performance win from ReHLDS is the rewritten engine itself — more accurate frame timing and a faster network path than Valve's original. On top of that it exposes a set of <code>sv_rehlds_*</code> cvars that do not exist on stock HLDS. Most of them are correctness or hardening switches rather than raw speed knobs, but several directly affect how the server behaves under load and under attack, which is what "performance" means once real players show up. This guide covers the ones worth setting and, just as important, how to introduce them safely.</p><p>This assumes you already run ReHLDS. If not, do <a href="/tutorials/install-rehlds-on-linux">the install</a> first — none of these commands exist on the Valve engine, and setting them there is a silent no-op.</p><h2>1. Confirm you are actually on ReHLDS</h2><pre>rehlds_version</pre><p>Stock HLDS answers <code>Unknown command: rehlds_version</code>. ReHLDS prints a version string. If you get the "unknown command" reply, the engine was not replaced and nothing below applies.</p><h2>2. Timing and tick rate</h2><p>ReHLDS holds a high <code>sys_ticrate</code> far more reliably than stock HLDS, which is the whole reason people chase it for FPS. Set the target as usual on the launch line:</p><pre>./hlds_run -game cstrike -pingboost 1 +sys_ticrate 1000 \ | |
| 10 | + +map de_dust2 +maxplayers 20 +sv_lan 0</pre><p>Then measure under load with <code>stats</code> as described in <a href="/tutorials/stable-1000-fps-linux-server">the stable-FPS guide</a>. On ReHLDS a 1000 target is realistic where stock HLDS would jitter.</p><h2>3. Anti-flood cvars protect FPS under attack</h2><p>A server does not only slow down from too many honest players — it slows down, or dies, when someone floods it with movement or string commands. ReHLDS ships rate limiters for exactly this. Add them to <a href="/tutorials/setup-server-cfg-cs16">server.cfg</a>:</p><pre>// limit per-client command flooding | |
| 11 | +sv_rehlds_stringcmdrate_max_avg 80 | |
| 12 | +sv_rehlds_stringcmdrate_max_burst 200 | |
| 13 | + | |
| 14 | +// limit connections from a single address | |
| 15 | +sv_rehlds_maxclients_from_single_ip 5</pre><p>These keep one abusive client from consuming a disproportionate share of the single server thread. Treat the numbers as starting points and read your ReHLDS build's own cvar list — exact names and defaults change between releases, and inventing a cvar just gets you a silent no-op.</p><h2>4. Network and download behaviour</h2><pre>// force the max client download rate the engine allows | |
| 16 | +sv_rehlds_force_dlmax 1 | |
| 17 | + | |
| 18 | +// do not push the mapcycle to clients | |
| 19 | +sv_rehlds_send_mapcycle 0 | |
| 20 | + | |
| 21 | +// use engine-local gametime (fixes some timing-sensitive bugs) | |
| 22 | +sv_rehlds_local_gametime 1</pre><p><code>sv_rehlds_force_dlmax 1</code> smooths out custom-content downloads on connect, which is where a lot of "stuck at connecting" reports come from; pair it with a proper <a href="/tutorials/fix-fastdl-not-working">FastDL setup</a>. <code>sv_rehlds_local_gametime 1</code> is a correctness fix worth having on.</p><h2>5. Introduce them one batch at a time</h2><p>This is the part people skip and regret. Some hardening cvars interact badly with old plugins that build raw network messages by hand. Turn on one small group, restart, and watch the log through a map change and a few connects:</p><pre>rcon sv_rehlds_local_gametime 1 | |
| 23 | +// restart, play a map, watch the console | |
| 24 | +rcon sv_rehlds_force_dlmax 1 | |
| 25 | +// restart, watch again</pre><p>If the server starts crashing right after you enable a batch, you have found the culprit without a bisect. A plugin that dies under a new security cvar usually needs updating, not the cvar disabling forever.</p><h2>6. What ReHLDS cvars will not do</h2><p>No <code>sv_rehlds_*</code> cvar turns a saturated core into a fast one. If <code>stats</code> shows the core at 100%, the answer is a faster CPU, fewer or lighter plugins, or a lower <code>sys_ticrate</code> — not another cvar. Likewise, the rate window that players actually experience is governed by <a href="/tutorials/sv-maxrate-maxupdaterate-values">sv_maxrate and sv_maxupdaterate</a>, which are engine-agnostic and matter regardless of ReHLDS.</p><h2>Common errors</h2><ul><li><strong><code>Unknown command: sv_rehlds_...</code></strong> — you are not on ReHLDS, or the cvar name is wrong/renamed in your build. Verify with <code>rehlds_version</code> and read the shipped cvar list.</li><li><strong>Server crashes right after enabling a hardening cvar</strong> — an old plugin sends malformed messages the cvar now rejects. Enable in small batches to find it, then update the plugin.</li><li><strong>Set a cvar, nothing changed</strong> — a misspelled cvar is a no-op with no error in older builds. Copy the exact name from the release notes.</li><li><strong>FPS unchanged after tuning</strong> — you were CPU-bound all along. Measure first; the fix is hardware or plugin load, per <a href="/tutorials/fix-hlds-100-cpu">the 100% CPU guide</a>.</li></ul><h2>Verification</h2><p>After each batch, confirm <code>rehlds_version</code> still answers, the server reaches a map, and <code>meta list</code> (if Metamod is loaded) still shows every plugin as <code>RUN</code>. Load the server and re-measure FPS with <code>stats</code> to prove the timing held. The goal is a server that is not just fast when empty but stays fast and stable when someone tries to abuse it.</p> |
users-ini-explained/en.md
A
| @@ -0,0 +1,81 @@ | ||
| 1 | +--- | |
| 2 | +title: "users.ini Explained: Admin Flags and Access Levels" | |
| 3 | +excerpt: "A field-by-field breakdown of addons/amxmodx/configs/users.ini: the four columns, access flags versus account flags, real example lines, and amx_reloadadmins." | |
| 4 | +category: "administration" | |
| 5 | +tags: "users.ini, admin" | |
| 6 | +image: "" | |
| 7 | +read_time: "8 min read" | |
| 8 | +--- | |
| 9 | +<p>Every AMX Mod X admin is one line in <code>addons/amxmodx/configs/users.ini</code>. It looks trivial until an admin silently stops working, and then the difference between the two flag columns suddenly matters a great deal. This is the file explained field by field, with the example lines that actually work in production. The file lives at <code>addons/amxmodx/configs/users.ini</code> and is read by the AMXX admin plugins at map start and whenever you reload — it is the single source of truth for who is an admin unless you have deliberately moved admin management into a database like <a href="/tutorials/install-amxbans">AMXBans</a>.</p> | |
| 10 | + | |
| 11 | +<h2>1. The line format</h2> | |
| 12 | +<p>Each admin is four quoted fields:</p> | |
| 13 | +<pre>"<name|ip|steamid>" "<password>" "<access flags>" "<account flags>"</pre> | |
| 14 | +<p>Field one is the identity (a SteamID, an IP, or a player name). Field two is a password — empty for SteamID/IP admins. Field three is <strong>access flags</strong>: what the admin is allowed to do. Field four is <strong>account flags</strong>: how AMXX should authenticate this line. Mixing up columns three and four is the most common mistake in the file.</p> | |
| 15 | + | |
| 16 | +<h2>2. Access flags (column 3)</h2> | |
| 17 | +<p>These are the letters <code>a</code>-<code>z</code> that grant commands. A few you will use constantly:</p> | |
| 18 | +<ul> | |
| 19 | +<li><code>a</code> — immunity (cannot be kicked/banned/slayed by other admins)</li> | |
| 20 | +<li><code>b</code> — reserved-slot access</li> | |
| 21 | +<li><code>c</code> — <code>amx_kick</code></li> | |
| 22 | +<li><code>d</code> — <code>amx_ban</code> / <code>amx_unban</code></li> | |
| 23 | +<li><code>e</code> — <code>amx_slay</code> / <code>amx_slap</code></li> | |
| 24 | +<li><code>f</code> — <code>amx_map</code></li> | |
| 25 | +<li><code>u</code> — admin menu access</li> | |
| 26 | +<li><code>z</code> — basic user, no admin power</li> | |
| 27 | +</ul> | |
| 28 | +<p>The full a-z table is in the <a href="/tutorials/amxx-admin-flags-reference">admin flags reference</a>. A full admin is usually given <code>abcdefghijklmnopqrstu</code> — every access flag except <code>z</code>.</p> | |
| 29 | + | |
| 30 | +<h2>3. Account flags (column 4)</h2> | |
| 31 | +<p>These tell AMXX <em>how to match and authenticate</em> the line. They are a different alphabet from the access flags:</p> | |
| 32 | +<table> | |
| 33 | +<thead><tr><th>Flag</th><th>Meaning</th></tr></thead> | |
| 34 | +<tbody> | |
| 35 | +<tr><td><code>a</code></td><td>Disconnect the player if the password is wrong</td></tr> | |
| 36 | +<tr><td><code>b</code></td><td>Treat the name field as a clan tag / substring of the player name</td></tr> | |
| 37 | +<tr><td><code>c</code></td><td>The identity is a SteamID (authid) check</td></tr> | |
| 38 | +<tr><td><code>d</code></td><td>The identity is an IP check</td></tr> | |
| 39 | +<tr><td><code>e</code></td><td>No password required (used with SteamID/IP admins)</td></tr> | |
| 40 | +</tbody> | |
| 41 | +</table> | |
| 42 | +<p>The workhorse combination is <code>ce</code>: authenticate by SteamID (<code>c</code>) and skip the password (<code>e</code>). That is the correct account-flag string for almost every modern admin.</p> | |
| 43 | + | |
| 44 | +<h2>4. Real example lines</h2> | |
| 45 | +<pre>; SteamID admin, full access, no password | |
| 46 | +"STEAM_0:0:12345678" "" "abcdefghijklmnopqrstu" "ce" | |
| 47 | + | |
| 48 | +; Name + password admin (legacy / non-Steam) | |
| 49 | +"BogdanAdmin" "S0meL0ngP@ss" "abcdefghijklmnopqrstu" "a" | |
| 50 | + | |
| 51 | +; IP-based admin, moderator subset only | |
| 52 | +"203.0.113.5" "" "cdefiju" "de" | |
| 53 | + | |
| 54 | +; VIP: reserved slot + custom level H, matched by SteamID | |
| 55 | +"STEAM_0:1:99887766" "" "bt" "ce"</pre> | |
| 56 | +<p>Comments start with <code>;</code>. Note how the SteamID lines use <code>ce</code> and an empty password, while the name line uses <code>a</code> and a real password — that is the whole authentication story in four lines.</p> | |
| 57 | + | |
| 58 | +<h2>5. Applying changes without a map change</h2> | |
| 59 | +<p>After editing the file, run this in the server console (or via RCON):</p> | |
| 60 | +<pre>amx_reloadadmins</pre> | |
| 61 | +<p>It re-reads users.ini live. There is no need to change the map or restart. Existing players are re-checked against the new list. Adding a specific admin by SteamID is covered step by step in <a href="/tutorials/add-admin-by-steamid">how to add an admin by SteamID</a>.</p> | |
| 62 | + | |
| 63 | +<h2>6. Order, quoting and comments</h2> | |
| 64 | +<p>A few rules keep the file from silently breaking. Every field must be wrapped in double quotes — an unquoted access string with a space, or a missing quote, makes AMXX skip the whole line without warning. Blank lines are ignored and any line starting with <code>;</code> is a comment, which is the right way to document who each admin is:</p> | |
| 65 | +<pre>; head admin - Bogdan | |
| 66 | +"STEAM_0:0:12345678" "" "abcdefghijklmnopqrstu" "ce" | |
| 67 | +; trial mod - added 2026-07 | |
| 68 | +"STEAM_0:1:22334455" "" "ceu" "ce"</pre> | |
| 69 | +<p>Order does not imply priority for distinct SteamIDs, but if the same identity appears twice the later line effectively wins after a reload, so remove stale duplicates rather than layering new lines on top of them.</p> | |
| 70 | + | |
| 71 | +<h2>Common errors</h2> | |
| 72 | +<ul> | |
| 73 | +<li><strong>Admin has power but is asked for a password</strong> — you left off account flag <code>e</code>. A SteamID admin needs <code>ce</code>, not just <code>c</code>.</li> | |
| 74 | +<li><strong>Admin is completely ignored</strong> — you put <code>c</code> (SteamID) in the access column instead of the account column. Column order is identity, password, access, account.</li> | |
| 75 | +<li><strong>Name admin works for impostors</strong> — name matching is weak; anyone can use that name. Prefer SteamID (<code>ce</code>) on any Steam server. On non-Steam servers this is why you install <a href="/tutorials/install-reunion">Reunion</a> to get stable IDs.</li> | |
| 76 | +<li><strong>Wrong universe digit</strong> — <code>STEAM_0:...</code> versus <code>STEAM_1:...</code>. The 2023 client update changed the leading digit for some setups; if the admin is not recognised, try the other digit and read <a href="/tutorials/fix-admin-not-recognized">admin not recognised</a>.</li> | |
| 77 | +<li><strong>Edited the wrong file</strong> — admins go in <code>configs/users.ini</code>, not <code>admins.ini</code> or a plugin config. Confirm the path.</li> | |
| 78 | +</ul> | |
| 79 | + | |
| 80 | +<h2>Verification</h2> | |
| 81 | +<p>Run <code>amx_reloadadmins</code>, reconnect, and type <code>amx_who</code> in chat or console — your name should list the flags you assigned. Open the admin menu with <code>amx_menu</code> (needs flag <code>u</code>). If <code>amx_who</code> shows you with no flags, the line did not match: re-check the SteamID with <code>status</code> and the account flags with the <a href="/tutorials/amxx-admin-flags-reference">flag reference</a>.</p> | |
| 0 | 82 |









