AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Check bounding box collision (https://forums.alliedmods.net/showthread.php?t=100093)

hlstriker 08-12-2009 13:56

Check bounding box collision
 
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;



hlstriker 08-12-2009 23:18

Re: Check bounding box collision
 
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;



waza123a 06-28-2014 05:54

Re: Check bounding box collision
 
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


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

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