Jump to content

Recuperar Veículo


Recommended Posts

12 minutes ago, Lord Henry said:

Como funciona essa função getVehicleByID? Ela usa elementData?

sim, tem o banco de dados, eh um script de concessionária 

function getFreeID()
	local result = dbPoll(dbQuery(db, "SELECT ID FROM VehicleList ORDER BY ID ASC"), -1)
	newID = false
	for i, id in pairs (result) do
		if id["ID"] ~= i then
			newID = i
			break
		end
	end
	if newID then return newID else return #result + 1 end
end

function getVehicleByID(id)
	v = false
	for i, veh in ipairs (getElementsByType("vehicle")) do
		if getElementData(veh, "ID") == id then
			v = veh
			break
		end
	end
	return v
end

 

Edited by SherlocK
Link to comment
15 hours ago, Lord Henry said:
  Ocultar conteúdo

[vídeo removido pelo usuário]

 

ok, entendi como funciona e agradeço as alterações a mais q você fez, mas eu não gostaria q para recuperar fosse por comando, pois o cara la na casa do chapéu vai dar o comando e vai ser teleportado ali, teria como fazer algo juntamente neste meu script que é de concessionária onde o cara chega no detran e mostra os carros dele que estão ali para ele recuperar, ou então como vc msm citou que seria bem mais simples acredito eu, que seria criar um shape onde identifica se tem um carro ali ou n para aplicar se a vaga esta livre ou ocupada ainda

Edited by Lord Henry
Link to comment
  • Other Languages Moderators

Como eu disse no vídeo, eu fiz por comando pois eu não tenho o painel. A questão do comando é apenas para simular mais ou menos os dados que o painel iria enviar pro servidor.

O objetivo final não é pra ser com comando mesmo.

Link to comment
2 minutes ago, Lord Henry said:

Como eu não disse nenhum vídeo, eu fiz o comando pois eu não tenho o painel. A questão do comando é apenas para simular mais ou menos os dados que o painel enviará para o servidor.

O objetivo final não é ser com o mesmo comando.

sim, eu digo a parte do recv entendeu, q tem q dar o comando para q o script entenda q a vaga ficou livre

Link to comment
  • Other Languages Moderators

Sim. No seu caso seria o painel que iria liberar a vaga.

Mas se o cara for lá manualmente buscar o carro (como eu fiz) sem usar comando nenhum. Dai a vaga vai continuar sendo considerada ocupada pelo script.

É por isso que depois de ocupar as vagas, quando você tenta enviar outro veículo, não acontece nada. Pois ele não encontrou vaga livre.

Lembra o que eu perguntei pra você lá no começo do tópico?

Quote

E o que acontece se todos os lugares estiverem cheios?

 

Edited by Lord Henry
Link to comment
3 minutes ago, Lord Henry said:

Sim. No seu caso seria o painel que iria liberar a vaga.

Mas se o cara for lá manualmente buscar o carro (como eu fiz) sem usar comando nenhum. Dai a vaga vai continuar sendo considerada ocupada pelo script.

É por isso que depois de ocupar as vagas, quando você tenta enviar outro veículo, não acontece nada. Pois ele não encontrou vaga livre.

e n ficaria mais simples de colocar um shape para reconhecer se o veículo está no local da vaga ou não? pois pelo painel o cara poderia clicar em sla "Pegar Carro", e ser teleportado pra la de onde estivesse, quebrando o RP.

pq tipo teria o Recuperar q o carro é teleportado para lá, e o "Pegar Carro" q seria pra retirar ele do pátio. Ou sla, tem como definir uma zona onde o comando só vai funcionar se ele tiver naquele local do detran? 

Edited by SherlocK
Link to comment
  • Other Languages Moderators

Ou você poderia tornar os locais de DETRAN inacessíveis pelos jogadores. De forma que não tem como entrar nos veículos que estão lá.
Ou então você simplesmente freeza e tranca todos os veículos quando eles são mandados ao DETRAN. Destrancando-os e descongelando-os somente quando o jogador pegar ele pelo painel.

Dai o jogador é obrigado a puxar o carro pelo painel. (dai vc muda o sistema que em vez de teleportar o jogador pra lá, teleporta o carro pro jogador)

Edited by Lord Henry
Link to comment
Just now, Lord Henry said:

Ou você poderia tornar os locais de DETRAN inacessíveis pelos jogadores. De forma que não tem como entrar nos veículos que estão lá.

