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 entity | TTT'de dönüştüğü entity |
|---|---|
weapon_smg1 | weapon_zm_mac10 |
weapon_shotgun | weapon_zm_shotgun |
item_healthkit | weapon_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 pointsyazar. 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; sabitweapon_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_ammoda aynı şekilde rastgele bir cephane kutusuna dönüşür.- Yerleştirme script'leri. Alternatif olarak TTT,
maps/<mapname>_ttt.txtadlı bir metin dosyasını (ya dadata_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 1ile spawn'ları da değiştirir. Bunuttt_use_weapon_spawn_scripts 0ile 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ış
| Entity | Görevi | Önemli keyvalue'lar, input'lar ve output'lar |
|---|---|---|
ttt_map_settings | Ayarlar ve raunt olayları | cbar_doors, cbar_buttons, cbar_other, plymodel, propspec_allow_named; output'lar RoundPreparation, RoundStart, RoundEnd |
ttt_traitor_button | Yalnızca hainlerin HUD'larında gördüğü ve uzaktan bastığı düğme | description, wait, RemoveOnPress, UsableRange; input'lar Lock, Unlock; output OnPressed |
ttt_logic_role | !activator'ın rolünü kontrol eder | Role; input TestActivator; output'lar OnPass, OnFail |
ttt_filter_role | Trigger'lar için role göre filtre | Role |
ttt_traitor_check | Hacminin içindeki canlı hainleri sayan brush | Input CheckForTraitor; output TraitorsFound |
ttt_weapon_check | Hacminin içindeki oyuncuların silahlarını kontrol eden brush | Input'lar CheckForType, CheckForClass; output WeaponsFound |
ttt_damageowner | Bir entity'nin verdiği hasarı bir oyuncuya yazar | damager, killname; input'lar SetActivatorAsDamageOwner, ClearDamageOwner |
ttt_win | Raundu bitirir | Input'lar TraitorWin, InnocentWin |
ttt_game_text | Sağ üstteki TTT mesaj alanında mesaj | receive, message, color; input Display |
ttt_credit_adjust | !activator'dan TTT kredisi alır ya da ona kredi verir | credits; input TakeCredits; output'lar OnSuccess, OnFail |
ttt_spectator_spawn | İzleyiciler için hedef nokta | Entity'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_rotatingveprop_door_rotatingentity'sinin kilidini açıp onu açar, herfunc_buttonentity'sinin kilidini açıp ona basar ve herfunc_movelinearentity'sini açar; yeter ki entity'nin bir adı olsun. Bir kapının yalnızca senin mantığınla açılması gerekiyorsattt_map_settingsiçindeki ilgilicbar_seçeneğini No yap. - Hazırlık aşamasında herkes masumdur.
ttt_logic_rolevettt_filter_rolebu sırada tüm oyuncuları masum sayar. ttt_traitor_checkeskimiştir. FGD bu sınıfıeditor/obsolete.vmtile işaretler ve belgeler bunun yerine normal bir trigger'la birliktettt_logic_rolekullanılmasını önerir.RoundEndsonucu 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_damageownerentity'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çinwaitya daRemoveOnPresskullan. - 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
- BSP'yi
garrysmod/mapsklasörüne koy, oyun modu olarak TTT'yi seç ve haritayı başlat. TTT önce oyuncu bekler. ttt_minimum_players 1vettt_debug_preventwin 1olarak ayarla. Entity'ler ancak TTT ilk raundu hazırladığında değiştirilir, silahlar da ancak o zaman yerleştirilir.sv_cheats 1komutunu etkinleştir vettt_force_traitor,ttt_force_detectivevettt_force_terrorile rol değiştir.ttt_roundrestartile yeni bir raunt başlat ve her şeyin sıfırlandığını kontrol et.ttt_winentity'sini test etmek içinttt_debug_preventwindeğ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.