Mapping ve Hammer

Hammer'da asansörler ve trenler: func_door'dan func_tracktrain'e

Source ve GMod haritalarında asansör ve trenler: hangi entity uygun, keyvalue'larla kurulum, çağrı butonları, path_track rotaları, ezilme ve sarsıntı nedenleri.

İki duraklı bir asansörü bir func_door ya da func_movelinear ile, birden çok katı ya da trenleri ise path_track entity'lerinden oluşan bir zinciri izleyen bir func_tracktrain ile yaparsın. Bir engelleme hasarı değeri ayarlıysa ve entity engellendiği hâlde itmeye devam ediyorsa oyuncular ezilir. Yolculuk sırasındaki sarsıntıyı Valve wiki'si, çok oyunculu Source oyunlarında dikey hareket eden platformların genel bir özelliği olarak tanımlar. Bir çözüm belirtmez; bu yüzden asansörü erken test et. Bir asansör çoğunlukla yolunda bir şey durduğu ya da rota yanlış zincirlendiği için takılıp kalır.

Hangi iş için hangi entity

EntityHareketNe için uygunSınırları
func_dooriki konum arasında, mesafe = brush boyutu eksi Lipiki duraklı basit asansörarada duramaz
func_movelineartek bir yön boyunca Move Distance kadar, SetPosition ile aradaki her konumiki duraklı asansör, platformlar, büyük kapılarValve wiki'sine göre başka bir func_movelinear entity'sine parent'landığında hatalı
func_tracktrainbir path_track zinciri boyuncabirden çok kat, trenler, virajlardaha fazla iş, yüksek hızda hedefinin biraz önünde durur

func_tanktrain, oyuncuya ateş eden ve öldürülebilen bir trendir; bu yüzden buraya uymaz. func_train ve func_plat GMod'un FGD'sinde yoktur.

İki duraklı bir asansör

En az iş çıkaran func_movelinear olur:

  1. Kabin zeminini brush olarak yap, Ctrl+T tuşlarına bas ve func_movelinear seç. Ad: lift.
  2. Move Direction (Pitch Yaw Roll) değerini Up yap. Alanda o zaman -90 0 0 yazar.
  3. Move Distance alanına iki zemin arasındaki mesafeyi birim cinsinden, Speed alanına da hızı gir.
  4. Kabinin duvarlarını ve tavanını func_brush olarak yap ve Parent alanına lift adını gir.
  5. Her kata çağrı butonu olarak bir func_button yerleştir ve asansöre bağla.
Entity        My Output       Target Entity   Target Input
button_up     OnPressed       lift            Open
button_down   OnPressed       lift            Close
lift          OnFullyOpen     door_top        Open
lift          OnFullyClosed   door_bottom     Open

Open son konuma gider, Close başlangıç konumuna geri döner. OnFullyOpen ve OnFullyClosed varışı bildirir; kat kapılarını bunlarla açarsın. Output'ların, gecikmelerin ve adların ayrıntılı olarak nasıl çalıştığı Hammer'da input ve output yazısında anlatılıyor.

func_door ile hesap farklıdır: bir kapı her zaman kendi brush boyutundan Lip çıkarıldığı kadar yol alır. 256 birim yükselmesi gereken 16 birim kalınlığındaki bir zemin bu yüzden -240'lık bir Lip ister. Buna -1 olarak ayarlanmış Delay Before Reset (-1 stay), Toggle flag'i ve işareti kaldırılmış Touch Opens eklenir.

Kabindeki kapılar ve butonlar

Birlikte hareket etmesi gereken her şeyin Parent alanına hareket eden entity'nin adı yazılır. Bir çocuk, parent'ına olan mesafesini korur ve her hareketi izler.

  • Kabin kapıları: Parent = lift olan iki func_door entity'si. Tablodaki parent hatası yüzünden burada ikinci bir func_movelinear kullanma.
  • Kabindeki butonlar: Parent = lift olan func_button. Don't move flag'i ile buton basıldığında duvarın içine girmez.
  • Butonları kilitleme: OnPressed ile tüm butonlara (lift_button*) Lock input'unu, OnFullyOpen ve OnFullyClosed ile de yeniden Unlock gönder.
  • Sandbox araçları: GMod'un FGD'si bu entity'ler için Allow Physics Gun ve Sandbox Tool Whitelist sunar. Sandbox'ta kimse asansörü Physics Gun ile tutmasın diye ilkini No yap.

func_tracktrain ile trenler ve birden çok kat

  1. İlk path_track entity'sini yerleştir ve ona track_1 gibi bir ad ver. Shift'e basılı tutarak klonlarsan Hammer adı birer birer artırır ve Next Stop Target alanını kendisi doldurur.
  2. Treni, ön tarafı X ekseni boyunca, yani üstten görünümde sağa bakacak şekilde yap. Spawn olduğunda bir sonraki path_track yönüne döner.
  3. Onu func_tracktrain entity'sine çevir ve First Stop Target alanına ilk path_track adını gir. Tren orada spawn olur.
  4. Max Speed (units / second) her hızı sınırlar. Initial Speed (units / second) değerinin 0 olması, trenin başlangıçta durduğu anlamına gelir.
  5. No User Control flag'ini ayarla. Asansör için, kabin dönmesin diye Fixed Orientation da ekle.
  6. StartForward input'uyla başlat. Bir durakta path_track, OnPass üzerinden trene Stop gönderir.

