dener189

[AJUDA] Ponto de Spawn de acordo com a localização

Recommended Posts

Olá, preciso de ajuda para fazer um script. Quero fazer um roteiro quando os jogadores não estiverem mais hospitalados, mais rápido e mais cordial e já sei que é necessário usar uma função getDistanceBetweenPoints3D, mais não sei como fazer um script com essa função pois nunca ouvi falar dela.

Você pode fazer um roteiro?

Edited by dener189

Share this post


Link to post

Não entendi direito o que você quer.

Você quer que o jogador nasça num hospital mais próximo depois de morrer? Em vez de nascer num ponto aleatório.

Share this post


Link to post
2 hours ago, Lord Henry said:

Não entendi direito o que você quer.

Você quer que o jogador nasça num hospital mais próximo depois de morrer? Em vez de nascer num ponto aleatório.

exatamente, quero que o player nasça em uma dessas localizações após morrer

 

"2034.9428710938, -1403.2003173828, 18",
"-2655.3991699219, 638.16137695313, 15"
"-1514.6713867188, 2522.4748535156, 56",
"1607.62890625, 1818.9958496094, 11"
"-2198.5632324219, -2306.6220703125, 31",

 

OBS: Quero que nasça na mais próxima!

Share this post


Link to post

Você disse que já sabe que é preciso usar a função getDistanceBetweenPoints3D. Isso já é um excelente começo. Usando ela e um FOR para verificar a distância entre cada ponto, você consegue determinar qual deles tem a menor distância e fazer o jogador nascer lá. A lógica funciona assim: Você tem uma variável local que será 9999 e outra variável que será o ID da menor posição possível. A primeira variável irá guardar a distância do primeiro elemento ao passar pelo FOR, a segunda irá guardar o ID 1, depois no segundo elemento, se a distância dele for menor do que a distância guardada nessa variável, então atualiza a variável com essa distância e a segunda variável passa a ser o ID 2, e vai fazendo isso com todos os demais itens dessa lista de posições. Ao final desse FOR, a primeira variável estará com a menor distância entre todos os elementos e a segunda variável estará com o ID da menor distância entre eles. Dai é só vc fazer o player nascer na posição desse ID.

(Sei que ficou difícil de entender, quando eu chegar em casa eu faço um exemplo com comentários pra ficar fácil de entender)

 

Share this post


Link to post
17 hours ago, Lord Henry said:

Você disse que já sabe que é preciso usar a função getDistanceBetweenPoints3D. Isso já é um excelente começo. Usando ela e um FOR para verificar a distância entre cada ponto, você consegue determinar qual deles tem a menor distância e fazer o jogador nascer lá. A lógica funciona assim: Você tem uma variável local que será 9999 e outra variável que será o ID da menor posição possível. A primeira variável irá guardar a distância do primeiro elemento ao passar pelo FOR, a segunda irá guardar o ID 1, depois no segundo elemento, se a distância dele for menor do que a distância guardada nessa variável, então atualiza a variável com essa distância e a segunda variável passa a ser o ID 2, e vai fazendo isso com todos os demais itens dessa lista de posições. Ao final desse FOR, a primeira variável estará com a menor distância entre todos os elementos e a segunda variável estará com o ID da menor distância entre eles. Dai é só vc fazer o player nascer na posição desse ID.

(Sei que ficou difícil de entender, quando eu chegar em casa eu faço um exemplo com comentários pra ficar fácil de entender)

 

realmente n entendi nada xD

Share this post


Link to post
local hospitais = {
	
	{ x, y, z },
	{ x, y, z },

}

function getNewSpawn( player )

	local hospitais_ = { }
	local x, y, z = getElementPosition( player )

	for i=1, #hospitais do

		table.insert( hospitais_, { distance = getDistanceBetweenPoints3D( x, y, z, hospitais[ i ][ 1 ], hospitais[ i ][ 2 ], hospitais[ i ][ 3 ] ), id = i } )

	end

	table.sort( hospitais_, function( a, b ) return a.distance < b.distance end )

	local id = hospitais_[ 1 ].id

	return hospitais[ id ][ 1 ], hospitais[ id ][ 2 ], hospitais[ id ][ 3 ]

end

--[[

	local x, y, z = getNewSpawn( player )

]]--

 

  • Thanks 1

Share this post


Link to post

Ta ae, coloquei comentários pra ficar mais fácil de entender.

local spawnPos = { -- (Prefira usar no máximo 3 casas decimais.)
	[1] = {2034.9428710938, -1403.2003173828, 18},	-- Hospital 1 LS
	[2] = {-2655.3991699219, 638.16137695313, 15},	-- Hospital SF
	[3] = {-1514.6713867188, 2522.4748535156, 56},	-- Hospital Tierra Robada
	[4] = {1607.62890625, 1818.9958496094, 11},	-- Hospital LV
	[5] = {-2198.5632324219, -2306.6220703125, 31},	-- Hospital Whetstone
}

addEventHandler ("onPlayerWasted", getRootElement(), function () -- Executa essa função quando o player morre.
	local x, y, z = getElementPosition (source) -- x, y, z recebem a posição do player onde ele morreu.
	local dist = 99999 -- Distância do ponto mais próximo.
	local id = 0 -- ID da coordenada mais próxima.
	for i, v in ipairs (spawnPos) do -- Para cada table de coordenadas, faça:
		local pX, pY, pZ = unpack (spawnPos[i]) -- pX,pY, pZ recebem as coordenadas que estão no spawnPos[i]
		if getDistanceBetweenPoints3D (x, y, z, pX, pY, pZ) < dist then -- Se a distância dessa coordenada for menor que dist, então:
			dist = getDistanceBetweenPoints3D (x, y, z, pX, pY, pZ) -- Atualiza a distância para essa.
			id = i -- Atualiza o id para este.
		end
	end
	if id == 1 then -- Outputs que servem somente para testes.
		outputChatBox ("Hospital mais próximo: Los Santos", source)
	elseif id == 2 then
		outputChatBox ("Hospital mais próximo: San Fierro", source)
	elseif id == 3 then
		outputChatBox ("Hospital mais próximo: Tierra Robada", source)
	elseif id == 4 then
		outputChatBox ("Hospital mais próximo: Las Venturas", source)
	elseif id == 5 then
		outputChatBox ("Hospital mais próximo: Whetstone", source)
	end
	setElementData (source, "killNear", id) -- Seta o id mais próximo como data no player.
end)

function spawnMe ()
	if getElementData (source, "killNear") then -- Se o jogador que morreu tem essa data, então: (quando o jogador entra no server, ele spawna sem essa data)
		setElementPosition (source, unpack (spawnPos[getElementData (source, "killNear")])) -- Coloca ele na posição desse ID que está na data.
		removeElementData (source, "killNear") -- Remove essa data, que não será mais usada até que ele morra novamente e uma nova data seja criada.
	end
end
addEventHandler ("onPlayerSpawn", getRootElement(), spawnMe) -- Executa essa função quando o player spawna.

 

  • Thanks 1

Share this post


Link to post

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.