GMod haritalarında spawn noktaları: Sandbox, DarkRP ve TTT için entity'ler
GMod haritasının Sandbox, DarkRP ve TTT için hangi spawn noktalarına ihtiyacı var, GMod spawn'ı nasıl seçer ve spawn eksikse ya da azsa ne olur.
Sandbox ve DarkRP için bir haritaya birden fazla info_player_start entity'si, TTT için info_player_deathmatch gerekir; her durumda en az, aynı anda spawn olabilecek oyuncu sayısı kadar. DarkRP'nin meslek spawn'ları ve hapishane konumları haritanın parçası değildir. Bunları adminler oyun içinde ayarlar, sunucu da kendi veritabanında saklar. Hiç spawn entity'si yoksa oyuncular çoğunlukla haritanın orijininde belirir. Çok az varsa spawn mantığı, bir spawn'ın üzerinde duran oyuncuları öldürür.
GMod spawn noktasını nasıl seçer
Seçim Lua ile, temel oyun modunun GM:PlayerSelectSpawn fonksiyonunda yazılmıştır (gamemodes/base/gamemode/player.lua). Sandbox bunu değiştirmeden kullanır, DarkRP çağırıp üzerine ekleme yapar, TTT ise kendi fonksiyonuyla değiştirir. İlk spawn'da fonksiyon şu sınıflardaki tüm entity'leri toplar:
info_player_startvegmod_player_startinfo_player_deathmatch- Half-Life 2: Deathmatch'ten
info_player_combineveinfo_player_rebel - Counter-Strike: Source'tan
info_player_terroristveinfo_player_counterterrorist - Team Fortress 2'den
info_player_teamspawn - diğer Source oyunlarından başka sınıflar, örneğin
info_player_alliesveinfo_player_axis
Takımsız bir oyun modunda hepsi eşdeğerdir. Başka oyunların haritalarındaki spawn'ların Sandbox'ta değişiklik gerekmeden çalışmasının nedeni budur. Hammer'da GMod'un kendi FGD'si yalnızca info_player_start sınıfını tanır. info_player_deathmatch ise gamemodes/terrortown klasöründeki ttt.fgd ile gelir.
Ardından seçim şöyle işler:
- En az bir spawn'da "Master" flag'i (spawnflag 1) varsa GMod her zaman bu flag'e sahip ilk spawn'ı alır ve rastgele çekilişi atlar.
- Yoksa fonksiyon, spawn sayısı kadar kez rastgele bir spawn çeker. Dünyanın dışındaki bir spawn atlanır. Haritada birden fazla spawn olduğu sürece en son kullanılan spawn ile bu oyuncunun en son kullandığı spawn da atlanır.
- Her aday için
GM:IsSpawnpointSuitable, spawn'daki 32 × 32 × 64 birimlik bir kutunun içinde canlı bir oyuncunun durup durmadığını kontrol eder. Kutu boşsa oyuncu orada spawn olur. - Son deneme zorla uygulanır. Kutunun içinde duran her oyuncu öldürülür.
Oyuncu bakış yönünü entity'nin açılarından alır.
Bir haritaya kaç spawn gerekir
Mapper'lar için kurallar buradan çıkar:
- En az slot sayısı kadar spawn, tercihen daha fazla. Fonksiyon tekrarlı çekiliş yapar ve her spawn'ı tam bir kez denemez. Ne kadar çok boş spawn varsa, zorla uygulanan son denemeye o kadar seyrek ulaşır.
- Tek bir spawn en kötü durumdur. O zaman ilk deneme aynı zamanda son denemedir. Spawn'ın üzerinde duran kişi, başka bir oyuncu spawn olur olmaz ölür.
- Mesafe bırak. Kontrol kutusu 32 birim genişliğindedir. İki spawn birbirine bundan daha yakınsa, birinin üzerindeki oyuncu diğerini de bloke eder.
- Çok oyunculu haritalarda Master flag'i olmasın. Bu flag tek oyunculu haritalar için düşünülmüştür. Ayarlıysa herkes o noktada spawn olur ve orada duran kişi her seferinde öldürülür.
- Boş bir alana yerleştir. Hammer'ın
info_player_startiçin gösterdiği model kabaca oyuncu boyutundadır, böylece bir oyuncunun sığıp sığmadığını görebilirsin.
Son deneme en son kullanılan spawn'a denk gelirse kontrol atlanır ve fonksiyon yine de onu döndürür. Orada hâlâ bir oyuncu duruyorsa ikisi iç içe geçer.
Hiç spawn entity'si yoksa temel oyun modu konsola [PlayerSelectSpawn] Error! No spawn points! yazar ve hiçbir spawn döndürmez. Valve Developer Community wiki'sine göre Source oyunları bu durumda oyuncuyu çoğunlukla haritanın orijinine (0 0 0) koyar. Bir BSP için Map Scanner spawnpoint olup olmadığını kontrol eder.
Sandbox, DarkRP ve TTT karşılaştırması
| Oyun modu | Haritadaki spawn entity'si | Ayrıca gerekenler | Eksikse |
|---|---|---|---|
| Sandbox | info_player_start | hiçbir şey | çoğunlukla orijinde spawn, çok azsa spawn'da ölümler |
| DarkRP | info_player_start | hapishane konumları, isteğe bağlı olarak meslek spawn'ları, ikisi de oyun içinde ayarlanır | hapishane konumu yoksa tutuklama olmaz |
| TTT | info_player_deathmatch | silah ve cephane entity'leri | No spawn entity found! hatası, çok azsa geçici spawn'lar |
DarkRP Sandbox'ı temel alır ve önce temel oyun modunun seçimini çağırır. Yani haritaya sıradan spawn entity'leri gerekir. DarkRP bundan sonra yalnızca konumu değiştirir:
/setspawn <job>bir mesleğin tüm spawn'larını bulunduğun konumla değiştirir,/addspawn <job>bir tane ekler,/removespawn <job>hepsini siler.<job>, mesleğin komut adıdır, örneğincp. Bu komutlar adminlere ayrılmıştır./jailpostüm hapishane konumlarını bulunduğun konumla değiştirir,/addjailposbir tane daha ekler. Bunu bir admin yapabilir,GM.Config.chiefjailposetkin olduğu sürece polis şefi de yapabilir.
DarkRP bu konumları sunucu veritabanında haritanın adı altında saklar. BSP yeni bir dosya adı alırsa DarkRP onları artık bulamaz. Hapishane konumu yoksa DarkRP tutuklamaları You cannot arrest people since there are no jail positions set! mesajıyla reddeder. DarkRP oyuncuyu yerleştirmeden önce hedefin çevresinde, en fazla 600 birim uzaklıkta boş bir yer arar. Temel oyun modunun öldürme mantığı yine de bundan önce çalışır, çünkü önce spawn entity'si seçilir. Bu yüzden bir DarkRP haritasına da yeterince info_player_start entity'si gerekir. Başka neler sunması gerektiği DarkRP haritası seçimi yazısında ve roleplay harita türleri özetinde anlatılıyor.
TTT, info_player_deathmatch entity'lerini ve diğer oyunların takım spawn'larını toplar. info_player_start sınıfını yalnızca başka hiçbir şey yoksa kullanır ve TTT dokümantasyonu bunu tavsiye etmez. Spawn'lar yetmezse TTT mevcut spawn'ların 36 birim yanında geçici spawn'lar oluşturur ve TTT WARNING: Map has too few spawn points bildirir. Her spawn'ın çevresinde yer bırak: TTT yalnızca noktanın dünyanın içinde olduğunu ve orada bir oyuncunun durmadığını kontrol eder. Bir boşluğun üzerinde oyuncu havada spawn olur. Silahlar haritaya ttt_random_weapon, ttt_random_ammo ya da sabit silah sınıfları üzerinden girer. Geri kalan her şey TTT haritası yapımı yazısında.
garrysmod.fgd içinde sıkça gözden kaçan entity'ler
| Entity | Amaç | Not |
|---|---|---|
lua_run | Lua kodu çalıştırır (keyvalue Code, input'lar RunCode ve RunPassedCode) | Map Scanner bunu riskli entity olarak bildirir |
env_skypaint | gökyüzünün renklerini kontrol eder | Map Properties'te painted skybox materyalini gerektirir |
func_nav_blocker, func_nav_avoid, func_nav_prefer | navmesh alanlarını engeller ya da ağırlıklandırır | yalnızca navmesh'i kullanan botları etkiler, navmesh ve AI node'lar yazısına bak |
trigger_catapult | oyuncuları ve fizik nesnelerini fırlatır | hız playerSpeed ve physicsSpeed ile ayrı ayrı ayarlanır |
beam_spotlight | görünür ışın demeti olan spot ışığı | tamamen istemci tarafında, istemciler arasında senkronize edilmez |
Sunucu sahipleri yeniden derleme olmadan neleri değiştirebilir
Satın aldığın bir haritada spawn eksikse bu sunucuda çözülebilir. DarkRP'de yukarıdaki sohbet komutları yeterlidir. TTT, ttt_use_weapon_spawn_scripts etkin olduğu sürece, silahları ve replacespawns ayarıyla spawn'ları da değiştiren bir rearm script'i yükler: maps/<mapname>_ttt.txt. Diğer tüm durumlarda Lua ile ek spawn entity'leri oluşturursun. Koordinatları oyun içinde getpos ile oku. Komut gözlerinin konumunu bildirir, bu yüzden ayakta duran bir oyuncu için Z değerinden 64 birim çıkar. Dosyanın yeri lua/autorun/server/ klasörüdür:
hook.Add( "InitPostEntity", "extra_spawns", function()
local spawn = ents.Create( "info_player_start" )
if ( not IsValid( spawn ) ) then return end
spawn:SetPos( Vector( 512, -128, 64 ) )
spawn:SetAngles( Angle( 0, 90, 0 ) )
spawn:Spawn()
end )
Bu yaklaşımın sınırları:
- Temel oyun modu ilk spawn'dan sonra spawn listesini aklında tutar. Yeni entity'lerin bundan önce var olması gerekir,
InitPostEntitybu yüzden kullanılır. game.CleanUpMapentity'lerin çoğunu kaldırır ve yalnızca haritaya ait olanları geri yükler. Bu yüzden Lua spawn'larınıPostCleanupMaphook'unda yeniden oluşturursun.- Koordinatlar haritanın tam olarak tek bir sürümü için geçerlidir. Bir güncellemeden sonra her konumu kontrol edersin.
- Lua geometriyi değiştirmez. Dar bir spawn odası dar kalır.
Sık sorulan sorular
Bir harita Sandbox, DarkRP ve TTT için aynı spawn'ları kullanabilir mi?
Evet, info_player_deathmatch ile. Temel oyun modu bu sınıfı tıpkı info_player_start gibi kabul eder, TTT dokümantasyonu da onu olağan spawn entity'si olarak anar. İki sınıfı karıştırırsan Sandbox ve DarkRP tüm spawn'ları, TTT ise yalnızca info_player_deathmatch olanları kullanır.
Kimse ateş etmediği hâlde oyuncular spawn'da neden ölüyor?
Bu, spawn seçiminin zorla uygulanan son denemesidir: GMod yolda duran oyuncuyu öldürür. Aralarında daha fazla mesafe bulunan daha çok spawn bunu çözer.
DarkRP spawn'ları bir harita güncellemesinden sonra da geçerli mi?
Yalnızca dosya adı aynı kalırsa, çünkü konumlar haritanın adına bağlıdır. O durumda bile kontrol etmen gerekir, çünkü odalar yer değiştirmiş olabilir.