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.