[Pedido] Corrida 1 x 1.
#1

Boa noite users, estou tentando desenvolver uma pequena corrida 1 x 1, algo simples, porйm estou com algumas dъvidas em relaзгo а ordem de chegada de ambos jogadores.
Irei demostrar o meu feito atй agora:

Variбvel:
PHP код:
NaCorrida[MAX_PLAYERS]; 
Comando:
PHP код:
CMD:corrida(playeridparams[]) { 
    new 
idstr[90]; 
    if(
sscanf(params"i"id)) return SendClientMessage(playerid, -1,"Uso: /Corrida [id rival]"); 
    
format(strsizeof(str),"%s quer uma corrida, aceitar?"nome[playerid]); 
    
ShowPlayerDialog(id9999DIALOG_STYLE_MSGBOX"Corrida"str"Aceitar""Cancelar"); 
     
    
player2[id] = playerid
    return 
1

Dialog:
PHP код:
if(dialogid == 9999)
{
   if(
response)
   {
       
SendClientMessage(playerid, -1"Corrida iniciada."); // Irб enviar a mensagem para quem ofereceu.
       
SendClientMessage(player2[playerid], -1"Corrida iniciada."); // Irб enviar a mensagem para o convidado.
       
SetPlayerCheckpoint(...)
       
SetPlayerCheckpoint(...)
       
NaCorrida[playerid] = true;
       
NaCorrida[player2[playerid]] = true;
   }
   else
   {
       
SendClientMessage(playerid, -1"Corrida recusada.");
       
SendClientMessage(player2[playerid], -1"Corrida recusada.");
   }

Agora minha dъvida й na parte do OnPlayerEnterCheckpoint, eu nгo sei como fazer para verificar a ordem de chegada do jogador. O meu objetivo era o seguinte:

• Quando o primeiro colocado passasse sobre o checkpoint, o mesmo iria desaparecer tanto para o vencedor quanto para o derrotado, seguido de uma mensagem de vitуria e derrota para seus respectivos jogadores.

Exemplo:
PHP код:
if(NaCorrida[playerid] == true)
{
    
SendClientMessage(playerid, -1,"Vencedor.");  
    
SendClientMessage(player2[playerid], -1"Perdedor."); 
}
else if(
NaCorrida[player2[playerid]] == true)
{
   
SendClientMessage(player2[playerid], -1,"Vencedor.");
   
SendClientMessage(playerid, -1,"Perdedor.");  

O problema й que nгo sei como posso verificar o primeiro colocado, se foi o playerid ou player2[playerid]. Se alguйm puder me ajudar com essa dъvida, serei muito grato.
Aguardo respostas
Reply
#2

Pela minha compreensгo, a callback OnPlayerEnterCheckpoint entгo seria processada apenas uma vez, o que aconteceria para o primeiro dos dois jogadores que chegasse ao Checkpoint. Esse jogador seria o vencedor .



Sendo assim, o parвmetro playerid da funзгo OnPlayerEnterCheckpoint equivaleria ao ID do jogador vencedor e, consequentemente, o ID do outro jogador competidor seria o ID do perdedor. A identificaзгo desses IDs, em termos de cуdigos, poderia ser feita atravйs de um loop por todos os jogadores e algumas verificaзхes de valores :


pawn Код:
new Competidores[2];
for(new x = 0, y = GetMaxPlayers(), z = 0; x != y; x++)
{
    if(NaCorrida[x])
    {
        Competidores[z] = x;
        z++;
        if(z > 1) break;
    }
}
if(playerid == Competidores[0])
{
    SendClientMessage(Competidores[0], 0x33CCFFAA, "Vencedor !");
    SendClientMessage(Competidores[1], 0xFF0000FF, "Perdedor !");
}
else if(playerid == Competidores[1])
{
    SendClientMessage(Competidores[1], 0x33CCFFAA, "Vencedor !");
    SendClientMessage(Competidores[0], 0xFF0000FF, "Perdedor !");
}


Espero ter ajudado .
Reply
#3

Hello novamente .

Pensei mais um pouco e aqui vai outra tentativa. Espero que ajude .

PS: й um sу um exemplo, adapte ao seu script.


http://pastebin.com/XAW7HajP
Reply
#4

Quote:
Originally Posted by rjjj
Посмотреть сообщение
Pela minha compreensгo, a callback OnPlayerEnterCheckpoint entгo seria processada apenas uma vez, o que aconteceria para o primeiro dos dois jogadores que chegasse ao Checkpoint. Esse jogador seria o vencedor .



Sendo assim, o parвmetro playerid da funзгo OnPlayerEnterCheckpoint equivaleria ao ID do jogador vencedor e, consequentemente, o ID do outro jogador competidor seria o ID do perdedor. A identificaзгo desses IDs, em termos de cуdigos, poderia ser feita atravйs de um loop por todos os jogadores e algumas verificaзхes de valores :


pawn Код:
new Competidores[2];
for(new x = 0, y = GetMaxPlayers(), z = 0; x != y; x++)
{
    if(NaCorrida[x])
    {
        Competidores[z] = x;
        z++;
        if(z > 1) break;
    }
}
if(playerid == Competidores[0])
{
    SendClientMessage(Competidores[0], 0x33CCFFAA, "Vencedor !");
    SendClientMessage(Competidores[1], 0xFF0000FF, "Perdedor !");
}
else if(playerid == Competidores[1])
{
    SendClientMessage(Competidores[1], 0x33CCFFAA, "Vencedor !");
    SendClientMessage(Competidores[0], 0xFF0000FF, "Perdedor !");
}


Espero ter ajudado .
Muito obrigado funcionou perfeitamente, obrigado pela explicaзгo. Grato!

Quote:
Originally Posted by Fel486
Посмотреть сообщение
Hello novamente .

Pensei mais um pouco e aqui vai outra tentativa. Espero que ajude .

PS: й um sу um exemplo, adapte ao seu script.


http://pastebin.com/XAW7HajP
Obrigado pela tentativa e esforзo, o rjjj jб conseguiu me ajudar, funcionou. Obrigado!

@Utilidade[Dъvida]

Se um dos competidores entrar em um veнculo, como posso fazer com que a corrida seja cancelada?
PHP код:
public OnPlayerStateChange(playeridnewstateoldstate
{
   if(
NaCorrida[playerid] == true)
   {
      
NaCorrida[playerid] = false;
      
NaCorrida[player2[playerid]] = false.
   }
   return 
1;

Nгo sei se funcionaria, se puderem tirar essa dъvida, obrigado.
Reply
#5

PHP код:
public OnPlayerStateChange(playeridnewstateoldstate)
{
   if(
NaCorrida[playerid] == true)
   {
      if(
oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
      {
             
NaCorrida[playerid] = false;
             for(new 
0MAX_PLAYERSi++)
             {
                  if(
IsPlayerConnected(i))
                  {
                      if(
IdCorrida[playerid] == IdCorrida[i])
                      {
                          
NaCorrida[i] = false;
                          
IdCorrida[playerid] = 0;
                          
IdCorrida[i] = 0;
                          
SendClientMessage(playerid0x33CCFFAA"Corrida cancelada.");
                          
SendClientMessage(i0x33CCFFAA"Corrida cancelada.");
                          break;
                    }
                }
            }
        }
    }

   return 
1;

Reply
#6

Quote:
Originally Posted by Fel486
Посмотреть сообщение
PHP код:
public OnPlayerStateChange(playeridnewstateoldstate)
{
   if(
NaCorrida[playerid] == true)
   {
      if(
oldstate == PLAYER_STATE_ONFOOT && newstate == PLAYER_STATE_DRIVER)
      {
             
NaCorrida[playerid] = false;
             for(new 
0MAX_PLAYERSi++)
             {
                  if(
IsPlayerConnected(i))
                  {
                      if(
IdCorrida[playerid] == IdCorrida[i])
                      {
                          
NaCorrida[i] = false;
                          
IdCorrida[playerid] = 0;
                          
IdCorrida[i] = 0;
                          
SendClientMessage(playerid0x33CCFFAA"Corrida cancelada.");
                          
SendClientMessage(i0x33CCFFAA"Corrida cancelada.");
                          break;
                    }
                }
            }
        }
    }
   return 
1;

@EDIT
Resolvido, eu tinha entendi errado. Obrigado novamente.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)