Sunucu ve topluluk

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_start ve gmod_player_start
  • info_player_deathmatch
  • Half-Life 2: Deathmatch'ten info_player_combine ve info_player_rebel
  • Counter-Strike: Source'tan info_player_terrorist ve info_player_counterterrorist
  • Team Fortress 2'den info_player_teamspawn
  • diğer Source oyunlarından başka sınıflar, örneğin info_player_allies ve info_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:

  1. 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.
  2. 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.
  3. 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.
  4. 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_start iç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 moduHaritadaki spawn entity'siAyrıca gerekenlerEksikse
Sandboxinfo_player_starthiçbir şeyçoğunlukla orijinde spawn, çok azsa spawn'da ölümler
DarkRPinfo_player_starthapishane konumları, isteğe bağlı olarak meslek spawn'ları, ikisi de oyun içinde ayarlanırhapishane konumu yoksa tutuklama olmaz
TTTinfo_player_deathmatchsilah ve cephane entity'leriNo 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ğin cp. Bu komutlar adminlere ayrılmıştır.
  • /jailpos tüm hapishane konumlarını bulunduğun konumla değiştirir, /addjailpos bir tane daha ekler. Bunu bir admin yapabilir, GM.Config.chiefjailpos etkin 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

EntityAmaçNot
lua_runLua kodu çalıştırır (keyvalue Code, input'lar RunCode ve RunPassedCode)Map Scanner bunu riskli entity olarak bildirir
env_skypaintgökyüzünün renklerini kontrol ederMap Properties'te painted skybox materyalini gerektirir
func_nav_blocker, func_nav_avoid, func_nav_prefernavmesh alanlarını engeller ya da ağırlıklandırıryalnızca navmesh'i kullanan botları etkiler, navmesh ve AI node'lar yazısına bak
trigger_catapultoyuncuları ve fizik nesnelerini fırlatırhız playerSpeed ve physicsSpeed ile ayrı ayrı ayarlanır
beam_spotlightgö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, InitPostEntity bu yüzden kullanılır.
  • game.CleanUpMap entity'lerin çoğunu kaldırır ve yalnızca haritaya ait olanları geri yükler. Bu yüzden Lua spawn'larını PostCleanupMap hook'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.