Jump to content

Detectar el click de un componente


aka Blue

Recommended Posts

Posted

Bueno, mi pregunta es, ¿puedo detectar si he clickeado el componente de un vehículo con el ratón client-side? Si es posible, ¿cómo debería hacerlo?

Gracias.

Posted

Puedes intentar loopear todos los componentes y ver si su posición (getVehicleComponentPostion) es igual a la que clickeaste, aunque para los que son muy grandes no funcionaría del todo bien, quizás buscar el más cercano?

Posted (edited)
function getClosestComponent(vehicle, x, y, z)
  local a = {}
  for component in pairs ( getVehicleComponents(vehicle) ) do
    local cx, cy, cz = getVehicleComponentVisible(vehicle, component, "world")
    local distance = getDistanceBetweenPoints3D(x, y, z, cx, cy, cz)
      if ( a[distance] ) then
        repeat offset = math.random() until not a[distance+offset] end
      end
    a[distance+(offset or 0)] = {component, offset or 0}
  end
  local least, leastComp = -math.huge, nil
  for dist, compData in pairs(a) do
    local component, offset = unpack(compData)
    if dist-offset > least then
      least = dist-offset
      leastComp = component
  	end
  end
  return leastComp, least
end

Esto debería funcionar, no lo he probado.

Edited by Tomas
Posted

@Tomas ¿Y cómo debería utilizarlo correctamente? Pregunto debido a que retorna 2 datos, una llego a entender que es la posición (leastComp), pero la otra, ¿Es? ¿La distancia entre? Gracias :) 

Posted
5 hours ago, aka Blue said:

@Tomas ¿Y cómo debería utilizarlo correctamente? Pregunto debido a que retorna 2 datos, una llego a entender que es la posición (leastComp), pero la otra, ¿Es? ¿La distancia entre? Gracias :) 

leastComp es el componente más cercano al click, lo otro es adicional y es la distancia que había entre el click y ese componente.

Posted

Vector en el argumento 4, got boolean me dice, no se puede ejecutar el getDistanceBetweenPoints3D

function getClosestComponent( vehicle, x, y, z )
	local a = { }
	for component in pairs( getVehicleComponents( vehicle ) ) do
		local cx, cy, cz = getVehicleComponentVisible( vehicle, component, "world" )
		local distance = getDistanceBetweenPoints3D( x, y, z, cx, cy, cz )
		if a[ distance ] then
			repeat offset = math.random( ) until not a[ distance+offset ] 
		end
		a[ distance+( offset or 0 ) ] = { component, offset or 0 }
	end
	local least, leastComp = -math.huge, nil
	for dist, compData in pairs( a ) do
		local component, offset = unpack( compData )
		if dist-offset > least then
			least = dist-offset
			leastComp = component
		end
		return component
	end	
end

addEventHandler( "onClientClick", root,
	function( button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement )
		if button == "left" and state == "down" then
			if getElementType( clickedElement ) == "vehicle" then
				local component = getClosestComponent( clickedElement, worldX, worldY, worldZ )
				if component then
					outputChatBox( "si" )
				else
					outputChatBox( "no" )
				end
			end	
		end
	end
)

 

Vector en el argumento 4, got boolean me dice, no se puede ejecutar el getDistanceBetweenPoints3D

function getClosestComponent( vehicle, x, y, z )
	local a = { }
	for component in pairs( getVehicleComponents( vehicle ) ) do
		local cx, cy, cz = getVehicleComponentVisible( vehicle, component, "world" )
		local distance = getDistanceBetweenPoints3D( x, y, z, cx, cy, cz )
		if a[ distance ] then
			repeat offset = math.random( ) until not a[ distance+offset ] 
		end
		a[ distance+( offset or 0 ) ] = { component, offset or 0 }
	end
	local least, leastComp = -math.huge, nil
	for dist, compData in pairs( a ) do
		local component, offset = unpack( compData )
		if dist-offset > least then
			least = dist-offset
			leastComp = component
		end
		return component
	end	
end

addEventHandler( "onClientClick", root,
	function( button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement )
		if button == "left" and state == "down" then
			if getElementType( clickedElement ) == "vehicle" then
				local component = getClosestComponent( clickedElement, worldX, worldY, worldZ )
				if component then
					outputChatBox( "si" )
				else
					outputChatBox( "no" )
				end
			end	
		end
	end
)

 

Posted
		local cx, cy, cz = getVehicleComponentPosition( vehicle, component, "world" )

 

		local cx, cy, cz = getVehicleComponentPosition( vehicle, component, "world" )

 

		local cx, cy, cz = getVehicleComponentPosition( vehicle, component, "world" )

 

Posted

Gracias @Tomas. Ya funcionó. Ahora mi duda es... el componente no se detecta como un elemento, pero, podría hacer un render en el cual, pudiese mover ese componente usando una variable para almacenarlo y en el render con distintos botones el movimiento del mismo?

Posted
22 minutes ago, aka Blue said:

Gracias @Tomas. Ya funcionó. Ahora mi duda es... el componente no se detecta como un elemento, pero, podría hacer un render en el cual, pudiese mover ese componente usando una variable para almacenarlo y en el render con distintos botones el movimiento del mismo?

Si, usa setVehicleComponentPosition.

22 minutes ago, aka Blue said:

Gracias @Tomas. Ya funcionó. Ahora mi duda es... el componente no se detecta como un elemento, pero, podría hacer un render en el cual, pudiese mover ese componente usando una variable para almacenarlo y en el render con distintos botones el movimiento del mismo?

Si, usa setVehicleComponentPosition.

  • Recently Browsing   0 members

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