Garry's Mod Wiki

Revision Difference

Global.CreatePhysCollideBox#514815

<function name="CreatePhysCollideBox" parent="Global" type="libraryfunc"> <description> Creates a new <page>PhysCollide</page> from the given bounds. <bug issue="3568">This fails to create planes or points - no components of the mins or maxs can be the same.</bug> </description> <realm>Shared</realm> <args> <arg name="mins" type="Vector">Min corner of the box. This is not automatically ordered with the maxs and must contain the smallest vector components. See &lt;page&gt;Global.OrderVectors&lt;/page&gt;.</arg> <arg name="maxs" type="Vector">Max corner of the box. This is not automatically ordered with the mins and must contain the largest vector components.</arg> </args> <rets> <ret name="" type="PhysCollide">The new PhysCollide. This will be a NULL PhysCollide (<page>PhysCollide:IsValid</page> returns false) if given bad vectors or no more PhysCollides can be created in the physics engine.</ret> </rets> </function> <example> <description>A box that interacts correctly with VPhysics objects and player movement.</description> <code> AddCSLuaFile() DEFINE_BASECLASS( "base_anim" ) ENT.PrintName = "Cube" ENT.Spawnable = true ENT.Mins = Vector( -16, -16, -16 ) ENT.Maxs = Vector( 16, 16, 16 ) function ENT:Initialize() self.PhysCollide = CreatePhysCollideBox( self.Mins, self.Maxs ) self:SetCollisionBounds( self.Mins, self.Maxs ) if SERVER then self:PhysicsInitBox( self.Mins, self.Maxs ) self:SetSolid( SOLID_VPHYSICS ) self:PhysWake() end if CLIENT then self:SetRenderBounds( self.Mins, self.Maxs ) end self:EnableCustomCollisions( true ) self:DrawShadow( false ) end -- Handles collisions against traces. This includes player movement. function ENT:TestCollision( startpos, delta, isbox, extents ) if not IsValid( self.PhysCollide ) then return end -- TraceBox expects the trace to begin at the center of the box, but TestCollision is bad local max = extents local min = -extents max.z = max.z - min.z min.z = 0 local hit, norm, frac = self.PhysCollide:TraceBox( self:GetPos(), self:GetAngles(), startpos, startpos + delta, min, max ) if not hit then return end return { HitPos = hit, Normal = norm, Fraction = frac, } end function ENT:Draw() render.DrawWireframeBox( self:GetPos(), self:GetAngles(), self.Mins, self.Maxs, Color( 255, 0, 0 ), true ) end </code> </example>