Fala galerinha do XTibia.com!
Como tenho visto poucos tutoriais de nível avançado na nossa sessão de scripting, decidi fazer este tutorial completo sobre loops em LUA.
Basicamente, existem 3 tipos de loops que podem ser usados, os quais são: repeat ... until, while e for.
Recomendações:
-Conhecimento completo sobre Arrays;
-Conhecimento intermediário sobre LUA OFF-OpenTibia
Repeat Loop
Este é raro de se ver, já que ele tem uma sintaxe maior e faz a mesma coisa que o while.
A sua sintaxe é a seguinte:
local var = 0
function bla()
repeat
script
var = var+1
until var == 10
end
end
Este tipo de loop funciona da seguinte maneira:
Você tem uma variável para a qual você atribui o valor 0.
Então, você da o comando repeat, o qual irá repetir o código.
Para que o loop não seja infinito, você terá que adicionar a linha until var == valor, e antes disso, algo que aumente o valor da variável, no nosso caso, foi usado var = var+1, o que, após o script ter sido executado, irá aumentar o valor da variável var em um.
Um exemplo de OpenTibia:
local var = 0function onUse(cid, item)local rand = math.random(1, 10)repeatdoPlayerSay(cid, rand, 2)var = var+1until var == 5return trueend
Isso fará com que o player fale um número qualquer (randomizado pelo math.random) até que a variável var tenha valor 5.
Como pôde perceber, esse tipo de loop é um pouco complicado, já que você tem que aumentar a variável e para se fechar o loop você precisa colocar uma 'função' (until var == 5) para que ele termine.
While Loop
Esse, mesmo que pouco usado, ainda é usado atualmente.
Ele funciona quase da mesma maneira que o repeat, a não ser pelo fato de que não existe o until var == valor.
A sua sintaxe é a seguinte:
local var = 0
function Bla()
while var < 5 do
script
var == var+1
end
end
Neste caso, você terá que adicionar um end no lugar do until, mas percebam que ainda é preciso usar o var == var+1.
Um exemplo de OpenTibia:
local var = 0function onUse(cid, item)while var < 5 dodoPlayerSay(cid, "I'm crazy!", 2)var == var+1endend
Este script fará com que o player fale I'm Crazy 5 vezes (ou até a varíavel var estar com o mesmo valor citado no início do loop).
Você pode usar ele para criar um script após o final do while. Por exemplo, depois que ele falar as 5 vezes, ele morrerá de cansaço.
For Loop
Este, na minha opinião pessoal, é o melhor e mais flexível tipo de loop em LUA, porém não funciona com nenhuma condição (ele simplesmente vai repetir até o valor estipulado).
Com ele, você consegue checar cada item de uma tabela, podendo ser nomes, posições, ou qualquer outra coisa.
A sua sintaxe é uma das mais fáceis:
function Bla()
for index = a, b do
print("Hey, you there!")
end
end
Você pode substituir a palavra index por qualquer outra coisa.
Para determinar o valor inicial e o valor máximo à ser usado, você troca a letra a pelo valor mínimo e b pelo valor máximo.
Caso você queira checar cada item de uma tabela, você fará da seguinte maneira:
local table = {"Me", "You", "They"}
function Bla()
for i = 1, #table do
print(i)
end
end
Isso vai exibir na tela do usuário as seguintes palavras:
Me
You
They
Você pode usá-lo para repetir algum código.
Por exemplo, caso você queira esvaziar a sua array sem ter que 'chutar' quantos valores ela vai ter e sem repetir o código, o que você pode fazer, é usar o loop!
local names = {"Me", "You", "He"}function Bla()for i = 1, #names dotable.remove(names, i)endend
Isso irá remover todos os nomes da tabela, sem ter que repetir o código!
Um exemplo de OpenTibia:
20 Itens dentro de uma backpack!
Você também pode parar o loop após ele ter efetuado a sua ação, tudo que você tem à fazer, é adicionar o comando break (quebrar) após o seu código.
Um exemplo muito interessante (não é de minha autoria, e sim de Colandus), é um script que checa uma área e atribui um valor à uma variável se estiver (o tile) vazio ou com algum player.
local position = {fromx = 584, fromy = 371, tox = 595, toy = 381, z = 7}local area = ""function onUse(cid, item, frompos, item2, topos)area = "Creatures at area:\n"for i = position.fromy, position.toy dofor j = position.fromx, position.tox dolocal pos = {x = j, y = i, z = position.z, stackpos = 253}local getThing = getThingfromPos(pos).uidif isCreature(getThing) == 1 thenarea = area .. "1 "elsearea = area .. "0 "endendarea = area .. "\n"enddoPlayerSendTextMessage(cid, 17, area)return 1end
Você também pode usar Iterators com um loop for.
Para isso, farei um tutorial mais tarde!
\\