Gostaria de fazer parte da equipe do xTibia? Ajude a comunidade tibiana, faça a diferença entre os membros. Acesse o tópico aqui e participe :)

Welcome to xTibia - Sua comunidade de Otserv e Tibia

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

Poccnn

tfs 0.3 Tutorial Coroutine Lua

Fala Xtibianos. 
Nesse tutorial, gostaria de explicar um pouco sobre coroutine e seu uso. 

 

Irei começar com uma lista de funções da coroutine. 

Citar

coroutine.create (f)               cria uma nova coroutine com uma função lua valida. 
coroutine.yield (···)                suspende a execução da coroutine. 
coroutine.resume (co [, val1, ···])    passa os valores para a coroutine. 
coroutine.running ()                pega a coroutine que esteja em execução. 
coroutine.status (co)                return "suspended", "running" ou "dead"
coroutine.wrap (f)                   cria uma nova coroutine no corpo com uma função lua valida. 

 

Irei começa falando sobre a principal função da coroutine. 

Citar

coroutine.create (f) 

 

No corpo dessa função, voce precisa declarar pontos para "suspender" a execução da coroutine. 

 

Ao criar a coroutine, ela se encontra no estado "suspended", ou seja, parada/pausada. 


para iniciar a coroutine, voce precisa ativar ela usando a função: 

Citar

coroutine.resume (co [, val1, ···]) 

 

Além de ativar/reativar a coroutine, você passa valores para a função da coroutine. 
A primeira ativação da coroutine, os argumentos passados não poderão ser modificados, ficam estáticos nos parâmetros da função. 

 

Citar

 

co = coroutine.create(function(a,b) 
-- verificando o estatus da coroutine. 
   print(coroutine.status(coroutine.running())) -- "running" 
   coroutine.yield(a+b) -- primeira chamada 
   coroutine.yield(a-b) -- segunda chamada 
   return a,b,"Fim da coroutine." -- chamada final usando return (facultativo). 
end) 

 

-- verificando o estatus da coroutine. 
print(coroutine.status(co))       -- "suspended" 
print(coroutine.resume(co,5,2))    -- saida >> 7 >> 5+2 
print(coroutine.resume(co,1,8))    -- saida >> 3 >> ??? 1-8 = -7 
print(coroutine.resume(co,9,55))   -- saida >> 5,2, Fim da coroutine. >> veja que são os valores passados na primeira chamada. 
-- verificando o estatus da coroutine. 
print(coroutine.status(co))       -- "dead" 

 

 

Veja que o resultado da segunda chamada não coincidem com os valores passados. Isso se dá devido aos parâmetros da função impregada na coroutine, não modificar seus valores. uma vez declarados os valores, eles não poderão ser modificados. 

 

uma chamada de coroutine a mais da quantidade de yield's existente na coroutine.

Citar

print(coroutine.resume(co,9,55))   -- saida >> cannot resume dead coroutine

 

Como demonstrado acima, ao exceder a quantidade de yield's, ela retorna essa mensagem (sem disparar erro no console). 

 

Agora você deva estar se perguntando: Então como fazer para pegar os valores que são passados em cada ativação? 


Vou explicar agora: 

a função yield pega os valores fornecidos e retorna-os; então você pode pegar esses valores usando variaveis para armazena-los. 

Citar

 

co = coroutine.create(function(a,b) 
   b,c = coroutine.yield(a+b) -- primeira chamada 
   c,d = coroutine.yield(b-c) -- segunda chamada. veja que modifiquei os parametros usados. 
   return c,d,"Fim da coroutine." -- chamada final usando return (facultativo). 
end) 

print(coroutine.resume(co,5,2))    -- saida >> 7 >> 5+2 
print(coroutine.resume(co,1,8))    -- saida >> -7 >> 1-8 << agora o resultado está certo, pois foi usados os valores passados pela segunda chamada. 
print(coroutine.resume(co,9,55))   -- saida >> 9,55, Fim da coroutine. << os dois numerais, são os valores passados na ultima chamada.

 

 

 

Mas, no corpo da função criada para a coroutine, você pode fazer chamadas a funções, pegar valores de variaveis globais, etc; sempre usando a função yield para "suspender" a coroutine. 

 

Citar

 

function add(a,b) 
   return coroutine.yield(a+b,"Valor retornado pela função add()") 
end 

m,n = 2,3 

co = coroutine.create(function(a,b) 
   c,d = add(a,b) 
   e,f = add(m,n) 
   return e,f, "Fim da coroutine." -- retorna os valores da ultima chamada. 
end) 

