Mensaje salga una vez
#1
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(iduc_handleseed) {
    
    if ( ! 
is_user_alive(id) )
        return;
    
    static 
buttonsoldbuttonsFloat:gametime;
    
buttons get_uc(uc_handleUC_Buttons);
    
oldbuttons pev(idpev_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(idprint_chat"blablabla")
    
    return;

Responder
#2
crea una variable en el principio del plugin, debajo de las librerias e.e

Código PHP:
new g_mensaje[33

al terminar la ronda , nueva ronda o al reiniciar la ronda activate esa variable

Código PHP:
g_mensaje[id] = // el 1 es para activar 


Luego en :

Código PHP:
client_print(idprint_chat"blablabla"

Reemplalo por >>>>>>>>>>>>>>>

Código PHP:
if (g_mensaje[id]) {
           
client_print(idprint_chat"blablabla")
           
g_mensaje[id] = // 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
Responder
#3
(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(iduc_handleseed) {
    
    if ( ! 
is_user_alive(id) )
        return;
    
    static 
buttonsoldbuttonsFloat:gametime;
    
buttons get_uc(uc_handleUC_Buttons);
    
oldbuttons pev(idpev_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(idprint_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_forwardFM_CmdStart"OnCmdStart"false );
}

public 
OnCmdStart(iduc_handleseed) {
    
    if( !
is_user_alive(id) )
        return 
FMRES_IGNORED;
    
    static 
buttonsoldbuttonsFloat:gametime;
    
buttons get_uc(uc_handleUC_Buttons);
    
oldbuttons pev(idpev_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(idprint_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
.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)