| 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(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; }
|