[Ajuda] ajuda urgente OnPlayerKeyStateChange
#1

Pessoal, alguйm poderia me informar um jeito pra eu arrumar meu sistema de cortar arvore?
tipo eu coloquei pra quando o jogador bater 20x a madeira й cortada antes tava 10 mas aumentei pq o jogador clicava varias vezes no primeiro botгo do mouse pra cortar mesmo nгo estando batendo...
alguйm sabe alguma forma de arrumar isso ?
eu quero que o jogador bata 20 vezes certo, sem dele clicar varias vezes rapido e cortar, alguma animaзгo com o TogglePlayerControllable ?

Код:
Arvore_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) 
{ 
	for(new i = 0; i < MAX_ARVORES; i++) 
	{
		if(IsPlayerInRangeOfPoint(playerid, 1.0, Arvores[i][0], Arvores[i][1], Arvores[i][2])) 
	    { 
	    	if(PRESSED(KEY_FIRE))
	    	{ 
	    		if(ArvoreVida[i] != 0)
	    		{
			        Bateu[i]++;
			        ArvoreVida[i] -= 5;
			       	PlayerPlaySound(playerid,1190,0.0,0.0,0.0);
			        if(Bateu[i] == 20 || ArvoreVida[i] <= 0)
			        { 
			            MatarArvore(i);
			            Bateu[i] = 0;
			            pInfo[playerid][pMadeira] += 5;
			            GameTextForPlayer(playerid,"~w~+5 Madeiras",2500, 3);
			            SendClientMessage(playerid, -1, "Veja quantas madeiras / metais vocк tem use /metais");

			     	}
			  	}else{
			  	 SendClientMessage(playerid, 0xA3A3A3FF, "essa arvore jб foi cortada!!");
			  	}
	        } 
	    } 
	}
    return 1; 
}
Reply
#2

Sу usar GetTickCount ou gettime. Se vocк quiser, por exemplo, que a aзгo de bater seja executada apenas de um em um segundo, vocк pode fazer isso (fiz uma alteraзгo pra otimizar):
PHP код:
new lastTreeHit[MAX_PLAYERS] = {000, ...}; //variбvel pra controlar o tempo da ъltima vez que ele bateu na бrvore
Arvore_OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    if(
PRESSED(KEY_FIRE)) //Como hб uma grande quantidade de telcas que chamam esta callback, vocк deve checar se o jogador apertou a tecla que vocк quer logo no inнcio para nгo desperdiзar processamento
    
