Jump to content

Asignar varios clickeos a un objecto


aka Blue

Recommended Posts

Posted

Bueno, he tenido una duda la cual he intentado solucionar pero no encuentro modo. Lo que quiero hacer es contar los clicks hechos a un objecto mediante una tabla. Los objectos se crean mediante una tabla que les asigna una 'ID' (la key) y quiero comprobar si el jugador le ha hecho click a un objeto con una ID varias veces. Dejo un código de ejemplo para ver si se me entiende mas o menos:

local objectID = 920 
local clicksObjecto = { } 
local objetoID = { } 
  
objetos = { 
  
    [1] = { 996.90002441406, 2377, 9.8000001907349, 0, 0, 90 }, 
    [2] = { 969.5, 2302.6000976563, 9.8000001907349, 0, 0, 0 }, 
    [3] = { 897, 2131.6000976563, 9.8000001907349, 0, 0, 90 }, 
  
} 
  
addEventHandler ( "onResourceStart", resourceRoot, 
    function ( ) 
        for k, v in ipairs ( objetos ) do 
            local x, y, z, rotx, roty, rotz = v[1], v[2], v[3], v[4], v[5], v[6] 
            local objeto = createObject ( objectID, x, y, z, rotx, roty, rotz ) 
            objetoID [ objeto ] = k 
        end 
    end 
) 
  
function clickCamion ( theButton, theState, player ) 
    if theButton == "left" and theState == "down" then  
        if objetoID [ source ] then 
            local cliksAhora = clicksObjecto [ source ][ player ] or 0 
            clicksObjecto [ source ][ player ] = clicksAhora + 1 
            if clicksAhora == 2 then 
                outputChatBox ( "Le has dado 2 clicks ya." ) 
            end 
        end 
    end 
end 
addEventHandler( "onElementClicked", getRootElement(), clickCamion ) 

Posted
  
   local cliksAhora = clicksObjecto[player] [objetoID[source]] or 0 
   clicksObjecto[player] [objetoID[source]] = clicksAhora + 1 
  

Posted
En lo que es la creación del objeto, ¿tengo que asignar algún index?

Graicas @Tomas :)

Lo que mostraste en tu código de ejemplo debería ser suficiente, de todas formas, tú quieres que se "sume" si tienen el mismo modelo, o si tienen la misma ID (key)?

Posted

Quiero que cuando se le de click a un objeto que tenga una ID, en este caso los creados. Que almacene los clicks hechos por el jugador a ese objeto con esa ID. Digamos que quiero restringir los clicks, almacenándolos y luego comprobar cuantos se han hecho, y si se han hecho x pues que ya no deje hacer mas clicks.

Posted
Me da attempt to index field '?' (a nil value) en esta línea:
local cliksAhora = clicksObjecto[player] [objetoID[source]] or 0 

Agrega esto antes:

  
if ( not clicksObjeto.player ) then  
   clicksObjeto.player = {} 
end 
  

Posted

Gracias @Tomas, ya funciona correctamente ;)

Ahora una duda, aprovechando este post. ¿Cómo podría disminuir la lentitud al crear un objeto server-side mediante un evento? Estoy haciendo que al hacer click a un objeto determinado, utilizando la función que posteé aquí, cree un objeto en la mano del jugador utilizando bone-attach. Eh aquí el código:

                    if bolsaBasura [ player ] == nil then 
                        bolsaBasura [ player ] = createObject ( 1264, x, y, z )  
                        exports.bone_attach:attachElementToBone ( bolsaBasura [ player ],player,12,0,0.05,0.27,0,180,0) 
                        setObjectScale ( bolsaBasura [ player ], 0.5 )           
                    end 

PD: Me da un delay de unos segundos o máximo un minuto por lo que he comprobado. Algo que yo quiero que se realice al segundo de clickear.

Posted
Gracias @Tomas, ya funciona correctamente ;)

