Raised This Month: $ Target: $400
 0% 

Check bounding box collision


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Author Message
hlstriker
Green Gaben
Join Date: Mar 2006
Location: OH-IO!
Old 08-12-2009 , 13:56   Check bounding box collision
Reply With Quote #1

I'm trying to check if an entities bounding box is inside another entities bounding box.

In the following example I'm checking to see if the client is inside of any valid entity.

The problem being that not all entities seem to have the right bounding box. In some maps it detects me being inside an entity that isn't there, or not detected inside an entity that is really there.

EDIT: Please ignore the following code, see post below.

PHP Code:
#include <amxmodx>
#include <fakemeta>

#define PLUGIN    "Test Collision"
#define VERSION    "1.0"
#define AUTHOR    "hlstriker"

public plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);
    
register_clcmd("say /test""CheckCollision");
}

public 
CheckCollision(iClient)
{
    new 
szClassName[32], bool:bFound;
    for(new 
iEnt=0iEnt<engfunc(EngFunc_NumberOfEntities); iEnt++)
    {
        if(!
pev_valid(iEnt) || iEnt == iClient)
            continue;
        
        if(
IsCollision(iClientiEnt))
        {
            
pev(iEntpev_classnameszClassNamesizeof(szClassName)-1);
            
client_print(iClientprint_chat"You are inside of [%i] [%s]."iEntszClassName);
            
bFound true;
        }
    }
    
    if(!
bFound)
        
client_print(iClientprint_chat"You are not inside of anything.");
    
    return 
PLUGIN_HANDLED;
}

public 
IsCollision(iEntOneiEntTwo)
{
    
// Get first entities bounding box
    
static Float:flOneOrigin[3], Float:flOneMins[3], Float:flOneMaxs[3];
    
pev(iEntOnepev_originflOneOrigin);
    
pev(iEntOnepev_minsflOneMins);
    
pev(iEntOnepev_maxsflOneMaxs);
    
    
flOneMins[0] = flOneOrigin[0] + flOneMins[0];
    
flOneMins[1] = flOneOrigin[1] + flOneMins[1];
    
flOneMins[2] = flOneOrigin[2] + flOneMins[2];
    
    
flOneMaxs[0] = flOneOrigin[0] + flOneMaxs[0];
    
flOneMaxs[1] = flOneOrigin[1] + flOneMaxs[1];
    
flOneMaxs[2] = flOneOrigin[2] + flOneMaxs[2];
    
    
// Get second entities bounding box
    
static Float:flTwoOrigin[3], Float:flTwoMins[3], Float:flTwoMaxs[3];
    
pev(iEntTwopev_originflTwoOrigin);
    
pev(iEntTwopev_minsflTwoMins);
    
pev(iEntTwopev_maxsflTwoMaxs);
    
    
flTwoMins[0] = flTwoOrigin[0] + flTwoMins[0] - 1;
    
flTwoMins[1] = flTwoOrigin[1] + flTwoMins[1] - 1;
    
flTwoMins[2] = flTwoOrigin[2] + flTwoMins[2] - 1;
    
    
flTwoMaxs[0] = flTwoOrigin[0] + flTwoMaxs[0] + 1;
    
flTwoMaxs[1] = flTwoOrigin[1] + flTwoMaxs[1] + 1;
    
flTwoMaxs[2] = flTwoOrigin[2] + flTwoMaxs[2] + 1;
    
    
// Check if entity ones bounding box is inside entity twos bounding box
    
static iTouchingiTouching 0;
    
    if(((
flOneMins[0] >= flTwoMins[0]) && (flOneMins[0] <= flTwoMaxs[0]))  // Is ones X Mins inside twos X bbox?
    
|| ((flOneMaxs[0] >= flTwoMins[0]) && (flOneMaxs[0] <= flTwoMaxs[0]))) // Is ones X Maxs inside twos X bbox?
        
iTouching++; // Either ones mins or maxs is inside twos X bbox.
    
    
if(((flOneMins[1] >= flTwoMins[1]) && (flOneMins[1] <= flTwoMaxs[1]))  // Is ones Y Mins inside twos Y bbox?
    
|| ((flOneMaxs[1] >= flTwoMins[1]) && (flOneMaxs[1] <= flTwoMaxs[1]))) // Is ones Y Maxs inside twos Y bbox?
        
iTouching++; // Either ones mins or maxs is inside twos Y bbox.
    
    
if(((flOneMins[2] >= flTwoMins[2]) && (flOneMins[2] <= flTwoMaxs[2]))  // Is ones Z Mins inside twos Z bbox?
    
|| ((flOneMaxs[2] >= flTwoMins[2]) && (flOneMaxs[2] <= flTwoMaxs[2]))) // Is ones Z Maxs inside twos Z bbox?
        
iTouching++; // Either ones mins or maxs is inside twos Z bbox.
    
    
if(iTouching != 3)
    {
        
// X,Y,Z all need to be inside? Must be no collision.
        
return false;
    }
    
    
// Ent ones bounding box is inside of ent twos bounding box.
    
return true;


Last edited by hlstriker; 08-12-2009 at 23:19.
hlstriker is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 18:31.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode