Skip to content

xHLDS settings

Every setting xHLDS adds to ReHLDS, in plain words, with its default, its values, when to change it and the technical details.

xHLDS version
3.15.0-hs.9
Updated

The settings xHLDS adds on top of ReHLDS. They all start with xhlds_, so they never look like ReHLDS's own sv_rehlds_* settings. ReHLDS's settings work in xHLDS as they do in ReHLDS: see the ReHLDS settings. Most servers keep the defaults.

How to change a setting

A setting (a "cvar") is a name and a value, for example xhlds_voice_rate 12000.

  • To keep it: add the line to server.cfg in the game folder (cstrike/server.cfg for Counter-Strike 1.6). The server runs that file when it starts and at every map change.
  • To try it now: type the line on the server console, or send it over rcon. It lasts until the server restarts or a config file sets it again.
  • To see the current value: type just the name on the console.

New to these words? The glossary explains them.

How to read an entry

  • The first line says what the setting does.
  • Default and Since: the value it has if you set nothing (from the xHLDS source), and the first xHLDS release that has it.
  • Values: what each value does.
  • When to change it: whether you need to touch it at all.
  • Technical details: what you see on the console and how it works with other settings, for admins who want it.

All settings

SettingWhat it doesDefault
xhlds_update_scheduleWith -pingboost 5, players get as many world updates a second as they ask for, and their updates are spread over the server's frames instead of all going out in the same frame.1
xhlds_datagram_warningsHow much the console tells you about data a player did not get.1
xhlds_datagram_budgetKeeps the sounds, effects and HUD messages a plugin sends from crowding out the updates that show players where everyone is.1
xhlds_overflow_fullupdateHelps a player catch up when the world around them changes so much at once that the update no longer fits in one packet, so they don't go a moment without seeing anything move.1
xhlds_voice_rateThe most voice data one player may send each second.12000
xhlds_voice_burstHow much voice a player may send at once on top of xhlds_voice_rate, for example the voice their game sends in one go after a short lag spike.16384
xhlds_voice_punish_afterAfter how many seconds of voice over the limit, without a break, a player is kicked or banned as xhlds_voice_punish says.0
xhlds_voice_punishWhat happens to a player who keeps sending voice over the limit for longer than xhlds_voice_punish_after allows.-1
xhlds_maxclients_per_ipThe most players the server lets in at the same time from one IP address, counting players in game and players still connecting.0
xhlds_api_guardSome plugin mistakes that would stop the server under ReHLDS are skipped instead, so the server keeps running, and each one is reported on the console with the file that made it.1
xhlds_api_warningsHow much the console tells you about the plugin mistakes xhlds_api_guard handles.1
xhlds_confilter_enableTurns the console filter on or off.1
xhlds_confilter_logsWhether the console filter's rules also apply to the server's log files.0
xhlds_precache_warningsHow often the console warns that the server tried to play a sound that is not precached, for example one removed by an unprecacher plugin.1
xhlds_stats_playersWhether the server publishes a JSON line per player for plugins at the end of each statistics window.1
xhlds_stats_net_keyAn optional secret that lets the per-player statistics show which players connect from the same network, across all your servers, without storing their addresses.empty
xhlds_stats_profileHow much detail xhlds_stats profile gives about where the server's frame time goes, so you can tell whether lag came from the game, a plugin, the network or the machine.2
xhlds_stats_windowHow many seconds of play each xhlds_stats report covers.60
xhlds_crash_ownerThe Steam accounts that may see this server's crash reports on Hostsrc's crash service.empty
xhlds_stats_players_jsonAn output for plugins, not a setting.empty
xhlds_stats_profile_jsonAn output for plugins, not a setting.empty
xhlds_stats_jsonAn output for plugins, not a setting.empty

Frame timing

xhlds_update_schedule

With -pingboost 5, players get as many world updates a second as they ask for, and their updates are spread over the server's frames instead of all going out in the same frame.

Default: 1. Since: xHLDS 3.15.0-hs.9.

