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

Add 4 tutorials (4 files)

Browse Source
Daemon666 committed parent c8167ca6e3 commit 1600b4707bfc7265dafeefca10ceb3bdca32c402
4 changed files with 198 additions and 0 deletions
+67 -0 colored-chat-messages/en.md A
@@ -0,0 +1,67 @@
1 +---
2 +title: "Colored Chat Messages in CS 1.6 (client_print_color)"
3 +excerpt: "How to print colored chat text from an AMX Mod X plugin using client_print_color on 1.9+, the ^x03 team-color trick, and the SayText fallback for 1.8.2."
4 +category: "plugin-dev"
5 +tags: "chat, amxmodx"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Colored chat in Counter-Strike 1.6 is not a font feature — it is a set of control bytes the client interprets inside a <code>SayText</code> message. AMX Mod X 1.9 wrapped that in a clean native, <code>client_print_color()</code>, but the color rules underneath are the same on every version and they are what trips people up. This walks through the native, the color codes, and the fallback you need if you are still on 1.8.2.</p>
10 +
11 +<h2>1. The native (AMX Mod X 1.9 and newer)</h2>
12 +<p><code>client_print_color()</code> does not exist in 1.8.2. If you use it, your plugin's minimum is <strong>1.9</strong> — compile against 1.9 or 1.10 headers or you will hit <a href="/tutorials/fix-error-017-undefined-symbol">error 017 undefined symbol</a>. The signature:</p>
13 +<pre>client_print_color(id, sender, const message[], any:...)</pre>
14 +<p><code>id</code> is the receiver (<code>0</code> = everyone). <code>sender</code> is whose team color <code>^x03</code> resolves to — use the constant <code>print_team_default</code> for the neutral case:</p>
15 +<pre>client_print_color(0, print_team_default, "^x04[SERVER]^x01 Round starts in ^x0330^x01 seconds")</pre>
16 +
17 +<h2>2. The color codes</h2>
18 +<p>Colors are embedded as <code>^x</code> escape sequences directly in the string:</p>
19 +<table>
20 +<thead><tr><th>Code</th><th>Color</th></tr></thead>
21 +<tbody>
22 +<tr><td><code>^x01</code></td><td>Default (yellow-white)</td></tr>
23 +<tr><td><code>^x03</code></td><td>Team color of the <code>sender</code> index</td></tr>
24 +<tr><td><code>^x04</code></td><td>Green</td></tr>
25 +</tbody>
26 +</table>
27 +<p><code>^x03</code> is the interesting one: it is not a fixed color. It renders as the team color (blue for CT, red/orange for T) of whatever player index you pass as <code>sender</code>. Pass a real player id to color their name in their team color; pass <code>print_team_default</code> when the message has no owner.</p>
28 +
29 +<h2>3. Printing a player's name in team color</h2>
30 +<pre>new name[32]
31 +get_user_name(id, name, charsmax(name))
32 +client_print_color(0, id, "^x03%s^x01 planted the bomb", name)</pre>
33 +<p>Because <code>sender</code> is <code>id</code>, the <code>^x03</code> before the name resolves to that player's team color, and <code>^x01</code> returns the rest of the line to default. This is the idiom behind almost every kill-feed and announce plugin.</p>
34 +
35 +<h2>4. The 1.8.2 fallback: build the SayText yourself</h2>
36 +<p>On 1.8.2 you send the raw user message. Find the <code>SayText</code> message id once and write the control bytes manually:</p>
37 +<pre>new g_msgSayText
38 +public plugin_init() {
39 + g_msgSayText = get_user_msgid("SayText")
40 +}
41 +
42 +print_color(id, const msg[]) {
43 + message_begin(id ? MSG_ONE_UNRELIABLE : MSG_ALL, g_msgSayText, _, id)
44 + write_byte(id ? id : 1) // sender index for ^x03
45 + write_string(msg)
46 + message_end()
47 +}</pre>
48 +<p>You then embed the same <code>^x01/^x03/^x04</code> codes in <code>msg</code>. This is exactly what <code>client_print_color</code> does internally — which is why upgrading to 1.9 is worth it just to delete this boilerplate. If you would rather not write any of it, our <a href="/plugins/csb-admin-chat">CSB Admin Chat</a> plugin ships colored admin messages ready to go.</p>
49 +
50 +<h2>5. Watch the length and the newline</h2>
51 +<p>A single chat line is bounded — build the string into a fixed buffer and format into it rather than concatenating blindly:</p>
52 +<pre>new msg[191]
53 +formatex(msg, charsmax(msg), "^x04[SERVER]^x01 %s connected from ^x03%s", name, country)
54 +client_print_color(0, print_team_default, msg)</pre>
55 +<p>Two practical limits bite here. First, the client truncates very long chat lines, so anything past roughly 190 characters is dropped — count your color codes toward that budget, each <code>^xNN</code> is real bytes on the wire. Second, a message with no trailing newline is fine for <code>client_print_color</code>, but the hand-built <code>SayText</code> path needs the string exactly as the client expects; do not append your own <code>^n</code> unless you mean a line break. When in doubt, format into a sized buffer and let the native handle delivery.</p>
56 +
57 +<h2>Common errors</h2>
58 +<ul>
59 +<li><strong>Colors show as literal <code>^x04</code> text</strong> — you sent the string through <code>client_print(id, print_chat, ...)</code>, which does not parse color codes. Only <code>client_print_color</code> (or a hand-built <code>SayText</code>) does.</li>
60 +<li><strong>Everything after the name loses its color</strong> — you forgot to reset with <code>^x01</code> after a <code>^x03</code> segment. Codes persist until the next one.</li>
61 +<li><strong><code>^x03</code> is always white</strong> — you passed <code>print_team_default</code> (or index 0) as <code>sender</code>. It needs a live player index to pick a team color.</li>
62 +<li><strong>017 undefined symbol client_print_color</strong> — you are compiling on 1.8.2 headers. Move to <a href="/tutorials/install-amx-mod-x-1-9">AMX Mod X 1.9</a> or use the SayText fallback above.</li>
63 +<li><strong>Message only reaches one player when you wanted everyone</strong> — in the manual version, <code>MSG_ONE</code> with a specific id targets one client; use <code>MSG_ALL</code> and id <code>0</code> for a broadcast.</li>
64 +</ul>
65 +
66 +<h2>Verification</h2>
67 +<p>Load the plugin, join the server, and trigger the message. You should see the yellow default text with green and team-colored segments exactly where you placed the codes. Test it with a player on each team — the <code>^x03</code> segment must flip color between a CT and a T sender. If it renders as plain text, you are on the wrong print path; re-check step 1. The natives used here are documented in the <code>amxmodx</code> and <code>engine</code> includes if you want the full argument list.</p>
+57 -0 cs16-no-sound-windows/en.md A
@@ -0,0 +1,57 @@
1 +---
2 +title: "Fix: No Sound in CS 1.6 on Windows 10/11"
3 +excerpt: "CS 1.6 uses a 2003-era audio path that fights modern Windows audio. Here is the ordered checklist that fixes silent guns, missing footsteps and dead menus."
4 +category: "client"
5 +tags: "sound, windows"
6 +image: ""
7 +read_time: "7 min read"
8 +---
9 +<p>CS 1.6 predates modern Windows audio by two decades. It expects a simple, exclusive DirectSound device at a fixed sample rate, and Windows 10/11 give it a shared, enhanced, high-sample-rate device instead. The result is a game that launches fine but is completely silent, or has menu sound but no in-game audio. This is almost never a broken install — it is an audio-configuration mismatch, and the fixes below are ordered from most to least common.</p>
10 +
11 +<h2>1. Restart the sound engine from the console</h2>
12 +<p>The fastest test. Open the console in-game and run:</p>
13 +<pre>snd_restart</pre>
14 +<p>This re-initialises the audio device. If sound returns until the next map change, the problem is device re-acquisition, and the launch-option and Windows fixes below make it stick.</p>
15 +
16 +<h2>2. Set the Windows default device to a compatible format</h2>
17 +<p>CS 1.6's DirectSound path is happiest at CD quality. Right-click the speaker icon, open <em>Sound settings</em>, then your output device's <em>Properties</em>, then the <em>Advanced</em> tab, and set the default format to:</p>
18 +<pre>16 bit, 44100 Hz (CD Quality)</pre>
19 +<p>High-resolution modes like 24-bit/192000 Hz are a frequent cause of total silence in GoldSrc games. While you are on that page, disable exclusive-mode grabbing so nothing else steals the device:</p>
20 +<pre>Uncheck: "Allow applications to take exclusive control of this device"</pre>
21 +
22 +<h2>3. Turn off audio enhancements and spatial sound</h2>
23 +<p>Windows "enhancements", Dolby/DTS processing, and Spatial Sound all insert an audio pipeline that GoldSrc does not expect. In the same device <em>Properties</em> window, find the <em>Enhancements</em> tab (or, on Windows 11, <em>Audio enhancements</em> in the device page) and set it to <strong>Off</strong>. Set <em>Spatial sound</em> to <strong>Off</strong> as well.</p>
24 +
25 +<h2>4. Fix the in-game speaker configuration</h2>
26 +<p>An incorrect speaker setup can mute in-game audio while leaving menu sound working. In the game, go to <em>Options → Audio</em> and set the speaker configuration to <strong>Headphones</strong> or <strong>2 Speakers</strong> — the surround options rely on hardware acceleration GoldSrc no longer gets on modern Windows. Make sure the sound slider is not at zero, and confirm the console cvars:</p>
27 +<pre>volume 1.0
28 +suitvolume 0.25
29 +hisound 1
30 +s_a3d 0
31 +s_eax 0</pre>
32 +<p><code>s_eax 1</code> (EAX hardware audio) references a subsystem that does not exist on Windows 10/11 and can silence the game outright — keep it at 0.</p>
33 +
34 +<h2>5. Launch options as a last resort</h2>
35 +<p>If the device still will not initialise, force software audio. In Steam, right-click Counter-Strike, <em>Properties → Launch Options</em>, and try:</p>
36 +<pre>-sndspeed 44100</pre>
37 +<p>Avoid <code>-nosound</code> unless you are testing — that flag disables audio entirely and people forget they set it, then file a "no sound" report about it.</p>
38 +
39 +<h2>6. Rule out the wrong default device</h2>
40 +<p>If you have multiple outputs (monitor speakers over HDMI, a headset, onboard audio), CS 1.6 grabs the Windows <em>default</em> device at launch. Set the device you actually listen through as the default <em>before</em> starting the game, because GoldSrc does not follow live device switches — it binds once at startup. If you plug in a headset after the game is already running and hear nothing through it, this is why: quit, set it as default, and relaunch.</p>
41 +
42 +<h2>7. Reinstall the audio path only if nothing else works</h2>
43 +<p>If every setting above is correct and the game is still silent while other applications play sound normally, the game's audio files may be corrupt. Verify the install through Steam (right-click Counter-Strike, <em>Properties → Installed Files → Verify integrity of game files</em>), which re-downloads any damaged sound assets without wiping your configs. On non-Steam builds, restore the <code>sound</code> folder from a clean copy of the game. This is genuinely a last resort — a corrupt install is far rarer than a Windows audio-format mismatch.</p>
44 +
45 +<h2>Common errors</h2>
46 +<ul>
47 +<li><strong>Menu sound works, in-game is silent</strong> — almost always the speaker configuration (step 4) or <code>s_eax 1</code>. Set 2 Speakers/Headphones and <code>s_eax 0</code>.</li>
48 +<li><strong>Total silence from launch</strong> — the default device is at an unsupported sample rate (step 2) or you have <code>-nosound</code> in launch options.</li>
49 +<li><strong>Sound dies after every map change</strong> — device re-acquisition; the exclusive-mode and enhancement fixes make <code>snd_restart</code> unnecessary.</li>
50 +<li><strong>Crackling or stuttering audio</strong> — an enhancement/spatial pipeline is resampling; turn it off (step 3).</li>
51 +<li><strong>Sound only after you alt-tab out and back</strong> — another app holds the device in exclusive mode; uncheck exclusive control on both apps.</li>
52 +</ul>
53 +
54 +<h2>Verification</h2>
55 +<p>Join any server and fire a weapon in spawn. You should hear the shot, footsteps, and the buy-menu clicks. If menu sound works but the game is silent, you have not addressed step 4. To confirm the engine sees a live device, run in console:</p>
56 +<pre>snd_show 1</pre>
57 +<p>You should see sound channels light up as effects play. Once audio is stable, set <code>snd_show 0</code> again. If you also tweak your video and network settings, the <a href="/tutorials/cs16-best-launch-options">launch options guide</a> covers the rest of a clean client setup.</p>
+57 -0 rtv-nextmap-setup/en.md A
@@ -0,0 +1,57 @@
1 +---
2 +title: "Rock The Vote (RTV) and nextmap Setup Guide"
3 +excerpt: "Wire up AMX Mod X nextmap, timeleft and an end-of-map vote, add a working Rock The Vote, and set the extend and nomination cvars correctly."
4 +category: "administration"
5 +tags: "rtv, voting"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Map voting on CS 1.6 is three separate pieces that people conflate: the <code>nextmap</code> plugin that announces and schedules the next map, the end-of-map vote (<code>mapchooser</code>), and <em>Rock The Vote</em> — a mid-map player-initiated vote to change early. Two of those ship with AMX Mod X; RTV does not, and knowing which is which saves a lot of confusion.</p>
10 +
11 +<h2>1. Know what AMX Mod X already gives you</h2>
12 +<p>A default AMX Mod X install (see <a href="/tutorials/install-amx-mod-x-1-9">installing AMXX 1.9</a>) enables these in <code>configs/plugins.ini</code>:</p>
13 +<ul>
14 +<li><code>nextmap.amxx</code> — reads <a href="/tutorials/mapcycle-txt-setup">mapcycle.txt</a>, powers <code>say nextmap</code>, and forces the scheduled map at time limit.</li>
15 +<li><code>timeleft.amxx</code> — <code>say timeleft</code> and <code>say thetime</code>.</li>
16 +<li><code>mapchooser.amxx</code> — the end-of-map vote menu that pops up in the final minutes.</li>
17 +</ul>
18 +<p>None of these is Rock The Vote. RTV is a third-party plugin you add on top.</p>
19 +
20 +<h2>2. Configure the end-of-map vote (mapchooser)</h2>
21 +<p>By default <code>mapchooser</code> draws candidate maps from your mapcycle. You can pin an explicit pool instead with a votemap list at <code>configs/maps.ini</code> (one map per line). The cvars that matter live in <code>amxx.cfg</code> or <code>server.cfg</code>:</p>
22 +<pre>amx_extendmap_max 90 // total extra minutes a map may be extended to
23 +amx_extendmap_step 15 // minutes added each time "Extend" wins
24 +amx_vote_ratio 0.02 // fraction of players needed for a valid result
25 +amx_vote_time 10 // seconds the vote menu stays open</pre>
26 +<p>The vote fires in the closing minutes of <code>mp_timelimit</code>, so this whole system does nothing if <code>mp_timelimit 0</code>. Set a real time limit first — see the <a href="/tutorials/mp-cvars-reference">mp_ cvars reference</a>.</p>
27 +
28 +<h2>3. Add a real Rock The Vote plugin</h2>
29 +<p>Install the RTV <code>.amxx</code> into <code>addons/amxmodx/plugins/</code> and add its line to <code>plugins.ini</code>. Because RTV changes the map mid-round on demand, it needs guardrails so it cannot be spammed at round one:</p>
30 +<pre>// typical RTV cvars — confirm names against your plugin's own .sma/docs
31 +rtv_delay 15.0 // minutes into the map before RTV is allowed
32 +rtv_ratio 0.60 // fraction of connected players who must type rtv
33 +rtv_wait 5.0 // minutes between failed RTV attempts</pre>
34 +<blockquote>RTV plugins are not standardized. Cvar names differ between the popular versions, so read the header of the exact <code>.sma</code> you deploy rather than copying a list. The three concepts above — delay, ratio, cooldown — exist in every good implementation, whatever they are named.</blockquote>
35 +<p>Load order matters: RTV, <code>mapchooser</code> and <code>nextmap</code> all want to control the next map, and the one that registers first wins the forward. Put your vote plugins in a deliberate order in <code>plugins.ini</code> — see <a href="/tutorials/plugins-ini-load-order">plugins.ini load order</a>. If you want a maintained pairing, the <a href="/plugins/csb-mapchooser">CSB Mapchooser</a> plugin bundles RTV, nominations and the end-map vote so they do not fight each other.</p>
36 +
37 +<h2>4. Nominations and extend</h2>
38 +<p>Most RTV setups pair with a <code>nominate</code> command (<code>say nominate</code> or <code>say /nominate</code>) so players can push a specific map into the ballot. Keep the nomination pool identical to the vote pool — a map that can be nominated but is not installed produces a vote that resolves to a map the server then cannot load. The <code>Extend</code> option is governed by <code>amx_extendmap_max</code> and <code>amx_extendmap_step</code> above; set the max to a sane ceiling or a popular map gets extended for hours.</p>
39 +
40 +<h2>5. Make the schedule visible</h2>
41 +<p>Give players the commands so they use them instead of asking:</p>
42 +<pre>say nextmap // what plays next
43 +say timeleft // time remaining on this map
44 +say thetime // real-world server clock</pre>
45 +<p>An <a href="/plugins/csb-adverts">adverts plugin</a> that periodically prints these keeps the chat calm near map end.</p>
46 +
47 +<h2>Common errors</h2>
48 +<ul>
49 +<li><strong>RTV "does nothing"</strong> — the ratio is unreachable on a low-population server (60% of 4 players is 3, and two of them are bots). Lower <code>rtv_ratio</code> for small servers.</li>
50 +<li><strong>Vote never appears at map end</strong> — <code>mp_timelimit</code> is 0, or <code>mapchooser</code> is not in <code>plugins.ini</code>. The vote is scheduled off the time limit.</li>
51 +<li><strong>Two menus pop at once</strong> — RTV and <code>mapchooser</code> both triggered. Configure RTV to hand off to the end-map vote rather than run its own, or disable one.</li>
52 +<li><strong>Vote resolves to a missing map</strong> — your vote/nominate pool lists a map that is not in <code>cstrike/maps/</code>. Keep the pool and the installed maps in sync.</li>
53 +<li><strong>Nextmap wrong after a vote</strong> — a plugin changed the scheduled map but <code>nextmap</code> re-read the cycle. This is a load-order conflict; order the plugins deliberately.</li>
54 +</ul>
55 +
56 +<h2>Verification</h2>
57 +<p>Set <code>mp_timelimit 2</code> on a test server, connect, and type <code>rtv</code> with enough clients (or bots plus a lowered ratio) to cross the threshold — the vote menu must appear and the winning map must load. Separately, let the two minutes expire without voting and confirm <code>mapchooser</code> runs and <code>say nextmap</code> matched the result. When both paths work, restore your real <code>mp_timelimit</code>.</p>
+17 -0 sv-maxrate-maxupdaterate-values/en.md A
@@ -0,0 +1,17 @@
1 +---
2 +title: "sv_maxrate, sv_maxupdaterate and sv_minupdaterate: Correct Values"
3 +excerpt: "The server-side rate cvars are a ceiling on what every client is allowed to use. Set them wrong and you either choke good connections or invite abuse. Here are the values that make sense."
4 +category: "optimization"
5 +tags: "rates, cvars"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Client-side <code>rate</code>, <code>cl_updaterate</code> and <code>cl_cmdrate</code> only ever matter within the limits the server imposes. A player can ask for <code>cl_updaterate 101</code> all day; if your <code>sv_maxupdaterate</code> is 60, they get 60. These four server cvars — <code>sv_maxrate</code>, <code>sv_minrate</code>, <code>sv_maxupdaterate</code>, <code>sv_minupdaterate</code> — are the ceiling and floor for the whole server, and getting them right is the difference between a smooth 100-tick feel and a room full of people complaining about choke.</p><h2>1. What each cvar controls</h2><table><thead><tr><th>Cvar</th><th>Controls</th></tr></thead><tbody><tr><td><code>sv_maxrate</code></td><td>Maximum bytes/second the server sends to any one client. Caps each client's <code>rate</code>.</td></tr><tr><td><code>sv_minrate</code></td><td>Minimum bytes/second floor. Stops a client setting a tiny <code>rate</code> to game the netcode.</td></tr><tr><td><code>sv_maxupdaterate</code></td><td>Maximum world updates/second the server sends. Caps each client's <code>cl_updaterate</code>.</td></tr><tr><td><code>sv_minupdaterate</code></td><td>Minimum updates/second floor.</td></tr></tbody></table><p>There is no <code>sv_maxcmdrate</code>; the server does not cap how many command packets a client sends the same way, though <code>cl_cmdrate</code> effectively tops out around the update rate in practice.</p><h2>2. Sensible values for a public server</h2><p>For a normal internet server on ReHLDS or HLDS, put these in <a href="/tutorials/setup-server-cfg-cs16">server.cfg</a>:</p><pre>sv_maxrate 25000
10 +sv_minrate 15000
11 +sv_maxupdaterate 101
12 +sv_minupdaterate 30
13 +sv_timeout 60</pre><p><code>sv_maxupdaterate 101</code> lets well-connected players run the full 100-tick experience. <code>sv_minupdaterate 30</code> keeps a player on a poor connection from dropping their update rate so low that they become impossible to hit fairly. The rate floor of 15000 does the same job for bandwidth.</p><h2>3. About the number 100000</h2><p>The 25th Anniversary update in 2023 raised the default and maximum <code>rate</code> the client uses (older builds effectively clamped it around 25000–20000). On a modern engine you can safely allow more headroom:</p><pre>sv_maxrate 100000
14 +sv_minrate 25000</pre><p>This is worth doing on ReHLDS with mostly modern clients, because it lets high-updaterate players actually receive the data those updates need without hitting a bandwidth wall. If you still serve a lot of old or <a href="/tutorials/cs16-steam-legacy-beta">steam_legacy</a> clients, keep <code>sv_maxrate</code> nearer 25000 — they will not benefit from more and you save bandwidth.</p><h2>4. Unlimited rate (sv_maxrate 0) and why to avoid it</h2><p><code>sv_maxrate 0</code> removes the cap entirely. On a LAN that is fine. On a public server it is a mistake: it lets a client demand enormous bandwidth per tick, and it removes your only lever against a client that misconfigures itself into flooding the connection. Always set a real ceiling.</p><h2>5. How the client values interact with yours</h2><p>Every client value is clamped into your window. If a player sets <code>cl_updaterate 101</code> and your <code>sv_maxupdaterate</code> is 60, they run at 60. If they set <code>rate 100000</code> and your <code>sv_maxrate</code> is 25000, they run at 25000. This is why players sometimes insist "my rates are perfect" while the server serves them something else entirely — the ceiling wins. The full client side is in <a href="/tutorials/cs16-best-client-rates">best rate, cl_updaterate and cl_cmdrate settings</a>.</p><h2>6. Apply without a full restart</h2><p>These cvars can be changed live over RCON, but connected clients renegotiate their rate on the next connection, so the clean way is:</p><pre>rcon sv_maxupdaterate 101
15 +rcon sv_minupdaterate 30
16 +rcon sv_maxrate 25000
17 +rcon sv_minrate 15000</pre><p>Then change the map, or have players reconnect, so everyone picks up the new window.</p><h2>Common errors</h2><ul><li><strong>Players stuck at low update rate</strong> — <code>sv_maxupdaterate</code> is set low (often left at a default like 30 or 60). Raise it to 101.</li><li><strong>Everyone chokes at once</strong> — <code>sv_maxrate</code> is too low for the update rate you allow. High update rate plus a tight rate cap means the server cannot fit the data and clients show choke. Raise <code>sv_maxrate</code> or lower <code>sv_maxupdaterate</code> together. See <a href="/tutorials/fix-choke-loss-scoreboard">choke and loss on the scoreboard</a>.</li><li><strong>One player abuses a tiny rate</strong> — without <code>sv_minrate</code>/<code>sv_minupdaterate</code>, a client can drop to values that make their movement jerky and hard to hit. Set the floors.</li><li><strong>Values do not stick</strong> — something later in your config (a mod's cfg, <code>game.cfg</code>, or a plugin) overwrites them. Grep your configs and check execution order; related symptoms in <a href="/tutorials/fix-server-cfg-not-executing">server.cfg not executing</a>.</li></ul><h2>Verification</h2><p>Connect a client, set <code>cl_updaterate 101</code> and <code>rate 100000</code>, then open <code>net_graph 3</code> and watch the update rate the server actually delivers. It should sit at your <code>sv_maxupdaterate</code> with low choke. From the server, <code>rcon stats</code> should show healthy <code>Out</code> bandwidth without the FPS collapsing. If choke appears the moment you raise the update rate, your <code>sv_maxrate</code> is the limiter — raise it and retest.</p>
0 18