Usando y_iterate/foreach -
RiqueP - 30.12.2016
♥ 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 x; x < 10; ++x)
{
Console.WriteLine(x);
}
/*
Resultado
1
2
3
4
5
6
7
8
9
*/
Foreach:
PHP Code:
// Exemplo em C#
int[] lista = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
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(MinhaLista, 0); // Vai adicionar o valor 0 na minha lista
Iter_Add(MinhaLista, 1); // Vai adicionar o valor 1 na minha lista
Iter_Add(MinhaLista, 2); // Vai adicionar o valor 2 na minha lista
Iter_Add(MinhaLista, 3); // Vai adicionar o valor 3 na minha lista
Iter_Add(MinhaLista, 5); // Vai adicionar o valor 5 na minha lista
Iter_Add(MinhaLista, 8); // Vai adicionar o valor 8 na minha lista
Iter_Add(MinhaLista, 13); // Vai adicionar o valor 13 na minha lista
...
Iter_Add(MinhaLista, 20); // 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(MinhaLista, 8); // 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 i : MinhaLista)
{
if(i == 5) Iter_SafeRemove(MinhaLista, 5, i); // 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 x : 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(JogadoresOn, playerid); // Adicionei na lista 'JogadoresOn' o 'ID' do jogador que acabou de entrar
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
Iter_Remove(JogadoresOn, playerid); // Removi da lista 'JogadoresOn' o 'ID' do jogador que acabou de sair do server
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/kickartodos", cmdtext, true, 10) == 0)
{
foreach(new i : 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(playerid, cmdtext[])
{
if (strcmp("/viraradmin", cmdtext, true, 10) == 0)
{
Iter_Add(AdminsOn, playerid); // Virei admin e coloquei meu ID na lista 'AdminsOn'.
Admin[playerid] = true;
return 1;
}
if (strcmp("/admins", cmdtext, true, 10) == 0)
{
new string[128], adminname[MAX_PLAYER_NAME];
foreach(new i : AdminsOn) // Pego o ID de cada Admin
{
GetPlayerName(i, adminname, MAX_PLAYER_NAME);
SendClientMessage(playerid, "» Admin %s (ID: %d)", adminname, i);
}
return 1;
}
return 0;
}
public OnPlayerDisconnect(playerid, reason)
{
if(Admin[playerid] == true) Iter_Remove(AdminsOn, playerid); // 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.
Re: Usando y_iterate/foreach -
GM_KoDi - 30.12.2016
Boaaaaaa manolo, hehehe gostei
Respuesta: Usando y_iterate/foreach -
NobiZinhoBR - 30.12.2016
Simples mas pode ajudar muitas pessoas! xD
(Atй mesmo eu kk)
Re: Usando y_iterate/foreach - KinG7 - 30.12.2016
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
[♪♫]
Re: Usando y_iterate/foreach -
RiqueP - 30.12.2016
Quote:
Originally Posted by GM_KoDi
Boaaaaaa manolo, hehehe gostei 
|
vlw ♥♥♥♥♥♥
Quote:
Originally Posted by NobiZinhoBR
Simples mas pode ajudar muitas pessoas! xD
(Atй mesmo eu kk)
|
Entгo jб valeu a pena o tutorial
Quote:
Originally Posted by String01
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.
Respuesta: Usando y_iterate/foreach -
SammyJ - 30.12.2016
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(MinhaLista, 1); // Vai adicionar o valor 1 na minha lista
Iter_Add(MinhaLista, 1); // 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(MinhaLista, 1); // 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.
Re: Respuesta: Usando y_iterate/foreach -
RiqueP - 30.12.2016
Quote:
Originally Posted by Glederson_dom
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(MinhaLista, 1); // Vai adicionar o valor 1 na minha lista
Iter_Add(MinhaLista, 1); // 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(MinhaLista, 1); // 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.
Re: Usando y_iterate/foreach -
PT - 30.12.2016
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
Re: Usando y_iterate/foreach -
RiqueP - 30.12.2016
Quote:
Originally Posted by PT
|
Obrigado, tinha esquecido completamente dessa funзгo. Mas ja fiz um update.
E como eu disse, o tutorial й simples mas й bem claro e suficiente.
Re: Usando y_iterate/foreach -
PT - 31.12.2016
Depende do que vocк considera "suficiente" pouco se apreende a usar esta include com este tuto.