Mapping ve Hammer

TTT haritası yapımı: GMod'da entity'ler, spawn'lar ve test

TTT haritası yapımı: TTT'nin otomatik aldığı spawn ve silahlar, her ttt_ entity'sinin işi, ttt.fgd'yi Hammer'a yükleme ve raundları tek başına test etme.

Teknik olarak Trouble in Terrorist Town için bir haritanın yalnızca yeterli sayıda info_player_deathmatch spawn noktasına, ayrıca silah ve cephaneye ihtiyacı vardır. Geri kalan her şey isteğe bağlıdır: TTT, ttt_ entity'lerini içeren kendi FGD dosyasıyla gelir; bunlarla hain düğmeleri, rol kontrolleri, öldürmeyi doğru oyuncuya yazan tuzaklar ve raunt olayları kurabilirsin. İki özellik önemlidir: TTT her raunttan önce haritayı tamamen sıfırlar ve hazırlık aşamasında her oyuncu masum sayılır.

TTT'nin bir haritadan otomatik olarak aldıkları

Spawn'lar. TTT, info_player_deathmatch dışında info_player_terrorist, info_player_counterterrorist, info_player_combine, info_player_rebel, info_player_axis, info_player_allies, info_player_teamspawn ve gmod_player_start sınıflarını da kullanır. Kod, info_player_start sınıfına yalnızca bunların hiçbiri yoksa başvurur ve TTT belgeleri bundan kaçınılmasını tavsiye eder. Diğer oyun modlarının spawn sınıfları spawn noktaları ve oyun modu entity'leri yazısında anlatılıyor.

Silahlar ve cephane. TTT bir raundu hazırlarken Half-Life 2'nin silah ve eşya entity'lerini kendi entity'leriyle değiştirir. TTT kodundaki tablodan bir kesit:

Haritadaki entityTTT'de dönüştüğü entity
weapon_smg1weapon_zm_mac10
weapon_shotgunweapon_zm_shotgun
item_healthkitweapon_zm_shotgun

Counter-Strike: Source'un stok haritalarında genellikle silah entity'si bulunmaz. TTT spawn edilebilir hiçbir silah ve hiçbir info_player_deathmatch bulamaz, ama bir info_player_counterterrorist bulursa spawn noktalarına ve rehine entity'lerine rastgele silahlar dağıtır.

Sıfırlama. TTT her raunttan önce game.CleanUpMap çağırır. Kapılar, düğmeler, kırılmış prop'lar ve tüm mantık entity'leri bunun ardından yeniden başlangıç durumuna döner. Bu yüzden raunttan raunda durum hatırlaması gereken hiçbir şey kurma.

TTT entity'lerini Hammer'a yükleme

ttt.fgd, garrysmod/gamemodes/terrortown/ klasöründedir. mapexamples alt klasöründe üç örnek harita bulunur: ttt_traitorcheck.vmf, ttt_traps.vmf ve ttt_weaponcheck.vmf. Hammer'da Tools > Options'ı aç, Game Configurations sekmesini seç ve dosyayı "Game Data files" altına Add ile ekle.

Hammer bundan sonra info_player_deathmatch sınıfını (bu sınıf garrysmod.fgd içinde yoktur), silahları (weapon_zm_*, weapon_ttt_*), cephaneyi (item_*_ttt) ve ttt_ entity'lerini sunar.

TTT, Counter-Strike: Source içeriği üzerine kuruludur ve Temmuz 2025 güncellemesinden beri GMod, CS:S ile Half-Life 2 episode'larının içeriğinin çoğunu haritalar, müzik ve seslendirme olmadan kendisi sunar. Bu yüzden onu bir TTT haritasında kullanabilirsin. Tam olarak nelerin dahil olduğu GMod haritalarında CS:S ve HL2 içeriği yazısında anlatılıyor.

