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>