Jump to content

[AYUDA] el script no guarda con setAccount


Recommended Posts

Este script fue puesto y discutido en el foro hace mucho tiempo, pero aun sigue bug.

Como le hago para que guarde el tiempo?

es decir, que cuando el jugador se meta y se logee me vuelva a poner el tiempo que tenia cuando salio

exports.scoreboard:addScoreboardColumn('PlayTime') 
  
local t = { } 
  
function checkValues( source,arg1,arg2) 
    if (arg2 >= 60) then 
        t[ source ][ 'min' ] = tonumber( t[ source ][ 'min' ] or 0 ) + 1 
        t[ source ][ 'sec' ] = 0 
    end 
    if (arg1 >= 60) then 
        t[ source ][ 'min' ] = 0 
        t[ source ][ 'hour' ] = tonumber( t[ source ][ 'hour' ] or 0 ) + 1 
    end 
    return arg1, arg2 
end 
      
setTimer( 
    function( ) 
        for _, v in pairs( getElementsByType( "player" ) ) do 
            if (not t[ v ]) then 
                t[ v ] = { 
                            ["hour"] = 0, 
                             ["min"] = 0, 
                             ["sec"] = 0 
                            } 
            end 
  
            t[ v ][ 'sec' ] = tonumber( t[ v ][ 'sec' ] or 0 ) + 1 
            local min,sec = checkValues ( 
                    v, 
                    t[ v ][ 'min' ] or 0, 
                    t[ v ][ 'sec' ] or 0 
                        )   
    local hour = tonumber( t[ v ][ 'hour' ] or 0 ) 
  
            setElementData( 
                v, 
                "PlayTime", 
                tostring( hour )..':'..tostring( min )..':'..tostring( sec ) 
            ) 
        end 
    end, 
    1000, 0 
) 
    
function onPlayerQuit ( ) 
    local playeraccount = getPlayerAccount ( source ) 
    if ( playeraccount ) and not isGuestAccount ( playeraccount ) then 
        local sValue = getElementData( source,'PlayTime' ) 
        setAccountData ( playeraccount, "PlayTime", tostring(sValue)) 
    end 
    t[ source ] = nil 
end 
  
function onPlayerLogin (_, playeraccount ) 
    if ( playeraccount ) then 
        local time = getAccountData ( playeraccount, "PlayTime" ) 
        if ( time ) then 
            setElementData ( source, "PlayTime", time ) 
                else 
            setElementData ( source, "PlayTime",0 ) 
        setAccountData ( playeraccount, "PlayTime",0 ) 
        end 
    end 
end 
addEventHandler ( "onPlayerQuit", root, onPlayerQuit ) 
addEventHandler ( "onPlayerLogin", root, onPlayerLogin ) 

y no tira ningun error, y no logro entender porque no guarda en la cuenta

Link to comment
Cambia el nombre de la función. No puede ser igual al del evento.

no tiene efecto, el script sigue fallando.

exports.scoreboard:addScoreboardColumn('PlayTime') 
  
local t = { } 
  
function checkValues( source,arg1,arg2) 
    if (arg2 >= 60) then 
        t[ source ][ 'min' ] = tonumber( t[ source ][ 'min' ] or 0 ) + 1 
        t[ source ][ 'sec' ] = 0 
    end 
    if (arg1 >= 60) then 
        t[ source ][ 'min' ] = 0 
        t[ source ][ 'hour' ] = tonumber( t[ source ][ 'hour' ] or 0 ) + 1 
    end 
    return arg1, arg2 
end 
      
setTimer( 
    function( ) 
        for _, v in pairs( getElementsByType( "player" ) ) do 
            if (not t[ v ]) then 
                t[ v ] = { 
                            ["hour"] = 0, 
                             ["min"] = 0, 
                             ["sec"] = 0 
                            } 
            end 
  
            t[ v ][ 'sec' ] = tonumber( t[ v ][ 'sec' ] or 0 ) + 1 
            local min,sec = checkValues ( 
                    v, 
                    t[ v ][ 'min' ] or 0, 
                    t[ v ][ 'sec' ] or 0 
                        )   
    local hour = tonumber( t[ v ][ 'hour' ] or 0 ) 
  
            setElementData( 
                v, 
                "PlayTime", 
                tostring( hour )..':'..tostring( min )..':'..tostring( sec ) 
            ) 
        end 
    end, 
    1000, 0 
) 
    
function playerleft ( ) 
    local playeraccount = getPlayerAccount ( source ) 
    if ( playeraccount ) and not isGuestAccount ( playeraccount ) then 
        local sValue = getElementData( source,'PlayTime' ) 
        setAccountData ( playeraccount, "PlayTime", tostring(sValue) ) 
    end 
    t[ source ] = nil 
end 
  
function playerlogin (_, playeraccount ) 
    if ( playeraccount ) then 
        local time = getAccountData ( playeraccount, "PlayTime" ) 
        if ( time ) then 
            setElementData ( source, "PlayTime", time ) 
                else 
            setElementData ( source, "PlayTime",0 ) 
        setAccountData ( playeraccount, "PlayTime",0 ) 
        end 
    end 
end 
addEventHandler ( "onPlayerQuit", root, playerleft ) 
addEventHandler ( "onPlayerLogin", root, playerlogin ) 

Link to comment
Hidden
Cambia el nombre de la función. No puede ser igual al del evento.

Eso no tiene el mas mínimo sentido, te recomiendo leer la wiki de MTA y la documentación de Lua.

* @venadH, ¿Estas seguro de que el 'elementData' es establecido correctamente?

Link to comment
Hidden

toma puedes utilizar este codigo es el que yo uso D:

exports.scoreboard:addScoreboardColumn('Online') 
  
local t = { } 
  
function checkValues( source,arg1,arg2) 
    if (arg2 >= 60) then 
        t[ source ][ 'min' ] = tonumber( t[ source ][ 'min' ] or 0 ) + 1 
        t[ source ][ 'sec' ] = 0 
    end 
    if (arg1 >= 60) then 
        t[ source ][ 'min' ] = 0 
        t[ source ][ 'hour' ] = tonumber( t[ source ][ 'hour' ] or 0 ) + 1 
    end 
    return arg1, arg2 
end 
      
setTimer( 
    function( ) 
        for _, v in pairs( getElementsByType( "player" ) ) do 
            if (not t[ v ]) then 
                t[ v ] = { 
                            ["hour"] = 0, 
                             ["min"] = 0, 
                             ["sec"] = 0 
                            } 
            end 
  
            t[ v ][ 'sec' ] = tonumber( t[ v ][ 'sec' ] or 0 ) + 1 
            local min,sec = checkValues ( 
                    v, 
                    t[ v ][ 'min' ] or 0, 
                    t[ v ][ 'sec' ] or 0 
                        )   
    local hour = tonumber( t[ v ][ 'hour' ] or 0 ) 
  
            setElementData( 
                v, 
                "Online", 
                (tostring( hour )..'H '..tostring( min )..'M ') 
            ) 
        end 
    end, 
    1000, 0 
) 
    
function onPlayerQuit ( ) 
    local playeraccount = getPlayerAccount ( source ) 
    if ( playeraccount ) and not isGuestAccount ( playeraccount ) then 
        local sValue = getElementData( source,'Online' ) 
    local hour = tonumber( t[ source ][ 'hour' ] or 0 ) 
    local min = tonumber( t[ source ][ 'min' ] or 0 ) 
    local sec = tonumber( t[ source ][ 'sec' ] or 0 ) 
        setAccountData ( playeraccount, "Online-hour", tostring(hour) ) 
        setAccountData ( playeraccount, "Online-min", tostring(min) ) 
        setAccountData ( playeraccount, "Online-sec", tostring(sec) ) 
        setAccountData ( playeraccount, "Online", tostring(sValue) ) 
  
    end 
    t[ source ] = nil 
end 
  
function onPlayerLogin (_, playeraccount ) 
    if ( playeraccount ) then 
        local time = getAccountData ( playeraccount, "Online" ) 
    local hou = getAccountData ( playeraccount, "Online-hour") 
    local min = getAccountData ( playeraccount, "Online-min") 
    local sec = getAccountData ( playeraccount, "Online-sec") 
        if ( time ) then 
            setElementData ( source, "Online", time ) 
  
                             t[ source ]["hour"] = tonumber(hou) 
                             t[ source ]["min"] = tonumber(min) 
                             t[ source ]["sec"] = tonumber(sec) 
                else 
            setElementData ( source, "Online",0 ) 
            setAccountData ( playeraccount, "Online",0 ) 
        end 
    end 
end 
addEventHandler ( "onPlayerQuit", root, onPlayerQuit ) 
addEventHandler ( "onPlayerLogin", root, onPlayerLogin ) 

Link to comment
Hidden
Alex, te recomiendo leer unos posts más atrás. Donde Solid dice que las funciones no pueden tener el nombre del evento.

El sabe mas que todos nosotros juntos.

[15:16:18] Alexs_Steel: Una funcion puede tener el mismo nombre que un evento?

[15:16:41] Castillo: se

Link to comment
Hidden
Anoche revisando posts viejos ví eso. Sigo buscandolo, cuando lo encuentro lo cito aquí.

Entonces, ¿en que afectaría eso a el funcionamiento del script?

La verdad es que si se puede hacer ya que no afecta a la comprensión de la maquina hacia el código, pero por normas de estilo de programación no se debería hacer ya que esto podría dificultar la comprensión una persona hacia el código, aunque a mi parecer, nombrar la función con el mismo nombre que el evento, en este caso no afecta la comprensión del código.

PD: No lo leí en un foro ni lo inventé, es lo que he aprendido en la universidad.

PD2: Quizás en códigos mas complejos y con mas lineas puedas enredarte si nombras eventos, variables, o funciones con el mismo nombre.

Link to comment
toma puedes utilizar este codigo es el que yo uso D:
exports.scoreboard:addScoreboardColumn('Online') 
  
local t = { } 
  
function checkValues( source,arg1,arg2) 
    if (arg2 >= 60) then 
        t[ source ][ 'min' ] = tonumber( t[ source ][ 'min' ] or 0 ) + 1 
        t[ source ][ 'sec' ] = 0 
    end 
    if (arg1 >= 60) then 
        t[ source ][ 'min' ] = 0 
        t[ source ][ 'hour' ] = tonumber( t[ source ][ 'hour' ] or 0 ) + 1 
    end 
    return arg1, arg2 
end 
      
setTimer( 
    function( ) 
        for _, v in pairs( getElementsByType( "player" ) ) do 
            if (not t[ v ]) then 
                t[ v ] = { 
                            ["hour"] = 0, 
                             ["min"] = 0, 
                             ["sec"] = 0 
                            } 
            end 
  
            t[ v ][ 'sec' ] = tonumber( t[ v ][ 'sec' ] or 0 ) + 1 
            local min,sec = checkValues ( 
                    v, 
                    t[ v ][ 'min' ] or 0, 
                    t[ v ][ 'sec' ] or 0 
                        )   
    local hour = tonumber( t[ v ][ 'hour' ] or 0 ) 
  
            setElementData( 
                v, 
                "Online", 
                (tostring( hour )..'H '..tostring( min )..'M ') 
            ) 
        end 
    end, 
    1000, 0 
) 
    
function onPlayerQuit ( ) 
    local playeraccount = getPlayerAccount ( source ) 
    if ( playeraccount ) and not isGuestAccount ( playeraccount ) then 
        local sValue = getElementData( source,'Online' ) 
    local hour = tonumber( t[ source ][ 'hour' ] or 0 ) 
    local min = tonumber( t[ source ][ 'min' ] or 0 ) 
    local sec = tonumber( t[ source ][ 'sec' ] or 0 ) 
        setAccountData ( playeraccount, "Online-hour", tostring(hour) ) 
        setAccountData ( playeraccount, "Online-min", tostring(min) ) 
        setAccountData ( playeraccount, "Online-sec", tostring(sec) ) 
        setAccountData ( playeraccount, "Online", tostring(sValue) ) 
  
    end 
    t[ source ] = nil 
end 
  
function onPlayerLogin (_, playeraccount ) 
    if ( playeraccount ) then 
        local time = getAccountData ( playeraccount, "Online" ) 
    local hou = getAccountData ( playeraccount, "Online-hour") 
    local min = getAccountData ( playeraccount, "Online-min") 
    local sec = getAccountData ( playeraccount, "Online-sec") 
        if ( time ) then 
            setElementData ( source, "Online", time ) 
  
                             t[ source ]["hour"] = tonumber(hou) 
                             t[ source ]["min"] = tonumber(min) 
                             t[ source ]["sec"] = tonumber(sec) 
                else 
            setElementData ( source, "Online",0 ) 
            setAccountData ( playeraccount, "Online",0 ) 
        end 
    end 
end 
addEventHandler ( "onPlayerQuit", root, onPlayerQuit ) 
addEventHandler ( "onPlayerLogin", root, onPlayerLogin ) 

Aun ando aprendiendo lua, recien hoy aprendi el uso mas o menos de pairs y ipairs,

Agradezco que me hayas dado el codigo corredigo, este script no es mio, es de un antiguo post de "Solid" en el que decia que SI QUE SE PODIA poner esas funciones

Link to comment
  • Recently Browsing   0 members

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