Mapping ve Hammer

Soundscape rehberi: Hammer'da GMod haritaları için ortam sesi

Source soundscape'leri nasıl çalışır: env_soundscape, proxy ve trigger, harita başına bir script, BSP'ye paketleme ve harita sessiz kalırsa çözümler.

Soundscape, bir script dosyasında yer alan ve bir arka plan ses karışımını tanımlayan adlandırılmış bir girdidir: döngü halinde çalan sesler, rastgele tek seferlik sesler ve bir yankı efekti. Haritada her bölgeye bir env_soundscape yerleştirir ve bu adı girersin. Motor, o anda hangi entity'nin geçerli olduğuna her oyuncu için ayrı ayrı karar verir ve entity değiştiğinde sesleri yumuşak bir geçişle birbirine bağlar. Kendi soundscape'lerini scripts/soundscapes_<mapname>.txt dosyasına yazar ve bu dosyayı sesleriyle birlikte BSP'ye paketlersin.

Soundscape nasıl çalışır

İş bölüşülmüştür. Sunucu, her oyuncu için hangi soundscape entity'sinin aktif olduğunu kontrol eder ve bunu istemciye bildirir. İstemci girdiyi script'ten okur ve sesleri yerel olarak çalar. Bunun anlamı şudur:

  • Sunucunun ve istemcinin aynı script'e ihtiyacı vardır. Taraflardan biri adı bilmiyorsa sessizlik olur.
  • Değişim sırasında döngüler yumuşak geçişle birbirine bağlanır. Süreyi soundscape_fadetime belirler, Source SDK'da bu 3 saniyedir.

Entity'leri yerleştirme: env_soundscape, proxy ve trigger

EntityGöreviÖnemli keyvalue'lar
env_soundscapeYarıçap ve görüş hattı üzerinden aktif olan point entityRadius (radius, varsayılan 128), Soundscape (soundscape), Sound Position 0 ile 7 arası (position0 ile position7 arası)
env_soundscape_proxyKendi konumu ve yarıçapı vardır, soundscape'i ve pozisyonları başka bir entity'den alırSoundscape Entity (MainSoundscapeName), Radius (radius)
env_soundscape_triggerableenv_soundscape gibidir, ayrıca bir trigger_soundscape tarafından da devreye sokulurenv_soundscape ile aynı
trigger_soundscapeİçine girildiğinde adı verilen entity'yi açan brush triggerSoundscape (soundscape): bir env_soundscape_triggerable adı

Seçim kuralı FGD'de yazılıdır: aktif soundscape, oyuncu yarıçapının içindeyken oyuncuyla en son görüş hattı kurmuş olandır. Ayrıntıları Source SDK kaynak kodu gösterir:

  • Görüş hattı entity'den oyuncuya doğru kontrol edilir. Katı geometri ve su onu keser.
  • Birden fazla entity her iki koşulu da sağlıyorsa en yakın olan kazanır.
  • Artık hiçbiri koşulları sağlamıyorsa sonuncusu çalmaya devam eder.
  • -1 yarıçapı şu anlama gelir: görüş hattı yeterlidir, mesafe önemli değildir.

Bu yüzden entity'yi açık bir alana yerleştir ve kapılardan geçip yan odaya uzanmayan bir yarıçap seç. Spawn noktalarının da bir soundscape'e ihtiyacı vardır, yoksa oyuncular ilk entity'ye ulaşana kadar hiçbir şey duymaz. Girintili çıkıntılı odalar için aynı ana entity'yi gösteren birkaç env_soundscape_proxy yerleştir. Görüş hattının oda düzenine uymadığı yerlerde, örneğin cam duvarlarda ya da açık avlularda trigger_soundscape kullan. Valve Developer Community'ye göre, oyuncuya yarıçap ve görüş hattı üzerinden ulaşan bir entity trigger'a göre önceliklidir ve env_soundscape_triggerable entity'sinin kendisi de yarıçapa ve görüş hattına tepki vermeye devam eder. Bu yüzden onu, oyuncuların yarıçapına girmeyeceği bir yere koy.

Mevcut soundscape'leri kullanma