Ahora una duda, aprovechando este post. ¿Cómo podría disminuir la lentitud al crear un objeto server-side mediante un evento? Estoy haciendo que al hacer click a un objeto determinado, utilizando la función que posteé aquí, cree un objeto en la mano del jugador utilizando bone-attach. Eh aquí el código:

                    if bolsaBasura [ player ] == nil then 
                        bolsaBasura [ player ] = createObject ( 1264, x, y, z )  
                        exports.bone_attach:attachElementToBone ( bolsaBasura [ player ],player,12,0,0.05,0.27,0,180,0) 
                        setObjectScale ( bolsaBasura [ player ], 0.5 )           
                    end 

PD: Me da un delay de unos segundos o máximo un minuto por lo que he comprobado. Algo que yo quiero que se realice al segundo de clickear.

No lo attachees al mismo momento, agrega un timer de 0.1s

Posted

Revivo para decir que el clicksObjeto.player = {} no funciona correctamente. Da igual lo que le pongas, sigue contando los clicks a todos los jugadores en el servidor. Me gustaría que un usuario tenga unos clicks definidos a un objeto y que el mismo no pueda realizar mas hasta que se asigne nuevamente nil a la tabla. Mientras, que otros puedan darle click :S

Posted
Revivo para decir que el clicksObjeto.player = {} no funciona correctamente. Da igual lo que le pongas, sigue contando los clicks a todos los jugadores en el servidor. Me gustaría que un usuario tenga unos clicks definidos a un objeto y que el mismo no pueda realizar mas hasta que se asigne nuevamente nil a la tabla. Mientras, que otros puedan darle click :S

Postea el código que estás usando para saber cuántos clicks tiene cada uno

Posted

Lo quiero hacer para el job de basurero. Aquí posteo el código:

function contenedorClick ( theButton, theState, player ) 
    if theButton == "left" and theState == "down" then  
        if contenedoresID [ source ] then 
            if ( not clicksContenedor.player ) then  
                clicksContenedor.player = {} 
            end 
            local x, y, z = getElementPosition ( player ) 
            local basuraActual = basuraRecogida [ player ] or 0 
            local cantidadRandom = math.random ( 1, 5 ) 
            if trabajando [ player ] == true then 
                if clicksContenedor.player[ contenedoresID [ source ] ] == nil then  
                    if bolsaBasura [ player ] == nil then 
                        bolsaBasura [ player ] = createObject ( 1264, x, y, z )  
                        setTimer ( function ( ) 
                            exports.bone_attach:attachElementToBone ( bolsaBasura [ player ],player,12,0,0.05,0.27,0,180,0) 
                        end, 100, 1 ) 
                        setObjectScale ( bolsaBasura [ player ], 0.5 )           
                    end 
                    exports.chat:me ( player, "empieza a recoger la basura del contenedor." ) 
                    outputChatBox ( "• Recogiendo la basura, espera...", player, 255, 255, 0 ) 
                    setTimer ( function ( ) 
                        outputChatBox ( "• Has recogido "..cantidadRandom.." de basura del contenedor.", player, 0, 255, 0 ) 
                        basuraRecogida [ player ] = basuraActual + cantidadRandom 
                    end, 4000, 1 ) 
                    clicksContenedor.player[ contenedoresID [ source ] ] = 1 
                else 
                    outputChatBox ( "(( Ya has recogido éste contenedor. Pasa al siguiente. ))", player, 255, 145, 0 ) 
                end 
            else 
                outputChatBox ( "(( No estás trabajando. Coge un camión y empieza tu ruta para empezar a trabajar. ))", player, 255, 145, 0 ) 
            end 
        end 
    end 
end 
addEventHandler( "onElementClicked", getRootElement(), contenedorClick ) 

Posted

Que si por ejemplo yo le doy click al contenedor, ya le salen a todos que está recogido, y yo lo que quiero es que solo le salga al jugador que le ha dado click que ya está recogido para evitar un farmeo masivo.

Posted

¿Up? He intentado todas las formas posibles, como cambiando el index de la tabla y sigo sin hacerlo funcional :c

PD: @Gaberiel, ¿te refieres a los clickeos, hacerlos lado cliente? Gracias por responder :)

  • Recently Browsing   0 members

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