Mapping y Hammer

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 mapaSe convierte en TTT en
weapon_smg1weapon_zm_mac10
weapon_shotgunweapon_zm_shotgun
item_healthkitweapon_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 points en 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 entities weapon_zm_* fijas no pueden hacer. Los spawnflags (Sub-Machine Guns, Assault Rifles, Sniper Rifles, Shotguns y más) acotan la selección. auto_ammo añ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_ammo se 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 en data_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. Con replacespawns 1 sustituye también los spawns. Puedes desactivarlo con ttt_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

EntityFunciónKeyvalues, inputs y outputs principales
ttt_map_settingsAjustes y eventos de rondacbar_doors, cbar_buttons, cbar_other, plymodel, propspec_allow_named; outputs RoundPreparation, RoundStart, RoundEnd
ttt_traitor_buttonBotón que solo los traidores ven en su HUD y pulsan a distanciadescription, wait, RemoveOnPress, UsableRange; inputs Lock, Unlock; output OnPressed
ttt_logic_roleComprueba el rol del !activatorRole; input TestActivator; outputs OnPass, OnFail
ttt_filter_roleFiltro para triggers según el rolRole
ttt_traitor_checkBrush que cuenta los traidores vivos dentro de su volumenInput CheckForTraitor; output TraitorsFound
ttt_weapon_checkBrush que comprueba las armas de los jugadores dentro de su volumenInputs CheckForType, CheckForClass; output WeaponsFound
ttt_damageownerAtribuye el daño de una entity a un jugadordamager, killname; inputs SetActivatorAsDamageOwner, ClearDamageOwner
ttt_winTermina la rondaInputs TraitorWin, InnocentWin
ttt_game_textMensaje en la zona de mensajes de TTT, arriba a la derechareceive, message, color; input Display
ttt_credit_adjustQuita créditos de TTT al !activator o se los dacredits; input TakeCredits; outputs OnSuccess, OnFail
ttt_spectator_spawnPunto 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_rotating y prop_door_rotating, desbloquea y pulsa cualquier func_button y abre cualquier func_movelinear, siempre que la entity tenga nombre. Si una puerta solo debe abrirse mediante tu lógica, pon en No la opción cbar_ correspondiente de ttt_map_settings.
  • Durante la fase de preparación todos son inocentes. ttt_logic_role y ttt_filter_role tratan entonces a todos los jugadores como inocentes.
  • ttt_traitor_check está obsoleta. El FGD marca la clase con editor/obsolete.vmt, y la documentación recomienda en su lugar ttt_logic_role con un trigger normal.
  • RoundEnd pasa 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. Usa wait o RemoveOnPress para 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

  1. Pon el BSP en garrysmod/maps, elige TTT como modo de juego e inicia el mapa. Al principio, TTT espera a que haya jugadores.
  2. Establece ttt_minimum_players 1 y ttt_debug_preventwin 1. Las entities solo se sustituyen y las armas solo se colocan cuando TTT prepara la primera ronda.
  3. Activa sv_cheats 1 y cambia de rol con ttt_force_traitor, ttt_force_detective y ttt_force_terror.
  4. Inicia una ronda nueva con ttt_roundrestart y comprueba que todo se reinicia.
  5. Para probar ttt_win, vuelve a poner ttt_debug_preventwin en 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.