Server Hosting
This page covers the TTT-specific layer on top of a working s&box dedicated server: package setup, map rotation, public settings, and troubleshooting.
Quick Links
-
Launch args & startup map selection
-
Gameplay settings configuration
-
Choosing maps for your server
-
Load messages, JSON, etc
This page does not explain general s&box server hosting.
This section focuses on what to do when hosting TTT. Use these resources if the base server isn't set up:
Physgun has easy, beginner-friendly TTT server hosting available. Use code TTT for 30% off.
Launch Basics
| Launch Arg | TTT Value |
|---|---|
| Game package ident | thieves.terrortown |
| Startup map | The map ident after the game ident in the native launch command. |
| Empty-server reset map | The startup map captured at boot. |
Typical dedicated launch shape:
-headless +game thieves.terrortown thieves.rooftops +hostname "Test" +port 00000 +net_query_port 00000 +net_hide_address 0
Replace the ports, hostname, and map ident with your own values.
Empty dedicated servers
Dedicated servers return to their boot map after everyone leaves. This keeps the next join on a clean baseline map. The behavior can be adjusted by t.dedicated.empty_reset and t.dedicated.empty_reset.delay; see Server Settings and Public ConVars.
Settings Config
For most gameplay settings and commands, see:
-
Host settings, defaults, ranges, and map vote commands
-
Staff roles, commands and config options
-
Normal player chat and console commands
Files
TTT currently uses these operator-facing files:
| File | Purpose |
|---|---|
server_settings.json |
Small dedicated-server bootstrap config: lobby max players/privacy and map vote source lists. |
config/convar/game.json |
Native s&box saved ConVars. Most gameplay and rule settings live here. |
roles.json |
Moderator/Admin/Owner role assignments written by TTT role commands. |
bans.json |
Persistent dedicated-server host bans. |
server_settings.json lives under the package's game data folder.
Example:
The game creates this file with active defaults the first time a dedicated server starts without one.
Current editable shape:
{
"SchemaVersion": 3,
"Lobby": {
"MaxPlayers": 36,
"Privacy": 0
},
"MapVote": {
"Pool": "Official;Verified",
"AlwaysInclude": "",
"NeverShow": ""
}
}
| Field | Default | Description |
|---|---|---|
SchemaVersion |
3 |
Generated by the game for future migrations. Leave this alone. |
Lobby.MaxPlayers |
36 |
Maximum player count for the lobby. Keep this aligned with any external server-manager player limit. |
Lobby.Privacy |
0 |
Lobby privacy: 0 public, 1 private, 2 friends only. Public dedicated servers should use 0. |
MapVote.Pool |
Official;Verified |
Source pools used for generated map vote options. |
MapVote.AlwaysInclude |
empty | Extra map idents added to the eligible vote candidates. These are called Custom Maps in the lobby UI. |
MapVote.NeverShow |
empty | Server-owner exclusions. These maps will not appear in generated map votes. |
Manual edits
Stop the server before editing JSON files by hand. A malformed JSON file can prevent settings from loading.
Map Sources
server_settings.json map vote pool example:
"MapVote": {
"Pool": "Official;Verified",
"AlwaysInclude": "thieves.dolls;throwupproducs.islandtropical",
"NeverShow": "doltcollective.badmapihate"
}
MapVote.Pool chooses the normal source pools for generated vote options:
| Pool | Meaning |
|---|---|
Official |
Maps made by, for, or directly maintained by the TTT team. |
Verified |
Community maps reviewed and sanctioned for TTT. |
AllCompatible |
All discovered map packages that target TTT. |
You can combine pools:
All and Any are also accepted for all currently playable source pools.
AlwaysInclude is additive. It can include maps outside the selected pool as long as they can be resolved and are not rejected by game validation. These maps join the eligible candidate set; they are not guaranteed or pinned to every ballot. NeverShow is the server-owner exclusion list and wins over selected pools. Adding a map to AlwaysInclude removes it from NeverShow. Adding a map to NeverShow removes it from AlwaysInclude.
Set Pool to an empty string if you only want maps from AlwaysInclude.
Lobby terminology
The Create Lobby screen calls AlwaysInclude Custom Maps. Both names refer to the same additional candidate list. See Lobby Map Selection for the host-facing browser and rule-preset behavior.
Other maps
Any maps that aren't targeting the game (e.g. facepunch.flatgrass) must be added manually to "AlwaysInclude". We'd add it as a pool, but it'd take 2 full minutes just to load the map vote or browser, because we'd have to check every map on s&box to do so.
Separate map idents with semicolons, commas, or newlines:
Duplicate entries are collapsed/ignored. If a selected pool or include list produces no valid maps, the vote system falls back as safely as it can instead of showing blocked or invalid entries.
Startup map
The native +game org.game org.map launch argument decides your startup map.
TTT has a blacklist of a few maps that are known to be broken, cause the game to crash, and generally have been untouched for 2+ years (from the Entity days). If your map is not playable, it may be on this list- if you've updated it and know it to be working, reach out to us on discord!
Map Commands
You can print the current full pool lists from the dedicated server console to see what they include:
t.maps.compatible can take a little time because it discovers compatible packages. When AllCompatible is enabled for map votes, the server prewarms that discovery after settings apply and reuses the cached list for later votes.
All of the other map vote settings and selection commands are listed below:
-
Map vote settings options
-
Map selection, vote and pool editing
Troubleshooting
If settings are not applying:
- Make sure
server_settings.jsonis in the correct game ident's data folder. - Make sure saved ConVars are edited under
config/convar/game.jsonor your host's ConVar panel. - Restart the dedicated server after editing files by hand.
- Check that your JSON is valid.
- In
game.json, edit onlyValue. - Check the server console for
[server.settings]messages. - Check the server console for
[lobby.settings] appliedto confirm 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=3 lobby=True map_pool=Official;Verified always_include=0 never_show=0
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:
Useful launch message:
[server.launch] boot_context game=thieves.terrortown boot_map=thieves.rooftops launch_map=thieves.rooftops source=GameNetworkManager.OnStart dedicated=True
Hosting Checklist
- Confirm that the server can boot a normal s&box dedicated instance before adding TTT-specific configuration.
- Use the TTT package ident:
thieves.terrortown. - Choose a startup map ident and keep it with the launch command.
- Decide whether the server should run curated maps, verified community maps, compatible public maps, or a hand-picked list.