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(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;
pev(iEnt, pev_classname, szClassName, sizeof(szClassName)-1);
if(equali(szClassName, "func_water"))
continue;
if(IsCollision(iClient, iEnt))
{
client_print(iClient, print_chat, "You are inside of [%i] [%s].", iEnt, szClassName);
dllfunc(DLLFunc_Touch, iEnt, iClient);
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_mins, flTwoMins);
pev(iEntTwo, pev_maxs, flTwoMaxs);
if(!IsEntBrush(iEntTwo))
{
pev(iEntTwo, pev_origin, flTwoOrigin);
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 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;
}
stock IsEntBrush(iEnt)
{
static szModel[32];
pev(iEnt, pev_model, szModel, sizeof(szModel)-1);
if(szModel[0] == '*')
return true;
return false;
}
stock fm_get_brush_entity_origin(iEnt, Float:flOrigin[3])
{
static Float:flMins[3], Float:flMaxs[3];
pev(iEnt, pev_mins, flMins);
pev(iEnt, pev_maxs, flMaxs);
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;
}