Garry's Mod Wiki

util.TraceHull

  table util.TraceHull( table TraceData )

Description

Performs an AABB hull (axis-aligned bounding box, aka not rotated) trace with the given trace data.

This trace type cannot hit hitboxes.

See util.TraceLine for a simple line ("ray") trace.

This function may not always give desired results clientside due to certain physics mechanisms not existing on the client. Use it serverside for accurate results.

Arguments

1 table TraceData
The trace data to use. See HullTrace structure

Returns

1 table
Trace result. See TraceResult structure

Example

Visual representation of a Hull Trace.

function ENT:Draw() self:DrawModel() -- Entity model's bounding box local mins = self:OBBMins() local maxs = self:OBBMaxs() local startpos = self:GetPos() -- Origin point for the trace local dir = self:GetUp() -- Direction for the trace, as a unit vector local len = 128 -- Maximum length of the trace -- Perform the trace local tr = util.TraceHull( { start = startpos, endpos = startpos + dir * len, maxs = maxs, mins = mins, filter = self } ) -- Draw a line between start and end of the performed trace render.DrawLine( tr.HitPos, startpos + dir * len, color_white, true ) render.DrawLine( startpos, tr.HitPos, Color( 0, 0, 255 ), true ) -- Choose a color, if the trace hit - make the color red local clr = color_white if ( tr.Hit ) then clr = Color( 255, 0, 0 ) end -- Draw the trace bounds at the start and end positions render.DrawWireframeBox( startpos, Angle( 0, 0, 0 ), mins, maxs, Color( 255, 255, 255 ), true ) render.DrawWireframeBox( tr.HitPos, Angle( 0, 0, 0 ), mins, maxs, clr, true ) end
Output:

Example

Trace a player sized hull to detect if a player can spawn here without getting stuck inside anything.

local pos = Entity(1):GetPos() -- Choose your position. local tr = { start = pos, endpos = pos, mins = Vector( -16, -16, 0 ), maxs = Vector( 16, 16, 71 ) } local hullTrace = util.TraceHull( tr ) if ( hullTrace.Hit ) then -- Find a new spawnpoint end

Example

From a SWEP:PrimaryAttack()

local tr = util.TraceHull( { start = self:GetOwner():GetShootPos(), endpos = self:GetOwner():GetShootPos() + ( self:GetOwner():GetAimVector() * 100 ), filter = self:GetOwner(), mins = Vector( -10, -10, -10 ), maxs = Vector( 10, 10, 10 ), mask = MASK_SHOT_HULL } )