{
        if ((
GetTickCount() - lastTreeHit[playerid]) > 1000//Checa se jб passou 1 segundo
        
{
            for(new 
0MAX_ARVORESi++)
            {
                if(
IsPlayerInRangeOfPoint(playerid1.0Arvores[i][0], Arvores[i][1], Arvores[i][2]))
                {
                    if(
ArvoreVida[i] != 0)
                    {
                        
lastTreeHit[playerid] = GetTickCount(); //Salva o tempo atual
                        
Bateu[i]++;
                        
ArvoreVida[i] -= 5;
                        
PlayerPlaySound(playerid,1190,0.0,0.0,0.0);
                        if(
Bateu[i] == 20 || ArvoreVida[i] <= 0)
                        {
                            
MatarArvore(i);
                            
Bateu[i] = 0;
                            
pInfo[playerid][pMadeira] += 5;
                            
GameTextForPlayer(playerid,"~w~+5 Madeiras",25003);
                            
SendClientMessage(playerid, -1"Veja quantas madeiras / metais vocк tem use /metais");
    
                        }
                    } else {
                     
SendClientMessage(playerid0xA3A3A3FF"essa arvore jб foi cortada!!");
                    }
                }
            }
        }
    }
    return 
1;

Reply
#3

Vocк tem duas Opзхes SetTimerEx() ou gettime(), recomendo que utilize a funзгo gettime.

Exemplo:
PHP код:

// crio uma variбvel para armazenar o valor do gettime.
new intTempo[MAX_PLAYERS];
Arvore_OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    for(new 
0MAX_ARVORESi++)
    {
        if(
IsPlayerInRangeOfPoint(playerid1.0Arvores[i][0], Arvores[i][1], Arvores[i][2]))
        {
            if(
PRESSED(KEY_FIRE))
            {
                if(
ArvoreVida[i] != 0)
                {
                    
// se o tempo que peguei agora menos o tempo que peguei anteriormente for maior que 2 (segundos) continuo a funзгo
                       
if((gettime() - intTempo[playerid]) > )
                    {
                        
Bateu[i]++;
                        
ArvoreVida[i] -= 5;
                           
PlayerPlaySound(playerid,1190,0.0,0.0,0.0);
                           
                           
intTempo[playerid] = gettime();
                        if(
Bateu[i] == 20 || ArvoreVida[i] <= 0)
                        {
                            
MatarArvore(i);
                            
Bateu[i] = 0;
                            
pInfo[playerid][pMadeira] += 5;
                            
GameTextForPlayer(playerid,"~w~+5 Madeiras",25003);
                            
SendClientMessage(playerid, -1"Veja quantas madeiras / metais vocк tem use /metais");
                         }
                    }
                    else return 
Send(playerid, -1"Erro clicou muito rapido");
                  }
                else
                {
                   
SendClientMessage(playerid0xA3A3A3FF"essa arvore jб foi cortada!!");
                  }
            }
        }
    }
    return 
1;

Reply
#4

Quote:
Originally Posted by Whoo
Посмотреть сообщение
Vocк tem duas Opзхes SetTimerEx() ou gettime(), recomendo que utilize a funзгo gettime.

Exemplo:
PHP код:

// crio uma variбvel para armazenar o valor do gettime.
new intTempo[MAX_PLAYERS];
Arvore_OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    for(new 
0MAX_ARVORESi++)
    {
        if(
IsPlayerInRangeOfPoint(playerid1.0Arvores[i][0], Arvores[i][1], Arvores[i][2]))
        {
            if(
PRESSED(KEY_FIRE))
            {
                if(
ArvoreVida[i] != 0)
                {
                    
// se o tempo que peguei agora menos o tempo que peguei anteriormente for maior que 2 (segundos) continuo a funзгo
                       
if((gettime() - intTempo[playerid]) > )
                    {
                        
Bateu[i]++;
                        
ArvoreVida[i] -= 5;
                           
PlayerPlaySound(playerid,1190,0.0,0.0,0.0);
                           
                           
intTempo[playerid] = gettime();
                        if(
Bateu[i] == 20 || ArvoreVida[i] <= 0)
                        {
                            
MatarArvore(i);
                            
Bateu[i] = 0;
                            
pInfo[playerid][pMadeira] += 5;
                            
GameTextForPlayer(playerid,"~w~+5 Madeiras",25003);
                            
SendClientMessage(playerid, -1"Veja quantas madeiras / metais vocк tem use /metais");
                         }
                    }
                    else return 
Send(playerid, -1"Erro clicou muito rapido");
                  }
                else
                {
                   
SendClientMessage(playerid0xA3A3A3FF"essa arvore jб foi cortada!!");
                  }
            }
        }
    }
    return 
1;

vlw man, slg eu coloquei pra qnd o jogador bater ele ficar travado mas tem horas que buga e n conseuge mais se mexer
olha como eu fiz

Код:
Arvore_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) 
{ 
	if(pInfo[playerid][EstaJogando] == 1)
	{
	    for(new i = 0; i < MAX_ARVORES; i++) 
	    { 
	        if(IsPlayerInRangeOfPoint(playerid, 1.0, Arvores[i][0], Arvores[i][1], Arvores[i][2])) 
	        { 
		        if(PRESSED(KEY_FIRE)) 
		        { 
		            if(ArvoreVida[i] != 0) 
		             { 
		                TogglePlayerControllable(playerid, 0);
		                ApplyAnimation(playerid, "BASEBALL", "Bat_3", 4, false, 1, 1, 0, 2000, 1);
		                if((gettime() - intTempo[playerid]) > 2 ) 
		                 { 
		                    Bateu[i]++; 
		                    ArvoreVida[i] -= 10; 
		                    PlayerPlaySound(playerid,1190,0.0,0.0,0.0); 
		                    TogglePlayerControllable(playerid, 1);
		                    ClearAnimations(playerid);
		                    intTempo[playerid] = gettime(); 
		                    if(Bateu[i] == 10 || ArvoreVida[i] <= 0) 
		                    { 
		                    	MatarArvore(i); 
		                    	Bateu[i] = 0; 
		                    	pInfo[playerid][pMadeira] += 5; 
		                    	GameTextForPlayer(playerid,"~w~+5 Madeiras",2500, 3); 
		                    	SendClientMessage(playerid, -1, "Veja quantas madeiras / metais vocк tem use /metais"); 
		                    }
		                }
		                }else{ 
		                SendClientMessage(playerid, 0xA3A3A3FF, "essa arvore jб foi cortada!!"); 
		            } 
		       } 
		   } 
		} 
	}
    return 1; 
}
Reply
#5