Hangi script'lerin yüklendiği scripts/soundscapes_manifest.txt dosyasında listelenir. GMod'un manifestosu, construct.outside gibi kendi girdilerinin yanı sıra Half-Life 2, Episode'lar, Portal, Counter-Strike: Source, Day of Defeat: Source ve Team Fortress 2 script'lerini de listeler. Entity'deki açılır liste yalnızca GenericIndoor gibi birkaç girdi gösterir ama istediğin adı yazabilirsin.

Manifestoda bir adın bulunması seslerin de orada olduğu anlamına gelmez. Güncel bir kurulumda, GMod'un kendisiyle birlikte gelen paketler Half-Life 2, Episode'lar ve Counter-Strike: Source script'lerinin kullandığı ses dosyalarının neredeyse tamamını içerir, Team Fortress 2 ve Day of Defeat: Source script'lerinin kullandıklarının ise yalnızca küçük bir kısmını. Bu konuda daha fazlası GMod haritalarında CS:S ve HL2 içeriği yazısında.

Birini dinlemek için konsola sv_cheats 1, ardından bir adla birlikte playsoundscape yaz.

Kendi script'ini yazma

scripts/soundscapes_<mapname>.txt dosyasını oluştur. Buradaki <mapname>, BSP'nin uzantısız adıdır. Dosya var olduğu anda motor onu manifestoya ek olarak yükler. Manifestonun kendisine dokunma. Haritanın adını değiştirirsen dosyanın adını da onunla birlikte değiştir.

"mymap.hall"
{
	"dsp"	"1"

	"playlooping"
	{
		"volume"	"0.4"
		"wave"		"ambient/atmosphere/indoor2.wav"
	}

	"playlooping"
	{
		"volume"	"0.6"
		"soundlevel"	"SNDLVL_70dB"
		"position"	"0"
		"wave"		"yourname/mymap/generator_loop.wav"
	}

	"playrandom"
	{
		"time"		"8,20"
		"volume"	"0.3,0.6"
		"pitch"		"90,110"
		"soundlevel"	"SNDLVL_75dB"
		"position"	"random"
		"rndwave"
		{
			"wave"	"ambient/levels/canals/drip1.wav"
			"wave"	"ambient/levels/canals/drip2.wav"
		}
	}
}
  • Ad: Soundscape adları yüklenen bütün dosyalar arasında ortaktır. mymap. gibi bir önek çakışmaları önler.
  • dsp: bölgenin yankı efekti. Oyunla birlikte gelen script'lerde 0 kapalı, 1 otomatik seçim anlamına gelir.
  • playlooping: sürekli bir döngü. wave için verilen yol sound/ klasörüne görelidir. volume değerini her zaman belirt: Source SDK kodunda başlangıç değeri 0'dır ve ses düzeyi 0 olan bir döngü atlanır.
  • playrandom: rndwave içindeki seslerden birini rastgele aralıklarla çalar. time, volume ve pitch, minimum,maximum biçiminde yazılan aralıklardır, time saniye cinsindendir.
  • position: Bu olmadan ses her yönden eşit şekilde gelir. 0 sayısı entity'nin Sound Position 0 keyvalue'suna karşılık gelir, oraya bir hedef entity'nin adını girersin, örneğin jeneratörün yanındaki bir info_target. random yalnızca playrandom içinde çalışır ve sesi her seferinde oyuncunun yakınında farklı bir noktaya yerleştirir. playrandom içindeki konumlandırılmış bir sesin ayrıca soundlevel ya da attenuation değerine ihtiyacı vardır: Source SDK kodunda aksi halde seviye 0'da kalır ve ses, sanki bir konumu yokmuş gibi mesafeye bağlı azalma olmadan çalar.

Script'i ve sesleri BSP'ye paketleme

