Ir para conteúdo
  • 0

addEvent crashando o server


Kasemaru

Pergunta

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?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

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.

Editado por Yan18
Link para o comentário
Compartilhar em outros sites

  • 0
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

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0

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. 

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...