alguйm ?
Reply
#6

Quote:
Originally Posted by BHTMestre
Посмотреть сообщение
vlw man, slg eu coloquei pra qnd o jogador bater ele ficar travado mas tem horas que buga e n conseuge mais se mexer
olha como eu fiz

Код:
Arvore_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) 
{ 
	if(pInfo[playerid][EstaJogando] == 1)
	{
	    for(new i = 0; i < MAX_ARVORES; i++) 
	    { 
	        if(IsPlayerInRangeOfPoint(playerid, 1.0, Arvores[i][0], Arvores[i][1], Arvores[i][2])) 
	        { 
		        if(PRESSED(KEY_FIRE)) 
		        { 
		            if(ArvoreVida[i] != 0) 
		             { 
		                TogglePlayerControllable(playerid, 0);
		                ApplyAnimation(playerid, "BASEBALL", "Bat_3", 4, false, 1, 1, 0, 2000, 1);
		                if((gettime() - intTempo[playerid]) > 2 ) 
		                 { 
		                    Bateu[i]++; 
		                    ArvoreVida[i] -= 10; 
		                    PlayerPlaySound(playerid,1190,0.0,0.0,0.0); 
		                    TogglePlayerControllable(playerid, 1);
		                    ClearAnimations(playerid);
		                    intTempo[playerid] = gettime(); 
		                    if(Bateu[i] == 10 || ArvoreVida[i] <= 0) 
		                    { 
		                    	MatarArvore(i); 
		                    	Bateu[i] = 0; 
		                    	pInfo[playerid][pMadeira] += 5; 
		                    	GameTextForPlayer(playerid,"~w~+5 Madeiras",2500, 3); 
		                    	SendClientMessage(playerid, -1, "Veja quantas madeiras / metais vocк tem use /metais"); 
		                    }
		                }
		                }else{ 
		                SendClientMessage(playerid, 0xA3A3A3FF, "essa arvore jб foi cortada!!"); 
		            } 
		       } 
		   } 
		} 
	}
    return 1; 
}
dispare um timer com o tempo da animaзгo:
PHP код:
Arvore_OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    if(
pInfo[playerid][EstaJogando] == 1)
    {
        for(new 
0MAX_ARVORESi++)
        {
            if(
IsPlayerInRangeOfPoint(playerid1.0Arvores[i][0], Arvores[i][1], Arvores[i][2]))
            {
                if(
PRESSED(KEY_FIRE))
                {
                    if(
ArvoreVida[i] != 0)
                      {
                        
TogglePlayerControllable(playerid0); // congelado
                        
ApplyAnimation(playerid"BASEBALL""Bat_3"4false11020001); // animaзгo de 2000 ms
                        
SetTimerEx("descongelarLenhador"2000false"i"playerid); // desparo o timer para 2000 ms
                        
if((gettime() - intTempo[playerid]) > )
                          {
                            
Bateu[i]++;
                            
ArvoreVida[i] -= 10;
                            
PlayerPlaySound(playerid,1190,0.0,0.0,0.0);
                            
ClearAnimations(playerid);
                            
intTempo[playerid] = gettime();
                            if(
Bateu[i] == 10 || ArvoreVida[i] <= 0)
                            {
                                
MatarArvore(i);
                                
Bateu[i] = 0;
                                
pInfo[playerid][pMadeira] += 5;
                                
GameTextForPlayer(playerid,"~w~+5 Madeiras",25003);
                                
SendClientMessage(playerid, -1"Veja quantas madeiras / metais vocк tem use /metais");
                            }
                        }
                      }
                    else
                    {
                        
SendClientMessage(playerid0xA3A3A3FF"essa arvore jб foi cortada!!");
                    }
                   }
               }
        }
    }
    return 