Dai o jogador é obrigado a puxar o carro pelo painel. (dai vc muda o sistema que em vez de teleportar o jogador pra lá, teleporta o carro pro jogador)

Eu retirei essa função, quando recuperava o carro, ele ia direto para o jogador. Agr ele vai para o pátio do detran, onde ele tem q ir la e pegar o carro. O servidor eh de RP, se colocar pra teleportar vai quebrar esse RP

Link to comment
Just now, Lord Henry said:

Pois é, mas em todos os casos ocorre o teleporte.

  • Quando o carro vai pro DETRAN.
  • Quando o carro vai pro jogador.
  • Quando o jogador vai pro DETRAN.

sim, mas o carro só vai para o detran, caso não esteja com ele dentro, entao ele terá q ir apé até o detran para retirar o carro. Se ele teleportar pra la vai quebrar o RP da seguinte forma, exemplo: ele está em LV e o carro quebrou, pra n chamar mec q vai demorar um monte para ir até la, ele vai manda o carro para o detran e vai e teleporta pra la logo após usando o "recv" para voltar pra cidade.

ou se o carro teleportar até ele pode acontecer o seguinte, ele esta  dando fuga, o carro dele quebrou, ele spawna outro e clica em recuperar, o carro eh teleportado até ele e ele continua a fuga usando outro carro.

Link to comment
  • Other Languages Moderators
1 minute ago, SherlocK said:

vai e teleporta pra la logo após usando o "recv" para voltar pra cidade.

Cara, já falei. Esse negócio de comando é só no MEU CASO pois eu não tenho o painel. Esqueça o uso de comandos.

Link to comment

oq estou tentando pedir é, tem como fazer com que ou fazer um shape nas vagas para reconhecer se há um veículo la ou não para acusar se a vaga está livre ou ocupada, ou fazer com que o comando para recuperar o carro do detran ( tirar da vaga ) seja restrito para o local do detran, onde ninguem q estiver fora do pátio consiga dar este comando, ou recuperar pelo painel e tals

Link to comment
  • Other Languages Moderators

Claro que dá.

Você tem uma table com todas as coordenadas das vagas, certo?

Passa um loop nas vagas criando um colShape em cada uma das coordenadas.

Recomendo o createColSphere, pois não precisa determinar coordenadas e tamanhos dos lados, apenas seu raio (que vc pode usar um valor fixo para todas)

Link to comment
7 minutes ago, Lord Henry said:

Claro que dá.

Você tem uma table com todas as coordenadas das vagas, certo?

Passa um loop nas vagas criando um colShape em cada uma das coordenadas.

Recomendo o createColSphere, pois não precisa determinar coordenadas e tamanhos dos lados, apenas seu raio (que vc pode usar um valor fixo para todas)

certo e como faria isso? nunca mexi com colShape, olhei a sintaxe e os exemplos mas ainda n entendi em como encaixar essa função no script q tenho.

No caso isso tiraria a função recover do script certo? pois no próprio warp reconheceria q a vaga está livre

Edited by SherlocK
Link to comment
  • Other Languages Moderators
detran = { -- x, y, z, ocupado, colShape
	[1] = {746.4, -1334.81, 13.54, false}, -- Esta coordenada está no seu script.
	[2] = {756.4, -1334.81, 13.54, false}, -- Esta coordenada eu inventei.
}

for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
    vaga[5] = createColSphere (vaga[1], vaga[2], vaga[3], 5) -- Adiciona um quinto elemento na vaga, depois do false. Que é uma colShape esférica de 5 metros de raio.
end

Obs: Para poder ver colShapes precisa usar /showcol (comando só funciona em Modo Desenvolvedor).

Edited by Lord Henry
Link to comment
1 hour ago, Lord Henry said:

detran = { -- x, y, z, ocupado, colShape
	[1] = {746.4, -1334.81, 13.54, false}, -- Esta coordenada está no seu script.
	[2] = {756.4, -1334.81, 13.54, false}, -- Esta coordenada eu inventei.
}

for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
    vaga[5] = createColSphere (vaga[1], vaga[2], vaga[3], 5) -- Adiciona um quinto elemento na vaga, depois do false. Que é uma colShape esférica de 5 metros de raio.
end

Obs: Para poder ver colShapes precisa usar /showcol (comando só funciona em Modo Desenvolvedor).

fiz isso juntamente com a rotação, mas ele n reconheceu q a vaga ficou livre novamente, esta certo? ou eu fiz errado?

