Então, estou fazendo um script que pega um array global (declarado em global.lua) chamado jogadorCasa = {}, populei esse array com 40 casas e todas as casas com o valor 0. Quando o jogador fala com o NPC ele joga nesse array um storage global + Flag dentro da primeira posição e assim por diante (essa parte está funcionando 100%). O problema é apenas na hora de limpar o array jogadorCasa. Pra isso eu criei um addEvent que depois de um tempo especifico ele joga na posição 'Flag' o valor 0 (pra resetar e outro jogador poder ter acesso a aquela posição no array). O problema é que quando o player desloga (mesmo eu não passando nenhum userdata no addevent) o servidor crasha :(, mas se o player fica on então ele funciona normalmente, só queria saber como faz pra não crashar quando o player estiver deslogado. (O addEvent precisa funcionar com o player offline), tem alguma maneira de fazer isso?
Está estranho o jeito que você está usando o addEvent.
Primeiro que só tem duas formas de usar o addEvent, sendo uma que é usando uma função anônima, ou seja, você cria uma função dentro do addEvent no primeiro parâmetro como você fez, e a segunda é usando uma função já existente. Só que, independente de qual maneira que você vai usar, não pode usar parâmetro dentro da função no primeiro parâmetro do addEvent como você está fazendo com:
addEvent(function(flag) ...
Até porque você já criou a variável flag, não faz sentido passar ela como parâmetro sendo que já é uma variável existente.
E a segunda maneira de usar uma função existente que tem parâmetros, é você modular esses parâmetros a partir do terceiro parâmtro do addEvent, porque o primeiro é a função e o segundo é o tempo que o addEvent será executado novamente em milissegundos:
function teste(message) return message // RETORNA PARÂMETRO PASSADO end local mensagem = "Essa é minha mensagem." // VARIÁVEL PARA RECEBER UMA STRING PARA FICAR MAIS LEGÍVEL O ADDEVENT addEvent(teste, 60000, mensagem) // ORDEM DOS PARÂMETROS DO addEvent(FUNÇÃO, TEMPO, PARÂMETRO1, PARÂMETRO2, ...)
Fiz um exemplo para você acima sobre o addEvent com uma função existente, a função apenas retorna o parâmetro e o addEvent executa a mensagem a cada 1 minuto, pois está em milissegundos. Lembrando que se a função existente passada como parâmetro no addEvent tiver parâmetros, todos os parâmetros devem ser inseridos no addEvent, exemplo:
function broadcast(storage, vezes) if (vezes > 0) and (storage <= os.time()) then doBroadcastMessage("Essa mensagem será repetida por mais " .. vezes .. " vezes.") // TFS 0.X addEvent(broadcast, 60000, storage, vezes - 1) else doBroadcastMessage("As mensagens foram encerradas por hoje!") setPlayerStorageValue(cid, storage, os.time() + (24*60*60)) end end function onThink(cid, interval) local storage = 12548 broadcast(storage, 5) // A MENSAGEM SERÁ REPETIDA 5 VEZES return true end
Acima tem um exemplo de usar uma função existente de forma recursiva no addEvent que será repetida 5 vezes sendo um evento global executado uma vez por dia.
Agora acho que ficou mais claro sobre o addEvent, então você pode usar assim o addEvent no seu caso:
local function executaFlag(flag, valor) jogadorCasa[flag] = valor end local flag = 1 local valor = 0 local tempo = (getPlayerStorageValue(cid, storageFish + flag) - os.time()) * 1000 addEvent(executaFlag, tempo, flag, valor)
Testa e fala se ainda continua dando problema.
18 horas atrás, Yan18 disse:Está estranho o jeito que você está usando o addEvent.
Primeiro que só tem duas formas de usar o addEvent, sendo uma que é usando uma função anônima, ou seja, você cria uma função dentro do addEvent no primeiro parâmetro como você fez, e a segunda é usando uma função já existente. Só que, independente de qual maneira que você vai usar, não pode usar parâmetro dentro da função no primeiro parâmetro do addEvent como você está fazendo com:
addEvent(function(flag) ...
Até porque você já criou a variável flag, não faz sentido passar ela como parâmetro sendo que já é uma variável existente.
E a segunda maneira de usar uma função existente que tem parâmetros, é você modular esses parâmetros a partir do terceiro parâmtro do addEvent, porque o primeiro é a função e o segundo é o tempo que o addEvent será executado novamente em milissegundos:
function teste(message) return message // RETORNA PARÂMETRO PASSADO end local mensagem = "Essa é minha mensagem." // VARIÁVEL PARA RECEBER UMA STRING PARA FICAR MAIS LEGÍVEL O ADDEVENT addEvent(teste, 60000, mensagem) // ORDEM DOS PARÂMETROS DO addEvent(FUNÇÃO, TEMPO, PARÂMETRO1, PARÂMETRO2, ...)
Fiz um exemplo para você acima sobre o addEvent com uma função existente, a função apenas retorna o parâmetro e o addEvent executa a mensagem a cada 1 minuto, pois está em milissegundos. Lembrando que se a função existente passada como parâmetro no addEvent tiver parâmetros, todos os parâmetros devem ser inseridos no addEvent, exemplo:
function broadcast(storage, vezes) if (vezes > 0) and (storage <= os.time()) then doBroadcastMessage("Essa mensagem será repetida por mais " .. vezes .. " vezes.") // TFS 0.X addEvent(broadcast, 60000, storage, vezes - 1) else doBroadcastMessage("As mensagens foram encerradas por hoje!") setPlayerStorageValue(cid, storage, os.time() + (24*60*60)) end end function onThink(cid, interval) local storage = 12548 broadcast(storage, 5) // A MENSAGEM SERÁ REPETIDA 5 VEZES return true end
Acima tem um exemplo de usar uma função existente de forma recursiva no addEvent que será repetida 5 vezes sendo um evento global executado uma vez por dia.
Agora acho que ficou mais claro sobre o addEvent, então você pode usar assim o addEvent no seu caso:
local function executaFlag(flag, valor) jogadorCasa[flag] = valor end local flag = 1 local valor = 0 local tempo = (getPlayerStorageValue(cid, storageFish + flag) - os.time()) * 1000 addEvent(executaFlag, tempo, flag, valor)
Testa e fala se ainda continua dando problema.
Então mano, acabou que eu ja resolvi de outra maneira sem usar o addEvent usando um globalStorage pra resetar o tempo em vez do addEvent kkkk
Em 12/12/2020 em 11:58, Kasemaru disse:Então mano, acabou que eu ja resolvi de outra maneira sem usar o addEvent usando um globalStorage pra resetar o tempo em vez do addEvent kkkk
Se deu certo é o que importa ☺️.
Mas, poste a solução que descobriu para ajudar outras pessoas com problemas parecidos.
Esta função que você esta usando "getPlayerStorageValue(cid,value)" da um check no Player online, verificando se ele tem o valor.
Caso o player deslogue ela retorna vazio, retornando erro no sistema causando crash no servidor.