TTT-Maps bauen: Entities, Spawns und Tests für GMod
TTT-Maps bauen: welche Spawns und Waffen TTT automatisch nutzt, was jede ttt_-Entity tut, wie du die ttt.fgd in Hammer lädst und Runden allein testest.
Eine Map für Trouble in Terrorist Town braucht technisch nur genug Spawnpunkte vom Typ info_player_deathmatch sowie Waffen und Munition. Alles Weitere ist optional: TTT liefert eine eigene FGD-Datei mit ttt_-Entities mit, über die du Traitor-Knöpfe, Rollenabfragen, Fallen mit korrekter Kill-Zuordnung und Rundenereignisse baust. Zwei Eigenheiten musst du kennen: TTT setzt die Map vor jeder Runde vollständig zurück, und in der Vorbereitungsphase gilt jeder Spieler als Innocent.
Was TTT einer Map automatisch entnimmt
Spawns. TTT nutzt neben info_player_deathmatch auch info_player_terrorist, info_player_counterterrorist, info_player_combine, info_player_rebel, info_player_axis, info_player_allies, info_player_teamspawn und gmod_player_start. info_player_start zieht der Code nur heran, wenn keine dieser Klassen vorhanden ist, und die TTT-Dokumentation rät ausdrücklich davon ab. Die Spawn-Klassen anderer Spielmodi behandelt der Artikel Spawnpunkte und Spielmodus-Entities.
Waffen und Munition. Bei der Vorbereitung jeder Runde ersetzt TTT die Waffen- und Item-Entities aus Half-Life 2 durch eigene. Ein Auszug aus der Tabelle im TTT-Code:
| Entity in der Map | Wird in TTT zu |
|---|---|
weapon_smg1 | weapon_zm_mac10 |
weapon_shotgun | weapon_zm_shotgun |
item_healthkit | weapon_zm_shotgun |
Die Standard-Maps aus Counter-Strike: Source enthalten in der Regel keine Waffen-Entities. Findet TTT keine spawnbare Waffe und kein info_player_deathmatch, aber ein info_player_counterterrorist, verteilt es zufällige Waffen an den Spawnpunkten und Geisel-Entities.
Zurücksetzen. Vor jeder Runde ruft TTT game.CleanUpMap auf. Türen, Knöpfe, zerstörte Props und jede Logik-Entity stehen danach wieder im Ausgangszustand. Baue also nichts, das sich über Runden hinweg etwas merken soll.
Die TTT-Entities in Hammer laden
Die Datei ttt.fgd liegt in garrysmod/gamemodes/terrortown/. Im Unterordner mapexamples findest du drei Beispiel-Maps: ttt_traitorcheck.vmf, ttt_traps.vmf und ttt_weaponcheck.vmf. In Hammer öffnest du Tools > Options, wählst den Reiter Game Configurations und fügst die Datei unter „Game Data files“ mit Add hinzu.
Danach bietet Hammer info_player_deathmatch an (in der garrysmod.fgd fehlt diese Klasse), dazu die Waffen (weapon_zm_*, weapon_ttt_*), die Munition (item_*_ttt) und die ttt_-Entities.
TTT baut auf den Inhalten von Counter-Strike: Source auf, und seit dem Update vom Juli 2025 liefert GMod den Großteil der Inhalte aus CS:S und den Half-Life-2-Episoden selbst mit, allerdings ohne Maps, Musik und Sprachausgabe. Du kannst sie in einer TTT-Map also nutzen. Was genau dabei ist, steht unter CS:S- und HL2-Content in GMod-Maps.
Spawns, Waffen und Munition platzieren
- Spawnzahl. Laut Dokumentation ist TTT für 16 bis 18 Spieler gedacht, viele Server erlauben mehr. Für Platzierungsskripte empfiehlt sie mindestens 32 Spawns. Fehlt ein freier Spawn, erzeugt TTT provisorische Spawns 36 Units neben einem vorhandenen und schreibt
TTT WARNING: Map has too few spawn pointsin die Konsole. Gelingt auch das nicht, wird ein Spawn erzwungen, und wer dort steht, stirbt. Lass deshalb rund um jeden Spawn freien Boden. ttt_random_weapon. Die Entity wird beim Spawnen zu einer zufälligen Waffe aus allen Waffen, die auf dem Server als automatisch spawnbar registriert sind. Dazu gehören auch Waffen aus Addons, was mit fest platziertenweapon_zm_*nicht geht. Über die Spawnflags (Sub-Machine Guns, Assault Rifles, Sniper Rifles, Shotguns und weitere) grenzt du die Auswahl ein.auto_ammolegt die angegebene Zahl passender Munitionskisten dazu. Lass über der Entity etwas Platz, die Kisten entstehen dort und fallen herunter.ttt_random_ammowird entsprechend zu einer zufälligen Munitionskiste.- Platzierungsskripte. Alternativ liest TTT eine Textdatei
maps/<mapname>_ttt.txt(oder dieselbe Datei indata_static/). Sie entsteht mit dem Addon TTT Weapon Placer in Sandbox und ist vor allem für Maps gedacht, die nicht für TTT gebaut wurden. Wichtig: Existiert ein solches Skript, entfernt TTT die in der Map platzierten Waffen und die Munition (alles automatisch Spawnbare sowie die Half-Life-2-Klassen, die es sonst ersetzen würde) und lädt stattdessen den Inhalt des Skripts. Mitreplacespawns 1ersetzt es auch die Spawns. Abschalten lässt sich das mitttt_use_weapon_spawn_scripts 0.
Eine Zeile besteht aus Klasse, Position und Winkel, getrennt durch Tabulatoren:
setting: replacespawns 1
ttt_playerspawn -203.8 -1811.8 -209.6 0 36 0
ttt_random_weapon -1107.0 2109.9 194.0 1.8 132.9 -92.7 auto_ammo 2
Die TTT-Entities im Überblick
| Entity | Aufgabe | Wichtige Keyvalues, Inputs und Outputs |
|---|---|---|
ttt_map_settings | Einstellungen und Rundenereignisse | cbar_doors, cbar_buttons, cbar_other, plymodel, propspec_allow_named; Outputs RoundPreparation, RoundStart, RoundEnd |
ttt_traitor_button | Knopf, den nur Traitor im HUD sehen und aus der Ferne drücken | description, wait, RemoveOnPress, UsableRange; Inputs Lock, Unlock; Output OnPressed |
ttt_logic_role | Prüft die Rolle des !activator | Role; Input TestActivator; Outputs OnPass, OnFail |
ttt_filter_role | Filter für Trigger nach Rolle | Role |
ttt_traitor_check | Brush, zählt lebende Traitor im Volumen | Input CheckForTraitor; Output TraitorsFound |
ttt_weapon_check | Brush, prüft Waffen der Spieler im Volumen | Inputs CheckForType, CheckForClass; Output WeaponsFound |
ttt_damageowner | Schreibt den Schaden einer Entity einem Spieler zu | damager, killname; Inputs SetActivatorAsDamageOwner, ClearDamageOwner |
ttt_win | Beendet die Runde | Inputs TraitorWin, InnocentWin |
ttt_game_text | Nachricht im TTT-Meldungsbereich oben rechts | receive, message, color; Input Display |
ttt_credit_adjust | Zieht dem !activator TTT-Credits ab oder gibt ihm welche | credits; Input TakeCredits; Outputs OnSuccess, OnFail |
ttt_spectator_spawn | Zielpunkt für Zuschauer | Winkel der Entity |
Vier Dinge gehen aus der Tabelle nicht hervor:
- Die Brechstange öffnet benannte Türen. Standardmäßig entsperrt und öffnet ein Schlag mit der Brechstange jede
func_door,func_door_rotatingundprop_door_rotating, entsperrt und drückt jedenfunc_buttonund öffnet jedefunc_movelinear, sofern die Entity einen Namen hat. Soll eine Tür nur über deine Logik aufgehen, stellst du inttt_map_settingsdie passendecbar_-Option auf No. - In der Vorbereitungsphase ist jeder Innocent.
ttt_logic_roleundttt_filter_rolewerten dann alle Spieler als Innocent. ttt_traitor_checkist veraltet. Die FGD kennzeichnet die Klasse miteditor/obsolete.vmt, und die Dokumentation empfiehlt stattdessenttt_logic_rolemit einem normalen Trigger.RoundEndliefert den Ausgang als Parameter: 2 für Traitor, 3 für Innocent, 4 für das Zeitlimit.
Wie du Outputs mit Inputs verdrahtest, erklärt der Artikel Hammer: Inputs und Outputs. info_manipulate im TTT-Ordner ist nur ein Platzhalter für alte Zombie-Master-Maps und wird im Spiel zu einem ttt_traitor_button.
Layout: Ratschläge, keine Regeln
Dieser Abschnitt ist Design-Erfahrung und keine dokumentierte Vorgabe. Fest stehen nur die Verhältnisse: Mit den Standardwerten sind 25 Prozent der Spieler Traitor (abgerundet, mindestens einer), und ab 8 Spielern gibt es Detectives. Bei 16 Spielern sind das 4 Traitor und 2 Detectives.
- Sichtlinien mischen. Traitor brauchen unbeobachtete Momente, Innocents brauchen Stellen mit Überblick. Eine Map nur aus langen Fluren bedient eine Seite.
- Orte für Leichen. Eine gefundene Leiche liefert Hinweise. Nischen abseits der Hauptwege machen das Verstecken möglich, sollten aber erreichbar bleiben.
- Faire Fallen. Eine Falle ist fair, wenn aufmerksame Spieler sie erkennen oder ihr ausweichen können. Verbinde sie mit
ttt_damageowner, sonst wird der Kill keinem Spieler zugerechnet, weder bei Punkten und Karma noch im Rundenbericht. MitwaitoderRemoveOnPressbegrenzt du, wie oft sie auslöst. - Traitor-Tester. Er ist in der Community umstritten, weil er Beobachten und Schlussfolgern durch Schlangestehen ersetzen kann. Verbreitete Kompromisse sind Tester, die langsam arbeiten, nur eine Person prüfen oder sich von Traitorn sabotieren lassen.
Ein Navmesh nutzt der TTT-Code nicht. Du brauchst es nur, wenn Server Bots oder Nextbots einsetzen, siehe Navmesh und AI-Nodes.
Mit dem Rundensystem testen
- Lege die BSP in
garrysmod/maps, wähle TTT als Spielmodus und starte die Map. TTT wartet zunächst auf Spieler. - Setze
ttt_minimum_players 1undttt_debug_preventwin 1. Erst wenn TTT die erste Runde vorbereitet, werden Entities ersetzt und Waffen platziert. - Aktiviere
sv_cheats 1und wechsle mitttt_force_traitor,ttt_force_detectiveundttt_force_terrordie Rolle. - Starte mit
ttt_roundrestarteine neue Runde und prüfe, ob sich alles zurücksetzt. - Für Tests von
ttt_winstellst duttt_debug_preventwinwieder auf 0, sonst ignoriert TTT den Sieg.
Spawnzahl, Waffenverteilung und Fallen zeigen sich erst mit einem vollen Server. Wie du das organisierst, steht unter GMod-Map mit Spielern testen.
Häufige Fragen
Muss der Name einer TTT-Map mit ttt_ beginnen?
Technisch nicht, TTT läuft auf jeder Map. Die Spielmodus-Datei von TTT enthält aber das Muster ^ttt_, und Garry's Mod sortiert Maps anhand dieses Musters in der Map-Auswahl dem Spielmodus zu.
Warum fehlen auf meiner Map die Waffen, die ich platziert habe?
Prüfe, ob eine Datei <mapname>_ttt.txt existiert. TTT liefert solche Skripte für mehrere CS:S-Maps mit, und ein Skript ersetzt die in der Map platzierten Waffen.
Wie weit reicht ein ttt_traitor_button?
Standardmäßig 1024 Units, gemessen zwischen Knopf und Spieler. Über UsableRange änderst du den Wert. Innocents sehen den Knopf gar nicht.