Dъvida em questгo de posiзгo. -
Ley - 23.04.2014
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(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");
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.
Re: Dъvida em questгo de posiзгo. -
lKoDlFuLLaNNo - 23.04.2014
Pq vc esta dizendo que
player2 и igual a playerid '-'
se voce quer saber qual variavel usar ?! :S fiquei confuso '-'
Re: Dъvida em questгo de posiзгo. -
Fel486 - 23.04.2014
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;
}
Re: Dъvida em questгo de posiзгo. -
Ley - 23.04.2014
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 a = 0; a < MAX_PLAYERS; a++)
{
for(new b = 1; b < MAX_PLAYERS; b++)
Re: Dъvida em questгo de posiзгo. -
Fel486 - 23.04.2014
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 a = 0; a < MAX_PLAYERS; a++)
{
for(new b = 1; b < MAX_PLAYERS; b++)
|
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.....
Re: Dъvida em questгo de posiзгo. -
Ley - 23.04.2014
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.
Re: Dъvida em questгo de posiзгo. -
Fel486 - 23.04.2014
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.
Re: Dъvida em questгo de posiзгo. -
Ley - 23.04.2014
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.
Re: Dъvida em questгo de posiзгo. -
Fel486 - 23.04.2014
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.
Re: Dъvida em questгo de posiзгo. -
Ley - 23.04.2014
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.