[Ajuda] Dъvida em questгo de posiзгo.
#1

Boa noite users, estou com uma pequena dъvida de como posso identificar a posiзгo de um determinado jogador, nгo, nгo й sobre coordenadas. Estou efetuando um pequeno sistema de corrida simples para estudos, segue abaixo:

Um comando simples para chamar a funзгo em um dialog;
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;

Digamos que caso o jogador aceite, irб setar um
PHP код:
SetPlayerCheckpoint 
em uma determinada posiзгo.

A minha dъvida й a seguinte, como posso por para verificar a posiзгo da chegada dos competidores? A posiзгo de chegada, quem chegou primeiro... playerid, ou player2.

Aguardo respostas, obrigado.
Reply
#2

Pq vc esta dizendo que
pawn Код:
player2[id] = playerid;
player2 и igual a playerid '-'

se voce quer saber qual variavel usar ?! :S fiquei confuso '-'
Reply
#3

Olha, pode me chamar de doido...

Mas juro, tentei. Espero que dк certo.

pawn Код:
new bool:EmCorrida[MAX_PLAYERS]; // topo
new bool:finalizou[MAX_PLAYERS]; // topo
new IdCorrida[MAX_PLAYERS]; // topo
new vencedor[MAX_PLAYERS]; // topo

EmCorrida[playerid] = false; // OnPlayerConnect
finalizou[playerid] = false; // OnPlayerConnect
IdCorrida[playerid] = 0; // OnPlayerConnect


CMD:corrida(playerid, params[])
{
    new id, str[90];
    if(sscanf(params, "i", id)) return SendClientMessage(playerid, -1,"Uso: /Corrida [id rival]");

    format(str, sizeof(str),"%s quer uma corrida, aceitar?", nome[playerid]);
    ShowPlayerDialog(id, 9999, DIALOG_STYLE_MSGBOX, "Corrida", str, "Aceitar", "Cancelar");

    IdCorrida[playerid] = (id+playerid); // ID da corrida
    IdCorrida[id] = (id+playerid); // ID da corrida

    EmCorrida[playerid] = true;
    EmCorrida[id] = true;
    finalizou[playerid] = false;
    finalizou[id] = false;

    SetPlayerCheckPoint(playerid, x, y, z, 20); // exemplo
    SetPlayerCheckPoint(id, x, y, z, 20); // exemplo
   
    player2[id] = playerid;
    return 1;
}


