Skip to content

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.

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:

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:

data/thieves/terrortown/server_settings.json

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:

Official;Verified
Official;Verified;AllCompatible

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:

orgident.mapident;orgident.mapident

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.official
t.maps.verified
t.maps.compatible

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:


Troubleshooting

If settings are not applying:

  • Make sure server_settings.json is in the correct game ident's data folder.
  • Make sure saved 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 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:

[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

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.