This is an old revision of the document!
Table of Contents
Dedicated Server Settings
Server hosting for TTT is still early and subject to change. This page documents the current dedicated-server setup.
This page does not explain how to install or start a baseline s&box dedicated server. For general s&box dedicated server setup, see: s&box Dedicated Servers
For the easiest and most stable server hosting on s&box, your best option is using physgun.
Basics
Live package ident:
thieves.terrortown
TTT dedicated config file:
server_settings.json
This file lives under the package's game data folder.
steamcmd/ttt/data/thieves/terrortown/server_settings.json
The game creates this file with active defaults the first time a dedicated server starts without one. We recommend launching the server with the game once before attempting configuration, like so:
Important Startup Map Rule
Choose the server startup map with the native s&box dedicated launch command as shown above.
The map ident after the game ident is the boot map. TTT also uses that boot map as the empty-server reset map.
Do not configure the startup map in server_settings.json. The old Server.StartupMap field is deprecated and ignored.
Launch Example
Typical dedicated launch shape (replace port with your port):
-headless +game thieves.terrortown thieves.rooftops +hostname "Test" +port 00000 +net_query_port 00000 +net_hide_address 0
Basic server_settings.json Example
The generated file includes the full curated map list. This shortened example shows the current editable shape.
- server_settings.json
{ "SchemaVersion": 1, "Server": {}, "Lobby": { "MaxPlayers": 24, "Privacy": 0, "MinPlayerCount": 2, "MaxRounds": 6, "RoundTimeMinutes": 5, "PrepareDurationSeconds": 20, "HasteMode": true, "HasteStartingMinutes": 5, "HasteMinutesPerDeath": 0.5, "MapVoteOptionCount": 8, "AllowPlayerCosmetics": true, "ProximityVoiceEnabled": false, "ProximityVoiceRange": 2000, "KarmaEnabled": true, "KarmaLowAutoKick": false, "RockTheVoteEnabled": true }, "MapVote": { "Maps": "thieves.rooftops;thieves.whitehouse;thieves.minecraft_t5" }, "AdminSteamIds": [] }
How Settings Persist
server_settings.json
server_settings.json is a dedicated-server bootstrap file.
- It is read once per server process.
- Edit it while the server is stopped, then restart the dedicated server.
- Missing fields are backfilled with defaults on startup.
- Values from this file survive map changes and full server restarts.
- Runtime console edits do not write back into
server_settings.json.
Runtime Console Edits
Some settings are also real console variables. Changing them in the server console affects the running server.
- Runtime console edits survive normal map travel during the same server process.
- Runtime console edits are lost on full server restart unless you also set the matching value in
server_settings.json, pass the ConVar from your launch tooling, or persist it through another server-manager mechanism. - Most lobby/bootstrap-only fields have no live console command yet.
Map Transitions
Normal map changes, RTV map changes, admin-forced map votes, and empty-server resets snapshot the current host settings before travel. That is why live changes such as ttt_karma 0 or ttt_rtv_enabled 0 carry to the next map in the same process.
Dedicated Config Settings
SchemaVersion
Generated by the game for future migrations. Leave this alone.
Server
Currently no active settings are required under Server. Older configs may contain:
"StartupMap": "thieves.rooftops"
This field is ignored. Set the startup map in the native launch command instead as described earlier.
Lobby
| Setting | Default | Console? | Takes Effect | Persists Restart? | Description |
|---|---|---|---|---|---|
MaxPlayers | 24 | No | Startup; carried across map travel | Yes | Maximum player count for the lobby. Keep this aligned with any external server-manager player limit. |
Privacy | 0 | No | Startup; carried across map travel | Yes | Lobby privacy: 0 public, 1 private, 2 friends only. Public dedicated servers should use 0. |
MinPlayerCount | 2 | No | Startup; carried across map travel | Yes | Minimum eligible players required before normal round start behavior proceeds. |
MaxRounds | 6 | No direct ConVar | Startup or next round; carried across map travel | Yes | Rounds to play before match end and map vote. |
RoundTimeMinutes | 5 | No direct ConVar | Startup or next round; carried across map travel | Yes | Round duration when haste mode is off. |
PrepareDurationSeconds | 20 | No | Startup or next round; carried across map travel | Yes | Preparation phase duration before a round starts. |
HasteMode | true | No direct ConVar | Startup or next round; carried across map travel | Yes | Enables haste mode. |
HasteStartingMinutes | 5 | No direct ConVar | Startup or next round; carried across map travel | Yes | Public round timer duration before haste overtime starts. Allowed range: 1 to 30. |
HasteMinutesPerDeath | 0.5 | No direct ConVar | Startup or next round; carried across map travel | Yes | Minutes added to the hidden round limit each time a player dies. Allowed range: 0 to 5. |
MapVoteOptionCount | 8 | No direct ConVar | Live for newly-created map votes | Yes | Maximum map choices shown during a map vote. Allowed range: 3 to 12. |
AllowPlayerCosmetics | true | No direct ConVar | Startup or next round; carried across map travel | Yes | Allows s&box player cosmetics. |
ProximityVoiceEnabled | false | No direct ConVar | Live; carried across map travel | Yes | Limits normal alive-player voice by distance during active rounds. Team voice and dead/alive voice filtering are separate. |
ProximityVoiceRange | 2000 | No direct ConVar | Live; carried across map travel | Yes | Voice range in world units when proximity voice is enabled. Allowed range: 500 to 5000. |
KarmaEnabled | true | ttt_karma | Next round | Yes if set in config | Enables karma penalties, rewards, and low-karma damage scaling. |
KarmaLowAutoKick | false | ttt_karma_low_autokick | Next round / round end checks | Yes if set in config | Kicks non-host players below the low-karma threshold at round end. |
RockTheVoteEnabled | true | ttt_rtv_enabled | Live | Yes if set in config | Allows players to start Rock the Vote map-change votes. Votekick and admin-forced map votes are unaffected. |
Karma Console Tuning
Only KarmaEnabled and KarmaLowAutoKick are stored in server_settings.json. The lower-level karma tuning values below are runtime ConVars.
| ConVar | Default | Persists Map Travel? | Persists Restart? | Description |
|---|---|---|---|---|
ttt_karma | 1 | Yes | Only if also set in server_settings.json or launch tooling | Enables/disables the karma system. |
ttt_karma_low_autokick | 0 | Yes | Only if also set in server_settings.json or launch tooling | Enables/disables low-karma auto-kick. |
ttt_karma_low_amount | 300 | Yes | No, unless launch/server tooling reapplies it | Low-karma threshold used by auto-kick. |
ttt_karma_strict | 1 | Yes | No, unless launch/server tooling reapplies it | Uses stricter low-karma damage scaling. |
ttt_karma_ratio | 0.001 | Yes | No, unless launch/server tooling reapplies it | Scales karma penalties from victim karma. |
ttt_karma_kill_penalty | 30 | Yes | No, unless launch/server tooling reapplies it | Base full team-kill penalty percentage. |
ttt_karma_starting | 1000 | Yes | No, unless launch/server tooling reapplies it | Normal starting karma. |
ttt_karma_max | 1100 | Yes | No, unless launch/server tooling reapplies it | Maximum karma. |
ttt_karma_min_required | 800 | Yes | No, unless launch/server tooling reapplies it | Karma value below which damage scaling applies. |
ttt_karma_round_increment | 15 | Yes | No, unless launch/server tooling reapplies it | Round-end karma recovery. |
ttt_karma_round_heal_on_teamkill | 10 | Yes | No, unless launch/server tooling reapplies it | Round-end recovery when the player team-killed. |
ttt_karma_clean_bonus | 25 | Yes | No, unless launch/server tooling reapplies it | Extra clean-round karma bonus. |
ttt_karma_traitorkill_bonus | 10 | Yes | No, unless launch/server tooling reapplies it | Bonus for valid traitor kills. |
ttt_karma_clean_half | 0 | Yes | No, unless launch/server tooling reapplies it | Optional falloff for high-karma recovery bonuses. |
Example:
ttt_karma 0 ttt_karma_low_autokick 1 ttt_karma_low_amount 250
Map Vote Rotation
The dedicated map vote pool is configured through:
"MapVote": {
"Maps": "thieves.rooftops;thieves.dolls;throwupproducs.islandtropical"
}
Separate map idents with semicolons, commas, or newlines.
orgident.mapident;orgident.mapident
Duplicate entries are collapsed. Maps outside the built-in curated list are ignored for dedicated map vote rotation. Make sure at least one valid map remains.
You can print the current built-in map whitelist from the server console with:
t.server.maps
The old MapVote.Whitelist and MapVote.Blacklist fields are migrated into MapVote.Maps when possible. Use MapVote.Maps going forward.
Admins And Roles
Dedicated servers can bootstrap admins with:
"AdminSteamIds": [ 00000000000000000, 11111111111111111 ]
Use SteamID64 values. Invalid or zero IDs are ignored.
AdminSteamIds bootstraps Admin role assignments from server_settings.json. Live role edits are stored separately in admins.json in the same data area and survive map transitions and server restarts.
Useful role commands:
| Command | Persists? | Description |
|---|---|---|
ttt_addadmin STEAMID64 | Yes, to admins.json | Assign Admin. |
ttt_removeadmin STEAMID64 | Yes, to admins.json | Remove Admin. |
ttt_addmod STEAMID64 / ttt_removemod STEAMID64 | Yes, to admins.json | Add or remove Moderator. |
ttt_addowner STEAMID64 / ttt_removeowner STEAMID64 | Yes, to admins.json | Add or remove Owner. |
ttt_setrole STEAMID64 ROLE | Yes, to admins.json | Replace assignable roles with one role. ROLE is mod, admin, or owner. |
ttt_clearrole STEAMID64 | Yes, to admins.json | Remove assignable roles. Founder is not removed. |
ttt_listadmins | No change | Print admin IDs. |
ttt_listroles | No change | Print assigned roles. |
The listen host/founder is derived per session and is not written to admins.json.
Other Runtime Console Options
These are launch/convar/runtime options, not fields inside server_settings.json.
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. |
map MAPIDENT | Alias for changelevel. |
scene SCENEFILE | Host-only scene change command for scene files. Use map idents for normal server operation. |
Deprecated Or Ignored Settings
| Old Setting | Current Status |
|---|---|
Server.StartupMap | Ignored. Use the native +game org.game org.map launch argument. |
MapVote.Whitelist | Migrated to MapVote.Maps if Maps is missing. |
MapVote.Blacklist | No longer the dedicated rotation model. If only Blacklist is present, defaults are backfilled into MapVote.Maps. |
Troubleshooting
If your settings are not applying:
- Make sure the file is named
server_settings.json. - Make sure the file is in the correct game ident's data folder.
- Restart the dedicated server after editing
server_settings.json. - Check that your JSON is valid.
- Check the server console for
[server.settings]messages. - Check the server console for
[lobby.settings] appliedto 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 lobby=True vote_maps=18 admin_count=1
If an old config still contains Server.StartupMap, you may see:
[server.settings] loaded path=server_settings.json lobby=True vote_maps=18 admin_count=1 legacy_startup_map_ignored=thieves.rooftops
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, 8 vote maps
Current Limitations
server_settings.jsonis read once per server process.- Restart the dedicated server after editing
server_settings.json. - Runtime console changes are convenient for the current process, but should be mirrored into config or launch tooling if they need to survive a full restart.
- Not every
server_settings.jsonfield has a matching live ConVar yet. - Keep
Lobby.MaxPlayersaligned with any external server-manager player limit. - Set the startup map with the native launch command, not
server_settings.json. - Dedicated server support is still early and may change.


