Romania XPlayZM.CSBlackDevil.COM # Zombie Plague UltimateX [ Respawn + FDL + VIP 22-12PM + POINTS] ® 17/32
Unknown ❤ RESPAWN.ZAFEST.RO | VIP FREE | FREE FOR ALL ❤ 0/32
France EMIRATES.KiNGS 亗 GAMEAREA ||͇̿P͇̿U͇̿B͇̿L͇̿I͇̿C͇̿| ✪ 32/32
Sunucu tanitimi

Add 6 tutorials (6 files)

Browse Source
Daemon666 committed parent 8221e38921 commit 11d3334c37574b6b36962f4d31937dfad7b179aa
6 changed files with 178 additions and 0 deletions
+9 -0 add-spawns-to-map/en.md A
@@ -0,0 +1,9 @@
1 +---
2 +title: "Adding Player Spawns (info_player_start / deathmatch)"
3 +excerpt: "Which spawn entities CS 1.6 actually uses, how info_player_start and info_player_deathmatch map to CT and T, how many you need, and the placement mistakes that cause spawn kills and \"stuck in wall\" bugs."
4 +category: "mapping"
5 +tags: "entities, cs-maps"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Every playable CS 1.6 map needs spawn points, and getting them wrong produces the classic new-mapper symptoms: everyone spawns on one team, players telefrag into each other, or half the server gets "stuck" the moment the round starts. The spawn entities are simple point entities, but the counts, team mapping, and placement rules are specific. This covers exactly what to place and where. It assumes you already have a compilable map from <a href="/tutorials/make-your-first-cs16-map">your first map</a>.</p><h2>1. Know the three spawn entities</h2><p>CS 1.6 maps its two teams onto Half-Life's spawn entities:</p><ul><li><code>info_player_start</code> &mdash; <strong>Counter-Terrorist</strong> spawns.</li><li><code>info_player_deathmatch</code> &mdash; <strong>Terrorist</strong> spawns.</li><li><code>info_vip_start</code> &mdash; the VIP spawn, used only on <code>as_</code> (assassination) maps.</li></ul><p>That CT/T mapping is a GoldSrc convention people constantly get backwards; there is no <code>info_player_ct</code> or <code>info_player_t</code>. If your CTs and Ts are swapped, this is why.</p><h2>2. Place enough of each</h2><p>You need one spawn point per player per team, plus a margin. For a 16-slot server (8 vs 8) place at least 12&ndash;16 of each entity; for a big 32-slot map, place 20 or more each. When there are fewer spawns than players on a team, the engine has to squeeze two players into one point &mdash; the origin of the "stuck together / telefragged at spawn" bug. More spawns than players is harmless; too few is not.</p><h2>3. Position them correctly in the world</h2><p>A spawn is a point entity with an origin and an angle. Placement rules that prevent bugs:</p><ul><li>Sit each spawn a little <em>above</em> the floor, not embedded in it. If the origin is inside the floor brush or a wall, the player spawns stuck or falls through.</li><li>Give each one clearance &mdash; roughly a player's bounding box (about 32 units wide, 72 tall). Spawns crammed together let two players occupy the same space.</li><li>Set the <strong>angle</strong> so players face into the map, toward the action, not into a wall.</li></ul><h2>4. Set the angles deliberately</h2><p>In the editor, the entity's <code>angles</code>/yaw controls the direction the player looks on spawn. Point CTs toward their objective and Ts toward theirs so nobody spends the first second spinning around. In a bomb-defusal map, face each team roughly toward the bombsites they will fight over.</p><h2>5. Group each team's spawns</h2><p>CT spawns and T spawns belong in their respective spawn areas, spread across a small cluster rather than stacked in a line. Spreading them reduces spawn-kill potential (a single grenade cannot catch the whole team) and gives the round a natural fan-out. Keep the two teams' spawn clusters far apart so nobody spawns in sight of the enemy.</p><h2>6. Compile and load</h2><p>Spawns are ordinary entities, so they take effect on a normal compile &mdash; no special step. Run your usual ZHLT/VHLT compile (<a href="/tutorials/zhlt-vhlt-compile-parameters">compile parameters</a>), load the BSP, and start a round with a few bots or a friend to see both teams appear where you intended.</p><h2>Common errors</h2><ul><li><strong>Everyone spawns as one team</strong> &mdash; you placed only <code>info_player_start</code> (CT) or only <code>info_player_deathmatch</code> (T). Both entities must exist for a two-team map.</li><li><strong>Players stuck together / telefragged at round start</strong> &mdash; too few spawns for the team size, so players share points. Add more of each entity.</li><li><strong>Spawn falls through the floor or is stuck in geometry</strong> &mdash; the origin is inside a brush. Raise it a few units above the floor with clearance around it.</li><li><strong>Players face a wall on spawn</strong> &mdash; the entity angle points the wrong way. Set the yaw toward the map.</li><li><strong>"Spawnpoint out of bounds" or players die instantly</strong> &mdash; a spawn is outside the sealed world or inside a trigger_hurt. Move it into playable, safe space.</li></ul><h2>Verification</h2><p>Load the map and fill both teams with bots or players. Confirm CTs appear at the <code>info_player_start</code> cluster and Ts at the <code>info_player_deathmatch</code> cluster, each facing into the map, with nobody stuck or overlapping. Run several rounds and watch for anyone spawning inside another player &mdash; if that happens, add spawns. A good final check is to fill the server to its maximum player count and re-run a round: bugs that never appear at 4 vs 4 surface immediately when 16 players try to claim spawns at once, because that is exactly when the engine runs out of points and starts doubling players up. Watch the round-start moment closely at full capacity rather than trusting a lightly populated test. If a whole team spawns wrong, you likely swapped the CT/T entity mapping. For servers that struggle with bad spawn placement at runtime, the <a href="/plugins/csb-bad-spawn-preventer">CSB Bad Spawn Preventer</a> and <a href="/plugins/csb-map-spawn-editor">CSB Map Spawn Editor</a> can patch spawns without recompiling.</p>
+20 -0 generate-res-file/en.md A
@@ -0,0 +1,20 @@
1 +---
2 +title: "Generating a .res File for Custom Map Content"
3 +excerpt: "What a .res file lists, why every custom model, sound, sprite and texture must appear in it, and how to build one with RESGen or by hand."
4 +category: "mapping"
5 +tags: "res-file, fastdl"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>A <code>.res</code> file is the manifest that tells clients exactly which extra files a map needs, so the server can send them and FastDL can host them. Without it, a map that references a custom model or sound will load with <code>ERROR</code> models and silent weapons for anyone who does not already have the content. The <code>.res</code> lives next to the map &mdash; <code>maps/de_mymap.res</code> beside <code>maps/de_mymap.bsp</code> &mdash; and lists every custom file the map pulls in. This is how you build one correctly.</p><h2>1. Know what belongs in a .res</h2><p>The file lists game-relative paths, one per line, to <strong>every custom asset the map references that is not part of stock CS</strong>:</p><ul><li>Models under <code>models/</code> (custom props, view models)</li><li>Sounds under <code>sound/</code> (ambient_generic, custom weapon sounds)</li><li>Sprites under <code>sprites/</code> (glows, custom HUD art the map spawns)</li><li>The overview under <code>overviews/</code> (<code>.bmp</code> + <code>.txt</code>) if you made one</li><li>The skybox files under <code>gfx/env/</code> if the map uses a custom sky</li><li>Detail textures and any custom <code>.wad</code> you ship externally</li></ul><p>You do <em>not</em> list the <code>.bsp</code> itself, and you do not list stock content every client already has &mdash; that just wastes bandwidth. Paths are relative to <code>cstrike/</code>.</p><h2>2. Build it automatically with RESGen</h2><p>RESGen is the standard tool for this: it scans a <code>.bsp</code>, finds every entity that references an external file, and writes the <code>.res</code>. Point it at your compiled map:</p><pre>RESGen.exe de_mymap.bsp</pre><p>It produces <code>de_mymap.res</code> with the models, sounds, sprites and sky it detected. RESGen reads the entity data (<code>ambient_generic</code> sound paths, <code>cycler</code>/<code>env_sprite</code> model and sprite paths, the skybox name) so it catches things you would forget by hand. Always open the result and read it &mdash; RESGen finds referenced files, but it cannot know about content your map only loads indirectly.</p><h2>3. Write or fix one by hand</h2><p>A <code>.res</code> is plain text; you can author or patch it in any editor. The format is a list of quoted, game-relative paths, and comment lines start with <code>//</code>:</p><pre>// de_mymap.res
10 +"models/props/mymap_crate.mdl"
11 +"sound/ambient/mymap_wind.wav"
12 +"sprites/mymap_glow.spr"
13 +"gfx/env/mysky_up.tga"
14 +"gfx/env/mysky_dn.tga"
15 +"gfx/env/mysky_lf.tga"
16 +"gfx/env/mysky_rt.tga"
17 +"gfx/env/mysky_ft.tga"
18 +"gfx/env/mysky_bk.tga"
19 +"overviews/de_mymap.bmp"
20 +"overviews/de_mymap.txt"</pre><p>Add any file RESGen missed, and delete lines for content that is actually stock. Each path must match the real file on disk exactly &mdash; wrong case or a typo means that one file never downloads.</p><h2>4. Include the skybox and overview</h2><p>Two things mappers forget: the six skybox faces in <code>gfx/env/</code> (named after your sky with the <code>up/dn/lf/rt/ft/bk</code> suffixes) and the radar overview in <code>overviews/</code>. If the map uses a custom sky set in <a href="/tutorials/light-environment-and-sky">light_environment and skybox</a>, all six faces must be listed or players get a plain sky. List both the <code>.bmp</code> and <code>.txt</code> of a custom overview.</p><h2>5. Place it and let the server use it</h2><p>Drop <code>de_mymap.res</code> in <code>cstrike/maps/</code> next to the BSP. The dedicated server reads it when the map loads and offers each listed file to connecting clients; FastDL then serves those files over HTTP if <code>sv_downloadurl</code> is set. The <code>.res</code> is the bridge between your map and <a href="/tutorials/package-map-for-fastdl">the FastDL packaging step</a>.</p><h2>6. Keep the .res in sync as the map changes</h2><p>The most common way a <code>.res</code> goes wrong is drift: you add a new ambient sound or swap a model in a later build and forget to regenerate the manifest, so the old <code>.res</code> silently omits the new asset. Make regenerating the <code>.res</code> the last step of every compile-and-ship cycle, not a one-time job. Re-run RESGen on each new <code>.bsp</code>, diff the result against the previous <code>.res</code>, and add anything new. If you maintain the file by hand, keep it open next to your entity work so a new <code>ambient_generic</code> path goes into the manifest the moment you place the entity. A stale <code>.res</code> is indistinguishable, from the player's side, from having no <code>.res</code> at all for the files it forgot.</p><h2>Common errors</h2><ul><li><strong>Players get <code>ERROR</code> models or silent sounds</strong> &mdash; the asset is not listed in the <code>.res</code> (or the path is wrong). Add or correct the line.</li><li><strong>Sky is plain / wrong for players</strong> &mdash; the six <code>gfx/env/</code> faces are missing from the <code>.res</code>. List all six.</li><li><strong>One file never downloads, rest work</strong> &mdash; a case or spelling mismatch between the <code>.res</code> line and the file. Match it exactly.</li><li><strong>RESGen produced an empty or tiny list</strong> &mdash; run it on the compiled <code>.bsp</code>, not the <code>.map</code>; it reads entity data from the BSP.</li><li><strong>Listed stock files too</strong> &mdash; harmless but wasteful; the client re-downloads content it already has. Trim stock entries.</li></ul><h2>Verification</h2><p>The real test is a clean client with none of the custom content. Connect it to a server running the map with FastDL configured and watch the download screen &mdash; every file in the <code>.res</code> should transfer, and the map should then show its models, sounds and sky correctly. If something is still missing, compare the missing asset's path against the <code>.res</code> line for a typo. Then move on to <a href="/tutorials/package-map-for-fastdl">packaging the whole map for FastDL</a>.</p>
+50 -0 install-bhop-server/en.md A
@@ -0,0 +1,50 @@
1 +---
2 +title: "How to Set Up a Bhop Server with a Timer"
3 +excerpt: "How to build a bunnyhop server on CS 1.6: the engine cvars that shape movement, an auto-bhop plugin so jumps chain, a KZ-style timer for records, and the map and rate settings that make it feel right."
4 +category: "installation"
5 +tags: "bhop, mods"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>A bunnyhop (bhop) server is a movement server: players chain jumps to build speed, and a timer records how fast they clear a course. CS 1.6 has no built-in "bhop mode" &mdash; you assemble it from an engine that allows the movement, a plugin that makes jumps chain reliably, and a timer plugin that records times. This walks through a clean setup on ReHLDS.</p>
10 +
11 +<h2>1. Start on ReHLDS + ReGameDLL</h2>
12 +<p>Bhop servers live or die on movement consistency, so run the maintained stack: <a href="/tutorials/install-rehlds-on-linux">ReHLDS</a> with <a href="/tutorials/install-regamedll-cs16">ReGameDLL_CS</a> underneath. ReGameDLL gives you clean control over the movement code and the cvars below behave predictably. Add <a href="/tutorials/install-metamod-r">Metamod-r</a> and <a href="/tutorials/install-amx-mod-x-1-9">AMX Mod X 1.9</a> on top, because the bhop and timer plugins are AMXX plugins.</p>
13 +
14 +<h2>2. Set the movement cvars</h2>
15 +<p>Two engine cvars shape how bhop feels. Put them in <a href="/tutorials/setup-server-cfg-cs16">server.cfg</a>:</p>
16 +<pre>sv_airaccelerate 100
17 +sv_maxspeed 320</pre>
18 +<p><code>sv_airaccelerate</code> controls how fast you can gain speed while strafing in the air; stock CS uses <code>10</code>, and bhop/KZ servers raise it (100 is a common value) so strafing actually accelerates you. <code>sv_maxspeed</code> caps ground speed &mdash; leave it at the CS default of <code>320</code> unless you deliberately want a faster feel. Do not confuse this with a bunnyhop cvar; CS 1.6 has no stock "enable bhop" switch, which is why you need the plugin in the next step.</p>
19 +
20 +<h2>3. Install an auto-bhop plugin</h2>
21 +<p>On stock CS, the engine inserts a small penalty that makes perfectly-timed manual jumps hard, so most bhop servers run an auto-bhop plugin that fires the jump the instant you land while holding jump &mdash; the classic "hold space to bhop" behaviour. Our GPL implementation is <a href="/plugins/csb-bhop-enable">CSB Bhop Enable</a>. Drop its <code>.amxx</code> into the plugins folder and register it &mdash; see <a href="/tutorials/install-amxx-plugin-files">installing plugin files</a> and <a href="/tutorials/plugins-ini-load-order">plugins.ini load order</a>:</p>
22 +<pre>bhop_enable.amxx</pre>
23 +<p>Most such plugins expose a cvar to toggle auto-jump and a per-player <code>say</code> command so purists can turn it off and hop manually. If you want stacked jumps for movement gimmicks, <a href="/plugins/csb-multi-jump">CSB Multi-Jump</a> grants a configurable number of mid-air jumps.</p>
24 +
25 +<h2>4. Add a timer for records</h2>
26 +<p>What makes it a bhop <em>server</em> rather than just a mod is the timer: a run starts when the player leaves the start zone and stops at the end zone, and the plugin stores the time and a leaderboard. Use <a href="/plugins/csb-kz-timer">CSB KZ-Timer</a>, which times runs, shows a live speedometer and clock on the HUD, and keeps per-map records. Add it to <code>plugins.ini</code>:</p>
27 +<pre>kz_timer.amxx</pre>
28 +<p>The timer keys records by SteamID, so on a non-Steam server make sure <a href="/tutorials/install-reunion">Reunion</a> is handing out stable ids &mdash; otherwise two players share a record and the leaderboard is meaningless.</p>
29 +
30 +<h2>5. Load bhop or KZ maps</h2>
31 +<p>Bhop courses are custom maps (typically prefixed <code>bhop_</code>, and KZ climbing maps <code>kz_</code>). Put the <code>.bsp</code> files in <code>cstrike/maps/</code>, add them to <code>mapcycle.txt</code>, and serve them over <a href="/tutorials/fastdl-setup-guide">FastDL</a> so players download them quickly on join. These maps have start and end zones the timer reads, so use maps built for timing rather than generic community maps.</p>
32 +
33 +<h2>6. Tune the server for movement</h2>
34 +<p>Movement players are sensitive to registration, so raise the rates. In server.cfg:</p>
35 +<pre>sys_ticrate 1000
36 +sv_maxupdaterate 100
37 +sv_maxrate 100000</pre>
38 +<p>A high <code>sys_ticrate</code> keeps the server frame time low so jumps land consistently, and generous rate caps let clients run 100 updates/sec. Turn friendly fire off and set a long <code>mp_timelimit</code> or none &mdash; bhop players want to stay on a map and grind a time, not rotate every 20 minutes.</p>
39 +
40 +<h2>Common errors</h2>
41 +<ul>
42 +<li><strong>Jumps do not chain / feel sticky</strong> &mdash; no auto-bhop plugin, or <code>sv_airaccelerate</code> left at the stock <code>10</code>. Add the plugin and raise airaccelerate.</li>
43 +<li><strong>Timer never starts</strong> &mdash; the map has no start/end zones the timer recognises. Use maps built for the timer plugin.</li>
44 +<li><strong>Two players share the top time</strong> &mdash; colliding non-Steam SteamIDs. Fix identity with <a href="/tutorials/install-reunion">Reunion</a>.</li>
45 +<li><strong>Speed feels capped no matter what</strong> &mdash; a plugin or config is clamping <code>sv_maxspeed</code>; read it back in the console and trace what re-sets it.</li>
46 +<li><strong>Choppy movement under load</strong> &mdash; <code>sys_ticrate</code> too low or the box is CPU-starved. Raise ticrate and check server FPS.</li>
47 +</ul>
48 +
49 +<h2>Verification</h2>
50 +<p>Load a <code>bhop_</code> map, hold jump, and confirm you chain hops and build speed &mdash; the speedometer from the timer should climb as you strafe. Cross the start zone and confirm the clock starts, then the end zone and confirm it stops and records a time. Reconnect and check your record survived, which proves the timer is keying by a stable id. When hops chain, the clock runs, and records persist, the server is complete.</p>
+47 -0 install-custom-models-server/en.md A
@@ -0,0 +1,47 @@
1 +---
2 +title: "How to Add Custom Player and Weapon Models Server-Side"
3 +excerpt: "Place custom player and weapon models on the server, distribute them over FastDL, precache them safely, and avoid the model-overflow crash that kills busy servers."
4 +category: "installation"
5 +tags: "models, custom-content"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>Custom models &mdash; a fresh AK viewmodel, reskinned player models, a distinctive knife &mdash; make a server feel like yours. Doing it server-side means every player sees the same content, downloaded automatically. The work is in three parts: placing the files, distributing them, and precaching them without blowing the engine's model limit. That last part is what separates a stable custom server from one that crashes on a full house.</p>
10 +<h2>1. Understand the two kinds of model swap</h2>
11 +<ul>
12 +<li><strong>Weapon models</strong> come in three variants per weapon: <code>v_</code> (viewmodel, what you hold), <code>p_</code> (player model attachment others see), and <code>w_</code> (world/dropped model). They live in <code>cstrike/models/</code> (e.g. <code>v_ak47.mdl</code>).</li>
13 +<li><strong>Player models</strong> live in <code>cstrike/models/player/&lt;name&gt;/&lt;name&gt;.mdl</code>. Replacing the default team models changes everyone; adding new ones requires a plugin to assign them.</li>
14 +</ul>
15 +<h2>2. Place the files</h2>
16 +<p>To replace a default weapon skin globally, drop the custom <code>.mdl</code> over the default path:</p>
17 +<pre>cstrike/models/v_ak47.mdl
18 +cstrike/models/p_ak47.mdl
19 +cstrike/models/w_ak47.mdl</pre>
20 +<p>The client downloads whichever files it lacks and uses them in place of its own. For player models, place them under <code>models/player/</code> in their own subfolder; the folder name must match the <code>.mdl</code> name or the model will not load.</p>
21 +<h2>3. Distribute over FastDL</h2>
22 +<p>Custom models only reach players if downloads are enabled and the files are on your mirror. Set the download cvars:</p>
23 +<pre>sv_allowdownload 1
24 +sv_downloadurl "http://dl.example.com"</pre>
25 +<p>Copy the exact <code>models/</code> paths into the FastDL web root's <code>cstrike/models/</code> and bzip2-compress them. The mechanics are in <a href="/tutorials/install-cs16-server-nginx-fastdl">the Nginx FastDL guide</a> and <a href="/tutorials/sv-allowdownload-settings">sv_allowdownload settings</a>. A client with <code>cl_allowdownload 0</code> will see the default model regardless &mdash; you cannot override their choice.</p>
26 +<h2>4. Precache so the model is transmitted</h2>
27 +<p>Simply overwriting a default file works because the engine already precaches that path. For <em>new</em> models &mdash; ones the base game does not reference &mdash; the server must precache them at map start or clients never receive them. The standard approach is a small AMX Mod X plugin using the plugin-precache forward:</p>
28 +<pre>public plugin_precache() {
29 + precache_model("models/player/ninja/ninja.mdl")
30 + precache_model("models/v_customknife.mdl")
31 +}</pre>
32 +<p>Or list them in the map's <code>.res</code> file so they download without being precached as active models. Player-model assignment plugins such as <a href="/plugins/csb-weapon-models">CSB Weapon Models</a> handle both the precache and the per-player <code>SetUserModel</code> call for you.</p>
33 +<h2>5. Respect the model limit</h2>
34 +<p>The GoldSrc engine caps the number of precached models. Every custom model you add counts against that budget alongside the map's own models, and a busy custom server that piles on weapon skins, player models and decorative props can exceed it &mdash; producing a hard crash, not a warning. Quote the symptom people search for:</p>
35 +<blockquote>Host_Error: PF_precache_model_I: Model ... overflow</blockquote>
36 +<p>The fix is budgeting: remove models you do not need, combine variants, and prefer replacing existing default models (which cost no extra precache slot) over adding brand-new ones. The full diagnosis is in <a href="/tutorials/fix-model-overflow-precache">the model-overflow fix</a>.</p>
37 +<h2>6. Keep filenames and structure exact</h2>
38 +<p>Models reference their own textures and sequences by internal name. A player model in <code>models/player/ninja/</code> whose <code>.mdl</code> is not named <code>ninja.mdl</code> will not load; a weapon model missing its <code>.bmp</code>-style external textures (for older models) shows as a checkerboard. Test each model in a listen server before deploying to a public one, and add custom sounds the same way under <code>sound/</code>, listed in the <code>.res</code>.</p>
39 +<h2>Troubleshooting</h2>
40 +<ul>
41 +<li><strong>Model shows as a giant <code>ERROR</code> sign</strong> &mdash; the file failed to precache or download. Confirm it is on the FastDL mirror and precached in <code>plugin_precache()</code>.</li>
42 +<li><strong>Server crashes on a full server with <code>... overflow</code></strong> &mdash; you exceeded the precache model limit. Trim models; see <a href="/tutorials/fix-model-overflow-precache">the fix</a>.</li>
43 +<li><strong>One player sees defaults, everyone else sees the skin</strong> &mdash; that client set <code>cl_allowdownload 0</code>. Only they can change it.</li>
44 +<li><strong>Purple/black checkerboard model</strong> &mdash; missing external textures or a corrupt <code>.mdl</code>. Re-export the model with textures embedded.</li>
45 +</ul>
46 +<h2>Verification</h2>
47 +<p>Join with a clean client (delete the custom files locally first) and confirm it downloads and displays the custom model, not the default and not an <code>ERROR</code> sign. Then fill the server or run a bot-heavy map to confirm you stay under the precache limit &mdash; a crash only when many models and players are active is the overflow signature. If a fresh client downloads and renders every model on a full server without crashing, your custom content is deployed correctly.</p>
+43 -0 install-rehlds-metamod-amxx-windows/en.md A
@@ -0,0 +1,43 @@
1 +---
2 +title: "Full ReHLDS + Metamod-r + AMXX Install on Windows"
3 +excerpt: "Install the full ReHLDS, Metamod-r, and AMX Mod X stack on a Windows CS 1.6 server, layer by layer, and verify each one loaded."
4 +category: "installation"
5 +tags: "windows, rehlds, amxmodx"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>This is the full modern Windows stack for a CS 1.6 dedicated server: <strong>ReHLDS</strong> replaces the stock engine, <strong>Metamod-r</strong> loads game-DLL plugins, and <strong>AMX Mod X</strong> loads as a Metamod plugin to give you admin commands and the plugin ecosystem. Each layer plugs into the one below it, and the order you install them in matters. This guide does all three on Windows.</p>
10 +<h2>1. Start with a working HLDS install</h2>
11 +<p>You need a base CS 1.6 server first. If you do not have one, follow <a href="/tutorials/install-cs16-dedicated-server-windows">the Windows dedicated-server guide</a> to get a stock server that launches and shows in the browser. Confirm it runs before adding anything &mdash; every problem below is easier to diagnose when you know the base worked.</p>
12 +<h2>2. Install ReHLDS (the engine)</h2>
13 +<p>ReHLDS is a drop-in replacement for the GoldSrc engine. On Windows the engine is <code>swds.dll</code> in the HLDS root. Back up the original and replace it with the ReHLDS build:</p>
14 +<pre>copy swds.dll swds.dll.stock
15 +copy rehlds\swds.dll swds.dll</pre>
16 +<p>ReHLDS ships as a matching <code>swds.dll</code> and its companion files; drop them into the server root. It is faster and actively maintained, and it is the prerequisite for ReGameDLL and ReAPI later. The full walkthrough with the file list is in <a href="/tutorials/install-rehlds-on-windows">install ReHLDS on Windows</a>. Launch the server once now &mdash; it must still start on the new engine before you layer Metamod on top.</p>
17 +<h2>3. Install Metamod-r</h2>
18 +<p>Metamod inserts itself between the engine and the game DLL. You point the game at Metamod, and Metamod then loads the real game DLL plus its own plugins. Put the DLL in place:</p>
19 +<pre>cstrike\addons\metamod\metamod.dll</pre>
20 +<p>Then edit <code>cstrike\liblist.gam</code> and change the <code>gamedll</code> line to load Metamod instead of the stock game DLL:</p>
21 +<pre>gamedll "addons\metamod\metamod.dll"</pre>
22 +<p>That single redirect is what activates Metamod &mdash; the engine now loads Metamod as the "game", and Metamod loads the actual <code>mp.dll</code> behind the scenes. Metamod-r versus classic Metamod-P is discussed in <a href="/tutorials/metamod-r-vs-metamod-p">this comparison</a>; on ReHLDS, Metamod-r is the right choice.</p>
23 +<h2>4. Load AMX Mod X as a Metamod plugin</h2>
24 +<p>AMX Mod X is itself a Metamod plugin. Copy the AMXX files into <code>cstrike\addons\amxmodx\</code>, then add its DLL to Metamod's plugin list at <code>cstrike\addons\metamod\plugins.ini</code>:</p>
25 +<pre>win32 addons\amxmodx\dlls\amxmodx_mm.dll</pre>
26 +<p>On Windows the AMXX Metamod module is <code>amxmodx_mm.dll</code>; on Linux the same line uses <code>amxmodx_mm_i386.so</code>. The path columns and win32/linux distinction are explained in <a href="/tutorials/metamod-plugins-ini-explained">metamod/plugins.ini explained</a>. From here, AMXX's own plugins load through <code>addons\amxmodx\configs\plugins.ini</code> &mdash; a different file &mdash; as covered in <a href="/tutorials/install-amx-mod-x-1-9">the AMX Mod X 1.9 guide</a>.</p>
27 +<h2>5. Verify each layer loaded</h2>
28 +<p>Start the server and check from the console, bottom-up:</p>
29 +<pre>meta list
30 +amxx version
31 +amxx plugins</pre>
32 +<p><code>meta list</code> lists Metamod plugins &mdash; AMXX should appear and read <code>running</code>. <code>amxx version</code> confirms AMXX itself initialised. <code>amxx plugins</code> lists the Pawn plugins AMXX loaded. If all three respond, the whole stack is live.</p>
33 +<p>Work strictly bottom-up when something breaks: an engine that will not boot masks a Metamod problem, and a Metamod that will not load makes AMXX look broken when it is fine. Add one layer, launch, confirm it works, then add the next. The Windows-specific traps are a <code>swds.dll</code> from the wrong ReHLDS build, a <code>liblist.gam</code> edit saved with a stray extension by Notepad, and a <code>plugins.ini</code> line using the <code>linux</code> keyword or the <code>.so</code> file by mistake &mdash; all three fail quietly rather than printing an obvious error.</p>
34 +<h2>Troubleshooting</h2>
35 +<ul>
36 +<li><strong>Server will not start after the ReHLDS swap</strong> &mdash; wrong or mismatched <code>swds.dll</code>. Restore <code>swds.dll.stock</code>, confirm the base boots, then re-copy the correct ReHLDS build.</li>
37 +<li><strong>"Metamod: Couldn't load plugin" / bad load on AMXX</strong> &mdash; a path or architecture mismatch in <code>plugins.ini</code>. See <a href="/tutorials/fix-metamod-bad-load">fix Metamod bad load</a>; confirm you used the <code>win32</code> line and the <code>.dll</code>.</li>
38 +<li><strong><code>meta list</code> shows no AMXX line</strong> &mdash; the AMXX line is missing from Metamod's <code>plugins.ini</code>, or you edited the wrong <code>plugins.ini</code>. Work through <a href="/tutorials/fix-meta-list-no-amxx">meta list has no AMXX</a>.</li>
39 +<li><strong><code>meta</code> is an unknown command</strong> &mdash; the <code>liblist.gam</code> <code>gamedll</code> edit did not take. Confirm the exact line and path.</li>
40 +<li><strong>AMXX loads but plugins do not</strong> &mdash; wrong file: AMXX plugins live in <code>addons\amxmodx\configs\plugins.ini</code>, not Metamod's.</li>
41 +</ul>
42 +<h2>Verification</h2>
43 +<p>Run the three console checks above in order and confirm each responds. Join the server as a listen admin and type <code>amx_help</code> &mdash; it should print the admin command list. Then change the map and re-run <code>meta list</code> and <code>amxx plugins</code> to confirm the stack survives a map change, which is when everything reloads. Once it does, add ReGameDLL and ReAPI as described in <a href="/tutorials/install-rehlds-regamedll-reapi-stack">the modern stack guide</a>.</p>
+9 -0 protocol-47-vs-48/en.md A
@@ -0,0 +1,9 @@
1 +---
2 +title: "Protocol 47 vs 48 Explained"
3 +excerpt: "What the GoldSrc network protocol number means, why non-Steam clients often speak 47 while Steam clients speak 48, and how dproto or Reunion let a server answer both."
4 +category: "misc"
5 +tags: "protocol, non-steam"
6 +image: ""
7 +read_time: "8 min read"
8 +---
9 +<p>If some players connect fine and others bounce off your server with <strong>&quot;This server is using a different protocol&quot;</strong>, you are looking at a protocol-version mismatch &mdash; almost always the classic 47-versus-48 split. Understanding what those numbers are makes the fix obvious. Here is the whole picture.</p><h2>1. What the protocol number is</h2><p>The GoldSrc network protocol version is a single integer the client and server exchange when connecting. It identifies the wire format they use to talk &mdash; how connect packets, messages, and the handshake are structured. If the client's protocol number does not match what the server accepts, the connection is refused before the player ever loads the map. It is a compatibility handshake, nothing more.</p><h2>2. 48 is current Steam; 47 is the older era</h2><ul><li><strong>Protocol 48</strong> is the current protocol spoken by the modern <strong>Steam</strong> Counter-Strike 1.6 client. A stock, updated Steam server and a stock Steam client both use 48 and connect without any special configuration.</li><li><strong>Protocol 47</strong> is the older protocol from the pre-Steam / early Half-Life era (the 1.1.0.4-generation engine). A number of <strong>non-Steam</strong> clients &mdash; older CS 1.6 distributions people still run &mdash; speak 47.</li></ul><p>So the mismatch is structural: a non-Steam client built around protocol 47 tries to join a server that only accepts 48, the numbers disagree, and the client is told the server uses a different protocol. The same happens in reverse for a 48-only client hitting a 47-only server.</p><h2>3. The fix: make the server answer both</h2><p>You do not pick 47 <em>or</em> 48 &mdash; you make the server accept <strong>both</strong>, so 47 and 48 clients can all connect. Two tools do this depending on your engine:</p><ul><li><strong>Reunion</strong> &mdash; the non-Steam support module for <strong>ReHLDS</strong>. It handles clients across protocol versions and steam/non-steam auth, letting a modern ReHLDS server accept legacy protocol-47 clients alongside protocol-48 ones. See <a href="/tutorials/install-reunion">installing Reunion</a>. Note Reunion needs a <code>SteamIdHashSalt</code> of at least 16 characters or it refuses to load.</li><li><strong>dproto</strong> &mdash; the equivalent for original <strong>HLDS</strong>. Same idea: it lets a stock-engine server answer both protocols and admit non-Steam clients.</li></ul><p>With one of these installed and configured, a single server serves the whole audience &mdash; Steam players on 48 and older non-Steam players on 47 all get in. The full walkthrough is in <a href="/tutorials/make-server-accept-nonsteam">making your server accept non-Steam clients</a>, and the specific error is covered in <a href="/tutorials/fix-protocol-mismatch-47-48">fixing the 47/48 protocol mismatch</a>.</p><h2>4. Why the 25th Anniversary update made this louder</h2><p>The 2023 <a href="/tutorials/25th-anniversary-update-recap">anniversary update</a> changed engine and networking behaviour, which shook loose a lot of previously-working non-Steam connections and surfaced protocol errors that had been quietly handled before. Moving to an updated ReHLDS + Reunion stack is the durable answer; rolling the client or server to <code>steam_legacy</code> is the stopgap.</p><h2>5. What the client actually experiences</h2><p>It helps to trace one failed join. The client sends a connect request stamped with its protocol number. The server compares it against the protocols it accepts. On a plain server that number is a single value &mdash; 48 for a modern Steam server &mdash; and any client whose stamp does not match is rejected immediately with &quot;This server is using a different protocol,&quot; before authentication, before the map, before anything. With Reunion or dproto loaded, the server accepts a <em>range</em> of protocol numbers and the appropriate auth path for each, so a 47-stamped connect and a 48-stamped connect are both admitted and routed correctly. From the player's side the difference is stark: same server address, but one build bounces and the other loads &mdash; and the only thing that changed is whether the server was taught to speak both protocols. That is why the fix always belongs on the server, never on the individual player's machine.</p><h2>Common misconceptions</h2><ul><li><strong>&quot;Protocol 47 is non-Steam and 48 is Steam, always.&quot;</strong> Roughly true in practice but the number describes the <em>engine protocol</em>, not the store. Some non-Steam clients speak 48; the point is that <em>47-only</em> clients are the ones that bounce off a 48-only server.</li><li><strong>&quot;I have to choose one protocol.&quot;</strong> No &mdash; Reunion/dproto make the server answer both simultaneously. That is the whole solution.</li><li><strong>&quot;It's a firewall/port problem.&quot;</strong> The message &quot;This server is using a different protocol&quot; is specifically a protocol-version mismatch, not a connectivity issue. A blocked port gives a timeout, not this message.</li><li><strong>&quot;Updating the client fixes it.&quot;</strong> For a non-Steam client stuck on 47, there may be no update &mdash; the fix belongs on the server via Reunion/dproto.</li><li><strong>&quot;Reunion works on stock HLDS.&quot;</strong> Reunion targets ReHLDS. On original HLDS the equivalent is dproto.</li></ul><h2>How to check on your server</h2><p>Have a player who cannot connect read the exact error &mdash; &quot;This server is using a different protocol&quot; confirms a protocol mismatch rather than a network fault. On the server, check whether you have non-Steam support loaded: run <code>meta list</code> and look for Reunion (on ReHLDS) in the list. If it is absent and non-Steam players are bouncing, install <a href="/tutorials/install-reunion">Reunion</a> (ReHLDS) or dproto (HLDS), set <code>sv_lan 0</code>, and reconnect a 47-era client to confirm it now gets in. Steam clients on 48 should continue to connect unaffected.</p>
0 10