Raised This Month: $51 Target: $400
 12% 

Check bounding box collision


Post New Thread Reply   
 
Thread Tools Display Modes
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
hlstriker
Green Gaben
Join Date: Mar 2006
Location: OH-IO!
Old 08-12-2009 , 23:18   Re: Check bounding box collision
Reply With Quote #2

I remembered I don't need to add the origin to a brushes mins/maxs.

Here is the altered code that works a bit better, yet it still seems wrong.

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;
        
        
pev(iEntpev_classnameszClassNamesizeof(szClassName)-1);
        if(
equali(szClassName"func_water"))
            continue;
        
        if(
IsCollision(iClientiEnt))
        {
            
client_print(iClientprint_chat"You are inside of [%i] [%s]."iEntszClassName);
            
dllfunc(DLLFunc_TouchiEntiClient);
            
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_minsflTwoMins);
    
pev(iEntTwopev_maxsflTwoMaxs);
    
    if(!
IsEntBrush(iEntTwo))
    {
        
pev(iEntTwopev_originflTwoOrigin);
        
        
flTwoMins[0] = flTwoOrigin[0] + flTwoMins[0];
        
flTwoMins[1] = flTwoOrigin[1] + flTwoMins[1];
        
flTwoMins[2] = flTwoOrigin[2] + flTwoMins[2];
        
        
flTwoMaxs[0] = flTwoOrigin[0] + flTwoMaxs[0];
        
flTwoMaxs[1] = flTwoOrigin[1] + flTwoMaxs[1];
        
flTwoMaxs[2] = flTwoOrigin[2] + flTwoMaxs[2];
    }
    
    
// 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;
}

stock IsEntBrush(iEnt)
{
    static 
szModel[32];
    
pev(iEntpev_modelszModelsizeof(szModel)-1);
    if(
szModel[0] == '*')
        return 
true;
    return 
false;
}

stock fm_get_brush_entity_origin(iEntFloat:flOrigin[3])
{
    static 
Float:flMins[3], Float:flMaxs[3];
    
pev(iEntpev_minsflMins);
    
pev(iEntpev_maxsflMaxs);
    
    
flOrigin[0] = (flMins[0] + flMaxs[0]) * 0.5;
    
flOrigin[1] = (flMins[1] + flMaxs[1]) * 0.5;
    
flOrigin[2] = (flMins[2] + flMaxs[2]) * 0.5;
    
    return 
1;

hlstriker is offline
waza123a
Member
Join Date: Mar 2010
Old 06-28-2014 , 05:54   Re: Check bounding box collision
Reply With Quote #3

would be nice if someone give a better detection of collision, because this works 50% of time

EDIT:

Found one, works great, 100% of time

https://forums.alliedmods.net/showpo...67&postcount=3
__________________
Life is good, sometimes...

Last edited by waza123a; 06-28-2014 at 05:58.
waza123a is offline
Reply



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 09:46.


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