Jump to content

Respawn de veículo por tempo (precisando de ajuda)


Recommended Posts

carro = createVehicle (411, 2475, -1657, 14, 0, 0, 0) -- modelo e as coordenadas do veiculo criado.
setVehicleRespawnPosition (carro, 2475, -1657, 14, 0, 0, 0) -- ponto de respawn do veiculo.

function Veh(ThePlayer)
	local vehicle = getPedOccupiedVehicle (ThePlayer) -- verifica se o jogador está no veiculo.
	if not vehicle then -- se o jogador não estiver no veiculo então...
		setTimer (respawnVehicle, 10000, 1, carro) -- conta 10 segundos para respawnar o veiculo.
		setTimer (setVehicleEngineState, 10000, 1, carro, false) -- conta 10 segundos para desligar o motor do veiculo.
		outputChatBox("Seu veiculo será respawnado em 10 segundos! Entre nele novamente") -- mensagem de aviso para o player.
	else
        cancelEvent() -- estou com dúvida aqui, quando eu entro no veiculo ele mesmo assim respawna...
	end	
end

addEventHandler("onVehicleExit", root, Veh)

 

Boas pessoal, estou com dúvida nesse script que escrevi, quando eu entro nele novamente não para a contagem e acaba respawnando o que eu posso fazer para arrumar isso? 

Obrigado.

Link to comment
  • Other Languages Moderators
9 hours ago, #Gubiani said:

[...] quando eu entro nele novamente não para a contagem e acaba respawnando [...]

Não existe nenhum evento nesse script que ative ao entrar no veículo. Como por exemplo um onVehicleEnter

Além disso, você precisa colocar seu timer em uma variável para poder cancelá-lo depois.

  • Thanks 1
Link to comment

Fiz isso aqui, porém, ainda não está funcionando..

carro = createVehicle (411, 2475, -1657, 14, 0, 0, 0) -- modelo e as coordenadas do veiculo criado.
setVehicleRespawnPosition (carro, 2475, -1657, 14, 0, 0, 0) -- ponto de respawn do veiculo.

function foraVeh(ThePlayer)
	local vehicle = getPedOccupiedVehicle (ThePlayer) -- verifica se o jogador está no veiculo.
	if not vehicle then -- se o jogador não estiver no veiculo então...
		setTimer (respawnVehicle, 10000, 1, carro) -- conta 10 segundos para respawnar o veiculo.
		setTimer (setVehicleEngineState, 10000, 1, carro, false) -- conta 10 segundos para desligar o motor do veiculo.
		outputChatBox("Seu veiculo será respawnado em 10 segundos! Entre nele novamente", ThePlayer, 255, 255, 255, true) -- mensagem de aviso para o player.
	else
        cancelEvent() -- estou com dúvida aqui, quando eu entro no veiculo ele mesmo assim respawna...
	end	
end

addEventHandler("onVehicleExit", root, foraVeh)

function dentroVeh(ThePlayer)
	local vehicle = getPedOccupiedVehicle (ThePlayer)
	if vehicle then
		
	else

	end	
end
addEventHandler ("onVehicleEnter", root, dentroVeh)

 

Link to comment
  • Other Languages Moderators

Sim, pois vc declarou o timer dentro de uma função. Se ela for local, as outras funções não terão acesso a ela.

Declare a variável do timer como uma tabela vazia antes da primeira função e depois use-a, indexando com o jogador.

  • Thanks 1
Link to comment

Bom eu abri a tabela, mas sou leigo, o que eu posso por dentro das chaves, e como eu chamo o setTimer?

carro = createVehicle (411, 2475, -1657, 14, 0, 0, 0) -- modelo e as coordenadas do veiculo criado.
setVehicleRespawnPosition (carro, 2475, -1657, 14, 0, 0, 0) -- ponto de respawn do veiculo.

setTimer {  }

function foraVeh(ThePlayer)
	local vehicle = getPedOccupiedVehicle (ThePlayer) -- verifica se o jogador está no veiculo.
	if not vehicle then -- se o jogador não estiver no veiculo então...

		outputChatBox("Seu veiculo será respawnado em 10 segundos! Entre nele novamente", ThePlayer, 255, 255, 255, true) -- mensagem de aviso para o player.
	else
       
	end	
end

addEventHandler("onVehicleExit", root, foraVeh)