print(coroutine.resume(co,5,2))    -- saida >> 7, "Valor retornado pela função add()" >> 5+2 
print(coroutine.resume(co,1,8))    -- saida >> 5 >> "Valor retornado pela função add()" >> valores pegos das variaveis externa 'm' e 'n' >> 2+3 
print(coroutine.resume(co,9,55))   -- saida >> 9,55, Fim da coroutine. << os dois numerais, são os valores passados na ultima chamada.

 

 

Agora só falta comentar sobre a função: 

Citar

coroutine.wrap(f)

 
Assim como coroutine.create, a função auxiliar coroutine.wrap cria uma nova co-rotina, mas ao invés de retornar uma referência para a co-rotina, retorna uma função que, quando chamada, (re)invoca a co- rotina. 


De forma geral, a função coroutine.wrap oferece uma maior conveniência que coroutine.create; ela provê exatamente o que é usualmente necessario: uma função para reativar uma co-rotina. Por outro lado, o uso das funções coroutine.create e coroutine.resume permite o gerenciamento de erros (funções estas que não podem ser usada por wrap). 

 

Citar

 

-- fatorar o valor 
function fatorar(n) 
   if n > 1 then 
      coroutine.yield(n) 
      fatorar(n/2) -- recursividade 
   end 
end 

-- iterador 
iterator = coroutine.wrap(function(value) 
      fatorar(value) 
   end) 

print(iterator(32)) -- 32 
print(iterator())   -- 16 
print(iterator())   -- 8 
print(iterator())   -- 4 
print(iterator())   -- 2 
print(iterator())   -- 1 
print(iterator())   -- Disparado erro com mensagem: "cannot resume dead coroutine". 

 


A função retornada por coroutine.wrap não captura erros; qualquer erro provocado pela execução da co-rotina é propagado a seu chamador. 

 

É isso ai pessoal, espero que tenham gostado. qualquer duvida, sugestão ou critica, deixem nos comentários. 
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom @Poccnn, sempre trazendo boas novidades relacionada a área de lua.

 

Queria eu poder exercer, mas é tenso aprender só :S.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Poccnn disse:

@kttallan

Qual sua dificuldade em aprender? 

Bom eu fazia codigos antigamente, participei da primeira escolinha de scripting do xtibia a qual o roksas era o professor aprendi tudo até criar funções, hoje sei da logica só que não sei muito sobre.

 

For, While e Repeat e Strings, Table, Creio que o resto eu saiba como criar funções etcs..

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigao vc e genial porem sou um pouco leigo na area de programação.. poderia me explicar oque seria coroutine e em que tipo de situação é aplicado?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 08/12/2016 at 21:33, newFag disse:

O que é uma corrotina em lua? É tipo um thread?

 

Não é uma thread. É um processo executado em modo separado.

 

1 hora atrás, Everson Miranda disse:

amigao vc e genial porem sou um pouco leigo na area de programação.. poderia me explicar oque seria coroutine e em que tipo de situação é aplicado?

 

Coroutine é uma forma de criar um processo que oode parar sua execução a qualquer momento e podendo retornar a execução a pedido do sistema.

É difícil fazer uma implementação dela no mundo do ot server, mas eu fiz essa:

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro membro,

Seu tópico foi movido de

Registre-se para ver link(s).

 para

Registre-se para ver link(s).