Sunucunun ve oyuncuların script'e ve her özel ses dosyasına ihtiyacı vardır. Script, bir Workshop addon'unda ayrı dosya olarak gelmez: gmad'in whitelist'i scripts/ klasöründe yalnızca scripts/vehicles/*.txt dosyalarına izin verir. Bu yüzden alışılmış yol haritanın pakfile'ıdır. İzlenecek adımlar Özel içeriği BSP içine paketleme yazısında anlatılıyor. İki nokta soundscape'lere özgüdür:

  • Yalnızca script'te geçen seslere haritanın kendisinde hiçbir yerde referans verilmez. Bu nedenle otomatik bir paketleyicinin listesini elle kontrol et.
  • playlooping için, oyunla birlikte gelen döngülerde olduğu gibi döngü işaretçisi (cue point) içeren bir WAV gerekir. Source bir döngüyü yalnızca bu işaretçiden tanır, işaretçi yoksa WAV bir kez çalar.

Script'in ve seslerin pakfile'a ulaşıp ulaşmadığını bspzip -dir ya da gömülü dosyaları listeleyen Map Scanner gösterir.

ambient_generic ne zaman daha uygun

Soundscapeambient_generic
Ne içinbir bölgenin temel atmosferitek bir ses kaynağı
Kontrolotomatik, oyuncunun konumuna görePlaySound, StopSound, Volume, FadeIn, FadeOut gibi input'larla
Kim duyarher oyuncu kendi karışımınımenzildeki bütün oyuncular aynısını

Haritanın açıp kapatması gereken her şey için ambient_generic kullan: kapatma düğmesi olan bir makine, bir alarm, düğmeye basınca çalan müzik. FGD'ye göre yeni bir entity'de "Start Silent" ve "Is NOT Looped" flag'leri işaretlidir. Bu yüzden bir output PlaySound tetikleyene kadar sessiz kalır. Bunun nasıl bağlanacağı Hammer input ve output yazısında anlatılıyor.

Tipik sorunlar

  • Her yerde sessizlik: Çoğunlukla ad yanlıştır ya da dosyanın adı haritanınkiyle aynı değildir. developer 1 ile konsol Can't find soundscape: <name> mesajını verir. Valve Developer Community'ye göre soundscape'ler ayrıca VVIS ile, en azından -fast ile derlenmiş bir harita gerektirir.
  • Soundscape değişmiyor ya da yanlış yerde değişiyor: Yeni entity'nin görüş hattı yoktur, yarıçapı çok küçüktür ya da daha yakın bir entity bir kapıdan odanın içini görüyordur. soundscape_debug 1 bütün entity'lere çizgiler çizer: aktif olan için yeşil, menzildeki entity'ler için beyaz, menzil dışındaki entity'ler için kırmızı.
  • Diğer oyuncularda sesler eksik: Script ya da ses dosyaları paketlenmemiştir ya da soundscape, oyuncularda olmayan bir oyunun seslerini kullanıyordur. Paketlenmiş haritayı, paketlenmemiş dosyaların olmadan test et.
  • Script'teki değişiklikler etki etmiyor: soundscape_flush, haritayı yeniden başlatmadan script'leri yeniden yükler.
sv_cheats 1
soundscape_debug 1
playsoundscape mymap.hall
stopsoundscape
soundscape_flush

İkiden dörde kadar olan komutlar sv_cheats 1 gerektirir. Sunucu soundscape_flush komutunu yalnızca kendi konsolundan ya da yerel bir sunucunun host'undan kabul eder ve Source SDK'da bu komutun tetiklediği istemci tarafındaki kısım (cl_soundscape_flush) da bir cheat komutudur.

Sık sorulan sorular

Bütün oyuncular aynı soundscape'i mi duyar?

Hayır. Aktif soundscape her oyuncu için ayrı ayrı belirlenir ve o oyuncunun istemcisinde çalınır. Herkes kendi bulunduğu yerin karışımını duyar.

dsp için verilen sayılar ne anlama gelir?

Her sayı bir yankı ön ayarına karşılık gelir. Valve'ın kendi script'indeki yorumlar, 0 (kapalı) ve 1 (genel) dışında, diğerlerinin yanı sıra metal odalar için 2 ile 4 arasını, tüneller için 5 ile 7 arasını, beton odalar için 17 ile 19 arasını ve mağaralar için 23 ile 25 arasını, her birini küçük, orta ve büyük olarak, ayrıca su için 14 ile 16 arasını sayar.

soundscapes_manifest.txt dosyasını düzenlemem gerekir mi?

Hayır. Motor, scripts/soundscapes_<mapname>.txt adlı bir dosyayı manifestoda listelenen her şeye ek olarak kendiliğinden yükler. Manifesto bütün haritalar için geçerlidir ve değişmeden kalır.