Spawn'ları, silahları ve cephaneyi yerleştirme

  • Spawn sayısı. Belgelere göre TTT 16 ila 18 oyuncu için tasarlanmıştır, birçok sunucu ise daha fazlasına izin verir. Belgeler, yerleştirme script'leri için en az 32 spawn önerir. Boş spawn yoksa TTT, mevcut bir spawn'ın 36 birim yanında geçici spawn'lar oluşturur ve konsola TTT WARNING: Map has too few spawn points yazar. Bu da başarısız olursa bir spawn zorlanır ve orada duran kişi ölür. Bu yüzden her spawn'ın çevresinde boş zemin bırak.
  • ttt_random_weapon. Spawn olurken, sunucuda otomatik spawn edilebilir olarak kayıtlı tüm silahlar arasından rastgele bir silaha dönüşür. Buna addon'lardan gelen silahlar da dahildir; sabit weapon_zm_* entity'leri bunu yapamaz. Spawnflag'ler (Sub-Machine Guns, Assault Rifles, Sniper Rifles, Shotguns ve diğerleri) seçimi daraltır. auto_ammo, belirtilen sayıda uygun cephane kutusu ekler. Entity'nin üstünde biraz boşluk bırak, çünkü kutular orada oluşturulur ve aşağı düşer. ttt_random_ammo da aynı şekilde rastgele bir cephane kutusuna dönüşür.
  • Yerleştirme script'leri. Alternatif olarak TTT, maps/<mapname>_ttt.txt adlı bir metin dosyasını (ya da data_static/ içindeki aynı dosyayı) okur. Bu dosya Sandbox'ta TTT Weapon Placer addon'uyla oluşturulur ve esas olarak TTT için yapılmamış haritalara yöneliktir. Önemli: böyle bir script varsa TTT, haritaya yerleştirilmiş silahları ve cephaneyi (otomatik spawn edilebilir her şeyi ve normalde değiştireceği Half-Life 2 sınıflarını) kaldırır ve bunların yerine script'in içeriğini yükler. replacespawns 1 ile spawn'ları da değiştirir. Bunu ttt_use_weapon_spawn_scripts 0 ile kapatabilirsin.

Bir satır, sekmelerle ayrılmış sınıf, konum ve açılardan oluşur:

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

TTT entity'lerine genel bakış

EntityGöreviÖnemli keyvalue'lar, input'lar ve output'lar
ttt_map_settingsAyarlar ve raunt olaylarıcbar_doors, cbar_buttons, cbar_other, plymodel, propspec_allow_named; output'lar RoundPreparation, RoundStart, RoundEnd
ttt_traitor_buttonYalnızca hainlerin HUD'larında gördüğü ve uzaktan bastığı düğmedescription, wait, RemoveOnPress, UsableRange; input'lar Lock, Unlock; output OnPressed
ttt_logic_role!activator'ın rolünü kontrol ederRole; input TestActivator; output'lar OnPass, OnFail
ttt_filter_roleTrigger'lar için role göre filtreRole
ttt_traitor_checkHacminin içindeki canlı hainleri sayan brushInput CheckForTraitor; output TraitorsFound
ttt_weapon_checkHacminin içindeki oyuncuların silahlarını kontrol eden brushInput'lar CheckForType, CheckForClass; output WeaponsFound
ttt_damageownerBir entity'nin verdiği hasarı bir oyuncuya yazardamager, killname; input'lar SetActivatorAsDamageOwner, ClearDamageOwner
ttt_winRaundu bitirirInput'lar TraitorWin, InnocentWin
ttt_game_textSağ üstteki TTT mesaj alanında mesajreceive, message, color; input Display
ttt_credit_adjust!activator'dan TTT kredisi alır ya da ona kredi verircredits; input TakeCredits; output'lar OnSuccess, OnFail
ttt_spectator_spawnİzleyiciler için hedef noktaEntity'nin açıları

Tablonun göstermediği dört şey:

  • Levye adlandırılmış kapıları açar. Varsayılan olarak bir levye darbesi her func_door, func_door_rotating ve prop_door_rotating entity'sinin kilidini açıp onu açar, her func_button entity'sinin kilidini açıp ona basar ve her func_movelinear entity'sini açar; yeter ki entity'nin bir adı olsun. Bir kapının yalnızca senin mantığınla açılması gerekiyorsa ttt_map_settings içindeki ilgili cbar_ seçeneğini No yap.
  • Hazırlık aşamasında herkes masumdur. ttt_logic_role ve ttt_filter_role bu sırada tüm oyuncuları masum sayar.
  • ttt_traitor_check eskimiştir. FGD bu sınıfı editor/obsolete.vmt ile işaretler ve belgeler bunun yerine normal bir trigger'la birlikte ttt_logic_role kullanılmasını önerir.
  • RoundEnd sonucu parametre olarak iletir: hainler için 2, masumlar için 3, süre sınırı için 4.