.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora


  • Conteúdo Similar

    • Por Poccnn
      Hail Xtibianos.
      Eu estava/estou atualizando alguns scripts meus bem antigos, então resolvi compartilhar para vocês que priorizam um jogo mais ao estilo: segunda vida na idade média. 
       
      Bom... tu terás que fazer uma sala parecida como essa e com esses ids (pois já foram implementados no código).

       
      Agora vamos implementar os códigos:
      Vá em data/actions.xml e insira essas tags:
       
      Em data/actions/scripts/tools; insira todos esses códigos cada um com seus respectivos nomes:
       
      ferreiro.lua
      Registre-se para ver spoiler(s).
       
       
    • Por Poccnn
      Fala XTibianos!
      Vim disponibilizar e ensinar como usar a livraria xml em lua, desenvolvida por mim. 
       
      Ela foi desenvolvida para substituir a livraria padrão disponibilizada por lua para trabalhar com dados xml.
      Essa livraria não requer a dll-xml necessária para a livraria padrão lua.
       
      Aqui tem o tutorial criado por mim para demonstrar as funções e suas implementações da livraria luaxml.

      Registre-se para ver link(s).
       
      Vamos lá.
      Primeiro, a livraria: 
      Registre-se para ver spoiler(s).
       
      Obs. Os codigos estão codificados em utf8, converta para ansi antes de usa-los.
       
      É isso ae pessoal, espero que gostem; qualquer erro ou sugestão serão bem vindas. obrigado.
       
    • Por GniusPlay
      Olá galera do XTibia,parei com meu Projeto PokeAW,mais tenho alguns HTML que postarei ao decorrer do tempo aqui no TK.
      Estou trazendo pra vocês um PHP que pode ser bem útil em seu servidor,o player escolhe a forma de donate que ele queira apenas selecionando a opção
      Print do resultado 
      Registre-se para ver link(s).
      OBS:Você ja deve ter as paginas dos donate pronta,esse aqui é só um "Atalho" e para deixar mais organizado no seu layout
      E além vem com texto's animados que pode ser removido caso não queira.
      Vamos lá!
       
      <center>
      <center> 
      <table width="500" heigth="40" valign="middle" border="1"> 
      <tbody> 
      <tr> 
      <td>
      <marquee direction="right" > Selecione a op&ccedil;&atilde;o que queira Donatar</marquee>
      </td></tr></tbody></table></center>
      <center>
      <select onchange="location.href=this.value">
           <option value="Site para onde sera direcionado">PicPay</option>
           <option value="Site para onde sera direcionado">PagSeguro</option>
           <option value="Site para onde sera direcionado">Mercado Pago</option>
      </select>
      <marquee direction=down <P align="center"><center> <p style="font-size:2em;">Donatando voc&ecirc; ajuda o servidor a crescer e voc&ecirc; tamb&eacute;m tem v&#225;rias vantagens dentro do game.</p></marquee>
          <tr>
       
      Vamos para as explicações:
      Selecione a op&ccedil;&atilde;o que queira Donatar
      Texto animado(Da esquerda para direita)em um "Bloco" que fica em cima das opção
      ~~~~~~~~
      Site para onde sera direcionado
      Sera o site para onde ira direcionar apos ter selecionado a opção.
      ~~~~~~~~
      PicPay
      PagSeguro
      Mercado Pago
      Sera os nomes da opção,no caso o donate.
      ~~~~~~~~
      Donatando voc&ecirc; ajuda o servidor a crescer e voc&ecirc; tamb&eacute;m tem v&#225;rias vantagens dentro do game.
      É a mensagem animada(De cima para baixo) onde irá aparecer no site logo embaixo das opção.
      OBS:Esses códigos na letras são em HTML,para deixa-los com acento(Tipo é,ã,ç)etc...
       
      Qualquer duvida não insista em perguntar.
    • Por GniusPlay
      Olá galera do XTibia,venho por meio desse tópico disponibilizar um HTML que consiste em montar uma tabela para diversas utilidades.
      Eu tenho alguns HTML feito por min,talvez eu disponibilize aki no tk.
      Então sem enrrolação vamos lá.
      A tabela pode ser montada de diversos jeito,eu montei para uma lista de pokemon Shiny(Print da tabela feita 
      Registre-se para ver link(s).
       ) Para adiciona-lo em seu site vá em
      htdocs>system>pages:
      Agora crie um arquivo .PHP e cole isso dentro
       
      <table border="1">
      <tr>
      <th>Pokemon</th>
      <th>Forma Shiny</th>
      <th>Quantidade de Shiny stone</th>
      </tr>
      <tr>
      <td>Venusaur</td>
      <td>Shiny Venusaur</td>
      <td>7</td>
       
      Explicação:
      Venusaur:Nome do pokemon
      Shiny Venusaur:Transformação para shiny
      7:Quantidade de Shiny stone
       
      Você pode usar essa tabela para outras coisas,não só para tabela de pokemons shinys,é só altera-la da maneira que você quiser.
       
      <table border="1">
      <tr>
      <th>Primeira Tag</th>
      <th>Segunda tag</th>
      <th>Terceira tag</th>
      </tr>
      <tr>
      <td>Sequencia da primeira tag</td>
      <td>Sequencia da terceira tag</td>
      <td>Sequencia da terceira tag</td>
       
      Caso queira remover uma coluna
      Apague <th>Terceira tag</th>
      <td>Sequencia da terceira tag</td>
       
      Caso queira adicionar uma outra coluna
      <th>Quarta tag</th>
      <td>Sequencia da terceira tag</td>
       
      E assim por diante...
    • Por Poccnn
      Estruturas de controle
       

      Palavras reservadas que será usado nessa aula:
       
      for, do, while, repeat, until, not, end, in
       
       
       
      Iremos tratar nesta aula sobre loops.
       
      Tomem muito cuidados ao usar loops, pois eles são a maior causa de travamento de sistemas.
       
      Será ensinado sobre as estruturas de controle: for, while e repeat.
       
       
       
      Iniciaremos pelo loop for:
       
      O loop for é composto por uma expressão de controle na qual a primeira expressão é uma variável interna e a segunda são suas atribuições que podem ser feitas para percorrer uma sequencia numérica ou uma iteração de tabela, por exemplo.
       
       
       
      Estrutura do for:
       
      for varName = primeiroValor,ultimoValor[,atribuição] do
       
      -- bloco
       
      end
       
       
       
      varName: seria o nome da variável, ou variáveis, que vai à receber a atribuição dos valores secundários.
       
      primeiroValor: seria o número que irá começar a percorrer a sequência; essa sequência tanto pode ser positiva quanto negativa.
       
      ultimoValor: seria o último valor a percorrer na sequência numérica.
       
      [,atribuição]: esse é um valor que pode ser omitido, mas quando não for, serve como atribuição de valor ao percorrer a sequência numérica; quando o loop está percorrendo a sequência numérica, esse valor é atribuído ao valor anterior da sequência; essa atribuição faz com que o loop “pule” alguns valores da sequência numérica. Por padrão, esse valor é 1 (positivo), caso esteja percorrendo valores negativos, terá que declarar como atribuição um valor negativo também.
       
       
       
      Exemplo de loop for usado para percorrer uma sequência numérica:
       
      for x = -1,-10,-2 do print(x) end
       
      >> -1
       
      >> -3
       
      >> -5
       
      >> -7
       
      >> -9
       
       
       
      Veja que ele “pulou” os números: -2,-4,-6 e -8; Por quê? Porquê ao atribuir o valor ao valor anterior, ele deixa de seguir a sequência comum e passa a seguir segundo a atribuição.
       
      Lembrando que o valor da atribuição pode ser omitido e que ele vale +1 (um positivo).
       
      for x = 1,4 do print(x) end
       
      >> 1
       
      >> 2
       
      >> 3
       
      >> 4
       
       
       
      Outra expressão muito usada no for é o uso de funções, principalmente funções iteradoras.
       
      Como toda função pode retornar mais de um valor, na expressão da variável interna, podem-se declarar mais palavras que irão pegar os múltiplos valores retornados pela função, ou omiti-las como já foi demonstrado na aula sobre variáveis.
       
      Enquanto a expressão for verdadeira, ele continuará executando o bloco até que a expressão se torne falsa ou ele seja terminado pelo uso da palavra break ou por um return.
       
       
       
      Exemplo de um for com uma função iteradora:
       
       

      Registre-se para ver attachment(s).
       
       
       
       
      O loop while:
       
       
       
      Estrutura do loop while:
       
      while expressão do
       
      --bloco
       
      end
       
       
       
      Tu poderás usar qualquer tipo de expressão válida em lua.
       
      A maior diferença entre esse loop e o for é a falta da variável interna que consta no loop for.
       
      Enquanto a expressão for verdadeira, ele continuará executando o bloco até que a expressão se torne falsa ou ele seja terminado pelo uso da palavra break ou por um return.
       
       
       
      Exemplo de uso de um loop while:
       
               local ttm = 0
       
               while (ttm < 60) do       ttm = ttm + 1       end
       
       
       
      Uma pratica em programação é não por expressão no loop while, mas por algo que seja verdadeiro no lugar, forçando assim que tu tenhas que parar o loop dentro do bloco.
       
      local x = 0
       
      while true do -- loop infinito
       
               if x > 9 then break end -- controle para parar o loop
       
               x = x + 1
       
      end
       
       
       
      O loop repeat:
       
       
       
      O loop repeat segue o conceito oposto dos demais. Ao invés dele continuar executando enquanto a expressão for verdadeira, ele só continua executando enquanto a expressão for falsa e parando quando ela for verdadeira; ou caso seja finalizada pelo uso da palavra break ou return.
       
       
       
      A estrutura do loop repeat:
       
      repeat
       
      --bloco
       
      until expressão
       
      O loop repeat cria o bloco e sua expressão de controle fica após a palavra until que serve como “end” dos demais loops.
       
       
       
      Exemplo de uso do loop repeat:
       
      local x = 0
       
      repeat
       
      print(x)
       
      x = x + 1
       
      until not (x < 10)
       
       
      No código criado por vocês nas aulas anteriores, adicionem loops dos três tipos.
       
      Inté a próxima aula.