[stocks/inc] entity task
#1
Estrella 
Bueno les traigo estos stocks que use para mi plugin (Hack blocker) ya que el set_task podría bugearse en players con lag y demás Thats what she said

Básicamente emula las funciones "set_task, remove_task, task_exists, etc"

Dejo los stocks y luego un ejemplo de uso:

entity task register (para registrar el think a una función en todos los players [y la consola, id 0])
Código PHP:
stock entity_task_register(base_numberMaxPlayers, function[]) // Register function (think) of a entity for all players with base num
{
    new 
szClassname[10]
    
    for(new 
0<= MaxPlayersi++)
    {
        
num_to_str(i+base_numberszClassnamecharsmax(szClassname))
        
        
register_think(szClassname, function)
    }

base_number: Numero base para sumarle a el ID del player y que no se repitan en distintos tasks
MaxPlayers: Numero de players aceptados por el servidor (get_maxplayers)
function[]: La función que se va a llamar cuando la entidad piense

Return: No retorna ningún valor.


entity_task_create (para crear una entidad con un ID [hecho igual que como lo registramos] y hacerla pensar en X segundos [como set_task])
Código PHP:
stock entity_task_create(number_nameFloat:nextthink_time 0.0// create a entity with a szID
{
    new 
ent create_entity("info_target")
    
    if(
ent 1)
        return 
0
    
    
new szClassname[10]
    
num_to_str(number_nameszClassnamecharsmax(szClassname))
    
entity_set_string(entEV_SZ_classnameszClassname)
    
    if(
nextthink_time 0.0)
        
entity_set_float(entEV_FL_nextthinkget_gametime()+nextthink_time)
    
    return 
ent

number_name: Entero con el que se llamara a la entidad(el id sumado a el numero base que usaste para registrar el think)
Float:nextthink_time: Numero de segundos que van a pasar hasta que se ejecute el think (task) si no se especifica ninguno se debe setear manualmente

Return: retorna el ID de la entidad creada, si falla retorna 0


entity_task_getid (para obtener el ID en un entero a partir de la entidad y del numero base)
Código PHP:
stock entity_task_getid(iEntnumber_basebool:remove_entity_getid true// Get num of the szID and remove entity
{
    new 
szID[10]
    
entity_get_string(iEntEV_SZ_classnameszIDcharsmax(szID))
    
    new 
id str_to_num(szID)
    
id -= number_base
    
    
if(remove_entity_getid)
        
remove_entity(iEnt)
    
    return 
id

iEnt: ID de la entidad de la cual se quiere obtener el ID
number_base: Numero base que se le sumo al nombre al crearla y registrarla
bool:remove_entity_getid: Especifica si la entidad se va a remover (Ya que normalmente no se vuelve a usar)

Return: retorna el ID


entity_task_exist (Para saber si una entidad con cierto ID existe)
Código PHP:
stock entity_task_exist(id// Check if entity exist
{
    new 
szID[10]
    
num_to_str(idszIDcharsmax(szID))
    
    if(
find_ent_by_class(-1szID))
        return 
1
    
    
return 0

id: El ID entero de la entidad

return: retorna 1 si la entidad (task) existe, de lo contrario, 0


entity_task_remove (Para remover una entidad a partir del ID entero)
Código PHP:
stock entity_task_remove(id// Remove entity task
{
    new 
szID[10]
    
num_to_str(idszIDcharsmax(szID))
    
    new 
ent = -1
    
while((ent find_ent_by_class(entszID)) > 0)
        
remove_entity(ent)


id: id entero de la entidad a remover

return: no retorna ningún valor.


entity_task_setfreeze (para setear el next think de la entida)
Código PHP:
stock entity_task_setfreeze(iEntFloat:flNextThink)
    
entity_set_float(iEntEV_FL_nextthinkget_gametime()+flNextThink
iEnt: ID de la entidad
Float:flNextThink: tiempo hasta el siguiente think

return: No retorna ningún valor.


Ejemplo de uso simple:

Código con set_task:
Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>

#define PLUGIN "Simple set task"
#define VERSION "1.0"
#define AUTHOR "sasske"

#define taskid_PlayerTest1 2938 // Un numero base al azar para que no se repitan los tasks
#define taskid_PlayerTest2 4053
#define taskid_PlayerTest3 9283

public plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
register_clcmd("say test1""CmdTest1")
    
register_clcmd("say test2""CmdTest2")
    
register_clcmd("say test3""CmdTest3")
}

public 
CmdTest1(id)
{
    
// Si ya existe una task con ese ID no hacemos nada
    
if(task_exists(id+taskid_PlayerTest1))
        return 
PLUGIN_HANDLED

    client_print
(idprint_chat"Funcion en 3 segs")
    
set_task(3.0"TaskFunc1"id+taskid_PlayerTest1)
    
    return 
PLUGIN_HANDLED
}

public 
TaskFunc1(id)
{
    
id -= taskid_PlayerTest1 // Le restamos el numero base
    
    
if(!is_user_connected(id))
        return
    
    
client_print(idprint_chat"Pasaron 3 segs, aun estas vivo?")
}

public 
CmdTest2(id)
{
    if(
task_exists(id+taskid_PlayerTest2))
        return 
PLUGIN_HANDLED
    
    client_print
(idprint_chat"Funcion repetitiva cada 6 segs")
    
set_task(6.0"TaskFunc2"id+taskid_PlayerTest2__"b")
    
    return 
PLUGIN_HANDLED
}

public 
TaskFunc2(id)
{
    
id -= taskid_PlayerTest2
    
    
if(!is_user_connected(id))
    {
        
remove_task(id+taskid_PlayerTest2)
        return
    }
    
    
client_print(idprint_chat"Aparesco cada 6 segs, soy re rompe bolas y no me podes frenar wii")
}

public 
CmdTest3(id)
{
    if(
task_exists(id+taskid_PlayerTest3))
        return 
PLUGIN_HANDLED
    
    client_print
(idprint_chat"Funcion que se repite 5 veces cada 3 segs")
    
set_task(5.0"TaskFunc1"id+taskid_PlayerTest3__"a"5)
    
    return 
PLUGIN_HANDLED
}

public 
TaskFunc3(id)
{
    
id -= taskid_PlayerTest3
    
    
if(!is_user_connected(id))
    {
        
remove_task(id+taskid_PlayerTest3)
        return
    }
    
    
client_print(idprint_chat"Aparecere cada 5 segs por 5 veces, tal vez esta sea la ultima vez que te vea :c")


Ahora vamos a hacer eso mismo con el include:

Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <entity_task> // incluimos el include, o podemos pegar los stocks

#define PLUGIN "Simple uso del entity_task"
#define VERSION "1.0"
#define AUTHOR "sasske"

#define entity_taskid_PlayerTest1 2938 // Un numero base al azar para que no se repitan los registros
#define entity_taskid_PlayerTest2 4053
#define entity_taskid_PlayerTest3 9283

public plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_clcmd("say test1""CmdTest1")
    
register_clcmd("say test2""CmdTest2")
    
register_clcmd("say test3""CmdTest3")
    
    new 
MaxPlayers get_maxplayers() // lo necesitaremos para registrar
    
    // Registramos los think

    
entity_task_register(entity_taskid_PlayerTest1MaxPlayers"entity_TaskFunc1")
    
entity_task_register(entity_taskid_PlayerTest2MaxPlayers"entity_TaskFunc2")
    
entity_task_register(entity_taskid_PlayerTest3MaxPlayers"entity_TaskFunc3")
}

public 
CmdTest1(id)
{
    
// Si ya hay una task con ese ID no continuamos
    
if(entity_task_exist(id+entity_taskid_PlayerTest1))
        return 
PLUGIN_HANDLED
    
    client_print
(idprint_chat"Funcion en 3 segs")
    
    
entity_task_create(id+entity_taskid_PlayerTest13.0// set_task(3.0, "TaskFunc1", id+taskid_PlayerTest1)
    
    
return PLUGIN_HANDLED
}

public 
entity_TaskFunc1(iEnt)
{
    new 
id entity_task_getid(iEntentity_taskid_PlayerTest1// id -= taskid_PlayerTest1
    
    
if(!is_user_connected(id))
    {
        
entity_task_remove(id+entity_taskid_PlayerTest1// Tambien se puede usar remove_entity(iEnt)
        
return
    }
    
    
client_print(idprint_chat"Pasaron 3 segs, aun estas vivo?")
}

public 
CmdTest2(id)
{
    if(
entity_task_exist(id+entity_taskid_PlayerTest2))
        return 
PLUGIN_HANDLED
    
    client_print
(idprint_chat"Funcion repetitiva cada 6 segs")
    
entity_task_create(id+entity_taskid_PlayerTest26.0// set_task(6.0, "TaskFunc2", id+taskid_PlayerTest2, _, _, "b")
    
    
return PLUGIN_HANDLED
}

public 
entity_TaskFunc2(iEnt)
{
    new 
id entity_task_getid(iEntentity_taskid_PlayerTest2false// El false del final evita que se borre la entidad
    
    
if(!is_user_connected(id))
    {
        
entity_task_remove(id+entity_taskid_PlayerTest2)
        return
    }
    
    
client_print(idprint_chat"Aparesco cada 6 segs, soy re rompe bolas y no me podes frenar wii")
    
    
entity_task_setfreeze(iEnt6.0// Otra vez se ejecuta en 6 segs
}

public 
CmdTest3(id)
{
    if(
entity_task_exist(id+entity_taskid_PlayerTest3))
        return 
PLUGIN_HANDLED
    
    client_print
(idprint_chat"Funcion que se repite 5 veces cada 5 segs")
    
entity_task_create(id+entity_taskid_PlayerTest35.0// set_task(5.0, "TaskFunc1", id+taskid_PlayerTest3, _, _, "a", 5)
    
    
return PLUGIN_HANDLED
}

public 
entity_TaskFunc3(iEnt)
{
    new 
id entity_task_getid(iEntentity_taskid_PlayerTest3false// El false al final es para evitar que se borre la entidad
    
    
static executions[32];
    
    if(!
is_user_connected(id))
    {
        
executions[id-1] = 0
        entity_task_remove
(id+entity_taskid_PlayerTest3)
        return
    }
    
    if(
executions[id-1] >= 5// Se ejecuto 5 veces
    
{
        
executions[id-1] = 0
        entity_task_remove
(id+entity_taskid_PlayerTest3)
        return
    }
    
    
// Va sumando cuando se ejecuta, la variable si o si tiene que ser static o ser global!
    
executions[id-1]++
    
    
client_print(idprint_chat"Aparecere cada 5 segs por 5 veces, tal vez esta sea la ultima vez que te vea :c")
    
    
entity_task_setfreeze(iEnt5.0)



Archivos adjuntos
.inc   entity_task.inc (Tamaño: 1.9 KB / Descargas: 48)
Responder
#2
Buen Aporte!
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#3
Buen aporte pacman

mejor que el HNS expasion xd NothingdohereNothingdohere

jaja chiste xd
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#4
#BuenAporte lo usare :3
[Imagen: bvpq9q-6.png]

NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Responder
#5
(28/02/2015, 02:48 AM)NkkI escribió: Buen aporte pacman

mejor que el HNS expasion xd NothingdohereNothingdohere

jaja chiste xd

Voy a intentar hacerle creer a mi cerebro que eso no fue un insulto Whatdone

#Graciasatodos
Responder
#6
https://forums.alliedmods.net/showthread.php?t=194093
Hi Milashkasiya CrabCrab

Soy un #Panda.. Soy solo un tipo que parece #común pero soy todo lo contrario; alguien #atípico en esta sociedad actual

[Imagen: xl0jvd-5.png]
Link
Responder
#7
Código PHP:
for(new 0<= MaxPlayersi++) 
Nothingdohere
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#8
(28/02/2015, 03:01 AM)[R]ak escribió: https://forums.alliedmods.net/showthread.php?t=194093

Oh, no había visto eso jamas

Por mi que quede esto como algo mas, igual veo que el tuyo tiene para repetir y demás, como guste nel, si quiere lo borra y posteas el tuyo.

(28/02/2015, 03:11 AM)mongito100 escribió:
Código PHP:
for(new 0<= MaxPlayersi++) 
Nothingdohere

Si se quiere usar para un task de la consola? Genius
Responder
#9
(28/02/2015, 03:21 AM)sasske escribió:
(28/02/2015, 03:01 AM)[R]ak escribió: https://forums.alliedmods.net/showthread.php?t=194093

Oh, no había visto eso jamas

Por mi que quede esto como algo mas, igual veo que el tuyo tiene para repetir y demás, como guste nel, si quiere lo borra y posteas el tuyo.

(28/02/2015, 03:11 AM)mongito100 escribió:
Código PHP:
for(new 0<= MaxPlayersi++) 
Nothingdohere

Si se quiere usar para un task de la consola? Genius

Por q no lo aclaras entonces (para registrar el think a una función en todos los players)
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#10
(28/02/2015, 03:26 AM)mongito100 escribió:
(28/02/2015, 03:21 AM)sasske escribió:
(28/02/2015, 03:01 AM)[R]ak escribió: https://forums.alliedmods.net/showthread.php?t=194093

Oh, no había visto eso jamas

Por mi que quede esto como algo mas, igual veo que el tuyo tiene para repetir y demás, como guste nel, si quiere lo borra y posteas el tuyo.

(28/02/2015, 03:11 AM)mongito100 escribió:
Código PHP:
for(new 0<= MaxPlayersi++) 
Nothingdohere

Si se quiere usar para un task de la consola? Genius

Por q no lo aclaras entonces (para registrar el think a una función en todos los players)

Vete al diablo detallista de mierda Oh god why

Ahí lo arreglo...
Responder
#11
te das cuenta la cantidad de entidades que creas al pedo?
Hi Milashkasiya CrabCrab

Soy un #Panda.. Soy solo un tipo que parece #común pero soy todo lo contrario; alguien #atípico en esta sociedad actual

[Imagen: xl0jvd-5.png]
Link
Responder
#12
(28/02/2015, 03:50 AM)[R]ak escribió: te das cuenta la cantidad de entidades que creas al pedo?

Por? creo una entidad por player que tenga que checkear Oh god why

Pero no se me ocurre una manera mejor...
Responder
#13
aclaro por si alguien no lo sabe o tiene dudas
usar entidades como timers/task solo es conveniente cuando el tiempo tenga que ser mas preciso que 0.1, en cualquier otro caso es mucho mejor usar set_task.
Responder
#14
(28/02/2015, 05:50 AM)Destro escribió: aclaro por si alguien no lo sabe o tiene dudas
usar entidades como timers/task solo es conveniente cuando el tiempo tenga que ser mas preciso que 0.1, en cualquier otro caso es mucho mejor usar set_task.

Si se hace un task en una función q se llama en menos de 0.1 también es conveniente?
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#15
(28/02/2015, 05:50 AM)Destro escribió: aclaro por si alguien no lo sabe o tiene dudas
usar entidades como timers/task solo es conveniente cuando el tiempo tenga que ser mas preciso que 0.1, en cualquier otro caso es mucho mejor usar set_task.

Que pasa si quiero usar tasks que sean precisos aun cuando el cliente tenga lag? a mi me dijeron que use esto por que sino mi plugin podría tirar falsos positivos Oh god why
Responder
#16
Que tiene que ver el lag del player con estos stocks? Todos son exactamente iguales a toda la familia de set_task
Hi [R]ak CrabCrab
Responder
#17
(28/02/2015, 12:22 PM)Milashkasiya escribió: Que tiene que ver el lag del player con estos stocks? Todos son exactamente iguales a toda la familia de set_task

Me refiero a que me dijeron que si el player tenia lag y tu le ponías un set_task de 0.2 segundos por ej, podría retrasarse (no se cuanto, no me dijeron tampoco...) y como lo dijo metal... pues le creo e.e

PD: Supuestamente, a menos que tenga lag el sv, si lo que piensa es una entidad debería ejecutarse aun cuando el player tenga lag pero... "Desconozco la problemática..."
Responder
#18
(28/02/2015, 12:41 PM)sasske escribió:
(28/02/2015, 12:22 PM)Milashkasiya escribió: Que tiene que ver el lag del player con estos stocks? Todos son exactamente iguales a toda la familia de set_task

Me refiero a que me dijeron que si el player tenia lag y tu le ponías un set_task de 0.2 segundos por ej, podría retrasarse (no se cuanto, no me dijeron tampoco...) y como lo dijo metal... pues le creo e.e

PD: Supuestamente, a menos que tenga lag el sv, si lo que piensa es una entidad debería ejecutarse aun cuando el player tenga lag pero... "Desconozco la problemática..."

No hay ningun retraso ni con set_task ni con entidades, a menos que el server tenga lag.
Hi [R]ak CrabCrab
Responder
#19
(28/02/2015, 12:51 PM)Milashkasiya escribió:
(28/02/2015, 12:41 PM)sasske escribió:
(28/02/2015, 12:22 PM)Milashkasiya escribió: Que tiene que ver el lag del player con estos stocks? Todos son exactamente iguales a toda la familia de set_task

Me refiero a que me dijeron que si el player tenia lag y tu le ponías un set_task de 0.2 segundos por ej, podría retrasarse (no se cuanto, no me dijeron tampoco...) y como lo dijo metal... pues le creo e.e

PD: Supuestamente, a menos que tenga lag el sv, si lo que piensa es una entidad debería ejecutarse aun cuando el player tenga lag pero... "Desconozco la problemática..."

No hay ningun retraso ni con set_task ni con entidades, a menos que el server tenga lag.

Me engañaron, hice todo un fucking inc, y pase todos los task de mi plugin a esta mierdapocooptimizadacosa al pedo... :,c

Maldito metalicross ya no te amo, ahora tengo que volver todo a como estaba antes xd
Responder
#20
me quedo con la api del panda :3
Ingeniero agrónomo y desarrollador de Software.

tutoriales-allied
buscas un zp?

"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"

Merci Alliedmodders pour m'introduire dans la programmation.
Responder
#21
(28/02/2015, 05:50 AM)Destro escribió: aclaro por si alguien no lo sabe o tiene dudas
usar entidades como timers/task solo es conveniente cuando el tiempo tenga que ser mas preciso que 0.1, en cualquier otro caso es mucho mejor usar set_task.

Gracias por la aclaración, entonces no sirve de nada salvo que necesite algo más rápido que lo más rápido que ofrece el motor. (? Genius

Igual buen post Sasske.
Believe, be yourself and don't hold on to just one dream ❤

https://github.com/FEDERICOMB96
Responder
#22
Creo que malinterpretaste a metalicross con respecto a set_task:
https://amxmodx-es.com/Thread-entender-e...5#pid54555
https://amxmodx-es.com/Thread-Desvirtue-...3#pid54963

Tu aporte es bueno, excepto por una desventaja: creas una entidad por cada task!
Imagina que alguien quiera usarlo en un ZP (donde ya hay bastantes entidades sueltas)...
No leí todo el code pero creo que manipulas las entidades según su ID, bueno, no lo he confirmado pero creo que ese ID puede variar y si sucede puede ocurrir una desgracia Oh god why

Se agradece tu buena intención de aportar Lengua
Responder
#23
(28/02/2015, 12:41 PM)sasske escribió:
(28/02/2015, 12:22 PM)Milashkasiya escribió: Que tiene que ver el lag del player con estos stocks? Todos son exactamente iguales a toda la familia de set_task

Me refiero a que me dijeron que si el player tenia lag y tu le ponías un set_task de 0.2 segundos por ej, podría retrasarse (no se cuanto, no me dijeron tampoco...) y como lo dijo metal... pues le creo e.e

PD: Supuestamente, a menos que tenga lag el sv, si lo que piensa es una entidad debería ejecutarse aun cuando el player tenga lag pero... "Desconozco la problemática..."

El *servidor*, lee bien la proxima Ragestart si el servidor esta lo suficientemente colapsado los frames no se ejecutaran tan fluidamente y llevaran unos segundos de mas por ahí, lo testié yo innumerables veces en mi servidor arrojandome esta diferencia.
Responder
#24
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

mario...

lptm Whatdone

Ok entonces mi aporte vale mierda la intencion (?

No el ID no debería de variar, según entiendo...
Responder
#25
Los tasks repetitivos mas de alguna vez mandan un retraso. Es cosa que hagan la prueba:

Mostrar un HUDmessage que dure 0.1 sin fadein ni fadeout, en un task repetitivo de 0.1, y en una entidad de think 0.1 constante, y si hay la suficiente cantidad de gente en el servidor, notaran como el de task parpadeara en respuesta a perdida de segundos.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)