[GUIA] FindEntityByString y derivados
#1
Les daré una pequeña clase sobre esta funcion.

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_FindEntityByStringSTARTSEARCHAFTERFIELDVALUE); 

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

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"

Proud

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_FindEntityByStringiEntId"classname""armoury_entity")) > )
    
iCount++;
    
server_print("Armas botadas en el suelo encontradas: %d"iCount); 

Para lo que respecta a: iEntId = engfunc(EngFunc_FindEntityByString, iEntId, "classname", "armoury_entity"), rutearemos:

Digamos que existen 5 armoury_entity de indexes: 35, 38, 42, 56, 60.

PRIMERO, la native es llamada. Su primer parametro es el valor de iEntId, -1.
SEGUNDO, la native devuelve un valor. Su return es 35.
TERCERO, iEntId se asigna al return de la native. iEntId = 35.

iCount incrementa, se repite el ciclo.

PRIMERO, la native es llamada. Su primer parametro es el valor de iEntId, 35.
SEGUNDO, la native devuelve un valor. Su return es 38.
TERCERO, iEntId se asigna al return de la native. iEntId = 38.

Si entendiste como funciona, eres un genio.

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[], iOwneriJghgType=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 Genius
Responder
#2
el otro día estaba leyendo sobre esto justamente , me viene de 10

