Ir para conteúdo

warofscream

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    warofscream deu reputação a Killua em Como usar addEvent   
    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.
     
     
        
  2. Gostei
    warofscream deu reputação a DukeeH em Script Falhando   
    A duvida foi provavelmente resolvida pelo @Wakon, só queria deixar uma dica, porque acho bacana pessoas que assim como eu estão tentando aprender a fazer scripts, mesmo que simples para seu otserv, pegando exemplos em outros scripts e juntando/misturando para criar algo novo.
    Quando você abrir um if, no caso ali tem 2 (pra ver se é o item, e pra ver se o player tem level igual ou maior que 150) você coloca um end ja, ai se baixar algum editor como o notepad ++, você pega aquele if e aperta um tab jogando ele pra direita, pra ficar mais organizado, assim como ali no wakon, ai você sabe o que esta dentro de cada função e sabe que ela esta fechada. Então você tem 2 ifs, precisa de 2 ends no final, e mais o end que fecha a função la de cima, que no caso é OnUse.
    basicamente o esboço seria:
    OnUse (por ser action) if xxxx then if xxxx then do blabla else don't do blabla end do blablabla else don't do blabla end return true end Não sou experiente, como ja disse, só faço ctrl c + ctrl v juntando scripts e tal, mas é o começo pra você poder fazer o que tiver ideia sem precisar ficar pedindo.
  3. Gostei
    warofscream deu reputação a Wakon em Script Falhando   
    Tente:
    function onUse(cid, item, fromPosition, itemEx, toPosition) if itemEx.itemid == 0000 then if getPlayerLevel(cid) >= 150 then doTeleportThing(cid, {x=,y=, z=}) doTransformItem(itemEx.uid, 0000) doSendMagicEffect(getThingPos(cid), 30) else doPlayerSendCancel(cid, 'Voce nao tem level suficiente!') end end return true end  
  4. Gostei
    warofscream deu reputação a jNo em Como arrumar esses erros no distro   
    Esse aviso da Inquisition, vai na sua pasta dos monstros procura pelo Hellgorak, abre o script dele, e vai ter uma tag <script> e remova

Informação Importante

Confirmação de Termo