[Tutorial] Usando y_iterate/foreach
#1

♥ Introduзгo
  • * Esse tutorial й destinado para quem jб possui conhecimentos bбsicos/intermediбrios em programaзгo.

    Antigamente, quando eu utilizava a biblioteca YSI, eu tinha imensa dificuldade em aprender a utilizar outras includes que existiam na biblioteca. Eu utilizava y_commands na йpoca e era muita burrice carregar uma biblioteca tгo grande para usar 2, 3 funзхes. Mas hoje, isso nгo й mais um problema para mim, entгo quero ajudar vocкs que nгo conhecem ou querem conhecer um pouco mais sobre essa biblioteca e assim aproveita-la mais.
♥ Foreach
  • Foreach й uma estrutura de repetiзгo (loop) que existe em outras linguagens de programaзгo como o C# por exemplo. A diferenзa dessa estrutura de repetiзгo й que ela vai percorrer uma lista. Ela nгo й usada para funcionar como um contador como geralmente o for й usado.

    For:
    PHP Code:

    // Exemplo em C#
    for(int x10; ++x)
    {
        
    Console.WriteLine(x);
    }
    /*
    Resultado
    1
    2
    3
    4
    5
    6
    7
    8
    9
    */ 
    Foreach:
    PHP Code:

    // Exemplo em C#
    int[] lista = new int[] { 011235813 };
    foreach (
    int x in lista)
    {
        
    Console.WriteLine(x);
    }
    /*
    Resultado
    0
    1
    1
    2
    3
    5
    8
    13
    */ 
    Vocк deve estar se perguntado, "Como isso pode me beneficiar?". Vocк pode montar listas em seu servidor como por exemplo: players que estгo spawnados, players que estгo mortos, veiculos criados, veiculos que pertencem aos policias, etc. Se vocк montar uma lista por exemplo, dos jogadores que efetuaram o login, vocк nгo vai mais precisar usar o MAX_PLAYERS em seu loop. Como ele nгo vai percorrer o ID dos jogadores que nгo estгo logados vocк vai economizar mais tempo no loop.
♥ Criando e gerenciando uma lista
  • Vou procurar ser o mais claro possнvel sobre as funзхes, vou tentar explicar todas as funзхes essenciais para a criaзгo e administraзгo de suas listas. Qualquer dъvida sera respondida, exceto perguntas extremamente idiotas.

    1° Incluindo: Antes de iniciar com o cуdigo, vocк deve baixar e importar o foreach ao seu projeto (lembre-se de ter a YSI e o Foreach).
    PHP Code:
    #include <foreach> 
    2° Criando uma lista: A segunda coisa a se fazer й declarar uma variбvel para a identificaзгo de sua lista. As variбveis devem ser declaradas com prй-fixo 'Iterator:' e devem possuir entre <> o valor mбximo dos itens que vai haver na lista +1.
    PHP Code:
    new Iterator:MinhaLista<21>; // Haverб uma lista com 20 slots, logo o valor mбximo que se pode ter incluido na lista й 20. 
    3є Adicionando itens: O terceiro passo apуs a lista ser criada й adicionar coisas a ela. Vocк pode adicionar itens em sua lista utilizando a funзгo 'Iter_Add'.
    PHP Code:
    Iter_Add(MinhaLista0); // Vai adicionar o valor 0 na minha lista
    Iter_Add(MinhaLista1); // Vai adicionar o valor 1 na minha lista
    Iter_Add(MinhaLista2); // Vai adicionar o valor 2 na minha lista
    Iter_Add(MinhaLista3); // Vai adicionar o valor 3 na minha lista
    Iter_Add(MinhaLista5); // Vai adicionar o valor 5 na minha lista
    Iter_Add(MinhaLista8); // Vai adicionar o valor 8 na minha lista
    Iter_Add(MinhaLista13); // Vai adicionar o valor 13 na minha lista
    ...
    Iter_Add(MinhaLista20); // Vai adicionar o valor 20 na minha lista (como definido a cima esse й o valor mбximo da lista) 
    4° Removendo itens: Caso vocк queira remover qualquer item que esteja em sua lista, basta apenas usar a funзгo 'Iter_Remove'.
    PHP Code:
    Iter_Remove(MinhaLista8); // Vai remover o valor 8 da minha lista 
    5° Total de itens: Vocк tambйm pode ver quantos itens tem na sua lista usando a funзгo 'Iter_Count'.
    PHP Code:
    new itens Iter_Count(MinhaLista);
    printf("Minha lista tem %d itens"itens); 
    * 6є Removendo itens em um loop: Se usarmos a funзгo Iter_Remove no meio de loop, vai acontecer que alйm de remover o item da lista, o loop serб parado. Porйm, existe uma funзгo que pode remover o item e o loop continuar percorrendo normalmente ignorando esse item. Usando a funзгo 'Iter_SafeRemove'.
    PHP Code:
    {
        foreach(new 
    MinhaLista)
        {
            if(
    == 5Iter_SafeRemove(MinhaLista5i); // Vai remover da 'MinhaLista' o item que possuн o valor 5
            
    else
            {
                
    //...
            
    }
        }

    O ultimo parвmetro da funзгo й uma referкncia a variбvel do loop, no caso ali em cima, a variбvel i.
♥ Usando a funзгo foreach
  • Logo apуs vocк ter montado sua lista, vocк provavelmente vai estar querendo acessar os valores da sua lista certo? pois bem, й ai que entra a funзгo foreach.

    A sintaxe da funзгo й a seguinte.
    PHP Code:
    foreach(new MinhaLista
    {
        
    //...

    Nгo existe muito o que falar, a sintaxe й totalmente clara se vocк jб sabe utilizar um loop. Se vocк nгo sabe usar o loop te recomendo esse tutorial.
♥ Prбtica
  • Vamos a uma aula prбtica aplicando tudo que vocк aprendeu nesse tуpico, okay ?

    Vou fazer com que o loop percorra apenas os jogadores conectados.
    PHP Code:
    new Iterator:JogadoresOn<MAX_PLAYERS+1>; // Criei uma lista
    public OnPlayerConnect(playerid)
    {
        
    Iter_Add(JogadoresOnplayerid); // Adicionei na lista 'JogadoresOn' o 'ID' do jogador que acabou de entrar
        
    return 1;
    }
    public 
    OnPlayerDisconnect(playeridreason)
    {
        
    Iter_Remove(JogadoresOnplayerid); // Removi da lista 'JogadoresOn' o 'ID' do jogador que acabou de sair do server
        
    return 1;
    }
    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if (
    strcmp("/kickartodos"cmdtexttrue10) == 0)
        {
            foreach(new 
    JogadoresOn)
            {
                
    Kick(i); // Kickei todos os jogadores que estavam online
            
    }
            return 
    1;
        }
        return 
    0;

    Vou fazer tambйm com que o loop percorra todos os admins conectados.
    PHP Code:
    new Iterator:AdminsOn<MAX_PLAYERS+1>; // Criei uma lista
    public OnPlayerCommandText(playeridcmdtext[])
    {
        if (
    strcmp("/viraradmin"cmdtexttrue10) == 0)
        {
            
    Iter_Add(AdminsOnplayerid); // Virei admin e coloquei meu ID na lista 'AdminsOn'.
            
    Admin[playerid] = true;
            return 
    1;
        }
        if (
    strcmp("/admins"cmdtexttrue10) == 0)
        {
            new 
    string[128], adminname[MAX_PLAYER_NAME];
            foreach(new 
    AdminsOn// Pego o ID de cada Admin
            
    {
                
    GetPlayerName(iadminnameMAX_PLAYER_NAME);
                
    SendClientMessage(playerid"» Admin %s (ID: %d)"adminnamei);
            }
            return 
    1;
        }
        return 
    0;
    }
    public 
    OnPlayerDisconnect(playeridreason)
    {
        if(
    Admin[playerid] == trueIter_Remove(AdminsOnplayerid); // Removi da lista 'AdminsOn' o 'ID' do jogador que acabou de sair do server
        
    return 1;

♥ Notas finais
  • ♪ Foi uma explicaзгo bem simples, mas procurei ser bem objetivo e claro.
    ♪ Nгo procurei escrever de forma muito formal e provavelmente haverб erros de escrita, mas os que forem reportados vou corrigir.
    ♪ Qualquer dъvida estarei respondendo
    ♪ Existem muitas outras funзхes, mas ensinei as mais simples porйm suficientes para poderem utiliza-lб. Vocк pode ver um tutorial mais completo (Inglкs) clicando aqui.
    ♪ Uma lista que salva o nome de todos os jogadores conectados jб estб definida nativamente pelo foreach. O nome da lista й 'Player'.
    ♪ Existem tambйm outras includes que vocк tambйm poderб criar listas e realizar as mesmas funзхes, basta dar uma procuradinha pelo fуrum.

Reply
#2

Boaaaaaa manolo, hehehe gostei
Reply
#3

Simples mas pode ajudar muitas pessoas! xD
(Atй mesmo eu kk)
Reply
#4

Booaa, vou comeзar a usar!
bateu atй uma vontade de conhecer mais, a biblioteca YSI, tenho aqui tambйm, e sу usava o Y_Hook
[♪♫]
Reply
#5

Quote:
Originally Posted by GM_KoDi
View Post
Boaaaaaa manolo, hehehe gostei
vlw ♥♥♥♥♥♥
Quote:
Originally Posted by NobiZinhoBR
View Post
Simples mas pode ajudar muitas pessoas! xD
(Atй mesmo eu kk)
Entгo jб valeu a pena o tutorial
Quote:
Originally Posted by String01
View Post
Booaa, vou comeзar a usar!
bateu atй uma vontade de conhecer mais, a biblioteca YSI, tenho aqui tambйm, e sу usava o Y_Hook
[♪♫]
Й uma boa biblioteca. Talvez eu lance hoje atй 2 tutoriais, mas nгo serгo sobre ela diretamente.
Reply
#6

Bom tuto RiqueP, Agora posso usar a include foreach para outros loops, nгo somente por Player kk.

@duvida

Adicionei 2 valores na lista iguais.
PHP Code:
Iter_Add(MinhaLista1); // Vai adicionar o valor 1 na minha lista 
Iter_Add(MinhaLista1); // Vai adicionar o valor 1 na minha lista 
Se eu remover o valor 1 da lista, ele vai remover os dois?
PHP Code:
Iter_Remove(MinhaLista1); // vai remover o valor 1 da minha lista. 
obs: Eu poderia fazer um debug, mas estou no trabalho no momento, e visto que vocк estб online, estou perguntando a ti. Obrigado desde jб.

@edit desculpa se a pergunta parece meio tosca kk.
Reply
#7

Quote:
Originally Posted by Glederson_dom
View Post
Bom tuto RiqueP, Agora posso usar a include foreach para outros loops, nгo somente por Player kk.

@duvida

Adicionei 2 valores na lista iguais.
PHP Code:
Iter_Add(MinhaLista1); // Vai adicionar o valor 1 na minha lista 
Iter_Add(MinhaLista1); // Vai adicionar o valor 1 na minha lista 
Se eu remover o valor 1 da lista, ele vai remover os dois?
PHP Code:
Iter_Remove(MinhaLista1); // vai remover o valor 1 da minha lista. 
obs: Eu poderia fazer um debug, mas estou no trabalho no momento, e visto que vocк estб online, estou perguntando a ti. Obrigado desde jб.

@edit desculpa se a pergunta parece meio tosca kk.
De boa, HEUHEU. Sim, vai remover os 2.
Reply
#8

Esta muito vago o tutorial...

Esqueceu de falar que em loops й preciso usar Iter_SafeRemove..

Tambem tem no meu tutorial alguma coisa sobre o assunto...

Deixo para quem quiser: https://sampforum.blast.hk/showthread.php?tid=493276
Reply
#9

Quote:
Originally Posted by PT
View Post
Esta muito vago o tutorial...

Esqueceu de falar que em loops й preciso usar Iter_SafeRemove..

Tambem tem no meu tutorial alguma coisa sobre o assunto...

Deixo para quem quiser: https://sampforum.blast.hk/showthread.php?tid=493276
Obrigado, tinha esquecido completamente dessa funзгo. Mas ja fiz um update.

E como eu disse, o tutorial й simples mas й bem claro e suficiente.
Reply
#10

Depende do que vocк considera "suficiente" pouco se apreende a usar esta include com este tuto.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)