[Ajuda] SetTimerEx
#1

Pq sempre quando deixamos para o SetTimerEx se repetir em um determinado tempo e sendo ele em questгo a vida nunca й possivel para-lo? ex: Colocar uma arma como a Faca para sempre que batermos em alguem causar sangramento continuo, sempre que tento fazer algo do tipo e coloco o killtimer ele nunca para pois o player sempre continua batendo e "reativando" o settimer

pawn Код:
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
    new Float:Colete;
    new Float:Vida;
    GetPlayerArmour(damagedid, Colete);
    GetPlayerHealth(damagedid, Vida);

    if(weaponid == 2)
    {
        if(Vida > 0)
        {
            Ssangramento[damagedid] = SetTimerEx("sangramento", 5000, false, "i", damagedid);
            SetTimerEx("dsangramento", 30000, false, "i", damagedid);
        }
    }
    return true;
}

forward sangramento(playerid);
public sangramento(playerid)
{
    new Float:health;
    GetPlayerHealth(playerid,health);
    SetPlayerHealth(playerid,(health-0.2));
}

forward dsangramento(playerid);
public dsangramento(playerid)
{
    KillTimer(Ssangramento[playerid]);
}
Reply
#2

Nгo entendi direito qual й a sua dъvida... Mas um timer pode sim ser parado por meio da funзгo KillTimer. Agora se ele reativa aн o problema estб na maneira em que vocк estб fazendo o seu cуdigo.
Reply
#3

@Artista
Repare q o timer 'sangramento' irб chamar suas funзхes apуs 5 segundos. Me explique pq vou querer perder vida depois de 5 segundos e ainda vou perder somente 0.2, nгo de forma contнnua, pois o timer й chamado uma vez sу, logo, cada hit da um dano de 0.2 depois de 5 segundos!

@TOPIC

Nгo sei se percebeu, mas utilizou FALSE no loop, ou seja, nгo irб repetir;
Outro detalhe visto, foi que o timer de parar o "dsangramento" tem um delay maior que o de "sangramento", ou seja, vc utiliza um killtimer pra parar porr@ nenhuma;
O timer sangramento termina antes de chamar o outro timer, sem ao menos repetir. Lуgica horrнvel!

Nгo sei se estб 100% funcional, mas a lуgica й exatamente essa:

PHP код:
public OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponid)
{
    new 
Float:ColeteFloat:Vida;
    
    
GetPlayerArmour(damagedidColete);
    
GetPlayerHealth(damagedidVida);
    if(
weaponid == && Vida 0)
    {
        
Ssangramento[damagedid] = SetTimerEx("sangramento"800true"i"damagedid);
        
SetTimerEx("dsangramento"10000false"i"damagedid);
    }
    return 
true;
}
forward sangramento(playerid);
public 
sangramento(playerid)
{
    new 
Float:health;
    
    
GetPlayerHealth(playerid,health);
    
SetPlayerHealth(playerid,(health 0.2));
    
    return 
true// nгo esqueзa de retornar numa callback/stock
}
forward dsangramento(playerid);
public 
dsangramento(playerid) return KillTimer(Ssangramento[playerid]); 
Dei uma otimizada e pelos meus cбlculos, nesse intervalo de tempo o player irб perder 2.4 de HP.
Reply
#4

PHP код:
new bool:Sangrando[MAX_PLAYERS];
public 
OnPlayerConnect(playerid)
{
    
Sangrando[playerid] = false;
    return 
1;
}
public 
OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponid)
{
    if(
Sangrando[playerid] == false)
    {
        new 
Float:Colete;
        new 
Float:Vida;
        
GetPlayerArmour(damagedidColete);
        
GetPlayerHealth(damagedidVida);
        if(
weaponid == 2)
        {
            if(
Vida 0.0)
            {
                
Sangrando[playerid] = true;
                
Ssangramento[damagedid] = SetTimerEx("sangramento"5000true"i"damagedid);
                
SetTimerEx("dsangramento"30000false"i"damagedid);
            }
        }
    }
    return 
true;
}
forward sangramento(playerid);
public 
sangramento(playerid)
{
    if(
Sangrando[playerid] == false)
    {
        
KillTimer(Ssangramento[playerid]);
        return 
1;
    }
    new 
Float:health;
    
GetPlayerHealth(playerid,health);
    
SetPlayerHealth(playerid,(health-0.2));
    return 
1;
}
forward dsangramento(playerid);
public 
dsangramento(playerid)
{
    if(
Sangrando[playerid] == true)
    {
        
Sangrando[playerid] = false;
        
KillTimer(Ssangramento[playerid]);
    }
    return 
1;

Reply
#5

Quote:
Originally Posted by F1N4L
Посмотреть сообщение
@Artista
Repare q o timer 'sangramento' irб chamar suas funзхes apуs 5 segundos. Me explique pq vou querer perder vida depois de 5 segundos e ainda vou perder somente 0.2, nгo de forma contнnua, pois o timer й chamado uma vez sу, logo, cada hit da um dano de 0.2 depois de 5 segundos!

@TOPIC

Nгo sei se percebeu, mas utilizou FALSE no loop, ou seja, nгo irб repetir;
Outro detalhe visto, foi que o timer de parar o "dsangramento" tem um delay maior que o de "sangramento", ou seja, vc utiliza um killtimer pra parar porr@ nenhuma;
O timer sangramento termina antes de chamar o outro timer, sem ao menos repetir. Lуgica horrнvel!

Nгo sei se estб 100% funcional, mas a lуgica й exatamente essa:

PHP код:
public OnPlayerGiveDamage(playeriddamagedidFloat:amountweaponid)
{
    new 
Float:ColeteFloat:Vida;
    
    
GetPlayerArmour(damagedidColete);
    
GetPlayerHealth(damagedidVida);
    if(
weaponid == && Vida 0)
    {
        
Ssangramento[damagedid] = SetTimerEx("sangramento"800true"i"damagedid);
        
SetTimerEx("dsangramento"10000false"i"damagedid);
    }
    return 
true;
}
forward sangramento(playerid);
public 
sangramento(playerid)
{
    new 
Float:health;
    
    
GetPlayerHealth(playerid,health);
    
SetPlayerHealth(playerid,(health 0.2));
    
    return 
true// nгo esqueзa de retornar numa callback/stock
}
forward dsangramento(playerid);
public 
dsangramento(playerid) return KillTimer(Ssangramento[playerid]); 
Dei uma otimizada e pelos meus cбlculos, nesse intervalo de tempo o player irб perder 2.4 de HP.
Sim eu coloquei False no Loop por causa que nгo estava funcionando o KillTimer e acabei me esquecendo de colocar true na hora de postar, e eu coloquei para tirar apenas 0.2 por causa que ainda й o Nivel 1 da Classe e o servidor terб um aumento no hp nгo sera apenas 100 o maximo

Vlw ai por terem me ajudado +rep \o
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)