Garry's Mod Wiki

Revision Difference

util.TraceLine#562800

<function name="TraceLine" parent="util" type="libraryfunc"> <description> Performs an infinitely thin, invisible Ray Trace (or "Trace") in a line based on an input <page text="Trace Structure table">Structures/Trace</page> and returns a <page text="Trace Result table">Structures/TraceResult</page> that contains information about what, if anything, the Trace line hit or intersected. Traces intersect with the Physics Meshes of <page text="Solid">enums/SOLID</page>, <page text="Server-side">States</page>, <page text="Entities">Entity</page> (including the <page text="Game World">game.GetWorld</page>) but cannot detect Client-side-only Entities. For a way to detect Client-side Entities, see <page>ents.FindAlongRay</page>. Traces do not differentiate between the inside and the outside faces of Physics Meshes. Because of this, if a Trace starts within a Solid Physics Mesh it will hit the inside faces of the Physics Mesh and may return unexpected values as a result. See Also:⤶ <page>util.TraceHull</page>⤶ </description> ⤶ See <page>util.TraceHull</page> for a "box" type trace. ⤶ You can use `r_visualizetraces` set to `1` (requires `sv_cheats` set to `1`) to visualize traces in real time for debugging purposes.</description> <realm>Shared</realm> <args> <arg name="traceConfig" type="table"> A table of data that configures the Trace. For the table's format and available options see the <page>Structures/Trace</page> page. </arg> </args> <rets> <ret name="" type="table"> A table of information detailing where and what the Trace line intersected, or `nil` if the trace is being done before the <page>GM:InitPostEntity</page> hook. For the table's format and available options see the <page>Structures/TraceResult</page> page. </ret> </rets> </function> <example> <description>Using a function callback as filter.</description> <code> local tr = util.TraceLine( { start = LocalPlayer():EyePos(), endpos = LocalPlayer():EyePos() + EyeAngles():Forward() * 10000, filter = function( ent ) return ( ent:GetClass() == "prop_physics" ) end } ) print( tr.HitPos, tr.Entity ) </code> <output>The trace will only hit prop_physics or world.</output> </example> <example> <description>Visualizes a trace.</description> <code> 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 ) -- Show that the traceline is a line, not a hull 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 ) </code> <output><upload src="70c/8dbdae6fcf05200.png" size="5612891" name="image.png" /></output> </example>