Values: 1 on. 0 the ReHLDS rule for when a player's next update is due.

When to change it: Leave it at 1. Set 0 only to compare with ReHLDS. It only does anything with -pingboost 5; with -pingboost 1 to 3 the server always uses the ReHLDS rule, so their timing stays as it was.

Technical details: A world update tells a player's game where everyone is, cl_updaterate times a second, limited by sv_minupdaterate and sv_maxupdaterate. With 1 each player keeps their own schedule: an update missed during a long frame (a slow plugin, a map load) is skipped, not sent twice, and the next one is back on that player's own time. A player who joins, or comes back after a map change, starts in the least busy frame. A change takes effect from every player's next update.

To check it, compare Pkt/s (updates a player got each second) with UR (the update rate they asked for, after the server's limits) in xhlds_stats players: they should be close. xhlds_stats profile shows whether sending to players takes much of some frames and little of others.

Dropped data and overflows

xhlds_datagram_warnings

How much the console tells you about data a player did not get: sounds, effects and messages that were dropped, world updates that did not fit, voice over the limit, and players who timed out.

Default: 1. Since: xHLDS 3.15.0-hs.5.

Values: 0 no lines. 1 short coded lines, at most one per player every 10 seconds. 2 the same, plus a line for every dropped message with the module that sent it, and ReHLDS's own overflow lines.

When to change it: Leave it at 1. Use 2 for a short time when you look for the plugin behind XH-D01 or XH-D02 lines; it prints a lot. Use 0 only if you don't want any of these lines.

Technical details: With 1 you see:

  • XH-D01: a player missed sounds, effects or other messages because more was queued for them than one packet can carry.
  • XH-D02: a player missed messages because they were over the player's rate (see xhlds_datagram_budget).
  • XH-T01, XH-T02, XH-T03: a player timed out while connecting, while loading the map, or in game.
  • WARNING: msg overflowed for <player>: a world update did not fit the player's packet, once per run of such packets, with the entities that filled it (for example 118 weaponbox, 40 env_sprite). See xhlds_overflow_fullupdate.
  • Voice data dropped from "<player>": voice over xhlds_voice_rate, at most one line per player every 10 seconds.

xhlds_explain <code> prints what a code means and what to do. With 2, each dropped message gets its own line naming the module that sent it, for example amxmodx_mm_i386.so: that names the module, not the AMX Mod X plugin. To find the plugin, pause suspected plugins one at a time (amxx pause <plugin>) and watch whether the lines stop. At 2 you also get ReHLDS's SZ_GetSpace: overflow on <player> lines, a line for every packet without a world update, and a Voice packet dropped line for every dropped voice packet instead of the summary.

Bots are never reported. A player who has stopped answering gets no XH-D lines; if they don't answer again, an XH-T line says so.

xhlds_datagram_budget

Keeps the sounds, effects and HUD messages a plugin sends from crowding out the updates that show players where everyone is.

Default: 1. Since: xHLDS 3.15.0-hs.5.

Values: 1 when a plugin sends a player more than their rate can carry, the extra messages are dropped and the player keeps getting world updates. 0 as in ReHLDS: the messages go out, and the player gets fewer world updates.

When to change it: Leave it at 1. Set 0 only to compare with ReHLDS.

Technical details: Normal play is not affected. When messages are dropped this way, the console reports it as XH-D02 (with xhlds_datagram_warnings at 1 or 2), and xhlds_stats players shows the dropped data per player.

Plugins that send a message every server frame send more at a higher frame rate, for example with a higher sys_ticrate or -pingboost 5, so this is where it matters most.

Note: The players' rate limits themselves come from sv_minrate and sv_maxrate.

xhlds_overflow_fullupdate

Helps a player catch up when the world around them changes so much at once that the update no longer fits in one packet, so they don't go a moment without seeing anything move.

Default: 1. Since: xHLDS 3.15.0-hs.5.

Values: 1 after an update that did not fit, the player gets full updates until one arrives. 0 as in ReHLDS.

When to change it: Leave it at 1. Set 0 only to compare with ReHLDS.

Technical details: This happens when a player suddenly sees many new entities: a spectator looking over the map, a pile of dropped weapons, or many sprites from a plugin. Under ReHLDS the player can go without world updates for a short while until their game gives up and asks for a full one. With 1 the server sends a full update straight away, which usually fits.

Each such run is reported once as WARNING: msg overflowed for <player> (with xhlds_datagram_warnings at 1 or 2), with the entity classes that filled the update. Many of these lines on one map point at the map or a plugin creating too many entities.

Voice

xhlds_voice_rate

The most voice data one player may send each second. Voice above it is dropped before other players and voice plugins get it, so one player flooding voice can't lag everyone who hears them.

Default: 12000. Since: xHLDS 3.15.0-hs.6.

Values: Bytes a second. 0 no limit, as in ReHLDS.

When to change it: Leave it as it is. If players who are only talking show up in Voice data dropped from "<player>" lines, raise it or set 0.

Technical details: Each drop is reported on the console as Voice data dropped from "<player>", at most one line per player every 10 seconds, with how much was dropped (see xhlds_datagram_warnings). The voice is dropped before voice plugins such as Revoice or VoiceTranscoder see it, so servers running them are covered too.

The default is set from published voice codec figures, not measured on real players. The limit does not apply with sv_voiceenable 0, to bots, or to a listen server's own player.

Note: Related: xhlds_voice_burst, xhlds_voice_punish_after, xhlds_voice_punish.

xhlds_voice_burst

How much voice a player may send at once on top of xhlds_voice_rate, for example the voice their game sends in one go after a short lag spike.

Default: 16384. Since: xHLDS 3.15.0-hs.6.

Values: Bytes. One voice packet of the largest size always gets through, whatever you set.

When to change it: Leave it as it is unless players who are only talking show up in Voice data dropped from "<player>" lines right after a lag spike; then raise it.

Technical details: Voice over xhlds_voice_rate plus this allowance is dropped and reported like any other voice over the limit. xhlds_voice_rate 0 turns the limit off, and this setting with it.

xhlds_voice_punish_after

After how many seconds of voice over the limit, without a break, a player is kicked or banned as xhlds_voice_punish says.

Default: 0. Since: xHLDS 3.15.0-hs.6.

Values: Seconds. 0 never: voice over the limit is only dropped and reported.

When to change it: Leave it at 0 if dropping the extra voice is enough. Set a few seconds if voice floods bother your players and you want the flooder removed.

Technical details: Players who are only talking stay under xhlds_voice_rate, so they are not affected. Check the Voice data dropped from "<player>" lines first: if normal players show up there, raise xhlds_voice_rate before you turn punishments on.

xhlds_voice_punish

What happens to a player who keeps sending voice over the limit for longer than xhlds_voice_punish_after allows.

Default: -1. Since: xHLDS 3.15.0-hs.6.

Values: -1 kicks the player ("Kicked for voice flooding"). 0 bans their address for good. A number: bans their address for that many minutes, as addip does.

When to change it: Only matters when xhlds_voice_punish_after is above 0. A kick is enough for most servers; use a ban if the same address keeps coming back to flood.

Technical details: The values work like ReHLDS's punish settings, such as sv_rehlds_movecmdrate_avg_punish. The console gets a line with the player's name and address, for example "<player>" (<address>) kicked for voice flooding. A banned player sees "Banned for voice flooding".

Players per address

xhlds_maxclients_per_ip

The most players the server lets in at the same time from one IP address, counting players in game and players still connecting.

Default: 0. Since: xHLDS 3.15.0-hs.6.

Values: 0 no such limit, as in ReHLDS. A number: a new player from an address that already has that many players on the server is refused.

When to change it: Leave it at 0 when players reach your server through an anti-DDoS proxy, a partner's relay, Docker's userland proxy or a boost service: the server then sees only a few addresses, and any limit caps the whole server. Otherwise, if one address fills your server with players or fake players, set a number above the most real players you expect from one address. Internet cafés, schools, families and mobile carriers put several real players behind one address.

Technical details: A refused player sees "Too many players from your IP address", and the server log gets a Too many clients from <ip:port> line.

Never counted: bots, HLTV proxies (sv_proxies limits those), a player reconnecting into their own slot, everyone while sv_lan is 1, and players from private addresses (127.x, 10.x, 172.16.x to 172.31.x, 192.168.x), which can only come from the server's own network.

Note: ReHLDS's sv_rehlds_maxclients_from_single_ip keeps working as in ReHLDS. It only counts players who are still connecting, so it does not stop one address from filling the server one player at a time. The two settings work side by side.

Plugin mistakes

xhlds_api_guard

Some plugin mistakes that would stop the server under ReHLDS are skipped instead, so the server keeps running, and each one is reported on the console with the file that made it.

Default: 1. Since: xHLDS 3.15.0-hs.6.

Values: 1 the server skips the one bad call where that is safe and keeps running. 0 the server stops, as in ReHLDS.

When to change it: Leave it at 1. Set 0 only to see the original behaviour while you debug a plugin.

Technical details: These are calls a plugin or the game makes to the engine in a way the engine refuses, for example a message an AMX Mod X plugin started and never finished because of a runtime error, a message sent to something that is not a player, a precache after the map has loaded, or a model set on an entity that was never precached. Under ReHLDS such a call ends in FATAL ERROR or Host_Error, a restart and a map reload. With 1, the server undoes that one call and carries on.

A missing file or a bad name precached by the game itself (for example cs.so) still stops the server with either value: that usually means broken map or game files, which should not be hidden.

Either way, every such call is printed on the console (see xhlds_api_warnings) and counted (see xhlds_api_incidents). The mistake is still in the plugin: use the reports to find and fix it. You can change the value while the server runs.

xhlds_api_warnings

How much the console tells you about the plugin mistakes xhlds_api_guard handles.

Default: 1. Since: xHLDS 3.15.0-hs.6.

Values: 0 no lines. 1 the first case from each module on each map at once, then at most one summary line per case every 10 seconds, saying how many more there were and from which modules. 2 a line for every call.

When to change it: Leave it at 1. Use 2 for a short time when you are tracking down one plugin; 0 only if you already know the cause and the lines are in the way.

Technical details: Each line looks like API misuse: <case>: <what was called>; called from <module>+0x<offset>; <what the server did>. The module is the file that made the call, for example amxmodx_mm_i386.so for AMX Mod X's own functions or fakemeta_amxx_i386.so for engfunc. It names the module, not the AMX Mod X plugin: look in the AMX Mod X error log at the same moment to find the plugin. "the game library, through Metamod" means the game made the call through Metamod.

A call that stops the server is always printed, whatever the value, just before the FATAL ERROR line, so the last thing on the console says what happened.

Console

xhlds_confilter_enable

Turns the console filter on or off. The filter hides console lines you never want to see, using rules you write in xhlds_confilter.txt.

Default: 1. Since: xHLDS 3.15.0-hs.6.

Values: 1 lines that match a rule are hidden. 0 every line is printed, rules or not.

When to change it: Leave it at 1. Without a rules file the filter does nothing, so 1 changes nothing on a server that has none. Set 0 for a moment when you want to see everything, for example while you look into a problem.

Technical details: xhlds_confilter enable and xhlds_confilter disable set this value too. Lines that report a fatal error, and the filter's own xhlds_confilter: lines, are always printed, even when a rule matches them. The rules file, its format and what the filter covers are explained under the xhlds_confilter command.

xhlds_confilter_logs

Whether the console filter's rules also apply to the server's log files.

Default: 0. Since: xHLDS 3.15.0-hs.6.

Values: 0 the log files get every line, as before. 1 the rules also hide lines from the log files (logs/*.log) and from logaddress listeners.

When to change it: Leave it at 0 if stats tools, ban systems or panels read your logs, so they keep seeing everything. Set 1 only if the lines you hide are noise in the logs too.

Technical details: With 0, a line hidden on the console is still in the log files. Crash reports always keep every console line, hidden or not, with either value, so a crash report still shows what led up to it.

xhlds_precache_warnings

How often the console warns that the server tried to play a sound that is not precached, for example one removed by an unprecacher plugin.

Default: 1. Since: xHLDS 3.15.0-hs.5.

Values: 0 never. 1 once per sound per map, with the sound's name. 2 every time, as in ReHLDS.

When to change it: Leave it at 1. Use 2 if you want to see how often a missing sound is played; 0 if you removed sounds on purpose and don't want the lines.

Technical details: The sound is not played with any value; this only changes how often you are told. With 1, after many different missing sounds on one map, one more line says the rest of that map is not reported.

Statistics

xhlds_stats_players

Whether the server publishes a JSON line per player for plugins at the end of each statistics window.

Default: 1. Since: xHLDS 3.15.0-hs.6.

Values: 1 at the end of each xhlds_stats window, xhlds_stats_players_json is set once for each player of the window. 0 it is not set.

When to change it: Set 0 if no plugin reads xhlds_stats_players_json; it saves plugins that watch that cvar the work. xhlds_stats players on the console works either way.

Technical details: The player lines come before xhlds_stats_json changes, so a plugin can collect them and then read the server line.

xhlds_stats_net_key

An optional secret that lets the per-player statistics show which players connect from the same network, across all your servers, without storing their addresses.

Default: empty. Since: xHLDS 3.15.0-hs.6.

Values: Empty: no network code in the player lines. A long random value: each player line carries a short code for the player's network, the same code on every server that uses the same value.

When to change it: Set it if you run several servers and want to spot many accounts coming from one network. Use the same long random value on every server, in server.cfg.

Technical details: The code shows up in the player lines of xhlds_stats_players_json and xhlds_stats players json. Keep the value private: anyone who has it can work out the network from the code. The server never sends it to players or the server browser.

xhlds_stats_profile

How much detail xhlds_stats profile gives about where the server's frame time goes, so you can tell whether lag came from the game, a plugin, the network or the machine.

Default: 2. Since: xHLDS 3.15.0-hs.6.

Values: 0 not measured. 1 by part of the frame (console commands, player packets, player movement, physics, think and touch, sending to players, Steam, the rest). 2 also by each game function the engine calls (StartFrame, Think, Touch, PlayerPreThink, AddToFullPack and others).

When to change it: Leave it at 2. Use 0 only if you never look at xhlds_stats profile.

Technical details: It only measures: it doesn't change how the server runs, in any -pingboost mode, apart from the small time measuring takes. A change takes effect when the next statistics window starts. For each late frame it also says whether the time went on the frame's own work or between frames, and what ran most often before late frames.

With Metamod, the time of a game function is Metamod plus all its plugins: the engine cannot tell which AMX Mod X or Metamod plugin used it. Pause plugins one at a time and compare.

xhlds_stats_window

How many seconds of play each xhlds_stats report covers.

Default: 60. Since: xHLDS 3.15.0-hs.2.

Values: Seconds, from 5 to 3600.

When to change it: Shorter windows react faster when you watch a problem as it happens; longer ones smooth out one-off spikes. Plugins that forward the JSON outputs get one update per window.

Technical details: xhlds_stats reports the last complete window, xhlds_stats now the one in progress. xhlds_stats_json, xhlds_stats_players_json and xhlds_stats_profile_json are updated once at the end of each window.

Crash reports

xhlds_crash_owner

The Steam accounts that may see this server's crash reports on Hostsrc's crash service. Outside Hostsrc's network it is also your consent to send them: without it, nothing leaves the machine.

Default: empty. Since: xHLDS 3.15.0-hs.6.

Values: Up to 8 SteamID64s, comma-separated and in quotes, for example xhlds_crash_owner "76561198000000001,76561198000000002". Empty: on a server outside Hostsrc's network no crash report is sent.

When to change it: Set it in server.cfg if you run xHLDS outside Hostsrc's network and want Hostsrc to see your crashes. Keep the quotes: without them the console reads only the first ID.

Technical details: When the server crashes, it writes a crash report and prints one line on the console (what crashed, the map, the uptime), then restarts as before. After the restart the report goes to Hostsrc's crash service at https://crash.hostsrc.com (opens in a new tab). On Hostsrc's network that always happens. Anywhere else it happens only when xhlds_crash_owner is set.

What is sent: the report and a memory snapshot of the server process, the licence file if there is one, the value of xhlds_crash_owner, the xHLDS version and, under Pterodactyl, the panel's server ID. It is encrypted so that only the crash service can read it. The crash page says where the crash happened (xHLDS, the game, Metamod, AMX Mod X, a plugin or module, Steam or a system library) and what to do. We look at every engine crash, and when one is fixed, the page names the update that fixes it. Passwords and player IPs are hidden, and the raw files are deleted after 90 days.

Signing in to the crash service is open to invited beta testers for now.

An entry that is not a SteamID64, and any after the eighth, is ignored with a WARNING: xhlds_crash_owner: ignoring ... line. The value is read when an upload starts, so a change counts from the next upload. After a report is sent the console prints Crash report uploaded: with a link. Crash reports are for the Linux server; uploads work from 3.15.0-hs.7.

Note: -nocrashreport turns crash reports and uploads off.

Outputs for plugins

xhlds_stats_players_json

An output for plugins, not a setting: one player's connection statistics as one line of JSON.

Default: empty. Since: xHLDS 3.15.0-hs.6.

Values: A line of JSON for one player. At the end of each xhlds_stats_window it is set once for each player of the window, one after another. Setting it yourself has no effect.

When to change it: You don't. It is an output that plugins read.

Technical details: A plugin reads it by watching the cvar change. Each line has the player's slot, user id and Steam ID, how long they were in the game, round trip, loss each way, choke, rate, update rate, packets a second each way, dropped data and overflows, and why they left if they did. It has no names and no IP addresses; with xhlds_stats_net_key set it also has a code for the player's network. HLTV proxies get a line marked as a proxy; bots get none.

It is not a server cvar, so it is not sent to players or written to the log. xhlds_stats_players 0 stops it being set. xhlds_stats players json prints the same lines on the console.

xhlds_stats_profile_json

An output for plugins, not a setting: the last profiled window of xhlds_stats profile as one line of JSON.

Default: empty. Since: xHLDS 3.15.0-hs.6.

Values: A line of JSON, updated once at the end of each xhlds_stats_window while xhlds_stats_profile is above 0. Setting it yourself has no effect.

When to change it: You don't. It is an output that plugins read.

Technical details: For plugins that forward the frame profile, like xhlds_stats_json. The line is long: an AMX Mod X plugin that reads it needs #pragma dynamic 16384 or more. It is not a server cvar, so it is not sent to players or written to the log. xhlds_stats profile json prints the same on the console.

xhlds_stats_json

An output for plugins, not a setting: the last complete xhlds_stats window as one line of JSON.

Default: empty. Since: xHLDS 3.15.0-hs.2.

Values: A line of JSON, updated once at the end of each xhlds_stats_window. Empty until the first window ends. Setting it yourself has no effect.

When to change it: You don't. It is an output that plugins read.

Technical details: Meant for plugins that forward the server's statistics, for example to a metrics database. It holds what xhlds_stats shows (frame rate, frame times, late frames), how the players' connections did over the window (round trip, loss, choke, dropped data, over all players and for the worst of them), and with the frame profile on, what was behind late frames. HLTV proxies and bots are left out of the player values.

It is set after the player lines of xhlds_stats_players_json, so when it changes, a plugin knows the window is complete. It is not a server cvar: it is not sent to players, written to the log or shown in the server browser. xhlds_stats json prints the same line on the console.

Licences, prices and what xHLDS adds: xHLDS licence and prices.

Something wrong or unclear on this page? Email office@hostsrc.com or tell us on Discord (external site, opens in a new tab).