Döngü için son path_track entity'sinin Next Stop Target alanına ilkini gir. Bir path_track üzerindeki New Train Speed hızı o noktadan itibaren değiştirir, ama yalnızca No User Control ile etkili olur.

GMod'da func_tracktrain ayrıca MoveToPathNode input'una sahiptir. Aynı yol üzerindeki adı verilen path_track entity'sine gider ve orada durur. Bu, çok katlı bir asansörü basitleştirir:

Entity          My Output                    Target Entity   Target Input     Parameter   Delay
button_floor3   OnPressed                    lift_door       Close                        0.00
button_floor3   OnPressed                    lift            MoveToPathNode   floor_3     1.00
lift            OnArrivedAtDestinationNode   lift_door       Open                         0.00

Valve wiki'si iki tuhaflık daha sayar: bir func_tracktrain yönünü saniyede yalnızca on kez günceller, bu yüzden hızlı trenler dar virajlarda rotanın dışına taşar. Ayrıca ilgili path_track entity'lerinde New Train Speed 0 ise Reverse ya da StartBackward başarısız olabilir.

Asansörler neden ezer, sarsılır ya da takılıp kalır

Ezilme. Üç entity'nin her birinin kendi hasar değeri vardır: func_door için Blocking Damage, func_movelinear için Block Damage, func_tracktrain için Damage on Crush. Varsayılan her yerde 0'dır. Kapı ve func_movelinear için FGD değeri frame başına belirtir; yani küçük sayılar hızlı öldürür. Entity'nin engellendiğinde nasıl davrandığı herkese açık Source SDK kodunda görülebilir: bir func_door geri döner; Delay Before Reset negatifse ya da Force Closed ayarlıysa dönmez. Bir func_movelinear hiçbir zaman geri dönmez ve itmeye devam eder. 0 ile asansör engelleme hasarı vermez, ama kuyudaki bir oyuncu onu durdurabilir. Yani ya 0'da bırakıp kuyuyu, ancak asansör vardığında açılan kat kapılarıyla kapatırsın ya da bir hasar değeri ayarlayıp asansörün kazanmasına izin verirsin. func_door üzerinde OnBlockedClosing ve OnBlockedOpening ile kendin tepki verebilirsin.

Sarsıntı. Valve wiki'si, dikey hareket eden her platformun çok oyunculu oyunlarda üzerindekilere sarsıntılı göründüğünü belirtir ve neden olarak oyuncuların ağ fiziğini gösterir. Valve wiki'sindeki asansör eğitiminin tartışma sayfasından bir ipucu, belgelenmemiş ve her haritanın doğruladığı bir şey değil: oyuncuların doğrudan func_tracktrain üzerinde değil, ona parent'lanmış bir func_brush üzerinde durmasını sağla. FGD, func_brush için Solid BSP keyvalue'sunu tam da bu durum için tanımlar: hareket eden bir nesnenin hiyerarşisinde yer alan ve oyuncuların üzerinde durduğu bir brush. Sonucu, GMod haritasını oyuncularla test etme yazısında anlatıldığı gibi ping'li gerçek bir sunucuda kontrol et.

Kabindeki prop'lar. Bir prop_physics fizik tarafından simüle edilir ve Valve wiki'sine göre parent'ladığında tuhaf davranır. Bu yüzden kabindeki dekorasyon, asansöre parent'lanmış bir prop_dynamic olarak yer almalıdır. Hareket eden bir platformdaki serbest fizik prop'ları kayabilir ve sıkışabilir. Bu, pratikten gelen bir deneyimdir, belgelenmiş bir davranış değil. Prop türleri prop_static, prop_dynamic ve prop_physics yazısında karşılaştırılıyor.

Takılıp kalma. Yolda bir şey mi var? Bir path_track üzerinde Disabled ya da Disable train flag'i mi ayarlı, yoksa Next Stop Target mı boş? Asansör engellendiği ve OnFullyOpen hiç gelmediği için butonlar kilitlenip bir daha açılmadı mı? func_tracktrain üzerinde Is unblockable by player flag'i, onu engelleyen oyunculara karşı işe yarar.

Sık sorulan sorular

func_tracktrain'im neden tam path_track'te durmuyor?

Tren hedefinin hemen önünde durur; yüksek hızda bu daha belirgindir. Duraktan önce hızı düşür ya da kabin hizalanana kadar path_track entity'sini eksik mesafe kadar kaydır.

Kabin yolculuk sırasında neden yanlış aydınlatılıyor?

Brush entity'ler, başlangıç konumlarına göre önceden hesaplanmış lightmap'ler taşır; kabin farklı aydınlatılmış bir alana girdiğinde bunlar artık uymaz. Çözüm: görünen kabini bir prop_dynamic olarak yap ve görünmez bir brush'a parent'la. Daha fazlası Source Engine ışıklandırma rehberinde.

Oyuncular bir treni kendileri sürebilir mi?

Evet, trendeki No User Control flag'i kapalı olduğu sürece. Valve wiki'sine göre bir func_tracktrain üzerinde duran oyuncu o zaman onu kontrol edebilir. Train Name ve Parent değerlerinin ikisi de treni gösteren bir func_traincontrols bunu kendi brush'ıyla sınırlar: oyuncunun onun içinde ve trenin üzerinde durması gerekir.