Mensajes: 843
Temas: 303
Registro en: Oct 2013
Reputación:
2
Hola todos, bueno yo uso un código que usa cmdstart para detectar si esta presionando dos botones a la misma vez y salga un mensaje pero por la funcion que es pesada sale varias veces, mi pregunta es si es posible hacer que solo aparezca una vez el mensaje (print)?.. gracias antemano
Código PHP: #include <amxmodx> #include <fakemeta>
new Float:gTime[33][3];
public plugin_init() { register_forward(FM_CmdStart, "OnCmdStart", false) }
public OnCmdStart(id, uc_handle, seed) { if ( ! is_user_alive(id) ) return; static buttons, oldbuttons, Float:gametime; buttons = get_uc(uc_handle, UC_Buttons); oldbuttons = pev(id, pev_oldbuttons); gametime = get_gametime(); if ( buttons & IN_FORWARD ) { if ( ! ( oldbuttons & IN_FORWARD ) ) gTime[id][0] = gametime; } else gTime[id][0] = 0.0; if ( buttons & IN_MOVELEFT ) { if ( ! ( oldbuttons & IN_MOVELEFT ) ) gTime[id][1] = gametime; } else gTime[id][1] = 0.0; if ( buttons & IN_MOVERIGHT ) { if ( ! ( oldbuttons & IN_MOVERIGHT ) ) gTime[id][2] = gametime; } else gTime[id][2] = 0.0; if ( gTime[id][0] && gametime - gTime[id][0] > 2.0 && ( ( gTime[id][1] && gametime - gTime[id][1] > 2.0 ) || ( gTime[id][2] && gametime - gTime[id][2] > 2.0 ) ) ) client_print(id, print_chat, "blablabla") return; }
Mensajes: 546
Temas: 65
Registro en: Jan 2017
Reputación:
4
03/05/2017, 03:47 AM
(Última modificación: 03/05/2017, 03:48 AM por warrior.)
crea una variable en el principio del plugin, debajo de las librerias e.e
al terminar la ronda , nueva ronda o al reiniciar la ronda activate esa variable
Código PHP: g_mensaje[id] = 1 // el 1 es para activar
Luego en :
Código PHP: client_print(id, print_chat, "blablabla")
Reemplalo por >>>>>>>>>>>>>>>
Código PHP: if (g_mensaje[id]) { client_print(id, print_chat, "blablabla") g_mensaje[id] = 0 // Desactivamos el mensaje para que no vuelva a aparecer hasta la proxima ronda }
ese "g_mensaje[id] = 0" de arriba quiere decir que se desactiva esa variable, cosa que no vuelva a a aparecer ese mensaje , y lo que te dije mas antes lo de terminar la ronda etc, lo vuelve activar cosa que ese active para que se mande 1 vez por ronda nuevamente.
Despues avisa si te funciono xd
Mensajes: 2,454
Temas: 14
Registro en: Oct 2013
Reputación:
51
(03/05/2017, 03:16 AM)wicho escribió: Hola todos, bueno yo uso un código que usa cmdstart para detectar si esta presionando dos botones a la misma vez y salga un mensaje pero por la funcion que es pesada sale varias veces, mi pregunta es si es posible hacer que solo aparezca una vez el mensaje (print)?.. gracias antemano
Código PHP: #include <amxmodx> #include <fakemeta>
new Float:gTime[33][3];
public plugin_init() { register_forward(FM_CmdStart, "OnCmdStart", false) }
public OnCmdStart(id, uc_handle, seed) { if ( ! is_user_alive(id) ) return; static buttons, oldbuttons, Float:gametime; buttons = get_uc(uc_handle, UC_Buttons); oldbuttons = pev(id, pev_oldbuttons); gametime = get_gametime(); if ( buttons & IN_FORWARD ) { if ( ! ( oldbuttons & IN_FORWARD ) ) gTime[id][0] = gametime; } else gTime[id][0] = 0.0; if ( buttons & IN_MOVELEFT ) { if ( ! ( oldbuttons & IN_MOVELEFT ) ) gTime[id][1] = gametime; } else gTime[id][1] = 0.0; if ( buttons & IN_MOVERIGHT ) { if ( ! ( oldbuttons & IN_MOVERIGHT ) ) gTime[id][2] = gametime; } else gTime[id][2] = 0.0; if ( gTime[id][0] && gametime - gTime[id][0] > 2.0 && ( ( gTime[id][1] && gametime - gTime[id][1] > 2.0 ) || ( gTime[id][2] && gametime - gTime[id][2] > 2.0 ) ) ) client_print(id, print_chat, "blablabla") return; }
Sale varias veces porque se ejecuta varias veces, no quiere decir que sea "pesada" porque se ejecute varias veces digamos.
¿Qué es lo que querés hacer exactamente? Lo digo porque hay varias soluciones, entre ellas podrías reiniciar los "gTime[id][x]" al enviar el mensaje y no te volverían a aparecer hasta que se re-dé la condición (en caso de que quieras realizar una acción que necesite una y solo una ejecución dado el hecho que la activó).
Acá te dejo una forma en la que utiliza un bool para que no se envíe el mensaje hasta que se de la condición nuevamente. También fijate como acomodé las condiciones y que fue lo que hice dentro, si no llega a funcionar ya tenés la idea de usar la variable booleana. Con el código estructurado de esta forma la cantidad de condiciones que se procesen será potencialmente menor a lo que era antes.
Código PHP: #include <amxmodx> #include <fakemeta>
new Float:gTime[33][3], bool:gSent[33];
public plugin_init( ) { register_forward( FM_CmdStart, "OnCmdStart", false ); }
public OnCmdStart(id, uc_handle, seed) { if( !is_user_alive(id) ) return FMRES_IGNORED; static buttons, oldbuttons, Float:gametime; buttons = get_uc(uc_handle, UC_Buttons); oldbuttons = pev(id, pev_oldbuttons); gametime = get_gametime(); if( buttons & IN_FORWARD && ( buttons & IN_MOVELEFT || buttons & IN_MOVERIGHT ) ) { if( buttons & ( IN_MOVELEFT | IN_MOVERIGHT ) != ( IN_MOVELEFT | IN_MOVERIGHT ) ) { if( ~buttons & IN_MOVELEFT ) gTime[id][1] = gametime; else gTime[id][2] = gametime; } if( !gSent[id] && gTime[0] + 2.0 < gametime && ( gTime[1] + 2.0 < gametime || gTime[2] + 2.0 < gametime ) ) { gSent[id] = true; client_print(id, print_chat, "blablabla") } } else { gSent[id] = false; gTime[id][0] = gametime; gTime[id][1] = gametime; gTime[id][2] = gametime; } return FMRES_IGNORED; }
No hago trabajos privados. Si necesitás ayuda, abrí un nuevo tema.
¿Buscás un ejemplo o algún modo de juego? Podés echarle un vistazo a mis aportes.
|