18/02/2015, 12:35 PM
(Última modificación: 18/02/2015, 01:31 PM por meTaLiCroSS.)
Les daré una pequeña clase sobre esta funcion.
La podemos utilizar *directamente* desde FakeMeta con la native engfunc.
Esta función sirve para buscar entidades en el juego, segun un campo en especifico de sus entvars (pev) que coincidan con el tercer parametro.
► El primer parametro define "desde que INDEX empezar a buscar". El motor buscará y comparará entidad por entidad, hasta encontrar la primera coincidencia, retornando el INDEX de esa entidad.
▬ Si defines el primer parametro como 32, empezará desde la 33 hasta todas las entidades que resten.
► El segundo parametro define "el PEV especifico que quiero buscar en las entidades" que es en string. Hay una simple lista de los únicos pevs que pueden ser utilizados en el segundo parametro, la cual es la siguiente:
Si se dan cuenta, cada uno de esos campos especificos, corresponden a todos los entvars (pevs) de entidades, que están definidos como strings. Cosa que revisen la lista de EV_SZ_* de engine_const.inc para fijarse:
▬ Si defines el segundo parametro como "viewmodel", preguntará (en cada entidad) si el campo viewmodel coincide con el tercer parametro.
► El tercer parametro define "que string quiero buscar especificamente (en el entvar que especifique en el segundo parametro)".
Si defino el tercer parametro como "func_door", y el segundo parametro como "classname", buscará a la primera entidad que tenga su entvar classname de valor "func_door".
► El return de la native vendría siendo el index de la entidad encontrada. En caso de que no exista una entidad con las condiciones que buscabas, devolvera un valor menor a 1. Basta con detectar si el return es mayor a 0 para saber si devolvió algo válido.
Existen muchas formas de utilizar esta funcion, ya sea para:
Y bastantes cosas mas.
Digamos que quiero saber si existen entidades armoury_entity (armas que aparecen en el piso) en el mapa. No necesito contar cada una, si no que simplemente me bastará saber si existe 1 para saber si hay.
El metodo para contar todas las entidades que contengan lo que buscas es corto pero complejo debido a su rara codificacion. Lograré explicarlo de una manera sencilla.
Se desea buscar "cuantas" armas botadas hay en el mapa. Puesto eso, realizamos el siguiente bucle:
Puedes usar el campo "model" para buscar entidades de un model especifico.
Puedes usar el campo "targetname" para buscar la "entidad" que estaría activando una entidad especifica al ser usada (si eres mapper, captaras)
Y puedes usar todas esas porquerías que listé...
¿QUE OPCIONES ADEMAS DE ÉSTA NATIVE TENGO?
El módulo Engine provee un buen numero de funciones que simplifican el uso de esta native (aunque fue al revez, debido que engine salió primero que fakemeta)
find_ent_by_class(iIndex, const szClass[]) = engfunc(EngFunc_FindEntityByString, iIndex, "classname", const szClass[])
find_ent_by_target(iIndex, const szClass[]) = engfunc(EngFunc_FindEntityByString, iIndex, "target", const szClass[])
find_ent_by_tname(iIndex, const szClass[]) = engfunc(EngFunc_FindEntityByString, iIndex, "targetname", const szClass[])
find_ent_by_owner y find_ent_by_model son distintos.
find_ent_by_owner busca por entidades de cierto classname/target/targetname (definido en el parametro iJghgType), y ademas a cada una que encuentra verifica si el valor de su entvar (pev) owner equivale al parametro iOwner.
find_ent_by_model busca por entidades de cierto classname, y ademas a cada una que encuentra verifica si el valor de su entvar (pev) model equivale al parametro szModel.
Funcionan igual que los ejemplos mencionados arriba.
Por sobre todo, prefieran las natives de engine mencionadas antes que engfunc(EngFunc_FindEntityByString, ...) a menos que lo necesiten porque no encuentren lo que busquen en las natives de engine.
Cualquier duda consulten
La podemos utilizar *directamente* desde FakeMeta con la native engfunc.
Código PHP:
// fakemeta_const.inc
EngFunc_FindEntityByString // (edict) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue)
Código PHP:
// fakemeta_stocks.inc
stock EF_FindEntityByString(const STARTSEARCHAFTER, const FIELD[], const VALUE[])
return engfunc(EngFunc_FindEntityByString, STARTSEARCHAFTER, FIELD, VALUE);
Esta función sirve para buscar entidades en el juego, segun un campo en especifico de sus entvars (pev) que coincidan con el tercer parametro.
► El primer parametro define "desde que INDEX empezar a buscar". El motor buscará y comparará entidad por entidad, hasta encontrar la primera coincidencia, retornando el INDEX de esa entidad.
▬ Si defines el primer parametro como 32, empezará desde la 33 hasta todas las entidades que resten.
► El segundo parametro define "el PEV especifico que quiero buscar en las entidades" que es en string. Hay una simple lista de los únicos pevs que pueden ser utilizados en el segundo parametro, la cual es la siguiente:
Código:
classname
model
viewmodel
weaponmodel
netname
target
targetname
message
noise
noise1
noise2
noise3
globalname
(Sacado de función iGetIndex, codigo semidecompilado del engine.)
Si se dan cuenta, cada uno de esos campos especificos, corresponden a todos los entvars (pevs) de entidades, que están definidos como strings. Cosa que revisen la lista de EV_SZ_* de engine_const.inc para fijarse:
Código PHP:
enum {
EV_SZ_classname = 0,
EV_SZ_globalname,
EV_SZ_model,
EV_SZ_target,
EV_SZ_targetname,
EV_SZ_netname,
EV_SZ_message,
EV_SZ_noise,
EV_SZ_noise1,
EV_SZ_noise2,
EV_SZ_noise3,
EV_SZ_viewmodel,
EV_SZ_weaponmodel,
};
▬ Si defines el segundo parametro como "viewmodel", preguntará (en cada entidad) si el campo viewmodel coincide con el tercer parametro.
► El tercer parametro define "que string quiero buscar especificamente (en el entvar que especifique en el segundo parametro)".
Si defino el tercer parametro como "func_door", y el segundo parametro como "classname", buscará a la primera entidad que tenga su entvar classname de valor "func_door".
► El return de la native vendría siendo el index de la entidad encontrada. En caso de que no exista una entidad con las condiciones que buscabas, devolvera un valor menor a 1. Basta con detectar si el return es mayor a 0 para saber si devolvió algo válido.
Existen muchas formas de utilizar esta funcion, ya sea para:
- Verificar si "existe" una entidad con lo que buscas
- Contar cuantas entidades "contienen" lo que buscas
- Realizar acciones a todas las entidades que "contengan" lo que buscas, ya sea para:
- Eliminarles
- Obtenerles informacion
- Eliminarles
Y bastantes cosas mas.
Digamos que quiero saber si existen entidades armoury_entity (armas que aparecen en el piso) en el mapa. No necesito contar cada una, si no que simplemente me bastará saber si existe 1 para saber si hay.
Código PHP:
if(engfunc(EngFunc_FindEntityByString, -1, "classname", "armoury_entity") > 0) // mayor a 0 implica una entidad valida
server_print("Existen armas botadas en el mapa!")
else
server_print("No hay ningun arma botada en el mapa")
El metodo para contar todas las entidades que contengan lo que buscas es corto pero complejo debido a su rara codificacion. Lograré explicarlo de una manera sencilla.
Se desea buscar "cuantas" armas botadas hay en el mapa. Puesto eso, realizamos el siguiente bucle:
Código PHP:
new iEntId = -1; // entidad de partida, leera desde el 0 para adelante
new iCount; // contador, inicia en 0
while( (iEntId = engfunc(EngFunc_FindEntityByString, iEntId, "classname", "armoury_entity")) > 0 )
iCount++;
server_print("Armas botadas en el suelo encontradas: %d", iCount);
Puedes usar el campo "model" para buscar entidades de un model especifico.
Puedes usar el campo "targetname" para buscar la "entidad" que estaría activando una entidad especifica al ser usada (si eres mapper, captaras)
Y puedes usar todas esas porquerías que listé...
¿QUE OPCIONES ADEMAS DE ÉSTA NATIVE TENGO?
El módulo Engine provee un buen numero de funciones que simplifican el uso de esta native (aunque fue al revez, debido que engine salió primero que fakemeta)
Código PHP:
native find_ent_by_class(iIndex, const szClass[]);
native find_ent_by_owner(iIndex, const szClass[], iOwner, iJghgType=0); // 1: target, 2:targetname, 0:classname (default)
native find_ent_by_target(iIndex, const szClass[]);
native find_ent_by_tname(iIndex, const szClass[]);
native find_ent_by_model(iIndex, const szClass[], const szModel[]);
find_ent_by_class(iIndex, const szClass[]) = engfunc(EngFunc_FindEntityByString, iIndex, "classname", const szClass[])
find_ent_by_target(iIndex, const szClass[]) = engfunc(EngFunc_FindEntityByString, iIndex, "target", const szClass[])
find_ent_by_tname(iIndex, const szClass[]) = engfunc(EngFunc_FindEntityByString, iIndex, "targetname", const szClass[])
find_ent_by_owner y find_ent_by_model son distintos.
find_ent_by_owner busca por entidades de cierto classname/target/targetname (definido en el parametro iJghgType), y ademas a cada una que encuentra verifica si el valor de su entvar (pev) owner equivale al parametro iOwner.
find_ent_by_model busca por entidades de cierto classname, y ademas a cada una que encuentra verifica si el valor de su entvar (pev) model equivale al parametro szModel.
Funcionan igual que los ejemplos mencionados arriba.
Por sobre todo, prefieran las natives de engine mencionadas antes que engfunc(EngFunc_FindEntityByString, ...) a menos que lo necesiten porque no encuentren lo que busquen en las natives de engine.
Cualquier duda consulten
Strings en goldsrc (STRING, ALLOC_STRING, MAKE_STRING) - GoldSrc: gamedll, hlsdk, etc - Obteniendo nombres de texturas de mapas - FindEntityByString y derivados - Detectar Ataques de Knife - El Parametro fNoMonsters de los Traces - Funcion: AddToFullPack - Compresión de digitos - Native: register_event
► Si vas a pedirme ayuda con code vía Mensaje Privado, anda pensando primero como me vas a cargar la PayPal... ◄
► Si vas a pedirme ayuda con code vía Mensaje Privado, anda pensando primero como me vas a cargar la PayPal... ◄