Mensajes: 1,867
Temas: 57
Registro en: Oct 2014
Reputación:
16
Bueno entiendo para que sirve pero no entiendo cuando hacen algo como
Código PHP: new fGameTime fGameTime = get_gametime()
if(fGameTime > 1.0) { new ftime ftime = get_gametime() } new fftime
fftime = fGameTime - ftime }
un ejemplo muy absurdo pero espero se haya entendido... quisiera saber mas y el modo de uso, gracias !
Mensajes: 905
Temas: 77
Registro en: Oct 2013
Reputación:
2
fGameTime toma el tiempo y si es mayor a 1.0 ftime toma devuelta el tiempo xD y después dice que fftime es igual a fGameTime menos ftime
Yo tampoco entiendo ese ejemplo pero creo que deje un poquito de explicación
Facebook para preguntas/pedidos: Fb.com/scripterfrosst
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
get_gametime() devuelve la cantidad de segundos que han transcurrido desde que el mapa empezó, así de simple, puedes hacer timers y delays, tasks efectivos y otros, no se necesita más matematica que sumar y comparar
Mensajes: 1,867
Temas: 57
Registro en: Oct 2014
Reputación:
16
(12/01/2015, 03:04 PM)Frosst escribió: fGameTime toma el tiempo y si es mayor a 1.0 ftime toma devuelta el tiempo xD y después dice que fftime es igual a fGameTime menos ftime
Yo tampoco entiendo ese ejemplo pero creo que deje un poquito de explicación
Con todo el respeto del mundo, queres sumar mensajes no ? ese ejmplo lo hice yo, porque asi veo los codes pero no entiendo el porque
(12/01/2015, 04:16 PM)meTaLiCroSS escribió: get_gametime() devuelve la cantidad de segundos que han transcurrido desde que el mapa empezó, así de simple, puedes hacer timers y delays, tasks efectivos y otros, no se necesita más matematica que sumar y comparar
si, exactamente pero no entiendo porque es mas efectivo que un set_task() ?
Código PHP: public Function() { new Players[32] new playerCount, i, id, weapon, ctime, xcvar get_players(Players, playerCount, "a") for (i=0; i < playerCount; i++) { id = Players[i] weapon = get_user_weapon(id) if(!wait[id]) { if(get_user_weapon(id, ammo, clip) == CSW_AWP) { if(ammo > get_pcvar_num(xAmmo)) { cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_awp", id), get_pcvar_num(xAmmo)) cs_set_user_bpammo(id, CSW_AWP, 0) } else // Starts the 'xTime' on the first bullet. { startTime = get_gametime() wait[id] = true } } } else { ctime = get_gametime() - startTime xcvar = float(get_pcvar_num(xTime)) // Why dont you just use a float cvar instead? if(ctime < xcvar) { cs_set_user_bpammo(id, CSW_AWP, 0) if(weapon == CSW_AWP) client_print(id, print_center, "Next Ammo in [%d]", floatround(float(get_pcvar_num(xTime)) - get_gametime() + startTime)) // Countdown Message else client_print(id,print_center, " ") // To insta-hide the Countdown Message if player changes weapon. } else if(ctime - xcvar >= 0) { cs_set_weapon_ammo(find_ent_by_owner(-1, "weapon_awp", id), get_pcvar_num(xAmmo)) wait[id] = false if(weapon != CSW_AWP) client_print(id, print_center, "Your AWP Ammo is ready!") else client_print(id,print_center, " ") // To insta-hide the Countdown Message at 0 sec. } } } }
este es un code de alliedmoders, ahi se utiliza el gametime, seria mejor que un set_task() para el disparo y eso?
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
Recurso que va más allá del llamado de natives, los tasks son un monton de codigo basura dentro del amxx, utilizando timers ahorras bastante.
Éste es frecuente, y lo uso mucho fijate.
Código PHP: #include <amxmodx> #include <engine>
new Float:g_flTimer[33];
public plugin_init() { register_plugin("CUANTAS", "COPAS", "TENES?"); register_clcmd("say /floodeame", "ClientCommand_FloodMe") }
public ClientCommand_FloodMe(iId) { if(g_flTimer[iId] > 0.0) { g_flTimer[iId] = 0.0; client_print(id, print_chat, "[FLOOD] Dejé de floodearte, negro puto"); } else { g_flTimer[iId] = get_gametime(); client_print(id, print_chat, "[FLOOD] Welcome al flood!"); } }
public client_PreThink(iId) { static Float:flCurrentTime; flCurrentTime = get_gametime(); if(g_flTimer[iId] > 0.0 /* importante */ && g_flTimer[iId] <= flCurrentTime) { g_flTimer[iId] = flCurrentTime + 0.5 client_print(id, print_chat, "[FLOOD] Floodeo de medio segundo :troll:"); } }
public client_connect(iId) { g_flTimer[iId] = 0.0; }
Y el limitador, que tambien es bueno
Código PHP: #include <amxmodx>
new Float:g_flTimer[33];
public plugin_init() { register_plugin("CUANTAS", "LIBERTADORES", "TENES?"); register_clcmd("say /mensajito", "ClientCommand_Message") }
public ClientCommand_Message(iId) { new Float:flCurrentTime = get_gametime(); if(g_flTimer[iId] > flCurrentTime) { client_print(id, print_chat, "[MENSAJITO] Espera %.2f segundos negro forro", (g_flTimer[iId] - flCurrentTime) ); return; } g_flTimer[iId] = flCurrentTime + 20.0; client_print(id, print_chat, "[MENSAJITO] Te ganaste una galleta :whatever: y espera 20 segundos para usar esto de nuevo"); }
public client_connect(iId) { g_flTimer[iId] = 0.0; }
Y es mucho mejor que usar un task de mierda para desactivar un booleano que define si paso el tiempo o no. Entre un set_task y un get_gametime, no hay por donde perderse
Mensajes: 1,867
Temas: 57
Registro en: Oct 2014
Reputación:
16
asi ?
Código PHP: // variable global g_fTime[33]
// en la funcion switch(get_pcvar_num(NoSayType)) { case 0 : { ChatColor(id,"%s Chat bloqueado",szPrefix) return PLUGIN_HANDLED } case 1 : { new const Chat[][] = { "/chat","!chat",".chat" }
for(new i = 0;i < sizeof Chat;i++) { if(containi(said,Chat[i]) != -1) { static Float:fGameTime = get_gametime() if(g_fTime[id] < 5.0) { ChatColor(id, "%s no rompas las bolas !", szPrefix) return PLUGIN_HANDLED; } g_fTime[id] = fGameTime - 5.0
ChatColor(0,"%s El jugador %s esta pidiendo que desbloqueen el chat",szPrefix,name) return PLUGIN_HANDLED } else { ChatColor(id,"%s Chat bloqueado",szPrefix) ChatColor(id,"%s Solo puedes escribir /chat para pedir que desbloqueen el chat",szPrefix) return PLUGIN_HANDLED } } } } return PLUGIN_HANDLED
un ejemplo de un post que vi recien...
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
Que claro ejemplo.. de que no entendiste una mierda
Me voy de aqui
Mensajes: 1,867
Temas: 57
Registro en: Oct 2014
Reputación:
16
La paciencia seria buena che -.- bueno gracias igual
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
(12/01/2015, 06:16 PM)meTaLiCroSS escribió: Recurso que va más allá del llamado de natives, los tasks son un monton de codigo basura dentro del amxx, utilizando timers ahorras bastante.
Éste es frecuente, y lo uso mucho fijate.
Código PHP: #include <amxmodx> #include <engine>
new Float:g_flTimer[33];
public plugin_init() { register_plugin("CUANTAS", "COPAS", "TENES?"); register_clcmd("say /floodeame", "ClientCommand_FloodMe") }
public ClientCommand_FloodMe(iId) { if(g_flTimer[iId] > 0.0) { g_flTimer[iId] = 0.0; client_print(id, print_chat, "[FLOOD] Dejé de floodearte, negro puto"); } else { g_flTimer[iId] = get_gametime(); client_print(id, print_chat, "[FLOOD] Welcome al flood!"); } }
public client_PreThink(iId) { static Float:flCurrentTime; flCurrentTime = get_gametime(); if(g_flTimer[iId] > 0.0 /* importante */ && g_flTimer[iId] <= flCurrentTime) { g_flTimer[iId] = flCurrentTime + 0.5 client_print(id, print_chat, "[FLOOD] Floodeo de medio segundo :troll:"); } }
public client_connect(iId) { g_flTimer[iId] = 0.0; }
Y el limitador, que tambien es bueno
Código PHP: #include <amxmodx>
new Float:g_flTimer[33];
public plugin_init() { register_plugin("CUANTAS", "LIBERTADORES", "TENES?"); register_clcmd("say /mensajito", "ClientCommand_Message") }
public ClientCommand_Message(iId) { new Float:flCurrentTime = get_gametime(); if(g_flTimer[iId] > flCurrentTime) { client_print(id, print_chat, "[MENSAJITO] Espera %.2f segundos negro forro", (g_flTimer[iId] - flCurrentTime) ); return; } g_flTimer[iId] = flCurrentTime + 20.0; client_print(id, print_chat, "[MENSAJITO] Te ganaste una galleta :whatever: y espera 20 segundos para usar esto de nuevo"); }
public client_connect(iId) { g_flTimer[iId] = 0.0; }
Y es mucho mejor que usar un task de mierda para desactivar un booleano que define si paso el tiempo o no. Entre un set_task y un get_gametime, no hay por donde perderse
y si quiero que se le desactive algo a los 20 segundos, me cago en tus gametime e.e
me sirvio el 2do ejemplo, ahora tengo mucho trabajo
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.
Mensajes: 538
Temas: 13
Registro en: Oct 2013
Reputación:
16
(13/01/2015, 12:01 AM)roccoxx escribió: y si quiero que se le desactive algo a los 20 segundos, me cago en tus gametime e.e Todo depende de como y donde se esta usando ese "algo", en los ejemplos de arriba tranquilamente lo puedes hacer con gametime.
Hi [R]ak
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
(13/01/2015, 12:47 AM)Milashkasiya escribió: (13/01/2015, 12:01 AM)roccoxx escribió: y si quiero que se le desactive algo a los 20 segundos, me cago en tus gametime e.e Todo depende de como y donde se esta usando ese "algo", en los ejemplos de arriba tranquilamente lo puedes hacer con gametime.
algo simple para que se entienda, no voy a hacer todo complento, no me malinterpreten.
public funcion(iId){
// estando vivo obviamente
set_user_health(iId, 50000)
// si se desconecta el que entra me chupa la pija
set_task(20.0, "vida_normal", iId)
}
public vida_normal(iId) set_user_health(iId, 100)
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.
Mensajes: 2,600
Temas: 33
Registro en: Oct 2013
Reputación:
36
13/01/2015, 12:37 PM
(Última modificación: 13/01/2015, 12:37 PM por RauliTop.)
(13/01/2015, 01:16 AM)roccoxx escribió: (13/01/2015, 12:47 AM)Milashkasiya escribió: (13/01/2015, 12:01 AM)roccoxx escribió: y si quiero que se le desactive algo a los 20 segundos, me cago en tus gametime e.e Todo depende de como y donde se esta usando ese "algo", en los ejemplos de arriba tranquilamente lo puedes hacer con gametime.
algo simple para que se entienda, no voy a hacer todo complento, no me malinterpreten.
public funcion(iId){
// estando vivo obviamente
set_user_health(iId, 50000)
// si se desconecta el que entra me chupa la pija
set_task(20.0, "vida_normal", iId)
}
public vida_normal(iId) set_user_health(iId, 100) pienso igual que tú, ahí solo se puede utilizar task... o una entidad que piense.
cuál de las 2 es mejor y por qué?
(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.
Mensajes: 996
Temas: 11
Registro en: Oct 2013
Reputación:
20
El gametime no cubre todas las posibilidades, pero si una parte de las mismas.
Si querés saber que hace, hacete un hud o print que te devuelva el gametime, con eso y pensarlo un poco te tiene que bastar.
@Raul
Supongo que un task, por mas que sea bastante denso no creo que supere a todas las natives que vas a usar para hacer la entidad.
Mensajes: 2,571
Temas: 40
Registro en: Feb 2014
Reputación:
72
Dependiendo de las necesidades...
Si vas a crear una entidad es mejor que aproveches todo lo que tiene para "ofrecer" (almacenamiento en PEVs, thinks, etc). Si sólo se trata de controlar eventos con tiempo, los task son buenos. La desventaja con los tasks es que por cada uno, el servidor tiene que comprobar en cada frame el tiempo y ver si es tiempo de llamar al task, mientras la entidad pensante también lo hace pero la comprobación es global para todas las entidades... Intento explicarme mejor: no puedes correr un servidor donde no hayan entidades, entonces, como sí o sí tienes entidades creadas en cada frame se va a comprobar si es momento para que las entidades "piensen" y al crear una entidad pensante más sólo agregas una a la lista, no es un gran esfuerzo, mientras en los task se hacen comprobaciones individuales, por cada task. Además, las comprobaciones de las entidades se hacen en un nivel más bajo (el HL engine) mientras las comprobaciones de los task se dan en el core de AMXX.
Si requieres de un evento controlado con tiempo permanente, desde que se inicia el plugin hasta que cierre el servidor, te conviene más una entidad pensante que un task. Supone un poco más de gasto de memoria; pero es preferible gastar unos bytes de más que sobrecargar el CPU (Hacer trabajar el CPU = consumo de energía, almacenar bytes no )
Sé que no me expliqué muy bien, pregunten cualquier duda...
Mensajes: 1,867
Temas: 57
Registro en: Oct 2014
Reputación:
16
ahora me voy a poner a buscar lo de entidades, habia visto en la epoca que estaba rak pero ahora no vi mas, asi que a buscar, igual podes dejar ejemplo de entidades pensantes?
pd: esto no me compila para probarlo, help jaja
Código PHP: #include <amxmodx>
new Float:g_fTime[33]
#define time_wait 5.0
public plugin_init() { register_plugin("Probando","Get","GameTime") register_clcmd("say /hola","cmd_Hola")
}
public client_connect(id) { g_fTime[id] = 0.0 }
public cmd_Hola(id) { static Float:fGameTime = get_gametime() if(g_fTime[id] > fGameTime) { client_print(id, print_chat, "g_fTime : %0.2f - fGametime: %0.2f", g_fTime[id], fGameTime) client_print(id, print_chat, "Deja de flooder el server (espera %0.2f)", g_fTime[id] - fGameTime ) return; } client_print(id, print_chat, "g_fTime : %0.2f - fGametime: %0.2f", g_fTime[id], fGameTime) g_fTime[id] = fGameTime + time_wait return; }
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
Tanto los think como los task se comprueban en server frame, pero en el task se usa un timer de 0.1s para recorrer la lista de task,en cambio para los think se comprueba en cada frame además de que se hace en varias funciones.
En C los hook son como llamar una función global, es casi lo mismo q se haga en el engine o en un módulo externo.
Usar un think como task solo rinde cuando ya tenes la entidad o cuando queres que seamas rápido y preciso que 0.1s
Pd: q bardo escribir desde el celu u.u
Mensajes: 210
Temas: 3
Registro en: Oct 2013
Reputación:
4
(13/01/2015, 01:26 PM)matrix123 escribió: ahora me voy a poner a buscar lo de entidades, habia visto en la epoca que estaba rak pero ahora no vi mas, asi que a buscar, igual podes dejar ejemplo de entidades pensantes?
pd: esto no me compila para probarlo, help jaja
Código PHP: #include <amxmodx>
new Float:g_fTime[33]
#define time_wait 5.0
public plugin_init() { register_plugin("Probando","Get","GameTime") register_clcmd("say /hola","cmd_Hola")
}
public client_connect(id) { g_fTime[id] = 0.0 }
public cmd_Hola(id) { static Float:fGameTime = get_gametime() if(g_fTime[id] > fGameTime) { client_print(id, print_chat, "g_fTime : %0.2f - fGametime: %0.2f", g_fTime[id], fGameTime) client_print(id, print_chat, "Deja de flooder el server (espera %0.2f)", g_fTime[id] - fGameTime ) return; } client_print(id, print_chat, "g_fTime : %0.2f - fGametime: %0.2f", g_fTime[id], fGameTime) g_fTime[id] = fGameTime + time_wait return; }
Código PHP: static Float:fGameTime = get_gametime()
--->
Código PHP: static Float:fGameTime; fGameTime = get_gametime()
Las variables estáticas no permiten ser declaradas y recibir un valor al mismo tiempo.
Mensajes: 2,571
Temas: 40
Registro en: Feb 2014
Reputación:
72
13/01/2015, 02:00 PM
(Última modificación: 13/01/2015, 02:01 PM por Mía.)
https://forums.alliedmods.net/showthread.php?t=43049
Y para ejemplos, mira codes de NPCs, publiqué en el foro oficial un plugin con una entidad que piensa, lo busco y agrego el link.
EDIT: Lo encontré
https://forums.alliedmods.net/showthread.php?t=243795
Mensajes: 1,867
Temas: 57
Registro en: Oct 2014
Reputación:
16
una pelotudez que recien me doy cuenta que no es como pienso, client_PreThink se llama cuando... ?
Mensajes: 2,600
Temas: 33
Registro en: Oct 2013
Reputación:
36
(13/01/2015, 02:33 PM)matrix123 escribió: una pelotudez que recien me doy cuenta que no es como pienso, client_PreThink se llama cuando... ?
haz que muestre un print y verás
(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.
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
(13/01/2015, 12:37 PM)RauliTop escribió: (13/01/2015, 01:16 AM)roccoxx escribió: (13/01/2015, 12:47 AM)Milashkasiya escribió: (13/01/2015, 12:01 AM)roccoxx escribió: y si quiero que se le desactive algo a los 20 segundos, me cago en tus gametime e.e Todo depende de como y donde se esta usando ese "algo", en los ejemplos de arriba tranquilamente lo puedes hacer con gametime.
algo simple para que se entienda, no voy a hacer todo complento, no me malinterpreten.
public funcion(iId){
// estando vivo obviamente
set_user_health(iId, 50000)
// si se desconecta el que entra me chupa la pija
set_task(20.0, "vida_normal", iId)
}
public vida_normal(iId) set_user_health(iId, 100) pienso igual que tú, ahí solo se puede utilizar task... o una entidad que piense.
cuál de las 2 es mejor y por qué?
marica me vas a decir que prefieres crear una entidad y todo eso para solamente setear la vida normal o un bool en false?
ahora una pregunta en general. ¿Qué recomiendan usar, para este caso, una entidad o los task?
https://amxmodx-es.com/Thread-Crear-un-C...erno-en-ZP
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.
Mensajes: 2,600
Temas: 33
Registro en: Oct 2013
Reputación:
36
no... para el caso de dar vida no...
yo preguntaba de forma general
(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.
Mensajes: 2,571
Temas: 40
Registro en: Feb 2014
Reputación:
72
(13/01/2015, 06:46 PM)roccoxx escribió: (13/01/2015, 12:37 PM)RauliTop escribió: (13/01/2015, 01:16 AM)roccoxx escribió: (13/01/2015, 12:47 AM)Milashkasiya escribió: (13/01/2015, 12:01 AM)roccoxx escribió: y si quiero que se le desactive algo a los 20 segundos, me cago en tus gametime e.e Todo depende de como y donde se esta usando ese "algo", en los ejemplos de arriba tranquilamente lo puedes hacer con gametime.
algo simple para que se entienda, no voy a hacer todo complento, no me malinterpreten.
public funcion(iId){
// estando vivo obviamente
set_user_health(iId, 50000)
// si se desconecta el que entra me chupa la pija
set_task(20.0, "vida_normal", iId)
}
public vida_normal(iId) set_user_health(iId, 100) pienso igual que tú, ahí solo se puede utilizar task... o una entidad que piense.
cuál de las 2 es mejor y por qué?
marica me vas a decir que prefieres crear una entidad y todo eso para solamente setear la vida normal o un bool en false?
ahora una pregunta en general. ¿Qué recomiendan usar, para este caso, una entidad o los task?
https://amxmodx-es.com/Thread-Crear-un-C...erno-en-ZP
Task.
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
Lo que tengo que decir al respecto, como quieran tomarselo
1) Los tasks son inexactos, no lidiaria con eso, e incluso se "nota" en un servidor con mucho trafico (ej tipico, zp con 32 players)
2) Si vas a hacer un task repetitivo permanente, las entidades son la mejor opcion, debido que las creas, y el think es lo unico que cambiará en ellas.
3) Si vas a hacer un task repetitivo pero no permanente (ej. aura), utiliza un timer guiado por get_gametime(), asegurarás exactitud y menos basura
4) Si vas a hacer un task no repetitivo para hacer un limitador de tiempo, utiliza un timer guiado por get_gametime()
(3 y 4 son respectivos a los ejemplos que di)
5) Si vas a hacer un task sencillo para hacer delay a una funcion o un codigo especifico que deba ejecutarse en un corto o largo tiempo despues, utiliza un task. Creo que es la unica utilidad buena que tiene esa mierda
Mensajes: 1,933
Temas: 39
Registro en: Jul 2014
Reputación:
23
17/01/2015, 09:39 PM
(Última modificación: 17/01/2015, 09:39 PM por Sugisaki.)
esto seria un ejemplo?
Código PHP: new Float:fGameTime
public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) RegisterHam(Ham_Spawn, "player", "hm_spawn", 1) register_event("ResetHUD","round_start","b") }
public round_start() { fGameTime = (get_gametime() + get_cvar_float("mp_freezetime")) } public hm_spawn(id) { if(get_gametime() > fGameTime) return new szTeam[13] get_user_team(id, szTeam, charsmax(szName)) new players[32] static iNum get_players(players, iNum, "aeh", szTeam) new szName[32], szHud[512], iMoney for(new i = 0 ; i < iNum ; i++) { new lid = players[i] iMoney = cs_get_user_money(lid) get_user_name(lid, szName, charsmax(szName)) formatex(szHud, charsmax(szHud), "%s%s $ %i^n", szHud, szName, iMoney) } set_hudmessage(0,255,0,0.58,0.02,0,0.0,6.0,0.0,0.0,1); show_hudmessage(id,(szTeam[0] == 'C') ? "Counter-Terrorists:" : "Terrorists:"); set_hudmessage(255,255,225,0.58,0.05,0,0.0,6.0,0.0,0.0,2); show_hudmessage(id,szHud); }
|