Jump to content

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


Recommended Posts

  • Other Languages Moderators

Realmente, esqueci do fato do jogador morrer e não sair do veículo. Assim funcionará perfeitamente:

carros = { -- Tabela com vários veículos em suas posições.
	createVehicle (411, 2475, -1657, 13.2, 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.2, 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.

for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça:
	toggleVehicleRespawn (vehicle, true) -- Permite que eles respawnem automaticamente.
	setVehicleIdleRespawnDelay (vehicle, 10000) -- Respawnar após 10 segundos sem ninguém no veículo. (Ex: jogador morre e não sai do veículo, ou alguém empurra o veículo de sua posição sem entrar nele)
	setVehicleRespawnDelay (vehicle, 5000) -- Respawnar após 5 segundos que explodiu. (Ex: Veículo explode sem ninguém sair dele.)
end

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

No caso de cair na água, vai acontecer exatamente como o @MaligNos disse: Ou os ocupantes do veículo morrerão dentro dele (deixando o veículo inativo e respawnando com o setVehicleIdleRespawnDelay), ou eles sairão do veículo (ativando o timer de saída).

Caso o veículo exploda com ou sem ninguém dentro, ele respawnará com o setVehicleRespawnDelay.

-------------------------------------------------------------------

39 minutes ago, MaligNos said:

[...]


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

addEventHandler("onResourceStart", resourceRoot,
[...]

[...]

Tome cuidado, vc está criando 2 veículos idênticos no mesmo lugar.

  • Like 1
  • Thanks 1
Link to comment
29 minutes ago, #Gubiani said:

@Lord Henry Eu não entendi muito algumas funções ali das linhas: 11, 12, e 13

Qual a dúvida ? ainda deixamos comentários explicando suas funcionalidades...

Basicamente estávamos tentando reinventar a roda... o MTA já dispõe de funções nativas que suprem as necessidade de respawnar veículo quando o player abandona ou explodi o veículo, não necessitando que criemos funções anexadas a eventos:

local carro = createVehicle (411, 2475, -1657, 14, 0, 0, 0)
toggleVehicleRespawn(carro,true) -- DIFINE QUE O VEÍCULO ESTÁ SUJEITO ÀS FUNÇÕES DE RESPAWN (setVehicleIdleRespawnDelay E setVehicleRespawnDelay)

-- ISSO:
setVehicleIdleRespawnDelay(carro,10000)
-- É IGUAL A ISSO:
function saiu(player)
	setTimer(respawnVehicle,10000,1,source)
end
addEventHandler ("onVehicleExit", carro, saiu)

-- ISSO:
setVehicleRespawnDelay(carro,5000)
-- É IGUAL A ISSO:
function explodiu()
	setTimer(respawnVehicle,5000,1,source)
end
addEventHandler("onVehicleExplode", carro, explodiu)

*Foi apenas um exemplo lógico, certamente o código fonte das funções setVehicleIdleRespawnDelay/setVehicleRespawnDelay é mais complexo

  • Thanks 1
Link to comment

Ah Beleza, entendi, então esse sistema ai está bugando no sistema de quando e saio de veiculo e ele respawna e não espera o tempo total setado, por exemplo eu setei para quando o jogador saísse do veiculo respawnar em 1 minuto e ele ta respawnado por esse motivo, de quando o veiculo é empurrado ou quando ele explode e ai ta respawnando antes do tempo setado:

for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça:
	toggleVehicleRespawn (vehicle, true) -- Permite que eles respawnem automaticamente.
	setVehicleIdleRespawnDelay (vehicle, 10000) -- Respawnar após 10 segundos sem ninguém no veículo. (Ex: jogador morre e não sai do veículo, ou alguém empurra o veículo de sua posição sem entrar nele)
	setVehicleRespawnDelay (vehicle, 5000) -- Respawnar após 5 segundos que explodiu. (Ex: Veículo explode sem ninguém sair dele.)

e não está funcionando este:

EDIT ignora a função cancelRespawn!

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.
		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, 60000, 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 #Gubiani
ignora a função cancelRespawn
Link to comment
  • Other Languages Moderators

Ele está respawnando antes pois o tempo de idle (inativo) dele está para 10 segundos. Mude essa parte para isso:

setVehicleIdleRespawnDelay (vehicle, 60000) -- 60 mil  = 60 segundos.

 

Em vez de reinventarmos a roda, é melhor deixar tudo automático mesmo xD

carros = { -- Tabela com vários veículos em suas posições.
	createVehicle (411, 2475, -1657, 13.2, 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.2, 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.
}

for i, vehicle in ipairs (carros) do -- Para cada veículo da table 'carros', faça:
	toggleVehicleRespawn (vehicle, true) -- Permite que eles respawnem automaticamente.
	setVehicleIdleRespawnDelay (vehicle, 60000) -- Respawnar após 60 segundos de inatividade do veículo. (Ex: Sem ninguém no veículo, ou alguém empurra o veículo pra fora de sua posição sem entrar nele)
	setVehicleRespawnDelay (vehicle, 5000) -- Respawnar após 5 segundos que explodiu. (Ex: Veículo explode sem ninguém sair nem entrar nele.)
end

 

Edited by Lord Henry
  • 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...