SetTimerEx("VerificarPosicao", 100, false, "i", playerid);
public VerificarPosicao(playerid){ for(new i = 0; i < MAX_PLAYERS; i++){ if(!IsPlayerConnected(i)) continue; if(Evento[i] == false) continue; if(i == playerid) continue; // Se o i for igual ao playerid if(AddCP[playerid] > AddCP[i] && AlguemGanhou[Colocado[0]] == false){ // Se a quantidade de CP's do jogador for maior que de todos players ele й o primeiro Posicao[Colocado[0]] = 1; Posicao[playerid] = 0; Colocado[0] = playerid; format(Str, sizeof(Str), "~b~~h~1|: ~w~%s", GetName(Colocado[0])); PlayerTextDrawSetString(playerid, Textdraw2[i], Str); PlayerTextDrawSetString(i, Textdraw2[i], Str); format(Str, sizeof(Str), "~b~~h~2|: ~w~%s", GetName(Colocado[1])); PlayerTextDrawSetString(playerid, Textdraw6[i], Str); PlayerTextDrawSetString(i, Textdraw6[i], Str); } format(Str, sizeof(Str), "** {FFFFFF}ID de todos os jogadores exceto playerid: {AA0000}%d", i); SendClientMessage(playerid, Red, Str); } return 1; }
new pos;
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(AddCP[playerid] < AddCP[i] && AlguemGanhou[Colocado[0]] == false) // Acrescenta mais 1 a posicao do jogador por cada player a frente dele
{
pos++;
}
if(AddCP[playerid] == AddCP[i]) // Caso alguem esteja empatado com o player
{
new JogadorCheckPoint = //O proximo checkpoint do player
new EmpatadoCheckPoint = // Proximo checkpoint com quem estб empatado
if(GetPlayerDistanceFromPoint(playerid, XCheckPoint,YCheckPoint, ZCheckPoint) > GetPlayerDistanceFromPoint(j,XCheckPoint, YCheckPoint, ZCheckPoint)) // Se a posiзгo do jogador em relaзгo ao checkpoint for maior do que com aquele que estб empatado acrescenta mais 1 a posiзгo
{
pos++;
}
}
}
Posicao[playerid] = pos+1;
PHP код:
|
Mano me explica melhor seu cуdigo... Porque pos й uma variбvel = para todos... Entгo sempre que AddCP[playerid] for menor que o AddCP de todos os outros esse variavel vai ganhar +1 no seu valor, o que nгo faz sentido, pois se tiver 4 player correndo e ele estiver em 2є lugar e alguem passar ele, nada vai acontecer porque o AddCP[playerid] nгo vai ser menor do que TODOS, vai ser menor somente de quem passou ele e de quem estб na frente dele na corrida
|
new pos = 0;
if(AddCP[playerid] < AddCP[i] && AlguemGanhou[Colocado[0]] == false) // Acrescenta mais 1 a posicao do jogador por cada player a frente dele
{
pos++;
}
if(AddCP[playerid] == AddCP[i]) // Caso alguem esteja empatado com o player
{
new JogadorCheckPoint = //O proximo checkpoint do player
new EmpatadoCheckPoint = // Proximo checkpoint com quem estб empatado
if(GetPlayerDistanceFromPoint(playerid, XCheckPoint,YCheckPoint, ZCheckPoint) > GetPlayerDistanceFromPoint(j,XCheckPoint, YCheckPoint, ZCheckPoint)) // Se a posiзгo do jogador em relaзгo ao checkpoint for maior do que com aquele que estб empatado acrescenta mais 1 a posiзгo
{
pos++;
}
}
Posicao[playerid] = pos+1;
new TimerPosicao[MAX_PLAYERS]
TimerPosicao[playerid] = SetTimerEx("VerificarPosicao", 500, true, "i", playerid);
KillTimer(TimerPosicao[playerid]);
Sua lуgica ta meio ruim:
Timers sгo utilizados para executar funзхes a cada X intervalo de tempo ou em certo intervalo de tempo. Vocк sу chama a funзгo "VerificarPosicao" uma vez e o intervalo nгo importa, entгo nгo й necessбrio o uso de timer. Pra fazer esse sistema de colocaзгo vocк precisa entender como se faz "sorting", jб mandei um link no outro tуpico com uma cacetada de algorнtimos sobre isso, sу escolher o que melhor se encaixa na situaзгo. O jeito mais fбcil й criar uma variбvel global pra salvar as posiзхes e, quando comeзar a corrida, colocar o id de todos os jogadores que estгo no evento dentro dela, sem pular nenhuma posiзгo. Assim vocк terб uma array com todos os corredores (por enquanto a ordem nгo importa porque ninguйm pegou checkpoint). A partir disto, quando alguйm pegar um CP vocк vai dar um loop nessa array com as posiзхes e verificar se ele passou alguйm, se sim faz a troca (swap). Talvez nгo seja o modo mais otimizado, mas й o mais fбcil |
new Y, X, CPAtual, J; for(Y = 0; Y < MAX_PLAYERS; Y++) { if(!IsPlayerConnected(Y)) continue; // Se o ID nгo tiver conectado, ignora e continua a funзгo Posicao[Y] = AddCP[Y]; // Posicao = Quantidade de CPs conquistados printf("%d %d", Posicao[Y], AddCP[Y]); } for(X = 1; X < 5; X++) // 10 seria a quant de jogadores no evento { CPAtual = Posicao[X]; J = X - 1; // J = antecessor de CPAtual while( (J >= 0) && (CPAtual < Posicao[J]) ) { Posicao[J+1] = Posicao[J]; J--; // J diminui } Posicao[J+1] = CPAtual; }
Posicao[0] = AddCP[Y]
Posicao[1] = AddCP[Y]
Posicao[0] = 5;
Posicao[1] = 10;
Posicao[2] = 15;
Acho que nгo em...
PHP код:
|
new colocados[MAX_PLAYERS] = {-1, -1, -1, ...}; //array global
//dentro da funзгo que inicia o evento (depois que o evento fecha e antes de um jogador pegar checkpoint)
//Salvar todos os jogadores do evento na array colocados[], sem pular posiзхes
for (new i = 0; i < MAX_PLAYERS; i++)
{
if (!IsPlayerConnected(i) continue;
if (!Evento[i]) continue;
for (new j=0; j < MAX_PLAYERS; j++)
{
if (colocados[j]) == -1) //Verifica se a posiзгo "j" estб disponнvel
colocados[j] = i; //Salva o id do jogador na posiзгo "j" de colocados
}
}
//Opзгo 1
VerificarPosicao() // Passa por todos os jogadores
{
new tmp, j;
for (new i = 1; i < MAX_PLAYERS; i++) //loop todos os jogadores comeзando pelo id 1
{
j = i-1; //j й a posiзгo anterior ao player que estamos (i)
while (j > -1 && AddCP[colocados[i]] > AddCP[colocados[j]] //enquando j for um id vбlido e AddCP do jogador atual (i) for maior que o anterior, ele faz a troca entre eles
{
tmp = colocados[i];
colocados[i] = colocados[j];
colocados[j] = tmp;
j--;
}
}
}
//Opзгo 2
VerificarPosicao(playerid) // Tem base no playerid
{
new tmp, j;
for (new i = 0; i < MAX_PLAYERS; i++) //loop todos os jogadores
{
if(colocados[i] == playerid) //encontra a posiзгo do playerid na array colocados
{
j = i-1; //salva a posiзгo de seu antecessor
break;
}
}
while (j > -1 && AddCP[playerid] > AddCP[colocados[j]] //enquando j for um id vбlido e AddCP do jogador atual (playerid || colocados[j+1]) for maior que o anterior (colocados[j]), ele faz a troca entre eles
{
tmp = colocados[j+1];
colocados[j+1] = colocados[j];
colocados[j] = tmp;
j--;
}
}