Mapping & Hammer

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 MapWird in TTT zu
weapon_smg1weapon_zm_mac10
weapon_shotgunweapon_zm_shotgun
item_healthkitweapon_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 points in 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 platzierten weapon_zm_* nicht geht. Über die Spawnflags (Sub-Machine Guns, Assault Rifles, Sniper Rifles, Shotguns und weitere) grenzt du die Auswahl ein. auto_ammo legt die angegebene Zahl passender Munitionskisten dazu. Lass über der Entity etwas Platz, die Kisten entstehen dort und fallen herunter. ttt_random_ammo wird entsprechend zu einer zufälligen Munitionskiste.
  • Platzierungsskripte. Alternativ liest TTT eine Textdatei maps/<mapname>_ttt.txt (oder dieselbe Datei in data_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. Mit replacespawns 1 ersetzt es auch die Spawns. Abschalten lässt sich das mit ttt_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

EntityAufgabeWichtige Keyvalues, Inputs und Outputs
ttt_map_settingsEinstellungen und Rundenereignissecbar_doors, cbar_buttons, cbar_other, plymodel, propspec_allow_named; Outputs RoundPreparation, RoundStart, RoundEnd
ttt_traitor_buttonKnopf, den nur Traitor im HUD sehen und aus der Ferne drückendescription, wait, RemoveOnPress, UsableRange; Inputs Lock, Unlock; Output OnPressed
ttt_logic_rolePrüft die Rolle des !activatorRole; Input TestActivator; Outputs OnPass, OnFail
ttt_filter_roleFilter für Trigger nach RolleRole
ttt_traitor_checkBrush, zählt lebende Traitor im VolumenInput CheckForTraitor; Output TraitorsFound
ttt_weapon_checkBrush, prüft Waffen der Spieler im VolumenInputs CheckForType, CheckForClass; Output WeaponsFound
ttt_damageownerSchreibt den Schaden einer Entity einem Spieler zudamager, killname; Inputs SetActivatorAsDamageOwner, ClearDamageOwner
ttt_winBeendet die RundeInputs TraitorWin, InnocentWin
ttt_game_textNachricht im TTT-Meldungsbereich oben rechtsreceive, message, color; Input Display
ttt_credit_adjustZieht dem !activator TTT-Credits ab oder gibt ihm welchecredits; Input TakeCredits; Outputs OnSuccess, OnFail
ttt_spectator_spawnZielpunkt für ZuschauerWinkel 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_rotating und prop_door_rotating, entsperrt und drückt jeden func_button und öffnet jede func_movelinear, sofern die Entity einen Namen hat. Soll eine Tür nur über deine Logik aufgehen, stellst du in ttt_map_settings die passende cbar_-Option auf No.
  • In der Vorbereitungsphase ist jeder Innocent. ttt_logic_role und ttt_filter_role werten dann alle Spieler als Innocent.
  • ttt_traitor_check ist veraltet. Die FGD kennzeichnet die Klasse mit editor/obsolete.vmt, und die Dokumentation empfiehlt stattdessen ttt_logic_role mit einem normalen Trigger.
  • RoundEnd liefert 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. Mit wait oder RemoveOnPress begrenzt 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

  1. Lege die BSP in garrysmod/maps, wähle TTT als Spielmodus und starte die Map. TTT wartet zunächst auf Spieler.
  2. Setze ttt_minimum_players 1 und ttt_debug_preventwin 1. Erst wenn TTT die erste Runde vorbereitet, werden Entities ersetzt und Waffen platziert.
  3. Aktiviere sv_cheats 1 und wechsle mit ttt_force_traitor, ttt_force_detective und ttt_force_terror die Rolle.
  4. Starte mit ttt_roundrestart eine neue Runde und prüfe, ob sich alles zurücksetzt.
  5. Für Tests von ttt_win stellst du ttt_debug_preventwin wieder 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.