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(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /test", "CheckCollision");
}
public CheckCollision(iClient)
{
new szClassName[32], bool:bFound;
for(new iEnt=0; iEnt<engfunc(EngFunc_NumberOfEntities); iEnt++)
{
if(!pev_valid(iEnt) || iEnt == iClient)
continue;
if(IsCollision(iClient, iEnt))
{
pev(iEnt, pev_classname, szClassName, sizeof(szClassName)-1);
client_print(iClient, print_chat, "You are inside of [%i] [%s].", iEnt, szClassName);
bFound = true;
}
}
if(!bFound)
client_print(iClient, print_chat, "You are not inside of anything.");
return PLUGIN_HANDLED;
}
public IsCollision(iEntOne, iEntTwo)
{
// Get first entities bounding box
static Float:flOneOrigin[3], Float:flOneMins[3], Float:flOneMaxs[3];
pev(iEntOne, pev_origin, flOneOrigin);
pev(iEntOne, pev_mins, flOneMins);
pev(iEntOne, pev_maxs, flOneMaxs);
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(iEntTwo, pev_origin, flTwoOrigin);
pev(iEntTwo, pev_mins, flTwoMins);
pev(iEntTwo, pev_maxs, flTwoMaxs);
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 iTouching; iTouching = 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;
}