SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 30/12/2016, 12:28 AM   #1
RiqueP
Gangsta
 
RiqueP's Avatar
 
Join Date: Jan 2014
Location: 01010011 01010000
Posts: 875
Reputation: 66
Post Usando y_iterate/foreach

♥ 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.



Last edited by RiqueP; 10/08/2017 at 08:33 PM.
RiqueP is offline   Reply With Quote
Old 30/12/2016, 01:53 AM   #2
GM_KoDi
Gangsta
 
GM_KoDi's Avatar
 
Join Date: Oct 2012
Location: Brazil
Posts: 824
Reputation: 266
Default Re: Usando y_iterate/foreach

Boaaaaaa manolo, hehehe gostei
__________________
Skills with GTA SA and SA-MP
[✔] TextDraws [✔] Mapper [✔] 3D Modeler [✔] Pawn Scripts [✔] Cleo Scripts

GM_KoDi is offline   Reply With Quote
Old 30/12/2016, 03:07 AM   #3
NobiZinhoBR
Little Clucker
 
Join Date: Sep 2015
Posts: 45
Reputation: 3
Default Respuesta: Usando y_iterate/foreach

Simples mas pode ajudar muitas pessoas! xD
(Até mesmo eu kk)
__________________
Vida Online SA:MP
(Algum dia eu termino )
NobiZinhoBR is offline   Reply With Quote
Old 30/12/2016, 11:57 AM   #4
KinG7
Guest
 
Posts: n/a
Default Re: Usando y_iterate/foreach

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 With Quote
Old 30/12/2016, 12:26 PM   #5
RiqueP
Gangsta
 
RiqueP's Avatar
 
Join Date: Jan 2014
Location: 01010011 01010000
Posts: 875
Reputation: 66
Default Re: Usando y_iterate/foreach

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.
RiqueP is offline   Reply With Quote
Old 30/12/2016, 12:40 PM   #6
SammyJ
Gangsta
 
SammyJ's Avatar
 
Join Date: May 2015
Location: Rio de Janeiro
Posts: 811
Reputation: 71
Default Respuesta: Usando y_iterate/foreach

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.
__________________
SammyJ is offline   Reply With Quote
Old 30/12/2016, 12:48 PM   #7
RiqueP
Gangsta
 
RiqueP's Avatar
 
Join Date: Jan 2014
Location: 01010011 01010000
Posts: 875
Reputation: 66
Default Re: Respuesta: Usando y_iterate/foreach

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.

Last edited by RiqueP; 30/12/2016 at 03:38 PM.
RiqueP is offline   Reply With Quote
Old 30/12/2016, 08:31 PM   #8
PT
Godfather
 
PT's Avatar
 
Join Date: Nov 2012
Location: Europe
Posts: 7,180
Reputation: 803
Default Re: Usando y_iterate/foreach

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: http://forum.sa-mp.com/showthread.php?t=493276
PT is offline   Reply With Quote
Old 30/12/2016, 10:09 PM   #9
RiqueP
Gangsta
 
RiqueP's Avatar
 
Join Date: Jan 2014
Location: 01010011 01010000
Posts: 875
Reputation: 66
Default Re: Usando y_iterate/foreach

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: http://forum.sa-mp.com/showthread.php?t=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.
RiqueP is offline   Reply With Quote
Old 31/12/2016, 09:59 AM   #10
PT
Godfather
 
PT's Avatar
 
Join Date: Nov 2012
Location: Europe
Posts: 7,180
Reputation: 803
Default Re: Usando y_iterate/foreach

Depende do que você considera "suficiente" pouco se apreende a usar esta include com este tuto.
PT is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Tutorial] Advanced Iterators (foreach/y_iterate). Ada32 Tutorials 8 10/04/2018 12:08 AM
[Tutorial] y_iterate (foreach 3.0) Misiur Tutorials 25 19/09/2017 09:17 PM
foreach (y_iterate) - select random player from the same team. Arthurillo Scripting Help 7 10/09/2016 01:48 AM


All times are GMT. The time now is 07:21 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.