Instrução continue - L10motos - 09/10/2023
Estou terminando um sistema mais não sei qual função usar, por exemplo,
Código: for(new z = 0; z < MAX_PLAYERS; ++z) { if(IsPlayerConnected(z)) { if(gTeam[z] == gTeam[playerid]) { if(GoChase[z] == i) continue; } } }
if(GoChase[i] < MAX_PLAYERS) continue;
eu quero fazer algo parecido, quero quem tiver GoChase pule e continue as funções abaixo de GoChase,
Código: for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[i][pHeadValue] > 0)
{
//for(new z = 0; z < MAX_PLAYERS; ++z) { if(IsPlayerConnected(z)) { if(gTeam[z] == gTeam[playerid]) { if(GoChase[z] == i) continue; } } }
if(GoChase[i] < MAX_PLAYERS) continue;
searchkiller = 1;
showcontract[playerid][cont] = i;
cont++;
if(gTeam[i] == 0) format(string, sizeof(string), "%s(%d) - $%d\n", Name(i), i, PlayerInfo[i][pHeadValue]);
else format(string, sizeof(string), "%s(%d) - $%d\t(%s)\n", Name(i), i, PlayerInfo[i][pHeadValue], TeamName(gTeam[i]));
strcat(megastring, string);
ShowPlayerDialog(playerid, DIALOG_ASSASSINOS_4, DIALOG_STYLE_TABLIST_HEADERS, "Contratos disponíveis", megastring, "Confirmar", "Fechar");
}
}
}
Resumindo, se o contrato foi atribuido para um assassino (GoChase), o contrato não aparecera em contratos disponiveis.
https://ibb.co/gDXQg6D
RE: Função continue - White_Blue - 09/10/2023
1 - continue não é uma função, é uma instrução.
2 - O que a instrução continue faz é caso uma condição for verdadeira, o loop pula aquela posição.
Código PHP: if(GoChase[i] < MAX_PLAYERS) continue; // Caso o valor da variável "GoChase" for menor que MAX_PLAYERS(Constante definida como 1000 por padrão) o loop vai pular uma iteração e continuar iterando.
No entanto, não entendi a lógica, verificar se a variável "GoChase" é menor que MAX_PLAYERS não faz tanto sentido, já que está basicamente verificando se ela é menor que 1000. Talvez você queira verificar se GoChase é -1 ou se é igual a zero, depende do que você quer fazer e de como seu sistema é feito.
RE: Instrução continue - pushline - 09/10/2023
Um adendo também, seu ShowPlayerDialog tá dentro do loop, retire-o.
RE: Instrução continue - L10motos - 09/10/2023
(09/10/2023 20:35)pushline Escreveu: Um adendo também, seu ShowPlayerDialog tá dentro do loop, retire-o.
Retirei. Abaixo é o código original sem edições mais não funciona no sistema atual que fiz, eu quero que o jogador que é a vitima(GoChase) não apareça no dialog,
Citar:if(GoChase[giveplayerid] < MAX_PLAYERS) return SendClientMessage(playerid, COLOR_GREY, "Você não pode continuar porque o jogador está ocupado.");
Código PHP: for(new i = 0; i < MAX_PLAYERS; i++) { if(IsPlayerConnected(i)) { if(searchhit == 0) { if(PlayerInfo[i][pHeadValue] > 0) { new continuar = 1; if(PlayerInfo[i][pAdmin] > 0 && adminstatus[i] == 0) { continuar = 0; } if(JogadorAusente[i] != 0) { continuar = 0; } for(new z = 0; z < MAX_PLAYERS; ++z) { if(IsPlayerConnected(z)) { if(gTeam[z] == f) { if(GoChase[z] == i) { continuar = 0; } } } }
if(continuar) { if(f != gTeam[i] && TeamIsKiller(f)) { GetPlayerName(i,giveplayer,sizeof(giveplayer)); searchhit = 1; hitfound[f] = 1; hitnumber[f] = i; /////////////////////////////////////////////////////////////////////////////////////////////// SendRadioMessage(f, COLOR_BLACK, "=================================================="); SendRadioMessage(f, COLOR_GREY, " Mensagem recebida da agência: Há contratos disponíveis"); format(string,sizeof(string), " Vítima: %s(%d) Valor: R$%d",giveplayer,i,PlayerInfo[i][pHeadValue]); SendRadioMessage(f, COLOR_GREY, string); SendRadioMessage(f, COLOR_GREY, " Use 'pegarcont [id do Assassino]' para atribuir o contrato."); SendRadioMessage(f, COLOR_BLACK, "=================================================="); } } } } }
Código PHP: if(dialogid == DIALOG_ASSASSINOS_2) { if(response) { if(strval(inputtext)) { new giveplayerid = strval(inputtext); if(IsPlayerConnected(giveplayerid)) { new f = gTeam[playerid]; if(gTeam[giveplayerid] == f) { if(GoChase[giveplayerid] < MAX_PLAYERS) return SendClientMessage(playerid, COLOR_GREY, "Você não pode continuar porque o jogador está ocupado.");
if(TeamKiller(f)) { new targetid = ContractAssigned[playerid]; if(IsPlayerConnected(targetid)) { FORMAT_STR "%s atribuiu para %s matar %s ($%d).", Name(playerid), Name(giveplayerid), Name(targetid), PlayerInfo[targetid][pHeadValue]); SendRadioMessage(f, COLOR_YELLOW, string); GoChase[giveplayerid] = targetid; } } else SendClientMessage(playerid, COLOR_GREY, "Você não faz parte de nenhuma organização assassina."); } else SendClientMessage(playerid, COLOR_GREY, "Você só pode atribuir contrato a membros da organização."); } } } return 1; }
RE: Instrução continue - pushline - 09/10/2023
Código PHP: for(new i = 0; i < MAX_PLAYERS; i++) // use foreach (y_iterate) pra otimização e n precisar ficar fazendo "isplayerconnected" o tempo todo { if(IsPlayerConnected(i)) { if(searchhit == 0) { if(PlayerInfo[i][pHeadValue] > 0) { if((PlayerInfo[i][pAdmin] > 0 && adminstatus[i] == 0) || JogadorAusente[i] != 0) continue; // ou GoChase[i] == i - Não sei como eh a variavel pra fazer a verificacao... // n sei oq é o 'f' tbm if(gTeam[i] == f && GoChase[f] == i) { continue; } if(TeamIsKiller(f)) { GetPlayerName(i, giveplayer, sizeof(giveplayer)); searchhit = 1; hitfound[f] = 1; hitnumber[f] = i;
/////////////////////////////////////////////////////////////////////////////////////////////// SendRadioMessage(f, COLOR_BLACK, "=================================================="); SendRadioMessage(f, COLOR_GREY, " Mensagem recebida da agência: Há contratos disponíveis"); format(string,sizeof(string), " Vítima: %s(%d) Valor: R$%d",giveplayer, i, PlayerInfo[i][pHeadValue]); SendRadioMessage(f, COLOR_GREY, string); SendRadioMessage(f, COLOR_GREY, " Use 'pegarcont [id do Assassino]' para atribuir o contrato."); SendRadioMessage(f, COLOR_BLACK, "=================================================="); } } } } }
if(dialogid == DIALOG_ASSASSINOS_2) { if(response) { if(strval(inputtext)) { new giveplayerid = strval(inputtext); if(IsPlayerConnected(giveplayerid)) { new f = gTeam[playerid]; if(gTeam[giveplayerid] == f) { if(GoChase[giveplayerid] < MAX_PLAYERS) return SendClientMessage(playerid, COLOR_GREY, "Você não pode continuar porque o jogador está ocupado.");
if(TeamKiller(f)) { new targetid = ContractAssigned[playerid]; if(IsPlayerConnected(targetid)) { FORMAT_STR "%s atribuiu para %s matar %s ($%d).", Name(playerid), Name(giveplayerid), Name(targetid), PlayerInfo[targetid][pHeadValue]); SendRadioMessage(f, COLOR_YELLOW, string); GoChase[giveplayerid] = targetid; } } else SendClientMessage(playerid, COLOR_GREY, "Você não faz parte de nenhuma organização assassina."); } } } } }
RE: Instrução continue - leonardos08bt - 09/10/2023
Um mini Guia de loop's: (instrução continue e break):
Código: public OnGameModeInit()//Exemplo
{
// Um loop que conta de 1 a 10
for (new i = 1; i <= 10; i++)
{
// Verifica se i pode ser dividido por 2 (par)
if (i % 2 == 0)
{
// Se for par, continua para a próxima iteração
continue;
}
// Caso contrário, exiba o valor de i no console/server_log
printf("O Número %d é ímpar!, i);
// Verifica se i é igual a 7
if (i == 7)
{
// Se for igual a 7, quebra o loop
break;
}
}
return 1;
}
Um detalhe é que se eu der um return dentro do loop além do loop ser quebrado a função que foi chamada também.
|