Postado Novembro 25, 2012 12 anos Este é um post popular. << Aula 7 - Estruturas de Controle Essa aula foi escrita por um urso gordo Mock, todos os créditos pertencem à ele. While & repeat Aula 8 Primeiramente desculpe a demora por essa aula, ficou meio aquela de; ah faz você, não faz você, anem faz você; Mais em fim estamos de volta com uma coisa indispensável em scripting que são os loops. Antes de tudo devo avisa que loops são perigosos, você pode travar seu servidor inteiro usando errado um loop. Os loops são usados para inicialmente quando temos varias funções juntas iguais, por exemplo, fazendo um jogador falar oi 10 vezes. Sem os loops você faria assim: doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) doPlayerSay(cid,'oi',1) Com loops você resume isso a 4 linhas, e ainda pode fazer milhares de coisas com eles! While Sintaxe: Citar while (sentença) do (bloco) end Traduzindo: Citar enquanto (algo for verdadeiro) fazer (coisas) fim Então repare, enquanto algo for verdadeiro fazer... Ele vai executar o que estiver dentro do loop infinitas vezes até que o ((sentença)) seja falso ou você mande ele parar. Veja um exemplo: while getPlayerLevel(cid) < 10 do --- Enquanto o level for menor que 10 doPlayerAddExp(cid,1000) adcionar 1k de exp por vez end Viram? enquanto o nível for menor que 10 ele vai adicionar 1k de exp. Ele ira verificar, se for false (maior que 10) ele pula tudo e vai para o que estiver depois do end, se for true (for menor que 10) ele ira adicionar 1k de exp e depois ira verificar de novo, ele vai executar até que seja 10. Nessa hora que se tem que tomar cuidado, é na verificação. Se você colocar algo como: while 1 < 2 do, ele vai executar eternamente, até que vc encerre o programa forçadamente (ctrl-alt-del) ou reinicie o pc, ou então feche o programa no X Veja mais alguns exemplos: pos = {x=100,y=100,z=100,stackpos=0} local stack = 0 while stack < 255 do pos.stackpos = stack local item = getThingFromPos(pos) if item.itemid ~= 0 and isCreature(item.uid) == false then doRemoveItem(item.uid,item.type) end stack = stack+1 end Nesse exemplo declaramos uma pos e um numero, no loop verifica se o numero é menor que 255, se for a stackpos vai ser igual ao numero e depois ira verificar o que tem no mapa naquela posição, se tiver um item e nao for um player ou monster ele ira remover o item e no final adcionar +1 numero a nossa variavel stack, Nisso repare, ele ira executar 255 veze e ira deletar todos os items daquela posição imagina vc escrevendo isso 255 vezes sem o loop . Repeat Ao contrario do while ele é tudo ao contrario, a verificação é no fim e ele só repete se for false (contrario de while que é se for true) Sintaxe: Citar repeat (bloco) until (sentença) Tradução: Citar repetir (coisas) até (bloco) Bem nao seria até seria até que nao, pois se você usar: until true ele vai parar, e se usar: until false ele vai continuar. è ao contrario especificando mais. Diferente do while, o repeat ele executa primeiro o bloco para depois verificar, a verificação é no final. Tambem perigoso pois se usado incorretamente vc vai travar seu server tambem. Mais nao ligue pra isso todos que começam a mexer com loops sempre travam seus servidores no começo é normal. Veja o repeat em uso: local n = 0 repeat n = n+1 print('ola pessoas este é o loop numero:'..n) until n == 10 Ele ira executar 10 vezes, ele ira parar quando n for 10. Agora veja o exemplo de limpar o char adaptado para o repeat e veja a diferença (repare nos sinais de > e< ) pos = {x=100,y=100,z=100,stackpos=0} local stack = 0 repeat pos.stackpos = stack local item = getThingFromPos(pos) if item.itemid ~= 0 and isCreature(item.uid) == false then doRemoveItem(item.uid,item.type) end stack = stack+1 until stack > 255 Viram? Ao invez da verificação ser no começo do loop ela é feita no final, entao ao final do lopp antes da verificação eu adciono +1 no valor da variavel stack, e ele so ira parar o loop assim que stack for maior que 255 (ou seja 256), entao assim que o script dentro do loop temrinar com o valor 256 ele ira parar o loop e prosseguir com o resto do script. break Antes de terminarmos irei falar rapidamente sobre o break. Ele é usado APENAS em loops e serve para "quebrar" o loop, acontece quando vc quer parar o loop sem a verificação, ou parar antes de algo. Veja: local parar = 0 while os.date('%S') == '45' do print('Verificando se agora são 45 segundos') if parar > 25 then break end print('Nem é agora são:'..os.date('%S')..' segundos') parar = para+1 end print('oi') Nesse caso criei um script para ver se agora são X horas X minutos e 45 segundos (não importa quantas horas e minutos só os segundos), e se depois de 25 verificações não for 45 segundos ele ira usar o break. Quando usado ele ira finalizar o loop e irar continuar a executar o script depois do loop, no caso o print('oi') ai e o resto do script (caso exista) Nesse caso criei um script para ver se agora são X horas X minutos e 45 segundos (não importa quantas horas e minutos só os segundos), e se depois de 25 verificações não for 45 segundos ele ira usar o break. Quando usado ele ira finalizar o loop e irar continuar a executar o script depois do loop, no caso o print('oi') ai e o resto do script (caso exista) Exercícios Faça seguinte: Crie um loop que execute enquanto o player estiver online, e enquanto ele estiver online colocar para kickar ele. Use o repeat para criar um script que solte 25 magic effects diferentes. Use qualquer loop para criar um script que mova um player por 5 sqms em direções aleatórios (o script deve parar com o break!) DESAFIO Crie um script que gere um loop infinito que só pare depois de 10 segundos de execução. Essa aula foi escrita por um urso gordo Mock, todos os créditos pertencem à ele. Aula 9 - Tabelas >> Respostas: Spoiler 1. while isPlayer(cid) == true do doRemoveCreature(cid) end 2. local efect = 0 repeat doSendMagicEffect({x=100,y=100,z=7},efect) efect = efect+1 until efect > 25 3. local times = 0 while true do doMoveCreature(cid,math.random(0,3)) times = times+1 if times > 4 then break end end Desafio: Spoiler local time = 10 --- segundos time = time+os.clock() while true do if time <= os.clock() then break end end Editado Setembro 10, 2020 4 anos por MaXwEllDeN (veja o histórico de edições) -"Supra Omnes Lux Lucis" - Acima de todos brilha a Luz -
Postado Setembro 14, 2014 10 anos Aaaaaaaaaah . esses exercicios to errando tudo... kkk a aula ta muito boa... so acho que esses exercicios teve coisas que eu nem sabia como :time = time+os.clock() doSendMagicEffect Cheguei a inventar Magic_efect kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Postado Fevereiro 13, 2018 7 anos desculpa reviver o topico, mas tenho uma duvida. toda vez q eu quiser relacionar tempo as scripts tenho que usar essa linha de codigo? time = time+os.clock() se no caso fosse uma hora, teria q por o time = 3600? se eu quiser printar isso e só eu por print('%S')?
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.