detran = { -- x, y, z, ocupado
    [1] = {746.4, -1334.81, 13.54, false}, -- Esta coordenada está no seu script.
    [2] = {751.4, -1334.81, 13.54, false},
	[3] = {756.4, -1334.81, 13.54, false},	-- Esta coordenada eu inventei.
}

addEvent("WarpMyVehicle", true)
addEventHandler("WarpMyVehicle", root, function(id)
    if not isPedInVehicle (source) then
		if getElementInterior(source) == 0 then
			if getPlayerMoney(source) >= tonumber(1000) then
				local vehicle = getVehicleByID(id)
				if isElement(vehicle) then
					for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
						local x, y, z, status = unpack (vaga) -- x, y, z são as coordenadas pra onde teleportar o veículo.
						if not status then -- Se a vaga está desocupada, então:
							vaga[4] = vehicle
							vaga[5] = createColSphere (vaga[1], vaga[2], vaga[3], 5) -- Adiciona um quinto elemento na vaga, depois do false. Que é uma colShape esférica de 5 metros de raio.
							takePlayerMoney (source, 1000)
							setElementPosition (vehicle, x, y, z)
							setElementRotation(vehicle,0,0,180)
							outputChatBox ("O seu veiculo #00FF66"..(customCarNames[getElementModel(vehicle)] or getVehicleNameFromModel(getElementModel(vehicle))).." foi entregue ao Detran.", source, 193, 193, 193, true)
							return
						end
					end
					outputChatBox ("Não há vagas disponíveis no Detran.", source, 193, 193, 193, true)
				else
					outputChatBox ("O seu veiculo não está spawnado.", source, 193, 193, 193, true)
				end
			else
				outputChatBox ("Você não tem os meios de se teletransportar para o veiculo.", source, 193, 193, 193, true)
			end
		else
			outputChatBox ("Você só poderá mudar de veiculo se sair do atual.", source, 193, 193, 193, true)
		end
	else
		outputChatBox ("Nós não podemos dirigir seu veiculo. Por favor, sair do outro veiculo.", source, 193, 193, 193, true)
	end
end)


----- assim tbm n deu 

addEvent("WarpMyVehicle", true)
addEventHandler("WarpMyVehicle", root, function(id)
    if not isPedInVehicle (source) then
		if getElementInterior(source) == 0 then
			if getPlayerMoney(source) >= tonumber(1000) then
				local vehicle = getVehicleByID(id)
				if isElement(vehicle) then
					for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
						vaga[5] = createColSphere (vaga[1], vaga[2], vaga[3], 5) -- Adiciona um quinto elemento na vaga, depois do false. Que é uma colShape esférica de 5 metros de raio.
						local x, y, z, status = unpack (vaga) -- x, y, z são as coordenadas pra onde teleportar o veículo.
						if not status then -- Se a vaga está desocupada, então:
							vaga[4] = vehicle
							takePlayerMoney (source, 1000)
							setElementPosition (vehicle, x, y, z)
							setElementRotation(vehicle,0,0,180)
							outputChatBox ("O seu veiculo #00FF66"..(customCarNames[getElementModel(vehicle)] or getVehicleNameFromModel(getElementModel(vehicle))).." #c1c1c1foi entregue ao Detran.", source, 193, 193, 193, true)
							return
						end
					end
					outputChatBox ("Não há vagas disponíveis no Detran.", source, 193, 193, 193, true)
				else
					outputChatBox ("O seu veiculo não está spawnado.", source, 193, 193, 193, true)
				end
			else
				outputChatBox ("Você não tem os meios de se teletransportar para o veiculo.", source, 193, 193, 193, true)
			end
		else
			outputChatBox ("Você só poderá mudar de veiculo se sair do atual.", source, 193, 193, 193, true)
		end
	else
		outputChatBox ("Nós não podemos dirigir seu veiculo. Por favor, sair do outro veiculo.", source, 193, 193, 193, true)
	end
end)

 

Edited by SherlocK
Link to comment
  • Other Languages Moderators

Vídeo:

Spoiler

[vídeo removido pelo usuário]

Script:

Spoiler

 


detran = { -- x, y, z, rotation, vehicle, colShape, ownerAccount
	[1] = {746.4, -1334.81, 13.54, 180, false, nil, nil}, -- Esta coordenada está no seu script.
	[2] = {756.4, -1334.81, 13.54, 180, false, nil, nil}, -- Esta coordenada eu inventei.
}

customCarNames = {}

function criarShapes () -- Cria cada colShape nas vagas e coloca eles na mesma table das vagas, como sendo o 5º elemento de cada uma.
    for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
        vaga[6] = createColSphere (vaga[1], vaga[2], vaga[3], 4) -- Adiciona um quinto elemento na vaga, depois do false. Que é uma colShape esférica de 4 metros de raio.
    end
    addEventHandler ("onColShapeLeave", resourceRoot, liberarVaga) -- Ativa essa função quando um elemento sair de dentro de qualquer colShape deste resource. (se usar root, funcionaria com todos os colShapes do server e seria mais pesado de processar)
    addEventHandler ("onColShapeHit", resourceRoot, liberarVehicle) -- Ativa essa função quando um elemento entrar em qualquer colShape deste resource. Vai verificar se o elemento que entrou é o dono daquela vaga.
end
addEventHandler ("onResourceStart", resourceRoot, criarShapes)

addEvent("WarpMyVehicle", true)
addEventHandler("WarpMyVehicle", root, function(id)
	local vehicle = getVehicleByID(id)
    if isElement(vehicle) then
        if (not getVehicleOccupant (vehicle, 0)) and (not getVehicleOccupant (vehicle, 1)) and (not getVehicleOccupant (vehicle, 2)) and (not getVehicleOccupant (vehicle, 3)) then -- Se o veículo a ser rebocado está vazio, então:
            for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
                if (vaga[5] == vehicle) then
                    return outputChatBox ("Seu veículo #00FF66"..(customCarNames[getElementModel(vehicle)] or getVehicleNameFromModel(getElementModel(vehicle))).."#ff3232 já está no DETRAN.", source, 255, 50, 50, true) -- Manda isso pro jogador e para de executar essa função.
                end
            end
            if getElementInterior(source) == 0 then
                if getPlayerMoney(source) >= tonumber(1000) then
                    for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
                        if not vaga[5] then -- Se a vaga está desocupada (não tem nenhum veículo no 5º elemento da vaga), então:
                            vaga[5] = vehicle
                            vaga[7] = getAccountName (getPlayerAccount (source))
                            -- takePlayerMoney (source, 1000)
                            setElementPosition (vaga[5], vaga[1], vaga[2], vaga[3]) -- Troquei o unpack por declarar direto os itens da table.
                            setElementRotation (vaga[5], 0, 0, vaga[4])
                            -- outputChatBox ("congelou, trancou e blindou") -- Somente para testes.
                            setElementFrozen (vaga[5], true) -- Congela o veículo.
                            setVehicleLocked (vaga[5], true) -- Tranca o veículo.
                            setVehicleDamageProof (vaga[5], true) -- Blinda o veículo.
                            setVehicleDoorOpenRatio (vaga[5], 0, 0)
                            setVehicleDoorOpenRatio (vaga[5], 1, 0)
                            setVehicleDoorOpenRatio (vaga[5], 2, 0)
                            setVehicleDoorOpenRatio (vaga[5], 3, 0)
                            setVehicleDoorOpenRatio (vaga[5], 4, 0)
                            setVehicleDoorOpenRatio (vaga[5], 5, 0) -- Fecha todas as portas do veículo, para evitar que entrem nele pra zoar.
                            setVehicleEngineState (vaga[5], false) -- Desliga o motor do veículo.
                            outputChatBox ("O seu veiculo #00ff66"..(customCarNames[getElementModel(vehicle)] or getVehicleNameFromModel(getElementModel(vehicle))).."#c1c1c1 foi levado ao DETRAN.", source, 193, 193, 193, true)
                            return
                        end
                    end
                    outputChatBox ("Não há vagas disponíveis no DETRAN.", source, 255, 50, 50, true)
                else
                    outputChatBox ("Você não tem dinheiro suficiente para levarmos seu veículo até o DETRAN.", source, 255, 50, 50, true)
                end
            else
                outputChatBox ("Não podemos levar seu veículo ao DETRAN se você estiver em interiores.", source, 255, 50, 50, true)
            end
        else
            outputChatBox ("Não podemos levar seu veículo enquanto ele estiver ocupado por alguém.", source, 255, 50, 50, true)
        end
    else
        outputChatBox ("O seu veiculo não está spawnado.", source, 255, 50, 50, true)
    end
end)

function getVehicleByID(id)
	for i, veh in ipairs (getElementsByType("vehicle")) do
		if getElementData(veh, "ID") == id then
			return veh
		end
	end
end

function liberarVaga (leaveElement) -- Essa função é ativada quando qualquer elemento sair de qualquer colShape deste resource. O evento ativador só é adicionado depois que os colShapes são criados, evitando erros.
    for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
        if (source == vaga[6]) then -- Se o colShape cujo elemento saiu pertence a esta vaga, então: (source = colShape envolvido no evento)
            if (leaveElement == vaga[5]) then -- Se o elemento que saiu é o veículo desta vaga, então: (evita de liberar a vaga quando algo sai da vaga sem ser o veículo dela)
                vaga[5] = false -- Libera a vaga.
                vaga[7] = nil -- Libera o proprietário da vaga.
                if (getVehicleController(leaveElement)) then
                    outputChatBox ("Liberou a vaga #00ff66"..i.."#c1c1c1 do DETRAN.", getVehicleController(leaveElement), 193, 193, 193, true) -- Somente para testes.
                end
                return -- Para de executar essa função pois não precisa nem verificar o resto do loop.
            elseif (leaveElement) and (getElementType (leaveElement) == "player") and (not getPedOccupiedVehicle (leaveElement)) then -- Senão se o elemento que saiu for um jogador que não está em um veículo, então:
                if (getAccountName (getPlayerAccount (leaveElement)) == vaga[7]) then -- Se o jogador que saiu tem o mesmo login do proprietário desta vaga, então:
                    -- outputChatBox ("congelou, trancou e blindou") -- Somente para testes.
                    setElementPosition (vaga[5], vaga[1], vaga[2], vaga[3])
                    setElementRotation (vaga[5], 0, 0, vaga[4])
                    setElementFrozen (vaga[5], true) -- Congela novamente o veículo.
                    setVehicleLocked (vaga[5], true) -- Tranca novamente o veículo.
                    setVehicleDamageProof (vaga[5], true) -- Blinda novamente o veículo.
                    setVehicleDoorOpenRatio (vaga[5], 0, 0)
                    setVehicleDoorOpenRatio (vaga[5], 1, 0)
                    setVehicleDoorOpenRatio (vaga[5], 2, 0)
                    setVehicleDoorOpenRatio (vaga[5], 3, 0)
                    setVehicleDoorOpenRatio (vaga[5], 4, 0) -- Fecha todas as portas do veículo novamente.
                    setVehicleDoorOpenRatio (vaga[5], 5, 0)
                    setVehicleEngineState (vaga[5], false) -- Desliga o motor do veículo.
                    outputChatBox ("Seu #00ff66"..(customCarNames[getElementModel(vaga[5])] or getVehicleNameFromModel(getElementModel(vaga[5]))).."#c1c1c1 voltou a ficar protegido e trancado.", leaveElement, 193, 193, 193, true)
                    return -- Para de executar essa função pois não precisa verificar o resto do loop.
                end
            end
        end
    end
end

function liberarVehicle (hitElement) -- Essa função é ativada quando qualquer elemento entra em qualquer colShape deste resource.
    for i, vaga in ipairs (detran) do -- Para cada vaga, faça:
        if (source == vaga[6]) then -- Se o colShape cujo elemento entrou pertence a esta vaga, então: (source = colShape envolvido no evento)
            if (hitElement) and (getElementType (hitElement) == "player") then -- Se o elemento que colidiu for um player, então:
                if (getAccountName (getPlayerAccount (hitElement)) == vaga[7]) then -- Se o jogador que entrou tem o mesmo login do proprietário desta vaga, então: (evita de liberar o veículo quando um jogador entra no colShape sem ser dono dela)
                    -- outputChatBox ("descongelou, destrancou e desblindou") -- Somente para testes.
                    setElementFrozen (vaga[5], false) -- Descongela o veículo.
                    setVehicleLocked (vaga[5], false) -- Destranca o veículo.
                    setVehicleDamageProof (vaga[5], false) -- Desblinda o veículo.
                    outputChatBox ("Este é seu #00ff66"..(customCarNames[getElementModel(vaga[5])] or getVehicleNameFromModel(getElementModel(vaga[5]))).."#c1c1c1. Liberamos ele pra você.", hitElement, 193, 193, 193, true)
                    return -- Para de executar essa função pois não precisa nem verificar o resto do loop.
                end
            end
        end
    end
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...