Portal SAMP
[Ajuda] Instrução continue - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Instrução continue (/showthread.php?tid=4053)



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(playeridCOLOR_GREY"Você não pode continuar porque o jogador está ocupado.");

Código PHP:
for(new 0MAX_PLAYERSi++)
{
if(
IsPlayerConnected(i))
{
    if(searchhit == 0)
    {
    if(PlayerInfo[i][pHeadValue] > 0)
    {
        new continuar 1;
        if(PlayerInfo[i][pAdmin] > && adminstatus[i] == 0)
        {
            continuar 0;
        }
        if(JogadorAusente[i] != 0)
        {
            continuar 0;
        }
        for(new 0MAX_PLAYERS; ++z) { if(IsPlayerConnected(z)) { if(gTeam[z] == f) { if(GoChase[z] == i) { continuar 0; } } } }

        if(continuar)
        {
            if(!= gTeam[i] && TeamIsKiller(f))
            {
                            GetPlayerName(i,giveplayer,sizeof(giveplayer)); searchhit 1hitfound[f] = 1hitnumber[f] = i;
        ///////////////////////////////////////////////////////////////////////////////////////////////
SendRadioMessage(fCOLOR_BLACK"==================================================");
SendRadioMessage(fCOLOR_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(fCOLOR_GREYstring);
SendRadioMessage(fCOLOR_GREY"  Use 'pegarcont [id do Assassino]' para atribuir o contrato.");
SendRadioMessage(fCOLOR_BLACK"==================================================");
            }
}
    }
}


Código PHP:
    if(dialogid == DIALOG_ASSASSINOS_2)
    {
    
    if(response)
        {
    
        if(strval(inputtext))
            {
                new 
giveplayerid strval(inputtext);
        
        if(IsPlayerConnected(giveplayerid))
        
          {
                       new gTeam[playerid];
            
          if(gTeam[giveplayerid] == f)
            
        {
            
            if(GoChase[giveplayerid] < MAX_PLAYERS) return SendClientMessage(playeridCOLOR_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(fCOLOR_YELLOWstring);
            
                    GoChase[giveplayerid] = targetid;
                            }
            
            }
            
            else SendClientMessage(playeridCOLOR_GREY"Você não faz parte de nenhuma organização assassina.");
                    }
                    else 
SendClientMessage(playeridCOLOR_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 0MAX_PLAYERSi++) // 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] > && 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] == && GoChase[f] == i)
                {
                    continue;
                }
                
                
if(TeamIsKiller(f))
                {
                    GetPlayerName(igiveplayersizeof(giveplayer)); 
                    searchhit 1hitfound[f] = 1hitnumber[f] = i;

                    ///////////////////////////////////////////////////////////////////////////////////////////////
                    SendRadioMessage(fCOLOR_BLACK"==================================================");
                    SendRadioMessage(fCOLOR_GREY"  Mensagem recebida da agência: Há contratos disponíveis");
                    format(string,sizeof(string), "  Vítima: %s(%d)  Valor: R$%d",giveplayeriPlayerInfo[i][pHeadValue]);
                    SendRadioMessage(fCOLOR_GREYstring);
                    SendRadioMessage(fCOLOR_GREY"  Use 'pegarcont [id do Assassino]' para atribuir o contrato.");
                    SendRadioMessage(fCOLOR_BLACK"==================================================");
                }
            }
        }
    
}


if(
dialogid == DIALOG_ASSASSINOS_2)
{
    if(response)
    {
        if(strval(inputtext))
        {
            new giveplayerid strval(inputtext);
            if(IsPlayerConnected(giveplayerid))
            {
                new gTeam[playerid];
                if(gTeam[giveplayerid] == f)
                {
                    if(GoChase[giveplayerid] < MAX_PLAYERS) return SendClientMessage(playeridCOLOR_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(fCOLOR_YELLOWstring);
                            GoChase[giveplayerid] = targetid;
                        }
                    }
                    else SendClientMessage(playeridCOLOR_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.