1;
}
forward descongelarLenhador(playerid); public descongelarLenhador(playerid)
{
    
ClearAnimations(playerid);
    
TogglePlayerControllable(playerid1);
    
SendClientMessage(playerid, -1"[DEBUG] DESCONGELADO");
    return 
1;

Reply
#7

Quote:
Originally Posted by Whoo
Посмотреть сообщение
dispare um timer com o tempo da animaзгo:
PHP код:
Arvore_OnPlayerKeyStateChange(playeridnewkeysoldkeys)
{
    if(
pInfo[playerid][EstaJogando] == 1)
    {
        for(new 
0MAX_ARVORESi++)
        {
            if(
IsPlayerInRangeOfPoint(playerid1.0Arvores[i][0], Arvores[i][1], Arvores[i][2]))
            {
                if(
PRESSED(KEY_FIRE))
                {
                    if(
ArvoreVida[i] != 0)
                      {
                        
TogglePlayerControllable(playerid0); // congelado
                        
ApplyAnimation(playerid"BASEBALL""Bat_3"4false11020001); // animaзгo de 2000 ms
                        
SetTimerEx("descongelarLenhador"2000false"i"playerid); // desparo o timer para 2000 ms
                        
if((gettime() - intTempo[playerid]) > )
                          {
                            
Bateu[i]++;
                            
ArvoreVida[i] -= 10;
                            
PlayerPlaySound(playerid,1190,0.0,0.0,0.0);
                            
ClearAnimations(playerid);
                            
intTempo[playerid] = gettime();
                            if(
Bateu[i] == 10 || ArvoreVida[i] <= 0)
                            {
                                
MatarArvore(i);
                                
Bateu[i] = 0;
                                
pInfo[playerid][pMadeira] += 5;
                                
GameTextForPlayer(playerid,"~w~+5 Madeiras",25003);
                                
SendClientMessage(playerid, -1"Veja quantas madeiras / metais vocк tem use /metais");
                            }
                        }
                      }
                    else
                    {
                        
SendClientMessage(playerid0xA3A3A3FF"essa arvore jб foi cortada!!");
                    }
                   }
               }
        }
    }
    return 
1;
}
forward descongelarLenhador(playerid); public descongelarLenhador(playerid)
{
    
ClearAnimations(playerid);
    
TogglePlayerControllable(playerid1);
    
SendClientMessage(playerid, -1"[DEBUG] DESCONGELADO");
    return 
1;

eu tinha feito assim

PHP код:
Arvore_OnPlayerKeyStateChange(playeridnewkeysoldkeys

    if(
pInfo[playerid][EstaJogando] == 1)
    {
        for(new 
0MAX_ARVORESi++) 
        { 
            if(
IsPlayerInRangeOfPoint(playerid1.0Arvores[i][0], Arvores[i][1], Arvores[i][2])) 
            { 
                if(
PRESSED(KEY_FIRE)) 
                { 
                    if(
ArvoreVida[i] != 0
                     { 
                        
TogglePlayerControllable(playerid0);
                        
ApplyAnimation(playerid"BASEBALL""Bat_3"4false11010001);
                        
SetTimerEx("controle"segundos(2), false"i"playerid);
                        if((
gettime() - intTempo[playerid]) > 
                         { 
                            
Bateu[i]++; 
                            
ArvoreVida[i] -= 10
                            
PlayerPlaySound(playerid,1190,0.0,0.0,0.0); 
                            
ClearAnimations(playerid);
                            
intTempo[playerid] = gettime(); 
                            if(
Bateu[i] == 10 || ArvoreVida[i] <= 0
                            { 
                                
MatarArvore(i); 
                                
Bateu[i] = 0
                                
pInfo[playerid][pMadeira] += 5
                                
GameTextForPlayer(playerid,"~w~+5 Madeiras",25003); 
                                
SendClientMessage(playerid, -1"Veja quantas madeiras / metais vocк tem use /metais"); 
                            }
                        }
                        }else{ 
                        
SendClientMessage(playerid0xA3A3A3FF"essa arvore jб foi cortada!!"); 
                    } 
               } 
           } 
        } 
    }
    return 
1
}  
forward controle(playerid);
public 
controle(playerid)
{
    
ClearAnimations(playerid);
    
TogglePlayerControllable(playerid,0);
       
TogglePlayerControllable(playerid,1);
    return 
1;

Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)