function dentroVeh(ThePlayer)
	local vehicle = getPedOccupiedVehicle (ThePlayer)
	if vehicle then

	else

	end	
end
addEventHandler ("onVehicleEnter", root, dentroVeh)

 

Link to comment

Se quiser aproveitar algo:

carro = createVehicle (411, 2475, -1657, 14, 0, 0, 0)

addEventHandler("onVehicleExit", root,
	function(player)
		if (#getVehicleOccupants(source) == 0) then
			outputChatBox("Seu veiculo será respawnado em 10 segundos! Entre nele novamente",player)
			setTimer(function(veh)
				if (#getVehicleOccupants(veh) == 0) then
					respawnVehicle(veh)
					setVehicleEngineState(veh,false)
				end
			end,10000,1,source)
		end
	end
)

Dessa forma ele não irá respawnar quando sair do veículo caso exista outros jogadores dentro.

  • Thanks 1
Link to comment
  • Other Languages Moderators

Eu fiz assim, pode testar:

carro = createVehicle (411, 2475, -1657, 14, 0, 0, 0) -- Cria o veículo na coordenada específica. (essa posição é por padrão o ponto de respawn)
globalTimer = {} -- tabela vazia global.

function startRespawn (thePlayer) -- Evite usar letra maiúscula no início de variáveis.
	-- vehicle é uma palavra reservada, não use-a para dar nome de variável.
	if source ~= carro then return end -- Se o veículo que o jogador saiu não for o veículo deste script, nada acontece.
	if not isTimer (globalTimer[thePlayer]) then -- Verifica se o jogador já possui um timer ativo.
		outputChatBox ("Seu veiculo será respawnado em 10 segundos! Entre nele novamente", thePlayer) -- Mensagem de aviso para o player.
		globalTimer[thePlayer] = setTimer (function() -- Conta 10 segundos
			respawnVehicle (carro) -- Respawna o veículo.
			setVehicleEngineState (carro, false) -- Desliga o motor do veículo.
		end, 10000, 1) -- Tempo e repetições do timer.
	else
		resetTimer (globalTimer[thePlayer]) -- Se já existe o timer do jogador, reinicia ele.
	end	
end
addEventHandler ("onVehicleExit", root, startRespawn) -- Executa essa função quando qualquer um sair de qualquer veículo.

function cancelRespawn (thePlayer)
	if source ~= carro then return end -- Se o veículo que o jogador entrou não for o veículo deste script, nada acontece.
	if isTimer (globalTimer[thePlayer]) then -- Se existe o timer deste jogador, então:
		killTimer (globalTimer[thePlayer]) -- Cancela o timer deste jogador e o veículo não vai mais respawnar até que ele saia de novo do veículo.
		outputChatBox ("Seu veiculo não será mais respawnado.", thePlayer) -- Mensagem de aviso para o player.
	end
end
addEventHandler ("onVehicleEnter", root, cancelRespawn) -- Executa essa função quando qualquer um entrar em qualquer veículo.

 

4 minutes ago, #Gubiani said:

@MaligNos Pode me explicar passo a passo teu código, para que serve as hashtag, enfim, me explique para eu entender melhor

A hashtag indica o tamanho de uma tabela. No caso, a função getVehicleOccupants retorna uma tabela com todos os jogadores que estão dentro de um veículo. A tabela vazia tem tamanho 0.

Por exemplo, essa tabela qualquer aqui:

tabelaQualquer = {32, 15, 50} -- Table com 3 elementos de valores numéricos.

No caso acima, se eu usar #tabelaQualquer, isso será igual a 3.

  • Like 1
  • Thanks 1
Link to comment

Humm, então eu colocando a tabela ele verifica quantos jogadores estão dentro do veículo ?

eu testei teu script @Lord Henry deu certinho como você deixou nos comentários 

Me surgiu uma dúvida Lord, na linha 9 do teu código, por que tu colocou uma função dentro do setTimer, e uma função sem nome ?

Link to comment
  • Other Languages Moderators
Just now, #Gubiani said:

Humm, então eu colocando a tabela ele verifica quantos jogadores estão dentro do veículo ?

eu testei teu script @Lord Henry deu certinho como você deixou nos comentários 

É que na verdade o exemplo do @MaligNos está mais avançado, ele está querendo evitar que o veículo respawne com outro jogador dentro.
Eu apenas corrigi o seu exemplo para fazer somente o que vc quer que ele faça.

  • Thanks 1
Link to comment

E quando eu quiser criar varios veiculos e todos terem um ponto de respawn e localidade diferentes e quiser que todos eles quando o player desocupar ele conte o respawn?

Por que eu quero fazer meio que um lugar de veiculos livres para os novatos usar

 

@Lord Henry

Edited by #Gubiani
Link to comment
5 minutes ago, #Gubiani said:

Eu testei o script do @MaligNos e respawna mesmo estando dentro do veículo... E achei muito confuso o o tipo e as sequencias das funções dele, não tem como deixar mais organizado ?

É, pelo que vi não era para acontecer de respawnar com o jogador dentro, depois posso tentar verificar melhor...

6 minutes ago, Lord Henry said:

E o exemplo que eu dei, só funciona no veículo do seu script, não funciona com os outros veículos pelo mapa.

Exatamente, no script que mandei passou despercebido a verificação se o veículo que irá respawnar é o mesmo criado e armazenado na variável "carro" 

  • Thanks 1
Link to comment
  • Other Languages Moderators
13 minutes ago, #Gubiani said:

Me surgiu uma dúvida Lord, na linha 9 do teu código, por que tu colocou uma função dentro do setTimer, e uma função sem nome ?

Desculpe, não tinha visto essa pergunta.

No caso, a função pertence ao timer, por isso não precisa dar nome a ela pois o nome está no timer. Eu preferi fazer assim pois é muito melhor fazer uma função inteira dentro do timer do que fazer 1 timer para cada comando que será feito após 10 segundos.

  • Thanks 1
Link to comment
Just now, Lord Henry said:

Desculpe, não tinha visto essa pergunta.

No caso, a função pertence ao timer, por isso não precisa dar nome a ela pois o nome está no timer. Eu preferi fazer assim pois é muito melhor fazer uma função inteira dentro do timer do que fazer 1 timer para cada comando que será feito após 10 segundos.

Entendi

Link to comment
  • Other Languages Moderators

Fiz agora com 2 veículos, pra colocar mais veículos é só vc ir adicionando eles na primeira table. Não se esqueça de colocar vírgula no final.

carros = { -- Tabela com vários veículos em suas posições.
	createVehicle (411, 2475, -1657, 13.1, 0, 0, 0), -- Cria o veículo na coordenada específica. (essa posição é por padrão o ponto de respawn)
	createVehicle (411, 2480, -1657, 13.1, 0, 0, 0), -- Cria outro veículo na outra coordenada e assim por diante. Este é um caso raro onde o elemento pode ser chamado sem estar em uma variável.
	
	-- (precisa ter a vírgula no final de cada veículo pois os elementos de uma table precisam estar separados entre vírgulas)
}

globalTimer = {} -- tabela vazia global. Os timers serão anexados aos veículos e não nos jogadores.

function startRespawn (thePlayer)
	local meuCarro = false -- Variável local, que será preenchida pelo veículo que o jogador saiu se ele estiver na tabela carros.
	for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça:
		if source == vehicle then -- Se o veículo que o jogador saiu for um veículo deste script, então:
			meuCarro = vehicle
			break -- (Break = sair deste FOR) Para de verificar os outros carros, pois o veículo já foi encontrado.
		end
	end
	if not meuCarro then return end -- Se o veículo que o jogador saiu não está na lista acima (não faz parte deste script), então nada acontece.
	if not isTimer (globalTimer[meuCarro]) then -- Verifica se o veículo já possui um timer ativo. Se não tiver, então:
		if (#getVehicleOccupants(meuCarro) > 0) then return end -- Não faz nada se ainda houver alguém dentro do veículo e não inicia o timer.
		outputChatBox ("Esse veiculo será respawnado em 10 segundos! Entre nele novamente!", thePlayer) -- Mensagem de aviso para o player.
		globalTimer[meuCarro] = setTimer (function() -- Conta 10 segundos
			respawnVehicle (meuCarro) -- Respawna o veículo.
			setVehicleEngineState (meuCarro, false) -- Desliga o motor do veículo.
		end, 10000, 1) -- Tempo e repetições do timer.
	else
		resetTimer (globalTimer[meuCarro]) -- Se já existe o timer do veículo, reinicia ele.
	end	
end
addEventHandler ("onVehicleExit", root, startRespawn) -- Executa essa função quando qualquer um sair de qualquer veículo.

function cancelRespawn (thePlayer)
	local meuCarro = false -- Variável local, que será preenchida pelo veículo que o jogador entrou se ele estiver na tabela carros.
	for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça:
		if source == vehicle then -- Se o veículo que o jogador entrou for um veículo deste script, então:
			meuCarro = vehicle
			break -- (Break = sair deste FOR) Para de verificar os outros carros, pois o veículo já foi encontrado.
		end
	end
	if not meuCarro then return end -- Se o veículo que o jogador entrou não está na lista acima (não faz parte deste script), então nada acontece.
	if isTimer (globalTimer[meuCarro]) then -- Se existe o timer deste veículo, então:
		killTimer (globalTimer[meuCarro]) -- Cancela o timer deste veículo e ele não vai mais respawnar até que o último jogador saia de novo do veículo.
		outputChatBox ("Esse veiculo não será mais respawnado.", thePlayer) -- Mensagem de aviso para o player.
	end
end
addEventHandler ("onVehicleEnter", root, cancelRespawn) -- Executa essa função quando qualquer um entrar em qualquer veículo.

 

Edited by Lord Henry
Erro de comentário e correção de indentação.
  • Thanks 1
Link to comment

Agora acho que deve funcionar a minha solução também:

createVehicle (411, 2475, -1657, 14, 0, 0, 0)
createVehicle (411, 2475, -1657, 14, 0, 0, 0)

addEventHandler("onVehicleExit", resourceRoot, -- resourceRoot define que nosso evento só será acionado nos veículos criados pelo próprio resource
	function(player)
		if (numeroPassageiros(source) == 0) then
			outputChatBox("Seu veiculo será respawnado em 10 segundos! Entre nele novamente",player)
			setTimer(function(veh)
				if (numeroPassageiros(veh) == 0) then
					respawnVehicle(veh)
					setVehicleEngineState(veh,false)
				end
			end,10000,1,source)
		end
	end
)

function numeroPassageiros(veh)
	local numero = 0
	for assento, jogador in pairs(getVehicleOccupants(veh)) do
		numero = numero + 1
	end
	return numero
end

A função getVehicleOccupants() retorna uma tabela com indexes desordenados que se referem ao assento que o player ocupa, podendo começar inclusive com 0, e nesses casos o uso da # (hashtag) na tentativa de obter a quantidade de elementos é incorreta, e retornará sempre o valor: 0 ... por isso nã solução que lhe enviei anteriormente não foi funcional

  • Thanks 1
Link to comment
4 hours ago, #Gubiani said:

Opa, muito obrigado, à todos vou estudar o script de vocês, se eu tiver alguma dúvida posso por aqui nesse mesmo tópico ?

Apenas se o assunto for o mesmo

2 hours ago, #Gubiani said:

Como vou fazer para o script reconhecer quando o veiculo explode ou cair na agua por exemplo e executar o respawn tenho que fazer uma função para cada evento?

createVehicle (411, 2475, -1657, 14, 0, 0, 0)
createVehicle (411, 2475, -1657, 14, 0, 0, 0)

addEventHandler("onResourceStart", resourceRoot,
	function()
		for _, veh in ipairs(getElementsByType("vehicle", resourceRoot)) do
			toggleVehicleRespawn(veh, true)
			setVehicleIdleRespawnDelay(veh, 10000) -- respawnar após 10 segundos sem ninguém no veículo
			setVehicleRespawnDelay(veh, 5000) -- respawnar em 5 segundos após o veículo explodir
		end
	end
)

setTimer(function()
	for _,veh in ipairs(getElementsByType("vehicle", resourceRoot)) do
		if isElementInWater(veh) and not next(getVehicleOccupants(veh)) then
			respawnVehicle(veh)
		end
	end
end,5000,0) -- a cada 5 segundos verifica se existe veículo na água, caso sim, aciona a função para respawnar ele

addEventHandler ( "onVehicleRespawn", resourceRoot,
	function()
		setVehicleEngineState(source,false)
	end
)

Esse timer com verificação para respawnar caso caia na água acho meio desnecessário, pois se caiu na água o player vai sair do veículo ou vai morrer e dessa forma já vai ser respawnado pela função setVehicleIdleRespawnDelay()

  • Thanks 1
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...