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
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])
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])
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)
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)
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)
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)
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:
Ahora vamos a hacer eso mismo con el include:
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_number, MaxPlayers, function[]) // Register function (think) of a entity for all players with base num
{
new szClassname[10]
for(new i = 0; i <= MaxPlayers; i++)
{
num_to_str(i+base_number, szClassname, charsmax(szClassname))
register_think(szClassname, function)
}
}
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_name, Float: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_name, szClassname, charsmax(szClassname))
entity_set_string(ent, EV_SZ_classname, szClassname)
if(nextthink_time > 0.0)
entity_set_float(ent, EV_FL_nextthink, get_gametime()+nextthink_time)
return ent
}
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(iEnt, number_base, bool:remove_entity_getid = true) // Get num of the szID and remove entity
{
new szID[10]
entity_get_string(iEnt, EV_SZ_classname, szID, charsmax(szID))
new id = str_to_num(szID)
id -= number_base
if(remove_entity_getid)
remove_entity(iEnt)
return 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(id, szID, charsmax(szID))
if(find_ent_by_class(-1, szID))
return 1
return 0
}
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(id, szID, charsmax(szID))
new ent = -1
while((ent = find_ent_by_class(ent, szID)) > 0)
remove_entity(ent)
}
return: no retorna ningún valor.
entity_task_setfreeze (para setear el next think de la entida)
Código PHP:
stock entity_task_setfreeze(iEnt, Float:flNextThink)
entity_set_float(iEnt, EV_FL_nextthink, get_gametime()+flNextThink)
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(PLUGIN, VERSION, AUTHOR)
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(id, print_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(id, print_chat, "Pasaron 3 segs, aun estas vivo?")
}
public CmdTest2(id)
{
if(task_exists(id+taskid_PlayerTest2))
return PLUGIN_HANDLED
client_print(id, print_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(id, print_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(id, print_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(id, print_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(PLUGIN, VERSION, AUTHOR)
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_PlayerTest1, MaxPlayers, "entity_TaskFunc1")
entity_task_register(entity_taskid_PlayerTest2, MaxPlayers, "entity_TaskFunc2")
entity_task_register(entity_taskid_PlayerTest3, MaxPlayers, "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(id, print_chat, "Funcion en 3 segs")
entity_task_create(id+entity_taskid_PlayerTest1, 3.0) // set_task(3.0, "TaskFunc1", id+taskid_PlayerTest1)
return PLUGIN_HANDLED
}
public entity_TaskFunc1(iEnt)
{
new id = entity_task_getid(iEnt, entity_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(id, print_chat, "Pasaron 3 segs, aun estas vivo?")
}
public CmdTest2(id)
{
if(entity_task_exist(id+entity_taskid_PlayerTest2))
return PLUGIN_HANDLED
client_print(id, print_chat, "Funcion repetitiva cada 6 segs")
entity_task_create(id+entity_taskid_PlayerTest2, 6.0) // set_task(6.0, "TaskFunc2", id+taskid_PlayerTest2, _, _, "b")
return PLUGIN_HANDLED
}
public entity_TaskFunc2(iEnt)
{
new id = entity_task_getid(iEnt, entity_taskid_PlayerTest2, false) // 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(id, print_chat, "Aparesco cada 6 segs, soy re rompe bolas y no me podes frenar wii")
entity_task_setfreeze(iEnt, 6.0) // Otra vez se ejecuta en 6 segs
}
public CmdTest3(id)
{
if(entity_task_exist(id+entity_taskid_PlayerTest3))
return PLUGIN_HANDLED
client_print(id, print_chat, "Funcion que se repite 5 veces cada 5 segs")
entity_task_create(id+entity_taskid_PlayerTest3, 5.0) // set_task(5.0, "TaskFunc1", id+taskid_PlayerTest3, _, _, "a", 5)
return PLUGIN_HANDLED
}
public entity_TaskFunc3(iEnt)
{
new id = entity_task_getid(iEnt, entity_taskid_PlayerTest3, false) // 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(id, print_chat, "Aparecere cada 5 segs por 5 veces, tal vez esta sea la ultima vez que te vea :c")
entity_task_setfreeze(iEnt, 5.0)
}