aka Blue Posted October 1, 2016 Share Posted October 1, 2016 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. Link to comment
Tomas Posted October 1, 2016 Share Posted October 1, 2016 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? Link to comment
aka Blue Posted October 1, 2016 Author Share Posted October 1, 2016 ¿Cómo podría hacerlo? El de buscar el más cercano, me refiero. Link to comment
Tomas Posted October 1, 2016 Share Posted October 1, 2016 (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 October 1, 2016 by Tomas Link to comment
aka Blue Posted October 2, 2016 Author Share Posted October 2, 2016 @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 Link to comment
Tomas Posted October 3, 2016 Share Posted October 3, 2016 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. Link to comment
aka Blue Posted October 7, 2016 Author Share Posted October 7, 2016 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 ) Link to comment
Tomas Posted October 7, 2016 Share Posted October 7, 2016 local cx, cy, cz = getVehicleComponentPosition( vehicle, component, "world" ) local cx, cy, cz = getVehicleComponentPosition( vehicle, component, "world" ) local cx, cy, cz = getVehicleComponentPosition( vehicle, component, "world" ) Link to comment
aka Blue Posted October 7, 2016 Author Share Posted October 7, 2016 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? Link to comment
Tomas Posted October 7, 2016 Share Posted October 7, 2016 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. Link to comment
Recommended Posts