public OnPlayerEnterCheckpoint(playerid)
{
    for(new a = 0; a < MAX_PLAYERS; a++)
    {
        for(new b = 1; b < MAX_PLAYERS; b++)
        {
            if(IsPlayerConnected(a) && IsPlayerConnected(b))
            {
                if(IdCorrida[a] != 0 && IdCorrida[b] != 0)
                {
                    if(IdCorrida[a] == IdCorrida[b])
                    {
                        if(EmCorrida[a] == true && finalizou[a] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            EmCorrida[a] = false;
                            finalizou[a] = true;
                            vencedor[a] = 1; // venceu
                        }
                        else if (EmCorrida[b] == true && finalizou[b] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            finalizou[b] = true;
                            EmCorrida[b] = false;
                            vencedor[b] = 1; // venceu
                        }
                    }
                }
            }
       }
       
    return 1;
}
Reply
#4

Quote:
Originally Posted by Fel486
Посмотреть сообщение
Olha, pode me chamar de doido...

Mas juro, tentei. Espero que dк certo.

pawn Код:
new bool:EmCorrida[MAX_PLAYERS]; // topo
new bool:finalizou[MAX_PLAYERS]; // topo
new IdCorrida[MAX_PLAYERS]; // topo
new vencedor[MAX_PLAYERS]; // topo

EmCorrida[playerid] = false; // OnPlayerConnect
finalizou[playerid] = false; // OnPlayerConnect
IdCorrida[playerid] = 0; // OnPlayerConnect


CMD:corrida(playerid, params[])
{
    new id, str[90];
    if(sscanf(params, "i", id)) return SendClientMessage(playerid, -1,"Uso: /Corrida [id rival]");

    format(str, sizeof(str),"%s quer uma corrida, aceitar?", nome[playerid]);
    ShowPlayerDialog(id, 9999, DIALOG_STYLE_MSGBOX, "Corrida", str, "Aceitar", "Cancelar");

    IdCorrida[playerid] = (id+playerid); // ID da corrida
    IdCorrida[id] = (id+playerid); // ID da corrida

    EmCorrida[playerid] = true;
    EmCorrida[id] = true;
    finalizou[playerid] = false;
    finalizou[id] = false;

    SetPlayerCheckPoint(playerid, x, y, z, 20); // exemplo
    SetPlayerCheckPoint(id, x, y, z, 20); // exemplo
   
    player2[id] = playerid;
    return 1;
}


public OnPlayerEnterCheckpoint(playerid)
{
    for(new a = 0; a < MAX_PLAYERS; a++)
    {
        for(new b = 1; b < MAX_PLAYERS; b++)
        {
            if(IsPlayerConnected(a) && IsPlayerConnected(b))
            {
                if(IdCorrida[a] != 0 && IdCorrida[b] != 0)
                {
                    if(IdCorrida[a] == IdCorrida[b])
                    {
                        if(EmCorrida[a] == true && finalizou[a] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            EmCorrida[a] = false;
                            finalizou[a] = true;
                            vencedor[a] = 1; // venceu
                        }
                        else if (EmCorrida[b] == true && finalizou[b] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            finalizou[b] = true;
                            EmCorrida[b] = false;
                            vencedor[b] = 1; // venceu
                        }
                    }
                }
            }
       }
       
    return 1;
}
Obrigado, pela lуgica ajudou bastante... Porйm, se possнvel, poderia me explicar o uso da seguinte funзгo? Estou em dъvida pois ela foi utilizada duas vezes com valores diferentes ( a | b ).
PHP код:
for(new 0MAX_PLAYERSa++)
    {
        for(new 
1MAX_PLAYERSb++) 
Reply
#5

Quote:
Originally Posted by Ley
Посмотреть сообщение
Obrigado, pela lуgica ajudou bastante... Porйm, se possнvel, poderia me explicar o uso da seguinte funзгo? Estou em dъvida pois ela foi utilizada duas vezes com valores diferentes ( a | b ).
PHP код:
for(new 0MAX_PLAYERSa++)
    {
        for(new 
1MAX_PLAYERSb++) 
Sгo 2 loops. Eles estгo testando se o ID da corrida de players sгo os mesmos.

Quando o primeiro й executado (LOOP A), ele processarб o B todinho, sу entгo o A avanзarб, retornando ao B para testar novamente os termos antecessores.

Exemplo:

pawn Код:
A = 0; B = 1;
A = 0; B = 2;
A = 0; B = 3;
A = 0; B = 4;
//......
A = 0; B = MAX_PLAYERS;


// Logo....

A = 1; B = 1;
A = 1; B = 2;
A = 1; B = 3;
A = 1; B = 4;
//......
A = 1; B = MAX_PLAYERS;

// Continua.....
Reply
#6

Quote:
Originally Posted by Fel486
Посмотреть сообщение
Sгo 2 loops. Eles estгo testando se o ID da corrida de players sгo os mesmos.

Quando o primeiro й executado (LOOP A), ele processarб o B todinho, sу entгo o A avanзarб, retornando ao B para testar novamente os termos antecessores.

Exemplo:

pawn Код:
A = 0; B = 1;
A = 0; B = 2;
A = 0; B = 3;
A = 0; B = 4;
//......
A = 0; B = MAX_PLAYERS;

// Logo....

A = 1; B = 1;
A = 1; B = 2;
A = 1; B = 3;
A = 1; B = 4;
//......
A = 1; B = MAX_PLAYERS;

// Continua.....
Muito obrigado pelo ajuda

@EDIT

Acho que nгo me ajudou o quanto eu pensava, o cуdigo. Pois a mesma funзгo й efetuada para o segundo colocado.
O correto seria sumir o CheckPoint dele, e a vitуria ser somente do primeiro colocado. Mas ainda estou enrolado com esses loops, para definir o vencedor e o perdedor.
Reply
#7

pawn Код:
if(IdCorrida[a] == IdCorrida[b])
                    {
                        if(EmCorrida[a] == true && finalizou[a] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            EmCorrida[a] = false;
                            finalizou[a] = true;
                            vencedor[a] = 1; // venceu
                        }
                        else if (EmCorrida[b] == true && finalizou[b] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            finalizou[b] = true;
                            EmCorrida[b] = false;
                            vencedor[b] = 1; // venceu
                        }
                    }
Para isso eu utilize o Else, porque se o primeiro vencer, o segundo nгo serб checado. O segundo serб checado apenas se o primeiro nгo for vencedor. Consequentemente, o segundo seria o vencedor.
Reply
#8

Quote:
Originally Posted by Fel486
Посмотреть сообщение
pawn Код:
if(IdCorrida[a] == IdCorrida[b])
                    {
                        if(EmCorrida[a] == true && finalizou[a] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            EmCorrida[a] = false;
                            finalizou[a] = true;
                            vencedor[a] = 1; // venceu
                        }
                        else if (EmCorrida[b] == true && finalizou[b] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            finalizou[b] = true;
                            EmCorrida[b] = false;
                            vencedor[b] = 1; // venceu
                        }
                    }
Para isso eu utilize o Else, porque se o primeiro vencer, o segundo nгo serб checado. O segundo serб checado apenas se o primeiro nгo for vencedor. Consequentemente, o segundo seria o vencedor.
Certo, entгo se eu colocar uma mensagem do tipo:
PHP код:
SCM(a, -1,"Vocк й um vencedor."); 
Essa mensagem seria enviada para o vencedor e para o rival, onde deveria ser enviada somente para o vencedor.
Reply
#9

pawn Код:
if(EmCorrida[a] == true && finalizou[a] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            EmCorrida[a] = false;
                            finalizou[a] = true;
                            vencedor[a] = 1;
                            SCM(a, -1,"Vocк й um vencedor."); // Aqui
                        }
                        else if (EmCorrida[b] == true && finalizou[b] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            finalizou[b] = true;
                            EmCorrida[b] = false;
                            vencedor[b] = 1;
                            SCM(b, -1,"Vocк й um vencedor."); // E aqui
                        }

Graзas ao Else, somente uma condiзгo serб checada. Ou seja, o cуdigo nгo alcanзarб os jogadores A e B.
Reply
#10

Quote:
Originally Posted by Fel486
Посмотреть сообщение
pawn Код:
if(EmCorrida[a] == true && finalizou[a] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            EmCorrida[a] = false;
                            finalizou[a] = true;
                            vencedor[a] = 1;
                            SCM(a, -1,"Vocк й um vencedor."); // Aqui
                        }
                        else if (EmCorrida[b] == true && finalizou[b] == false)
                        {
                            DisablePlayerCheckPoint(b);
                            finalizou[b] = true;
                            EmCorrida[b] = false;
                            vencedor[b] = 1;
                            SCM(b, -1,"Vocк й um vencedor."); // E aqui
                        }

Graзas ao Else, somente uma condiзгo serб checada. Ou seja, o cуdigo nгo alcanзarб os jogadores A e B.
Entгo, eu adicionei uma mensagem ao loop 'a', porйm quando completei o trajeto, a mensagem foi apresentada ao jogador perdedor. Ou seja, ambos os participantes tiveram a mensagem de vitуria, enquanto somente um venceu.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)