Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Usando addEvent

 

O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.

 

Para que serve o addEvent?

Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 

 

O addEvent tem como parâmetros: callback, delay e ...

addEvent(callback, delay, ...)

 

Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:

addEvent(doBroadcastMessage, 1000, "Bom dia", 23)

Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.

 

O addEvent pode ser usado de duas maneiras:

Chamando uma função existente ou criando uma nova função.

 

Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:

addEvent(function()
     if isCreature(cid) then
          doPlayerAddItem(cid, 2160, 10)
          doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")
     end
end, 1000)

Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).

Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.

 

Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:

Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:

function onUse(cid, item, fromPosition, itemEx, toPosition)
     if getPlayerLevel(cid) > 10 then
          doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")
          addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))
     end
     return true
end

Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:

function onUse(cid, item, fromPosition, itemEx, toPosition)
     if getPlayerLevel(cid) > 10 then
          doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")
          addEvent(function()
               if isCreature(cid) then
                    doCreateItem(1308, 1, getThingPos(cid))
               end
          end, 2000)
     end
     return true
end

Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.

 

 

Recursão

Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.

Para usar, crie uma função, exemplo:

function respawnMonster(name, pos)
     if doCreateMonster(name, pos) then
          doBroadcastMessage(name.." nasceu!")
     end
     addEvent(respawnMonster, 10000, name, pos)
end

Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.

Para chamar a função, seria assim:

respawnMonster("Demon", {x = 123, y = 123, z = 5})

Considerações

Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.

 

Erros no código podem fazer o evento ser interrompido, preste sempre atenção.

 

Se ainda ficou com alguma dúvida, poste aqui.

 

 

    

Editado por Killua (veja o histórico de edições)

 

 

 

 

 

v61snZO.png?129bcx1x.pngiVgTXVz.png?1

 

 

 

 

 

  • Respostas 5
  • Visualizações 16.9k
  • Created
  • Última resposta

Top Posters In This Topic

Postado

Ótimo tutorial, muito bem explicado e organizado. ;p

  • 1 year later...
Postado

Tenho uma dúvida, não sei se vou reviver, mas...

e se eu quiser que ele repita uma quantidade de vezes e depois pare?

por exemplo, como ele falou, aquele script vai ficar em um ciclo infinito, (até que alguem de reload)

e se eu quiser que ele execute apenas 5 vezes (faça 5 summons) e depois pare?

  • 1 month later...
Postado
  Em 08/02/2016 em 09:58, sertthoon disse:

Tenho uma dúvida, não sei se vou reviver, mas...

e se eu quiser que ele repita uma quantidade de vezes e depois pare?

por exemplo, como ele falou, aquele script vai ficar em um ciclo infinito, (até que alguem de reload)

e se eu quiser que ele execute apenas 5 vezes (faça 5 summons) e depois pare?

Também possuo a mesma dúvida, e também peço desculpa caso revivi o POST...

Mas li que antes de criar um tópico era pra ver se já existia então aqui estou haha!

Se alguém puder nos ajudar 

Desde já grato!!

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo