Crear mapas TTT: entities, spawns y pruebas en GMod
Crear mapas TTT: qué spawns y armas recoge TTT automáticamente, qué hace cada entity ttt_, cómo cargar ttt.fgd en Hammer y probar rondas en solitario.
Técnicamente, un mapa para Trouble in Terrorist Town solo necesita suficientes puntos de spawn info_player_deathmatch, además de armas y munición. Todo lo demás es opcional: TTT incluye su propio archivo FGD con entities ttt_ que te permiten construir botones de traidor, comprobaciones de rol, trampas con la atribución correcta de las muertes y eventos de ronda. Importan dos peculiaridades: TTT reinicia el mapa por completo antes de cada ronda, y durante la fase de preparación todos los jugadores cuentan como inocentes.
Lo que TTT toma automáticamente de un mapa
Spawns. Además de info_player_deathmatch, TTT usa info_player_terrorist, info_player_counterterrorist, info_player_combine, info_player_rebel, info_player_axis, info_player_allies, info_player_teamspawn y gmod_player_start. El código solo recurre a info_player_start cuando no existe ninguna de ellas, y la documentación de TTT lo desaconseja. Las clases de spawn de otros modos de juego se tratan en spawns y entities de modo de juego.
Armas y munición. Al preparar una ronda, TTT sustituye las entities de armas y objetos de Half-Life 2 por las suyas. Un extracto de la tabla del código de TTT:
| Entity en el mapa | Se convierte en TTT en |
|---|---|
weapon_smg1 | weapon_zm_mac10 |
weapon_shotgun | weapon_zm_shotgun |
item_healthkit | weapon_zm_shotgun |
Los mapas originales de Counter-Strike: Source no suelen contener entities de armas. Si TTT no encuentra ningún arma spawneable ni ningún info_player_deathmatch, pero sí un info_player_counterterrorist, reparte armas aleatorias en los puntos de spawn y en las entities de rehenes.
Reinicio. Antes de cada ronda, TTT llama a game.CleanUpMap. Las puertas, los botones, los props rotos y todas las entities de lógica vuelven entonces a su estado inicial. Así que no construyas nada que tenga que recordar un estado de una ronda a otra.
Cargar las entities de TTT en Hammer
ttt.fgd está en garrysmod/gamemodes/terrortown/. La subcarpeta mapexamples contiene tres mapas de ejemplo: ttt_traitorcheck.vmf, ttt_traps.vmf y ttt_weaponcheck.vmf. En Hammer, abre Tools > Options, selecciona la pestaña Game Configurations y añade el archivo en «Game Data files» con Add.
Hammer ofrece entonces info_player_deathmatch (esta clase falta en garrysmod.fgd), las armas (weapon_zm_*, weapon_ttt_*), la munición (item_*_ttt) y las entities ttt_.
TTT se basa en el contenido de Counter-Strike: Source, y desde la actualización de julio de 2025 el propio GMod incluye la mayor parte del contenido de CS:S y de los episodios de Half-Life 2, sin mapas, música ni voces. Por eso puedes usarlo en un mapa TTT. Qué incluye exactamente se explica en contenido de CS:S y HL2 en mapas de GMod.
Colocar spawns, armas y munición
- Número de spawns. Según la documentación, TTT está pensado para entre 16 y 18 jugadores, y muchos servidores permiten más. Para los scripts de colocación recomienda al menos 32 spawns. Si no hay ningún spawn libre, TTT crea spawns provisionales a 36 unidades de uno existente y escribe
TTT WARNING: Map has too few spawn pointsen la consola. Si eso también falla, se fuerza un spawn y quien esté allí muere. Así que deja suelo despejado alrededor de cada spawn. ttt_random_weapon. Al aparecer, se convierte en un arma aleatoria de entre todas las registradas en el servidor como spawneables automáticamente. Eso incluye las armas de addons, algo que las entitiesweapon_zm_*fijas no pueden hacer. Los spawnflags (Sub-Machine Guns, Assault Rifles, Sniper Rifles, Shotguns y más) acotan la selección.auto_ammoañade el número indicado de cajas de munición compatibles. Deja algo de espacio encima de la entity, porque las cajas se crean ahí y caen.ttt_random_ammose convierte, del mismo modo, en una caja de munición aleatoria.- Scripts de colocación. Como alternativa, TTT lee un archivo de texto
maps/<mapname>_ttt.txt(o el mismo archivo endata_static/). Se crea con el addon TTT Weapon Placer en Sandbox y está pensado sobre todo para mapas que no se construyeron para TTT. Importante: si existe un script así, TTT elimina las armas y la munición colocadas en el mapa (todo lo spawneable automáticamente más las clases de Half-Life 2 que de otro modo sustituiría) y carga en su lugar el contenido del script. Conreplacespawns 1sustituye también los spawns. Puedes desactivarlo conttt_use_weapon_spawn_scripts 0.
Una línea se compone de clase, posición y ángulos, separados por tabuladores:
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
Las entities de TTT de un vistazo
| Entity | Función | Keyvalues, inputs y outputs principales |
|---|---|---|
ttt_map_settings | Ajustes y eventos de ronda | cbar_doors, cbar_buttons, cbar_other, plymodel, propspec_allow_named; outputs RoundPreparation, RoundStart, RoundEnd |
ttt_traitor_button | Botón que solo los traidores ven en su HUD y pulsan a distancia | description, wait, RemoveOnPress, UsableRange; inputs Lock, Unlock; output OnPressed |
ttt_logic_role | Comprueba el rol del !activator | Role; input TestActivator; outputs OnPass, OnFail |
ttt_filter_role | Filtro para triggers según el rol | Role |
ttt_traitor_check | Brush que cuenta los traidores vivos dentro de su volumen | Input CheckForTraitor; output TraitorsFound |
ttt_weapon_check | Brush que comprueba las armas de los jugadores dentro de su volumen | Inputs CheckForType, CheckForClass; output WeaponsFound |
ttt_damageowner | Atribuye el daño de una entity a un jugador | damager, killname; inputs SetActivatorAsDamageOwner, ClearDamageOwner |
ttt_win | Termina la ronda | Inputs TraitorWin, InnocentWin |
ttt_game_text | Mensaje en la zona de mensajes de TTT, arriba a la derecha | receive, message, color; input Display |
ttt_credit_adjust | Quita créditos de TTT al !activator o se los da | credits; input TakeCredits; outputs OnSuccess, OnFail |
ttt_spectator_spawn | Punto de destino para los espectadores | Ángulos de la entity |
Cuatro cosas que la tabla no muestra:
- La palanca abre las puertas con nombre. Por defecto, un golpe de palanca desbloquea y abre cualquier
func_door,func_door_rotatingyprop_door_rotating, desbloquea y pulsa cualquierfunc_buttony abre cualquierfunc_movelinear, siempre que la entity tenga nombre. Si una puerta solo debe abrirse mediante tu lógica, pon en No la opcióncbar_correspondiente dettt_map_settings. - Durante la fase de preparación todos son inocentes.
ttt_logic_roleyttt_filter_roletratan entonces a todos los jugadores como inocentes. ttt_traitor_checkestá obsoleta. El FGD marca la clase coneditor/obsolete.vmt, y la documentación recomienda en su lugarttt_logic_rolecon un trigger normal.RoundEndpasa el resultado como parámetro: 2 para los traidores, 3 para los inocentes, 4 para el límite de tiempo.
Cómo conectar outputs con inputs se explica en inputs y outputs en Hammer. info_manipulate, en la carpeta de TTT, es solo un marcador de posición para mapas antiguos de Zombie Master y se convierte en un ttt_traitor_button dentro del juego.
Layout: consejos, no reglas
Esta sección es experiencia de diseño, no requisitos documentados. Lo único fijo son las proporciones: con los valores por defecto, el 25 % de los jugadores son traidores (redondeado hacia abajo, al menos uno), y los detectives aparecen a partir de 8 jugadores. Con 16 jugadores, eso son 4 traidores y 2 detectives.
- Mezcla las líneas de visión. Los traidores necesitan momentos en los que nadie los observe, y los inocentes, sitios con una vista general. Un mapa hecho solo de pasillos largos sirve a un solo bando.
- Sitios para los cadáveres. Un cadáver encontrado aporta pistas. Los rincones apartados de las rutas principales permiten esconderlo, pero deberían seguir siendo accesibles.
- Trampas justas. Una trampa es justa cuando los jugadores atentos pueden reconocerla o evitarla. Conéctala a un
ttt_damageowner; de lo contrario, la muerte no se atribuye a ningún jugador, ni para la puntuación y el karma ni en el informe de la ronda. UsawaitoRemoveOnPresspara limitar cuántas veces se activa. - Testers de traidores. Son polémicos en la comunidad porque pueden sustituir la deducción por hacer cola. Los compromisos habituales son testers que funcionan despacio, que solo comprueban a una persona o que los traidores pueden sabotear.
El código de TTT no usa navmesh. Solo lo necesitas si los servidores usan bots o Nextbots; consulta navmesh y AI nodes.
Probar con el sistema de rondas
- Pon el BSP en
garrysmod/maps, elige TTT como modo de juego e inicia el mapa. Al principio, TTT espera a que haya jugadores. - Establece
ttt_minimum_players 1yttt_debug_preventwin 1. Las entities solo se sustituyen y las armas solo se colocan cuando TTT prepara la primera ronda. - Activa
sv_cheats 1y cambia de rol conttt_force_traitor,ttt_force_detectiveyttt_force_terror. - Inicia una ronda nueva con
ttt_roundrestarty comprueba que todo se reinicia. - Para probar
ttt_win, vuelve a ponerttt_debug_preventwinen 0; de lo contrario, TTT ignora la victoria.
El número de spawns, el reparto de armas y las trampas solo se ponen a prueba de verdad en un servidor lleno. Cómo organizarlo se explica en probar un mapa de GMod con jugadores.
Preguntas frecuentes
¿El nombre de un mapa TTT tiene que empezar por ttt_?
Técnicamente no, TTT funciona en cualquier mapa. Pero el archivo del modo de juego de TTT contiene el patrón ^ttt_, que Garry's Mod usa para ordenar los mapas bajo el modo de juego en el selector de mapas.
¿Por qué faltan en mi mapa las armas que coloqué?
Comprueba si existe un archivo <mapname>_ttt.txt. TTT incluye scripts de este tipo para varios mapas de CS:S, y un script sustituye las armas colocadas en el mapa.
¿Qué alcance tiene un ttt_traitor_button?
1024 unidades por defecto, medidas entre el botón y el jugador. Cambia el valor con UsableRange. Los inocentes no ven el botón en absoluto.