util.TraceLine

  table util.TraceLine( table traceConfig )

Açıklama

Girdiye dayalı olarak bir çizgi üzerinde sonsuz incelikte, görünmez bir ışın izlemesi (veya "trace") gerçekleştirir ve izleme çizgisinin neye çarptığı veya neyle kesiştiği hakkında bilgi içeren bir tablo döndürür.

İzlemeler, katı, sunucu taraflı, objelerin (oyun dünyası dahil) fiziksel ağlarıyla kesişir, ancak hitclientonly `true` olarak ayarlanmadığı sürece yalnızca istemci taraflı objeleri algılayamaz.

İzlemenin ilk kesişimde durmamasını istiyorsanız ents.FindAlongRay fonksiyonuna bakın.
"Kutu" tipi bir izleme için util.TraceHull fonksiyonuna bakın.

İzlemeler, fiziksel ağların iç ve dış yüzleri arasında ayrım yapmaz. Bu nedenle, bir izleme katı bir fiziksel ağ içinde başlarsa, fiziksel ağın iç yüzlerine çarpacak ve sonuç olarak beklenmedik değerler döndürebilecektir.

Hata ayıklama amacıyla izlemeleri gerçek zamanlı olarak görselleştirmek için r_visualizetraces komutunu 1 olarak ayarlayabilirsiniz (sv_cheats komutunun 1 olmasını gerektirir).

Argümanlar

1 table (Trace yapısı ile) traceConfig
İzlemeyi yapılandıran verileri içeren bir tablo. Mevcut seçenekler için Trace yapısı sayfasına bakın.

Dönen Değerler

1 table (TraceResult yapısı ile)
İzleme çizgisinin nereyle ve neyle kesiştiğini detaylandıran bir bilgi tablosu veya izleme GM:InitPostEntity kancasından önce yapılıyorsa nil döner.

Tablonun formatı ve mevcut seçenekler için TraceResult yapısı sayfasına bakın.

Örnek

Çeşitli filtre yöntemlerinin örnek kullanımı.

-- Bu izleme, fonksiyon geri arama filtresi kullanarak SADECE araç olan objelere çarpacaktır concommand.Add( "test_trace_vehicles", function( ply ) local tr = util.TraceLine( { start = ply:GetShootPos(), endpos = ply:GetShootPos() + ply:GetAimVector() * 10000, filter = function( ent ) return ent:IsVehicle() end } ) print( tr.HitPos, tr.Entity ) end ) -- Bu izleme, sınıf adı 'prop_physics' olan objelere ÇARPMAYACAKTIR. concommand.Add( "test_trace_not_props", function( ply ) local tr = util.TraceLine( { start = ply:GetShootPos(), endpos = ply:GetShootPos() + ply:GetAimVector() * 10000, filter = { "prop_physics", ply } -- Ayrıca izlemeyi yapan oyuncuya da çarpma } ) print( tr.HitPos, tr.Entity ) end ) -- Bu izleme, SADECE sınıf adı 'prop_physics' olan objelere çarpacaktır. concommand.Add( "test_trace_props", function( ply ) local tr = util.TraceLine( { start = ply:GetShootPos(), endpos = ply:GetShootPos() + ply:GetAimVector() * 10000, filter = { "prop_physics" }, whitelist = true } ) print( tr.HitPos, tr.Entity ) end )

Örnek

Bir izlemeyi görselleştirir.

local color_red = Color( 255, 0, 0 ) local color_blu = Color( 0, 0, 255 ) local mins, maxs = Vector( -24, -3, -2 ), Vector( 24, 3, 2 ) hook.Add( "PostDrawTranslucentRenderables", "trace_visualize", function() local eyePos = Entity( 1 ):EyePos() + Entity( 1 ):GetRight() * -5 local eyeDir = Entity( 1 ):GetAimVector() local tr = util.TraceLine( { start = eyePos, endpos = eyePos + eyeDir * 10000, filter = Entity( 1 ) } ) render.DrawLine( eyePos + LocalPlayer():GetRight() * -5, tr.HitPos, color_red, true ) -- İzleme çizgisinin bir çizgi olduğunu, bir gövde (hull) olmadığını göster render.DrawWireframeBox( tr.HitPos, Angle( 0, 0, 0 ), mins, maxs, color_red, true ) eyePos = Entity( 1 ):EyePos() + Entity( 1 ):GetRight() * 5 local tr2 = util.TraceHull( { start = eyePos, endpos = eyePos + eyeDir * 10000, filter = Entity( 1 ), mins = mins, maxs = maxs } ) render.DrawLine( eyePos, tr2.HitPos, color_blu, true ) render.DrawWireframeBox( tr2.HitPos, Angle( 0, 0, 0 ), mins, maxs, color_blu, true ) end )
Çıktı:
image.png

Örnek

İstemcide çalıştırıldığında yalnızca istemci taraflı objelere çarpacak örnek kod.

if ( CLIENT ) then concommand.Add( "test_cl_trace", function( ply ) local tr = util.TraceLine( { start = ply:GetShootPos(), endpos = ply:GetShootPos() + ply:GetAimVector() * 10000, mask = MASK_ALL, -- Bu, ölü NPC'lerin/oyuncuların ragdoll'larına çarpmak için gereklidir, çünkü onlar "moloz" olarak kabul edilir filter = ply, -- İzlemeyi yapan oyuncuya çarpma hitclientonly = true -- Sadece istemci taraflı objelere çarp } ) -- İzleme sonuçlarını göster PrintTable( tr ) -- "developer 1" etkinken, çarpma pozisyonunu çiz -- Zamanlayıcı gereklidir çünkü oyun duraklatıldığında (konsol açıkken olduğu gibi) debugoverlay çalışmaz timer.Simple( 0.0, function() debugoverlay.Cross( tr.HitPos, 16, 10 ) debugoverlay.Text( tr.HitPos, "Hit: " .. tostring(tr.Entity), 10 ) end ) end ) end

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord