Jump to content

Identificar clique em tal parte do veiculo


Recommended Posts

Olá pessoal, estou tentando identificar o clique no porta-malas do veículo com a função processLineOfSight, porém sempre que clico no porta-malas do veículo retorna 4 identificando que o clique foi na parte de trás do carro. Eu acho que as posições que coloquei no parâmetro da função estejam erradas e não estou conseguindo solucionar isto.

local vehicleClicked = nil

function fClientClick(button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement)
	if button == "left" and state == "up" then
		if not getPedOccupiedVehicle(localPlayer) and isElement(clickedElement) and getElementType(clickedElement) == "vehicle" then
			if getElementData(clickedElement, "Owner") == localPlayer then
				local cx, cy, cz = getVehicleComponentPosition(clickedElement, "boot_dummy", "world")
				if cx and cy and cz then
					local hit, x, y, z, hitElement, _, _, _, _, _, part = processLineOfSight(worldX, worldY, worldZ, cx, cy, cz)
					iprint(part)
					-- if not guiGetVisible(weaponWindow) then
					-- 	guiSetVisible(weaponWindow, true)
					-- 	triggerServerEvent("RefreshListWeapons", resourceRoot, getElementModel(clickedElement))
					-- 	triggerServerEvent("OpenVehicleTrunk", resourceRoot, clickedElement, true)
					-- end
					-- vehicleClicked = clickedElement
				end
			end
		end
	end
end
addEventHandler("onClientClick", root, fClientClick)

 

Link to comment
  • Other Languages Moderators

processLineOfSight é meio bugado, além de ser pesado. Você pode verificar a posição do clique e compará-lo com a posição do porta-malas. Se clicou perto da posição do porta-malas, então considera como clicou no porta-malas.

function fClientClick (button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement)
    if (button == "left") and (state == "up") then
        if not getPedOccupiedVehicle(localPlayer) and isElement(clickedElement) and getElementType(clickedElement) == "vehicle" then
            -- if getElementData(clickedElement, "Owner") == localPlayer then
                local cx, cy, cz = getVehicleComponentPosition(clickedElement, "boot_dummy", "world") -- Obtém a posição do porta-malas
                if (math.abs(cx - worldX) <= 1) and (math.abs(cy - worldY) <= 1) and (math.abs(cz - worldZ) <= 1) then -- Se a diferença entre a posição clicada e a posição do porta-malas for menor que 1 (clicou perto), então:
                    print("Clicou no porta-malas!")
                else
                    print("Não clicou no porta-malas.")
                end
                if (boot) then destroyElement (boot) end
                if (target) then destroyElement (target) end
                boot = createMarker (cx, cy, cz, "corona", 0.1) -- Somente para testes. Marca a posição do porta-malas em azul.
                target = createMarker (worldX, worldY, worldZ, "corona", 0.1, 255, 0, 0, 255) -- Somente para testes. Marca a posição clicada em vermelho.
                -- if not guiGetVisible(weaponWindow) then
                    -- 	guiSetVisible(weaponWindow, true)
                    -- 	triggerServerEvent("RefreshListWeapons", resourceRoot, getElementModel(clickedElement))
                    -- 	triggerServerEvent("OpenVehicleTrunk", resourceRoot, clickedElement, true)
                -- end
                -- vehicleClicked = clickedElement
            -- end
        end
    end
end
addEventHandler ("onClientClick", root, fClientClick)

Se você quer que ele aceite cliques mais precisos, vc pode diminuir aqueles 1 da condição. Quanto menor o valor, mais perto do porta-malas precisa ser o clique  para ser considerado no porta-malas.

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