This document provides a comprehensive, field-by-field reference for every configuration file used by the RS2V Custom Server. It covers file formats, every available setting, default values, valid ranges, and behavioral notes.
For deployment-specific configuration, see DEPLOYMENT.md. For architecture details, see ARCHITECTURE.md.
- 1. Configuration Overview
- 2. server.ini — Main Server Configuration
- 3. server_production.ini — Production Overrides
- 4. game_modes.ini — Game Mode Definitions
- 5. maps.ini — Map Rotation & Settings
- 6. weapons.ini — Weapon Definitions
- 7. teams.ini — Team Definitions
- 8. gameplay_settings.ini — Global Gameplay Settings
- 9. admin_commands.ini — Admin Command Definitions
- 10. Text-Based List Files
- 11. eac_scanner.json — Anti-Cheat Scanner Configuration
- 12. loadouts.ini — Player Loadout Definitions
The RS2V server resolves configuration values using a priority-based hierarchy. Higher-priority sources override lower-priority ones:
Priority (highest → lowest):
┌──────────────────────────────────┐
│ 1. Command-Line Arguments │ --port 8777, --log-level DEBUG
├──────────────────────────────────┤
│ 2. Environment Variables │ RS2V_PORT=8777, RS2V_LOG_LEVEL=DEBUG
├──────────────────────────────────┤
│ 3. Config Files │ config/server.ini, config/server_production.ini
├──────────────────────────────────┤
│ 4. Default Values │ Hardcoded in source code
├──────────────────────────────────┤
│ 5. Auto-Detected Values │ Hardware detection (CPU cores, memory)
└──────────────────────────────────┘
Command-line arguments always take highest priority. For example, --port 8777 overrides whatever port is set to in config/server.ini.
Environment variables use the prefix RS2V_ followed by the uppercase key name with underscores. For example, the port key in [Network] can be overridden by setting RS2V_PORT=8777.
Config files can be layered. The production override file (config/server_production.ini) is loaded on top of the base config/server.ini when specified. Values in the override file replace values from the base file; keys not present in the override fall through to the base.
The server supports hot reloading of certain configuration files without a restart. When a watched file changes on disk, the ConfigWatcher subsystem detects the change and re-parses the file.
| File | Hot Reload | Notes |
|---|---|---|
server.ini |
Partial | [Logging], [Telemetry], and [Admin] sections reload. [Network] and [General] require restart. |
game_modes.ini |
Yes | New modes take effect at the next round transition. |
maps.ini |
Yes | Rotation updates immediately; current map unaffected. |
weapons.ini |
Yes | Weapon stats update at the next round. |
teams.ini |
Yes | Team settings update at the next round. |
gameplay_settings.ini |
Yes | Applied immediately to the current round. |
admin_commands.ini |
No | Requires server restart. |
admin_list.txt |
Yes | Admin permissions update immediately. |
ban_list.txt |
Yes | Bans applied immediately to new connections. |
ip_blacklist.txt |
Yes | IP blocks applied immediately. |
motd.txt |
Yes | New MOTD shown to the next connecting player. |
workshop_items.txt |
No | Requires server restart. |
eac_scanner.json |
No | Requires server restart. |
Hot reload uses inotify on Linux and ReadDirectoryChangesW on Windows. The file watcher debounces changes using the script_reload_interval_ms setting (default: 500ms).
All configuration files reside in the config/ directory relative to the server root. The --config command-line argument specifies the path to the primary INI file:
./rs2v_server --config config/server.iniPaths inside configuration files (e.g., map_rotation_file, ban_list_file) are resolved relative to the server root directory, not relative to the config file itself.
Path: config/server.ini
This is the primary configuration file. It is organized into sections denoted by [SectionName] headers. Comments begin with ; and extend to the end of the line.
General server identity and behavior settings.
| Key | Type | Default | Description |
|---|---|---|---|
server_name |
string | RS2V Custom Server |
The display name of the server as shown in the server browser and connection messages. Supports spaces and special characters. Maximum 128 characters. |
version |
string | 1.0.0 |
Server version string. Informational only; used in status responses and telemetry. Does not affect protocol compatibility. |
max_players |
integer | 64 |
Maximum number of concurrent player connections. Valid range: 1–128. Higher values require more CPU, memory, and bandwidth. See System Requirements for hardware guidelines. |
map_rotation_file |
path | config/maps.ini |
Path to the map rotation configuration file, relative to server root. This file defines all available maps, their properties, and the rotation order. See Section 5. |
game_modes_file |
path | config/game_modes.ini |
Path to the game modes configuration file, relative to server root. Defines all available game modes and their rules. See Section 4. |
motd_file |
path | config/motd.txt |
Path to the Message of the Day file, relative to server root. Contents are displayed to players upon connection. Supports formatting codes. See Section 10.5. |
tick_rate |
integer | 60 |
Server simulation tick rate in Hz (ticks per second). Controls how frequently the game loop executes. Higher values improve simulation accuracy and responsiveness but increase CPU usage. Recommended values: 30 (low-spec), 60 (standard), 128 (competitive). |
timesync_interval_s |
integer | 30 |
Interval in seconds between time synchronization requests sent to connected clients. Lower values improve time accuracy at the cost of increased network traffic. Valid range: 5–300. |
enable_announcements |
boolean | true |
When true, the server broadcasts periodic announcements to all connected players (e.g., map change warnings, round countdowns). Set to false to suppress automated messages. |
data_directory |
path | data/ |
Path to the runtime data directory, relative to server root. Contains map assets, scripts, and other runtime resources. |
log_directory |
path | logs/ |
Path to the log output directory, relative to server root. All log files (server, security, performance, telemetry) are written here. Created automatically if it does not exist. |
admin_rcon_only |
boolean | false |
When true, admin commands can only be issued via RCON (remote console). In-game chat commands are disabled for all admin levels. When false, admins can use both RCON and in-game chat commands based on their permission level. |
Paths to data directories used at runtime.
| Key | Type | Default | Description |
|---|---|---|---|
maps_path |
path | data/maps/ |
Directory containing map asset files (.umap), relative to server root. The server scans this directory for map files referenced in maps.ini. |
Network stack configuration.
| Key | Type | Default | Description |
|---|---|---|---|
port |
integer | 7777 |
Primary UDP port the server listens on for game traffic. Valid range: 1024–65535. Ensure this port is open in your firewall for both inbound and outbound UDP traffic. Common values: 7777 (default), 7778, 27015. |
bind_address |
string | (empty) | IP address to bind the server socket to. Leave empty or set to 0.0.0.0 to listen on all available interfaces. Set to a specific IP (e.g., 192.168.1.100) to restrict the server to a single network interface. |
max_packet_size |
integer | 1200 |
Maximum UDP packet size in bytes. This should be set below the network MTU to avoid fragmentation. Standard Internet MTU is 1500 bytes; the default of 1200 provides headroom for headers and tunneling. Valid range: 512–65535. |
client_idle_timeout_s |
integer | 300 |
Time in seconds after which an idle client (no packets received) is automatically disconnected. Set to 0 to disable idle timeout (not recommended for public servers). Valid range: 0–3600. |
heartbeat_interval_s |
integer | 5 |
Interval in seconds between heartbeat packets sent to each connected client. Heartbeats maintain the connection and detect disconnected clients. Valid range: 1–60. |
dual_stack |
boolean | true |
When true, the server listens on both IPv4 and IPv6 (dual-stack socket). When false, only IPv4 is used. Requires OS-level IPv6 support. |
idle_timeout_ms |
integer | 300000 |
Idle timeout in milliseconds (alternative to client_idle_timeout_s for millisecond precision). If both are set, this value takes precedence. Valid range: 0–3600000. |
reliable_transport |
boolean | true |
When true, critical packets (player joins, game state changes, RPCs) use reliable delivery with acknowledgment and retransmission. When false, all packets are sent unreliably (not recommended). |
Authentication, anti-cheat, and ban management settings.
| Key | Type | Default | Description |
|---|---|---|---|
enable_steam_auth |
boolean | true |
When true, the server validates player connections against Steam's authentication servers using Steam session tickets. Requires a valid Steam App ID and network access to Steam servers. When false, Steam authentication is bypassed (useful for development/testing only). |
fallback_custom_auth |
boolean | false |
When true and Steam authentication fails, the server falls back to custom token-based authentication using auth_tokens.txt. This allows players with valid custom tokens to connect when Steam is unavailable. |
custom_auth_tokens_file |
path | config/auth_tokens.txt |
Path to the custom authentication tokens file, relative to server root. See Section 10.2. |
enable_ban_manager |
boolean | true |
When true, the ban management system is active. Banned players (by SteamID) are rejected during the connection handshake. When false, all bans are ignored. |
ban_list_file |
path | config/ban_list.txt |
Path to the active ban list file, relative to server root. See Section 10.3. |
enable_anti_cheat |
boolean | true |
When true, the EAC (Easy Anti-Cheat) emulation/proxy subsystem is active. This performs client memory scanning and behavioral analysis. See SECURITY.md for architecture details. |
anti_cheat_mode |
enum | emulate |
Anti-cheat operating mode. Valid values: safe (passive monitoring only, no enforcement), emulate (full EAC emulation with enforcement), off (anti-cheat disabled entirely). See SECURITY.md for detailed mode descriptions. |
eac_scanner_config_file |
path | config/eac_scanner.json |
Path to the EAC scanner configuration file (JSON format), relative to server root. See Section 11. |
C# scripting engine configuration.
| Key | Type | Default | Description |
|---|---|---|---|
enable_csharp_scripting |
boolean | false |
When true, the Roslyn-based C# scripting engine is loaded at startup. Scripts in the scripts_path directory are compiled and executed. Requires the ENABLE_SCRIPTING CMake option and .NET SDK at build time. |
scripts_path |
path | data/scripts/ |
Directory containing C# script files (.cs). Scripts in the enabled/ subdirectory are loaded automatically; scripts in disabled/ are available for manual activation. |
script_reload_interval_ms |
integer | 500 |
Debounce interval in milliseconds for the file watcher. When a script file changes, the server waits this long before recompiling to avoid reloading during rapid edits. Valid range: 100–10000. |
default_namespace |
string | DynamicScripts |
Default C# namespace used when wrapping scripts that don't declare their own namespace. |
Log output configuration.
| Key | Type | Default | Description |
|---|---|---|---|
log_level |
enum | info |
Minimum log severity level. Messages below this level are discarded. Valid values (from most to least verbose): trace, debug, info, warn, error, fatal. For development, use debug or trace. For production, use info or warn. |
log_to_console |
boolean | true |
When true, log messages are written to standard output (stdout). Useful for development and when running under a process supervisor that captures stdout. |
log_to_file |
boolean | true |
When true, log messages are written to a file in the log_directory. |
log_file |
string | server.log |
Name of the primary log file (relative to log_directory). The server creates this file if it does not exist. |
log_max_size_mb |
integer | 10 |
Maximum size in megabytes of a single log file before rotation. When the file exceeds this size, it is renamed with a numeric suffix and a new file is started. Valid range: 1–1024. |
log_max_files |
integer | 5 |
Maximum number of rotated log files to keep. Older files beyond this count are deleted. Valid range: 1–100. |
log_timestamp_format |
string | %Y-%m-%d %H:%M:%S |
Format string for timestamps in log output. Uses strftime format specifiers. Common alternatives: %Y-%m-%dT%H:%M:%S%z (ISO 8601), %s (Unix epoch). |
CPU and performance tuning.
| Key | Type | Default | Description |
|---|---|---|---|
max_cpu_cores |
integer | 0 |
Maximum number of CPU cores the server may use. Set to 0 for automatic detection (uses all available cores). Set to a specific number to limit CPU usage (e.g., 4 to use at most 4 cores). Valid range: 0–256. |
cpu_affinity_mask |
integer | 0 |
CPU core affinity bitmask. Each bit represents a CPU core (bit 0 = core 0, bit 1 = core 1, etc.). Set to 0 to disable affinity pinning (OS scheduler decides). Example: 0x0F pins to cores 0–3. |
game_tick_rate |
integer | 60 |
Game simulation tick rate in Hz. This is an alias for [General].tick_rate when set in the [Performance] section. If both are specified, [Performance].game_tick_rate takes precedence. |
dynamic_tuning_enabled |
boolean | true |
When true, the server dynamically adjusts internal parameters (batch sizes, buffer lengths, thread pool sizes) based on current load. When false, all tuning parameters remain at their configured values. |
Worker thread pool configuration for background tasks (script execution, file I/O, deferred processing).
| Key | Type | Default | Description |
|---|---|---|---|
worker_thread_count |
integer | 0 |
Number of worker threads in the pool. Set to 0 for automatic detection (typically CPU_cores - 2, minimum 2). Set to a specific number to control concurrency. Valid range: 0–64. |
max_task_queue_length |
integer | 256 |
Maximum number of tasks that can be queued before the pool starts rejecting new tasks. When the queue is full, task submission blocks until space is available. Valid range: 16–4096. |
spill_threshold |
integer | 512 |
When the task queue exceeds this length, the pool logs a warning and optionally activates overflow handling (such as rejecting low-priority tasks). Valid range: must be >= max_task_queue_length. |
Pre-allocated memory pool configuration for high-frequency object allocation (packets, entities, buffers).
| Key | Type | Default | Description |
|---|---|---|---|
preallocate_chunks |
integer | 4 |
Number of memory chunks to pre-allocate at startup. Each chunk is 1 MB. Higher values reduce runtime allocation overhead at the cost of initial memory usage. Valid range: 1–64. |
max_chunks |
integer | 0 |
Maximum number of memory chunks the pool may grow to. Set to 0 for unlimited growth (constrained only by system memory). Valid range: 0–1024. |
Performance profiler configuration for recording timing data.
| Key | Type | Default | Description |
|---|---|---|---|
enable_profiling |
boolean | true |
When true, the profiler records timing data for tagged code sections. This adds minimal overhead (~1% CPU) but provides valuable performance insights. Disable in production if profiling data is not needed. |
min_record_ms |
float | 0 |
Minimum duration in milliseconds for a profiler record to be stored. Set to 0 to record all sections. Set higher (e.g., 1.0) to only capture slow operations. |
buffer_size |
integer | 1000 |
Maximum number of profiler records kept in the circular buffer. Older records are overwritten when the buffer is full. Valid range: 100–100000. |
flush_interval_s |
integer | 10 |
Interval in seconds between automatic flushes of the profiler buffer to disk. Valid range: 1–3600. |
output_format |
enum | json |
Output format for profiler data. Valid values: json (structured JSON), csv (comma-separated values). JSON is recommended for tool integration; CSV is useful for spreadsheet analysis. |
profiler_output_path |
path | logs/profiler.json |
Path to the profiler output file, relative to server root. |
Telemetry system configuration. For comprehensive telemetry setup including Prometheus and Grafana, see TELEMETRY.md.
| Key | Type | Default | Description |
|---|---|---|---|
batch_size |
integer | 50 |
Number of metric samples collected before writing a batch to reporters. Higher values reduce I/O frequency but increase memory usage and latency of metric availability. Valid range: 1–1000. |
flush_interval_s |
integer | 5 |
Interval in seconds between forced flushes of telemetry data to reporters, even if the batch is not full. Valid range: 1–300. |
Administrative access and RCON (Remote Console) configuration.
| Key | Type | Default | Description |
|---|---|---|---|
enable_rcon |
boolean | true |
When true, the RCON (Remote Console) TCP listener is started, allowing remote administration. When false, the server can only be administered via in-game chat commands or direct console access. |
rcon_port |
integer | 27020 |
TCP port for RCON connections. Valid range: 1024–65535. Must be different from the game port. Ensure this port is open in your firewall for TCP traffic. |
rcon_password |
string | ChangeMe123 |
Password required for RCON authentication. You must change this from the default before running a public server. Use a strong, unique password. Minimum recommended length: 12 characters. |
rcon_min_level |
integer | 2 |
Minimum admin permission level required to connect via RCON. Valid values: 0 (player), 1 (helper), 2 (moderator), 3 (administrator). Setting to 3 restricts RCON to administrators only. |
admin_list_file |
path | config/admin_list.txt |
Path to the admin list file, relative to server root. This file maps SteamIDs to permission levels. See Section 10.1. |
chat_auth_enabled |
boolean | true |
When true, in-game admin commands (chat-based) require the issuing player to be listed in admin_list.txt with the appropriate permission level. When false, chat-based admin commands are disabled entirely (use RCON instead). |
Path: config/server_production.ini
This file provides production-optimized overrides for the base server.ini. It is loaded as a layer on top of the base configuration when specified:
./rs2v_server --config config/server_production.iniKey differences from the base configuration:
| Setting | Base Value | Production Value | Rationale |
|---|---|---|---|
server_name |
RS2V Custom Server |
RS2V Live Server |
Distinguishes production from development |
tick_rate |
60 |
64 |
Optimized for stability at scale |
timesync_interval_s |
30 |
60 |
Reduces network overhead |
enable_announcements |
true |
false |
Reduces chat noise |
admin_rcon_only |
false |
true |
Enforces RCON-only administration |
log_level |
info |
warn |
Reduces log volume |
log_to_console |
true |
false |
No console output in daemon mode |
log_max_size_mb |
10 |
100 |
Larger log files for production |
log_max_files |
5 |
10 |
More log history retained |
client_idle_timeout_s |
300 |
180 |
Frees player slots faster |
enable_profiling |
true |
false |
No profiling overhead in production |
preallocate_chunks |
4 |
8 |
More pre-allocated memory |
batch_size (telemetry) |
50 |
100 |
Larger telemetry batches |
flush_interval_s (telemetry) |
5 |
30 |
Less frequent telemetry I/O |
rcon_min_level |
2 |
3 |
Administrators-only RCON |
The production file also includes additional sections not in the base:
[Modules]: Explicit enable/disable toggles for subsystems (enable_physics,enable_collision,enable_telemetry,enable_metrics,enable_admin,enable_rcon,enable_chat_logging).[Security.Advanced]: Enhanced RCON security (rcon_use_tls = true).[Advanced]: Memory limits (max_memory_mb = 8192) and monitoring intervals (perf_monitor_interval_s = 300).
Path: config/game_modes.ini
Defines all available game modes. Each mode is a section with a unique [ModeID]. For a detailed guide on game mechanics and strategy for each mode, see GAME_MODES.md.
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Human-readable display name shown in the server browser and UI. |
description |
string | No | (empty) | Brief description of the game mode's objective and rules. |
teams |
integer | Yes | — | Number of teams in this mode. Valid range: 2–4. |
players_per_team |
integer | Yes | — | Maximum number of players per team. Total player capacity is teams * players_per_team (capped by [General].max_players). |
rounds_per_match |
integer | Yes | — | Total number of rounds in a complete match. For single-round modes (e.g., Conquest), set to 1. |
win_condition |
enum | Yes | — | Victory condition type. Valid values: elimination, territory_control, capture_the_flag, zone_control, multi_zone. |
timelimit_sec |
integer | No | 0 |
Per-round time limit in seconds. 0 means no time limit. When the timer expires, the round ends with the current score determining the winner. |
score_limit |
integer | No | 0 |
Score threshold that triggers a round or match win. 0 means no score limit. |
respawn_delay |
integer | No | 0 |
Delay in seconds between a player's death and their respawn. 0 means instant respawn (typically used in elimination modes where there is no respawn). |
map_list |
string | No | (all maps) | Comma-separated list of MapIDs that support this mode. If omitted, all maps with this mode in their supported_modes list are eligible. |
friendly_fire |
boolean | No | false |
When true, players can damage teammates. Overrides gameplay_settings.ini for this mode. |
| ModeID | Name | Teams | Players/Team | Rounds | Win Condition | Time Limit | Score Limit | Respawn |
|---|---|---|---|---|---|---|---|---|
Conquest |
Conquest | 2 | 32 | 1 | territory_control |
900s | 1000 | 5s |
Elimination |
Elimination | 2 | 16 | 9 | elimination |
600s | — | 0s |
CaptureTheFlag |
Capture the Flag | 2 | 24 | 5 | capture_the_flag |
1200s | 3 | 10s |
HotZone |
Hot Zone | 2 | 32 | 3 | zone_control |
600s | 500 | 7s |
Domination |
Domination | 3 | 20 | 1 | multi_zone |
1200s | 800 | 5s |
[CustomMode]
name = Last Stand
description = Defend the base against waves of attackers. Defenders win by surviving.
teams = 2
players_per_team = 16
rounds_per_match = 3
win_condition = elimination
timelimit_sec = 480
respawn_delay = 15
friendly_fire = true
map_list = hill_400, haciendaPath: config/maps.ini
Defines all available maps, their properties, and the rotation order. The rotation order follows the section order in the file. For a detailed guide on each map, see MAPS.md.
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
display_name |
string | Yes | — | Human-readable name shown in the server browser, map vote screen, and MOTD. |
file |
path | Yes | — | Map asset filename, relative to the maps_path directory (configured in [DataPaths]). Typically a .umap file. |
supported_modes |
string | Yes | — | Comma-separated list of ModeID values from game_modes.ini that this map supports. |
min_players |
integer | No | 2 |
Minimum number of connected players required to start a round on this map. |
max_players |
integer | No | 64 |
Maximum player capacity for this map. Overrides [General].max_players if lower. |
default_mode |
string | No | (first in supported_modes) | Default game mode if this map is selected without specifying a mode. Must be one of the supported_modes. |
time_of_day |
enum | No | (unset) | Time of day setting. Valid values: day, dusk, night, dawn. Affects lighting and visibility. |
weather |
enum | No | (unset) | Weather condition. Valid values: clear, rain, fog. Affects visibility, sound propagation, and vehicle handling. |
vote_weight |
integer | No | 50 |
Weight used in the map voting system. Higher values make this map more likely to appear as a vote option. Valid range: 1–100. |
description |
string | No | (empty) | Brief description of the map's setting and gameplay characteristics. |
| MapID | Display Name | Modes | Max Players | Time | Weather | Weight |
|---|---|---|---|---|---|---|
carcassonne |
Carcassonne | Conquest, HotZone, Domination | 64 | Day | Clear | 80 |
hill_400 |
Hill 400 | Conquest, Elimination, Domination | 48 | Dawn | Fog | 60 |
rubber_plant |
Rubber Plant | Conquest, HotZone, CTF | 56 | Day | Rain | 70 |
hacienda |
Hacienda | HotZone, Elimination, Domination | 64 | Dusk | Clear | 75 |
hill_937 |
Hill 937 | HotZone, CTF, Elimination | 64 | Night | Clear | 50 |
village |
Village | Conquest, Domination, CTF | 64 | Day | Rain | 65 |
skirmish_field |
Skirmish Field | Elimination, Domination | 32 | — | — | 50 |
coastal_assault |
Coastal Assault | Conquest, HotZone | 64 | Dawn | Clear | 55 |
Path: config/weapons.ini
Defines all weapons available in-game with their attributes, statistics, and behavior.
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
display_name |
string | Yes | — | Human-readable weapon name shown in the UI and kill feed. |
category |
enum | Yes | — | Weapon category determining loadout slot and UI grouping. Valid values: primary, secondary, melee, explosive. |
ammo_type |
string | Yes | — | Ammunition type identifier. Use none for melee weapons and thrown explosives. |
magazine_size |
integer | Yes | — | Number of rounds per magazine/clip. 0 for melee weapons. |
reserve_ammo |
integer | Yes | — | Starting reserve ammunition count. |
fire_rate_rpm |
integer | Yes | — | Cyclic fire rate in rounds per minute. 0 for single-shot or melee weapons. |
damage |
integer | Yes | — | Base damage per hit (or per bullet for automatic weapons). |
range_m |
integer | Yes | — | Effective range in meters. Damage may drop off beyond this distance. |
recoil_strength |
float | Yes | — | Normalized recoil intensity. Range: 0.0 (no recoil) to 1.0 (maximum recoil). |
spread_crouch |
float | Yes | — | Aim cone in degrees when the player is crouched. Lower values = more accurate. |
spread_stand |
float | Yes | — | Aim cone in degrees when the player is standing. |
reload_time_s |
float | Yes | — | Time in seconds to complete a full reload. |
attachments |
string | No | (empty) | Comma-separated list of available attachments: optics, grip, laser. |
special |
enum | No | (none) | Special fire mode. Valid values: auto (fully automatic), burst (3-round burst), semi (semi-automatic), pump (pump-action), single (single-use), throw (thrown), melee (melee attack). |
description |
string | No | (empty) | Brief description of the weapon's characteristics and history. |
| WeaponID | Name | Ammo | Mag | Reserve | RPM | Damage | Range | Recoil | Special |
|---|---|---|---|---|---|---|---|---|---|
AK47 |
AK-47 Assault Rifle | 7.62x39mm | 30 | 90 | 600 | 35 | 300m | 0.75 | auto |
M16A4 |
M16A4 Burst Rifle | 5.56x45mm | 20 | 100 | 800 | 29 | 350m | 0.65 | burst |
AK74 |
AK-74 Assault Rifle | 5.45x39mm | 30 | 90 | 620 | 33 | 310m | 0.70 | auto |
| WeaponID | Name | Ammo | Mag | Reserve | Damage | Range | Special |
|---|---|---|---|---|---|---|---|
M9 |
M9 Pistol | 9x19mm | 15 | 45 | 20 | 50m | semi |
PMM |
PMM Pistol | 9x18mm | 8 | 32 | 22 | 45m | semi |
| WeaponID | Name | Ammo | Reserve | Damage | Range | Special |
|---|---|---|---|---|---|---|
M67 |
M67 Frag Grenade | none | 3 | 100 | 15m | throw |
SPG9 |
SPG-9 Recoilless Rifle | 73mm | 5 | 150 | 500m | single |
| WeaponID | Name | Damage | Range | Special |
|---|---|---|---|---|
Knife |
Combat Knife | 50 | 2m | melee |
Path: config/teams.ini
Defines the teams available in matches, their properties, and relationships.
| Key | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Human-readable team name shown in the scoreboard and team selection screen. |
color |
string | Yes | — | RGB color for the team's chat messages and UI elements. Format: R,G,B with values 0–255. |
spawn_points_file |
path | No | (empty) | Path to a file listing spawn point coordinates, relative to config/ or data/maps/<map>/. |
default_loadout |
string | No | (empty) | Default loadout ID (references loadouts.ini) assigned to players joining this team. |
score_multiplier |
float | No | 1.0 |
Score multiplier applied to all points earned by players on this team. 1.0 = normal. Use values > 1.0 to give a team a scoring advantage (e.g., for asymmetric modes). |
friendly_to |
string | No | (empty) | Comma-separated list of TeamIDs considered friendly (no friendly fire regardless of mode settings). |
enemy_to |
string | No | (empty) | Comma-separated list of TeamIDs considered enemies. |
max_players |
integer | No | 0 |
Maximum players on this team. 0 means unlimited (constrained by server max_players). |
min_players |
integer | No | 0 |
Minimum players required on this team before a round can start. |
auto_balance |
boolean | No | true |
When true, the auto-balance system may move players to this team to maintain equal team sizes. |
voice_channel |
string | No | (empty) | Voice chat channel name for team-only communication. |
description |
string | No | (empty) | Brief description of the team's faction and role. |
| TeamID | Name | Color | Max Players | Auto-Balance | Description |
|---|---|---|---|---|---|
Red |
US Army | 255,0,0 | 32 | Yes | Allied forces (US & allies) |
Blue |
North Vietnamese Army | 0,0,255 | 32 | Yes | NVA and Viet Cong forces |
Spectator |
Spectator | 128,128,128 | 0 | No | Observers only; no gameplay participation |
Path: config/gameplay_settings.ini
Global gameplay parameters that apply across all game modes unless overridden by a specific mode's settings. This file uses a flat key-value format (no section headers).
| Key | Type | Default | Description |
|---|---|---|---|
friendly_fire |
boolean | false |
When true, players can damage teammates globally. Individual game modes can override this setting. |
respawn_delay_s |
integer | 5 |
Default respawn delay in seconds after a player dies. Overridden by the game mode's respawn_delay if set. |
enable_round_timer |
boolean | true |
When true, rounds have a time limit. The time limit value comes from the game mode's timelimit_sec. |
round_time_limit_s |
integer | 900 |
Default round time limit in seconds. Used when a game mode does not specify its own timelimit_sec. |
enable_score_limit |
boolean | true |
When true, reaching the score limit ends the round or match. The score limit value comes from the game mode's score_limit. |
score_limit |
integer | 1000 |
Default score limit. Used when a game mode does not specify its own score_limit. |
enable_vehicles |
boolean | true |
When true, vehicle spawning and vehicle gameplay is enabled. When false, all vehicle spawns are disabled. |
Path: config/admin_commands.ini
Defines all administrative commands, their handlers, arguments, permission levels, and aliases. The AdminManager parses this file at startup and builds a hash map for O(1) command lookup.
For detailed usage instructions and examples for every command, see ADMIN_COMMANDS.md.
Each command is defined as an INI section:
[SectionName]
cmd = <primary command token>
aliases = <comma-separated aliases>
handler = <fully-qualified C++ handler>
args = <space-separated argument placeholders>
minArgs = <minimum required arguments>
maxArgs = <maximum allowed arguments>
level = <permission level 0-3>
description = <single-line help text>| Field | Type | Required | Default | Description |
|---|---|---|---|---|
cmd |
string | Yes | — | Primary command token (case-insensitive). Must be unique across all commands. |
aliases |
string | No | (none) | Comma-separated list of alternative names for the command. Each alias must be unique. |
handler |
string | Yes | — | Fully-qualified C++ handler function registered in the AdminManager. |
args |
string | No | (none) | Space-separated argument placeholders. Use <name> for required args, [name] for optional, <name...> for variadic. |
minArgs |
integer | No | (count of required args) | Minimum number of arguments the command accepts. |
maxArgs |
integer | No | (count of all args) | Maximum number of arguments the command accepts. |
level |
integer | Yes | — | Minimum permission level required: 0 = player, 1 = helper, 2 = moderator, 3 = administrator. |
description |
string | Yes | — | Single-line help text shown by the help command. |
These files use a simple line-based format where # indicates a comment.
Path: config/admin_list.txt
Maps SteamID64 identifiers to permission levels, granting administrative access.
Format:
<SteamID64> <Level> <Name/Comment>
Permission Levels:
| Level | Role | Capabilities |
|---|---|---|
0 |
Player | No admin access. Can only use help command. |
1 |
Helper | Basic informational commands (status). Can view server state but cannot modify it. |
2 |
Moderator | Player management commands (kick, ban, broadcast, give, tp, god, banlist). Can moderate players and issue items. |
3 |
Administrator | Full access to all commands including server management (shutdown, restart, changemap, rotation, timescale, tickrate, spawnbot, eacmode, unban). |
Example:
76561198000000001 3 Lead Admin - "Krill"
76561198000000002 2 Moderator - "Alice"
76561198000000003 1 Helper - "Charlie"
Path: config/auth_tokens.txt
Fallback authentication tokens used when Steam authentication is unavailable. Tokens are checked line by line when fallback_custom_auth = true in [Security].
Format: One token per line. Tokens can be SteamID64 values or custom alphanumeric strings.
76561198000000001
ABCDEF1234567890
CLIENTTOKEN-001
Path: config/ban_list.txt
Active ban list. The server checks this file during the connection handshake to reject banned players.
Format:
<SteamID64> <Type> <ExpiresAt> <Reason>
| Field | Description |
|---|---|
SteamID64 |
64-bit Steam ID of the banned player |
Type |
perm for permanent ban, temp for temporary ban |
ExpiresAt |
UTC timestamp in YYYY-MM-DD HH:MM:SS format, or permanent for permanent bans |
Reason |
Human-readable reason (optional) |
Example:
76561198000000010 perm permanent Cheating detected via EAC
76561198000000011 temp 2025-07-15 14:30:00 Toxic behavior
Temporary bans are automatically removed after their expiration time. The server checks expiration on each connection attempt and during periodic cleanup.
Path: config/ip_blacklist.txt
IP-level deny list. Connections from listed IPs or CIDR ranges are rejected at the network layer before any protocol processing.
Format: One IP address or CIDR range per line.
# Single IPs
192.0.2.123
203.0.113.45
# CIDR Ranges (blocks the entire subnet)
198.51.100.0/24
Notes:
- This is checked before Steam authentication, making it effective against DDoS sources.
- Use CIDR notation for blocking entire subnets.
- Changes are hot-reloaded.
Path: config/motd.txt
Message of the Day displayed to players when they connect to the server. Supports formatting codes and variable substitution.
Formatting Codes:
| Code | Effect |
|---|---|
[COLOR=R,G,B]...[/COLOR] |
Set text color (RGB values 0–255) |
[B]...[/B] |
Bold text |
[I]...[/I] |
Italic text |
[U]...[/U] |
Underlined text |
[URL=link]...[/URL] |
Clickable hyperlink |
Variable Substitution:
| Variable | Replaced With |
|---|---|
{server_name} |
Current server name from [General].server_name |
{player_count} |
Current connected player count and max (e.g., "32/64") |
{map_name} |
Current map display name |
{uptime} |
Server uptime since last restart (e.g., "2d 5h 30m") |
{next_map} |
Next map in the rotation |
Example:
[COLOR=0,255,0][B]Welcome to {server_name}![/B][/COLOR]
[I]Players:[/I] {player_count} [I]Map:[/I] {map_name}
[I]Uptime:[/I] {uptime} [I]Next Map:[/I] {next_map}
1. No cheating or exploiting. EAC is enforced.
2. Be respectful.
3. Have fun and play fair!
[COLOR=128,128,128][I]Type [B]/help[/B] in chat for admin commands.[/I][/COLOR]
Path: config/workshop_items.txt
Steam Workshop items for automatic download. When a client connects, these items are required and will be downloaded if not already present.
Format:
<WorkshopID> <Type> <FileName> <LocalPath> # <Description>
| Field | Description |
|---|---|
WorkshopID |
Steam Workshop numeric item ID |
Type |
Item type: map, mod, or asset |
FileName |
Expected filename after extraction (e.g., desert_assault.umap) |
LocalPath |
Server-side storage path relative to the data directory |
Description |
Human-readable description (optional, after #) |
Example:
123456789 map desert_assault.umap maps/desert_assault # Desert Assault map
223344556 mod night_ops.pak mods/night_ops # Night Operations weather cycle
556677889 asset vietnam_uniforms.pak assets/uniforms # Vietnam-era soldier uniforms
Path: config/eac_scanner.json
JSON configuration for the EAC (Easy Anti-Cheat) memory scanner subsystem. This configures how the server scans client memory for suspicious patterns.
{
"scanner": {
"scanIntervalMs": 1000,
"maxScanThreads": 2,
"memoryRegions": [
{
"name": "GameCode",
"pattern": "48 8B ?? ?? ?? ?? ?? 48 85 C0",
"offset": 0
},
{
"name": "ClientModule",
"pattern": "55 8B EC 83 E4 F8 83 EC 70",
"offset": 0
}
],
"maxRegionsToScan": 4,
"readBlockSize": 4096,
"suspiciousThreshold": 5,
"reportOnThreshold": true
},
"logging": {
"enable": true,
"logFile": "logs/eac_scanner.log",
"level": "DEBUG"
}
}| Key | Type | Default | Description |
|---|---|---|---|
scanIntervalMs |
integer | 1000 |
Interval in milliseconds between memory scans. Lower values increase detection speed but add CPU overhead. |
maxScanThreads |
integer | 2 |
Maximum number of concurrent scan threads. |
memoryRegions |
array | — | List of memory regions to scan, each with a name, byte pattern (hex with ?? wildcards), and byte offset. |
maxRegionsToScan |
integer | 4 |
Maximum number of memory regions to scan per interval. |
readBlockSize |
integer | 4096 |
Size in bytes of each memory read operation. |
suspiciousThreshold |
integer | 5 |
Number of suspicious pattern matches required before triggering a report. |
reportOnThreshold |
boolean | true |
When true, a security report is generated when the suspicious threshold is reached. |
| Key | Type | Default | Description |
|---|---|---|---|
enable |
boolean | true |
When true, EAC scanner events are logged. |
logFile |
string | logs/eac_scanner.log |
Path to the scanner log file, relative to server root. |
level |
enum | DEBUG |
Log level for scanner output. Valid values: DEBUG, INFO, WARN, ERROR. |
Path: config/loadouts.ini
Defines player loadout presets that can be assigned to teams via teams.ini or selected by players. This file is currently a placeholder for future implementation.
Expected Schema:
[LoadoutID]
primary = <WeaponID>
secondary = <WeaponID>
melee = <WeaponID>
explosive = <WeaponID>End of CONFIGURATION.md
For questions about specific configuration options, see FAQ.md. For troubleshooting configuration issues, see TROUBLESHOOTING.md.