===== Basics =====
Most gameplay settings are now native saved ConVars. These are stored in a large file:
config/convar/game.json
Each value appears under a ''convar.'' key. Example:
"convar.ttt_rtv_enabled": {
"Value": "False",
"Timeout": 1781214253,
"DeleteAt": 0
}
Only edit ''Value''. Do **not** edit ''Timeout'' or ''DeleteAt''.
**These are most easily modified directly from the console. Commands will apply live (with some variance; see the sections below). Setting the command via the console will store/update the value in ''game.json''.**
* Stop the server before manually editing ''game.json''.
* Preserve valid JSON syntax.
* Values are usually stored as strings, even for numbers and booleans.
* Use ''True'' / ''False'' or ''1'' / ''0'' for boolean values, matching what your host panel writes.
====== Gameplay ConVars ======
The key in ''game.json'' includes the ''convar.'' prefix. The console command does not.
Example:
^ In game.json ^ In server console ^
| ''convar.ttt_rtv_enabled'' | ''ttt_rtv_enabled false'' |
===== Time =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_max_rounds'' | 6 | Next round / map travel | Number of rounds to play before the match ends and a map vote begins. |
| ''ttt_round_time_minutes'' | 5 | Next round | Round duration in minutes **when haste mode is off**. |
| ''ttt_haste_mode'' | True | Next round | Enables haste mode, where the public timer starts shorter and hidden time is added as players die. |
| ''ttt_haste_starting_minutes'' | 5 | Next round | Public round timer duration in minutes before haste overtime starts. |
| ''ttt_haste_minutes_per_death'' | 0.5 | Next round | Minutes added to the hidden round limit each time a player dies. |
===== Gameplay Roles =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_traitor_pct'' | 0.25 | Next round | Fraction of round players assigned as traitors. |
| ''ttt_traitor_max'' | 32 | Next round | Maximum number of traitors that can be assigned in a round. |
| ''ttt_detective_pct'' | 0.13 | Next round | Fraction of round players assigned as detectives when enough players are present. |
| ''ttt_detective_max'' | 32 | Next round | Maximum number of detectives that can be assigned in a round. |
| ''ttt_detective_min_players'' | 8 | Next round | Minimum round player count required before detectives can be assigned. |
===== Karma =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_karma'' | True | Next round | Enables karma penalties, rewards, and low-karma damage scaling. |
| ''ttt_karma_low_autokick'' | False | Round end | Kicks non-host players below the low-karma threshold at round end. |
| ''ttt_karma_kick_threshold'' | 300 | Round end | Karma value below which low-karma auto-kick removes non-host players. Only matters when ''ttt_karma_low_autokick'' is enabled. |
| ''ttt_karma_starting'' | 1000 | New player component | Karma assigned to newly-created player components. |
| ''ttt_karma_damage_threshold'' | 800 | Live damage checks | Karma value below which outgoing damage is reduced. |
| ''ttt_karma_kill_penalty'' | 30 | Round end | How harshly friendly damage removes karma before internal scaling. |
| ''ttt_karma_round_increment'' | 15 | Round end | Karma restored at round end when the player teamkilled nobody. |
===== Voice =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_proximity_voice_enabled'' | False | Live | Uses distance-limited voice chat for normal alive-player voice. Team voice and dead/alive voice filtering are separate. |
| ''ttt_proximity_voice_range'' | 800 | Live | Voice range in world units when proximity voice is enabled. |
===== Map Vote =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_rtv_enabled'' | True | Live | Allows players to start Rock the Vote map-change votes. Admin-forced map votes are unaffected. |
| ''ttt_mapvote_option_count'' | 10 | Newly-created map votes | Maximum number of maps shown during a map vote. |
| ''ttt_mapvote_include_uncurated'' | False | Newly-created map votes | Includes uncurated maps in curated map vote pools when available. Dedicated servers should normally use ''MapVote.Maps'' instead. |
===== Visuals =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_allow_player_cosmetics'' | True | Next round | Allows players to use their s&box headwear. |
===== AFK =====
^ ConVar ^ Default ^ Applies ^ Description ^
| ''ttt_auto_afk'' | True | Live | Automatically marks idle alive players as AFK. |
===== Map And Vote Commands =====
^ Command ^ Description ^
| ''rtv'' | Starts a Rock the Vote map-change vote if ''ttt_rtv_enabled'' is true. Players can also type ''/rtv'' or ''!rtv'' in chat. |
| ''votekick PLAYERNAME'' | Starts a public votekick. Players can also type ''/votekick'' or ''!votekick'' in chat. |
| ''ttt_forcemapvote'' | Admin/host command that forces the map-vote flow. It is not blocked by ''ttt_rtv_enabled''. |
| ''changelevel MAPIDENT'' | Changes to a map ident. May cause instability! |
| ''map MAPIDENT'' | Alias for ''changelevel''. |
| ''scene SCENEFILE'' | Host-only scene change command for scene files. Use map idents for normal server operation. |
====== Troubleshooting ======
If your settings are not applying:
* Make sure ''server_settings.json'' is in the correct game ident's data folder.
* Make sure ConVars are edited under ''config/convar/game.json'' or your host's ConVar panel.
* Restart the dedicated server after editing files by hand.
* Check that your JSON is valid.
* In ''game.json'', edit only ''Value''.
* Check the server console for ''[server.settings]'' messages.
* Check the server console for ''[lobby.settings] applied'' to confirm the resolved lobby/rule settings.
* Check the server console for ''[server.launch]'' messages to confirm the native boot map.
Useful successful load message:
[server.settings] loaded path=server_settings.json schema=2 lobby=True vote_maps=18
Useful default/backfill messages:
[server.settings] missing path=server_settings.json; created active defaults. Edit server_settings.json and restart the dedicated server to customize settings.
[server.settings] defaults_backfilled path=server_settings.json
Useful failure message:
[server.settings] failed_to_load path=server_settings.json error=...
Useful launch message:
[server.launch] boot_context game=thieves.terrortown boot_map=thieves.rooftops launch_map=thieves.rooftops source=GameNetworkManager.OnStart dedicated=True
Useful applied settings message:
[lobby.settings] applied public, 6 rounds, 5m, prep 20s, haste 5m +0.5m/death, curated, 10 vote maps