+1 imaginario
Responder
#3
para remover las entidades de armas al inicio de la partida se usa?
Código PHP:
public round_start()
{
    new 
ent = -1
    
while( (ent find_ent_by_class(ent"armoury_entity") ) >)
        
remove_entity(ent)

Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
[Imagen: b_350_20_5A6C3E_383F2D_D2E1B5_2E3226.png]

(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

Responder
#4
(18/02/2015, 12:51 PM)Sugisaki escribió: para remover las entidades de armas al inicio de la partida se usa?
Código PHP:
public round_start()
{
    new 
ent = -1
    
while( (ent find_ent_by_class(ent"armoury_entity") ) >)
        
remove_entity(ent)


Evaluando el caso, basta que lo hagas en el init. Las armoury_entity al ser usados no se eliminan, solo se hacen invisibles. Los eliminas una vez y no volveran a aparecer Nothingdohere
Responder
#5
Buena Guía

PD:
sencila...
sencilla.
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016, 05:05 PM)meTaLiCroSS escribió: Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019, 05:32 PM)meTaLiCroSS escribió: grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
Responder
#6
(18/02/2015, 12:35 PM)meTaLiCroSS escribió: Si entendiste como funciona, eres un genio.

Excitedeyes

Buena guía Proud

Aunque no entendí bien cuando usar cada uno de estos "pevs"

Código:
classname
model
viewmodel
weaponmodel
netname
target
targetname
message
noise
noise1
noise2
noise3
globalname

(Sacado de función iGetIndex, codigo semidecompilado del engine.)

Por ejemplo que es exactamente lo que busca o hace "globalname" o "message", osea, cuando debería usarlos (?
Responder
#7
Nadie te obliga a usarlos, si quieres encontrar una entidad que en algunos de esos pevs contenga un string especifico, lo haces. Algunas entidades le dan utilidad a aquellas, otras no
Responder
#8
(18/02/2015, 01:55 PM)meTaLiCroSS escribió: Nadie te obliga a usarlos, si quieres encontrar una entidad que en algunos de esos pevs contenga un string especifico, lo haces. Algunas entidades le dan utilidad a aquellas, otras no

Claro pero por ejemplo, que entidad usa esas string, osea, que utilidad tienen? porque tiene que haber alguna entidad que los use (?
Responder
#9
(18/02/2015, 02:21 PM)sasske escribió:
(18/02/2015, 01:55 PM)meTaLiCroSS escribió: Nadie te obliga a usarlos, si quieres encontrar una entidad que en algunos de esos pevs contenga un string especifico, lo haces. Algunas entidades le dan utilidad a aquellas, otras no

Claro pero por ejemplo, que entidad usa esas string, osea, que utilidad tienen? porque tiene que haber alguna entidad que los use (?

El pev message es usado por la entidad game_text, guarda el mensaje que muestra el hudmessage, env_laser para guardar la entidad a la que apunta el laser, entre otros varios

Y algunas entidades tienen globalname... que es algo que aun no entiendo, es la parte china del sdk junto otros, Arkshine debe saber bien, nunca he visto aparecer una entidad con globalname
Responder
#10
(18/02/2015, 02:31 PM)meTaLiCroSS escribió:
(18/02/2015, 02:21 PM)sasske escribió:
(18/02/2015, 01:55 PM)meTaLiCroSS escribió: Nadie te obliga a usarlos, si quieres encontrar una entidad que en algunos de esos pevs contenga un string especifico, lo haces. Algunas entidades le dan utilidad a aquellas, otras no

Claro pero por ejemplo, que entidad usa esas string, osea, que utilidad tienen? porque tiene que haber alguna entidad que los use (?

El pev message es usado por la entidad game_text, guarda el mensaje que muestra el hudmessage, env_laser para guardar la entidad a la que apunta el laser, entre otros varios

Y algunas entidades tienen globalname... que es algo que aun no entiendo, es la parte china del sdk junto otros, Arkshine debe saber bien, nunca he visto aparecer una entidad con globalname

A la entidad a la que apunta que laser, no entiendo un carajo Nothingdohere

Calculo que con buscar entidades por el classname ya tengo suficiente Yao ming
Responder
#11
un momento...

vamos a VHE, el global name no es eso que le colocas a la entidad como "Name" ?

Ejemplo
creo una entidad "armoury_entity" esto es el classname, en las porpiedades le pongo un name, eeeesssteeeee m4_base_ct, eso seria el globalname? o con al entidad func_wall, Name: Pared_ct
Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
[Imagen: b_350_20_5A6C3E_383F2D_D2E1B5_2E3226.png]

(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

Responder
#12
Name es el targetname
Target es el target
Responder
#13
Ok, deviandonos al tema.

Hice un plugin que usa find_ent_by_owner (que por cierto no lo han aprovado o alreves)

para usar FindEntBystring con el owner seria

Código PHP:
event_curweapon(id)
{
    new 
weaponid get_user_weapon(id)
    new 
weapon_name[15]
    
get_weaponname(weaponidweapon_namecharsmax(weapon_name))
    
    new 
wIndex engfunc(EngFunc_FindEntityByString, -1pev(idpev_owner), weapon_name)
    
    
cs_set_weapon_ammo(wIndexammo)


o es diferente o no es asi
Competitive/Face it Pick Up Game (PUG) servidor de prueba: 45.77.94.109:27016 Click para Entrar
[Imagen: b_350_20_5A6C3E_383F2D_D2E1B5_2E3226.png]

(14/08/2015, 10:15 PM)Sugisaki escribió: "El mundo es caotico, irracional e injusto. No tiene ningun significado"
Palabras que desde hace mucho tiempo he buscado para describir, ¿Que es el mundo?
Crab

Código PHP:
if(ayuda && free)
{
    exit();

Responder
#14
Imaginemos que yo tengo un while para ir buscando las entidades y cada vez que encuentro una le hago algo...

hace falta chequear que la entidad es válida? is_valid_ent o similar me refiero



Buen tutorial, yo también prefiero engine Cansado
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#15
(18/02/2015, 03:19 PM)Sugisaki escribió: Ok, deviandonos al tema.

Hice un plugin que usa find_ent_by_owner (que por cierto no lo han aprovado o alreves)

para usar FindEntBystring con el owner seria

Código PHP:
event_curweapon(id)
{
    new 
weaponid get_user_weapon(id)
    new 
weapon_name[15]
    
get_weaponname(weaponidweapon_namecharsmax(weapon_name))
    
    new 
wIndex engfunc(EngFunc_FindEntityByString, -1pev(idpev_owner), weapon_name)
    
    
cs_set_weapon_ammo(wIndexammo)


o es diferente o no es asi

Ni leiste el tutorial, gracias

(18/02/2015, 03:23 PM)RauliTop escribió: Imaginemos que yo tengo un while para ir buscando las entidades y cada vez que encuentro una le hago algo...

hace falta chequear que la entidad es válida? is_valid_ent o similar me refiero



Buen tutorial, yo también prefiero engine Cansado

Cita: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.
Responder
#16
(18/02/2015, 03:25 PM)meTaLiCroSS escribió:
Cita: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.

no... no me llegaste a entender...

más que nada lo que te quiero preguntar es cuando se tiene que chequear si una entidad es válida...

puede existir una entidad que tenga dueño pero no sea válida? o si tiene dueño quiere decir que existe y por tanto es válida?

más que nada es que me expliques cuando chequear esa condición, porque la he visto en muchísimas funciones y no entiendo porque la ponen si en realidad no hace falta.
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#17
(18/02/2015, 02:42 PM)Sugisaki escribió: un momento...

vamos a VHE, el global name no es eso que le colocas a la entidad como "Name" ?

Ejemplo
creo una entidad "armoury_entity" esto es el classname, en las porpiedades le pongo un name, eeeesssteeeee m4_base_ct, eso seria el globalname? o con al entidad func_wall, Name: Pared_ct

globalname se utiliza para vincular entidades entre 2 mapas diferentes. func_tracktrain utiliza ese atributo en singleplayer, no se si sea posible en multiplayer.
Hi [R]ak CrabCrab
Responder
#18
(18/02/2015, 03:29 PM)RauliTop escribió:
(18/02/2015, 03:25 PM)meTaLiCroSS escribió:
Cita: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.

no... no me llegaste a entender...

más que nada lo que te quiero preguntar es cuando se tiene que chequear si una entidad es válida...

puede existir una entidad que tenga dueño pero no sea válida? o si tiene dueño quiere decir que existe y por tanto es válida?

más que nada es que me expliques cuando chequear esa condición, porque la he visto en muchísimas funciones y no entiendo porque la ponen si en realidad no hace falta.

O devuelve una entidad, o devuelve nulo, no devuelve "entidades invalidas", por eso insisto con que basta con detectar si es mayor a 0. El módulo ademas del motor revisan si la entidad es invalida o no en caso de.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)