shavit-credits/scripting/include/smlib/edicts.inc

127 lines
2.8 KiB
SourcePawn

#if defined _smlib_edicts_included
#endinput
#endif
#define _smlib_edicts_included
#include <sourcemod>
#include <smlib/entities>
/*
* Finds an edict by it's name
* It only finds the first occurence.
*
* @param name Name of the entity you want so search.
* @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
*/
stock int Edict_FindByName(const char[] name)
{
int maxEntities = GetMaxEntities();
for (int edict=0; edict < maxEntities; edict++) {
if (!IsValidEdict(edict)) {
continue;
}
if (Entity_NameMatches(edict, name)) {
return edict;
}
}
return INVALID_ENT_REFERENCE;
}
/*
* Finds an edict by its HammerID.
* The newer version of Valve's Hammer editor
* sets a unique ID for each entity in a map.
* It only finds the first occurence.
*
* @param hammerId Hammer editor ID
* @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
*/
stock int Edict_FindByHammerId(int hammerId)
{
int maxEntities = GetMaxEntities();
for (int edict=0; edict < maxEntities; edict++) {
if (!IsValidEdict(edict)) {
continue;
}
if (Entity_GetHammerId(edict) == hammerId) {
return edict;
}
}
return INVALID_ENT_REFERENCE;
}
/**
* Searches for the closest edict in relation to the given origin
*
* @param vecOrigin_center 3 dimensional origin array
* @param clientsOnly True if you only want to search for clients
* @param ignoreEntity Ignore this entity
* @return Edict Index or INVALID_ENT_REFERENCE if no entity was found.
*/
stock int Edict_GetClosest(float vecOrigin_center[3], bool clientsOnly=false, int ignoreEntity=-1)
{
float vecOrigin_edict[3];
float smallestDistance = 0.0;
int closestEdict = INVALID_ENT_REFERENCE;
int maxEntities;
if (clientsOnly) {
maxEntities = MaxClients;
}
else {
maxEntities = GetMaxEntities();
}
for (int edict=1; edict <= maxEntities; edict++) {
if (!IsValidEdict(edict)) {
continue;
}
if (ignoreEntity >= 0 && edict == ignoreEntity) {
continue;
}
if (GetEntSendPropOffs(edict, "m_vecOrigin") == -1) {
continue;
}
Entity_GetAbsOrigin(edict, vecOrigin_edict);
float edict_distance = GetVectorDistance(vecOrigin_center, vecOrigin_edict, true);
if (edict_distance < smallestDistance || smallestDistance == 0.0) {
smallestDistance = edict_distance;
closestEdict = edict;
}
}
return closestEdict;
}
/**
* Searches for the closest edict in relation to the given edict.
*
* @param edict Edict index
* @param clientsOnly True if you only want to search for clients
* @return The closest edict or INVALID_ENT_REFERENCE
*/
stock int Edict_GetClosestToEdict(int edict, bool clientsOnly=false)
{
float vecOrigin[3];
if (GetEntSendPropOffs(edict, "m_vecOrigin") == -1) {
return INVALID_ENT_REFERENCE;
}
Entity_GetAbsOrigin(edict, vecOrigin);
return Edict_GetClosest(vecOrigin, clientsOnly, edict);
}