Output'ları input'lara bağlamak Hammer'da input ve output yazısında açıklanıyor. TTT klasöründeki info_manipulate yalnızca eski Zombie Master haritaları için bir yer tutucudur ve oyunda bir ttt_traitor_button entity'sine dönüşür.

Yerleşim: kural değil, tavsiye

Bu bölüm tasarım deneyimidir, belgelenmiş gereklilik değil. Sabit olan yalnızca oranlardır: varsayılan değerlerle oyuncuların %25'i haindir (aşağı yuvarlanır, en az bir kişi) ve dedektifler 8 oyuncudan itibaren ortaya çıkar. 16 oyuncuyla bu, 4 hain ve 2 dedektif demektir.

  • Görüş hatlarını çeşitlendir. Hainlerin gözlenmedikleri anlara, masumların ise genel görüş sağlayan noktalara ihtiyacı vardır. Yalnızca uzun koridorlardan oluşan bir harita tek bir tarafa hizmet eder.
  • Cesetler için yerler. Bulunan bir ceset ipucu verir. Ana yolların uzağındaki nişler saklamayı mümkün kılar, ama ulaşılabilir kalmalıdır.
  • Adil tuzaklar. Bir tuzak, dikkatli oyuncular onu fark edebiliyor ya da ondan kaçınabiliyorsa adildir. Onu bir ttt_damageowner entity'sine bağla, aksi halde öldürme hiçbir oyuncuya yazılmaz; ne puan ve karma için ne de raunt raporunda. Kaç kez tetikleneceğini sınırlamak için wait ya da RemoveOnPress kullan.
  • Hain test cihazları. Toplulukta tartışmalıdır, çünkü çıkarım yapmanın yerine sıra beklemeyi koyabilirler. Yaygın uzlaşmalar; yavaş çalışan, yalnızca bir kişiyi kontrol eden ya da hainler tarafından sabote edilebilen test cihazlarıdır.

TTT kodu navmesh kullanmaz. Yalnızca sunucular bot ya da Nextbot çalıştırıyorsa ihtiyacın olur, bkz. navmesh ve AI node'lar.

Raunt sistemiyle test etme

  1. BSP'yi garrysmod/maps klasörüne koy, oyun modu olarak TTT'yi seç ve haritayı başlat. TTT önce oyuncu bekler.
  2. ttt_minimum_players 1 ve ttt_debug_preventwin 1 olarak ayarla. Entity'ler ancak TTT ilk raundu hazırladığında değiştirilir, silahlar da ancak o zaman yerleştirilir.
  3. sv_cheats 1 komutunu etkinleştir ve ttt_force_traitor, ttt_force_detective ve ttt_force_terror ile rol değiştir.
  4. ttt_roundrestart ile yeni bir raunt başlat ve her şeyin sıfırlandığını kontrol et.
  5. ttt_win entity'sini test etmek için ttt_debug_preventwin değerini yeniden 0 yap, aksi halde TTT galibiyeti yok sayar.

Spawn sayısı, silah dağılımı ve tuzaklar kendini ancak dolu bir sunucuda gösterir. Bunun nasıl organize edileceği GMod haritasını oyuncularla test etme yazısında anlatılıyor.

Sık sorulan sorular

Bir TTT haritasının adı ttt_ ile başlamak zorunda mı?

Teknik olarak hayır, TTT her haritada çalışır. Ancak TTT'nin oyun modu dosyası ^ttt_ kalıbını içerir; Garry's Mod bu kalıbı, harita seçicide haritaları oyun modunun altına yerleştirmek için kullanır.

Yerleştirdiğim silahlar haritamda neden yok?

<mapname>_ttt.txt adlı bir dosyanın var olup olmadığını kontrol et. TTT birkaç CS:S haritası için bu tür script'lerle gelir ve bir script haritaya yerleştirilmiş silahların yerini alır.

Bir ttt_traitor_button ne kadar uzağa erişir?

Varsayılan olarak 1024 birim; düğme ile oyuncu arasında ölçülür. Değeri UsableRange ile değiştir. Masumlar düğmeyi hiç görmez.