Jump to content

setAccountData não funciona com onPlayerQuit.


Recommended Posts

Quando o usuário se desconectar eu quero que isto seja feito.

addEventHandler('onPlayerQuit', root, 
 function()
      local account = getPlayerAccount(source)
      setAccountData(account, 'vehitem', true)
 end)

isso para quando o usuário logar novamente e fazer uma ação em específico essa verificação funcionar:

local accsalvo = getPlayerAccount(source)
if getAccountData(accsalvo, 'vehitem') then
    exports._infobox:addNotification(source, 'funcionou', 'warning')
else
    exports._infobox:addNotification(source, 'não funcionou', 'warning')
end

só que ela sempre retorna false, como se o setAccountData fosse ignorado, e agora?

Edited by Mickey2
Link to comment

Não me lembro como é o comportamento de booleano (true) no setAccountData, pode tentar algo do tipo:

addEventHandler('onPlayerQuit', root,
    function()
        local account = getPlayerAccount(source)
        if ( account ) and not isGuestAccount ( account ) then
            setAccountData(account, 'vehitem', 1)
        end
    end
)

 

  • Thanks 1
Link to comment
  • Other Languages Moderators
29 minutes ago, [M]ister said:

Não me lembro como é o comportamento de booleano (true) no setAccountData, pode tentar algo do tipo:

setAccountData não aceita booleano true pois se trata de uma entrada no banco de dados, mas a função aceita false para remover essa data do banco de dados. Você pode usar string "true" ou "false" e dai no script considerar como true ou false. Ou então, como vc exemplificou, usar número 1 ou 0 e no script considerar como true ou false.

Edited by Lord Henry
  • Thanks 1
Link to comment

Testei com string 'true' e com número 1, mesmo assim não funcionou, não sei o por que..

vou continuar tentando, os dois codes, o primeiro do setAccount e o segundo do getAccount são de scripts diferentes, isso não muda nada né? creio que não.

aqui está o code:

addEventHandler('onPlayerQuit', root, function()
    local account = getPlayerAccount(source)
    if not isGuestAccount(account) then
        for i, vehicle in ipairs(getElementsByType('vehicle')) do
            if getElementData(vehicle, 'Owner') == source then
                weap = getElementData(vehicle, 'armasG')
                setAccountData(account, 'vehitem', weap)
                break
            end
        end
    end
end)

2 parte do outro script:

local accsalvo = getPlayerAccount(source)
if getAccountData(accsalvo, 'vehitem') then
    exports._infobox:addNotification(source, 'funcionou finalmente caralhoo', 'warning')
    itemsalvos = getAccountData(accsalvo, 'vehitem')
    setElementData(vehicle, 'armasG', itemsalvos)
else
    exports._infobox:addNotification(source, 'não tá funcionando maaano', 'warning')
end
Link to comment

Bom na verdade não daria para ver o debugscript, pois esta função só é chamada quando o usuário sai do servidor, já tentei usar o outputConsole mas foi como se tivesse ignorado o código, mas enfim, mesmo assim iria dar erro, pois o getElementData está me retornando uma tabela de armas guardadas no veículo, e não dá pra armazenar tabelas em setAccountData certo? eu descobri isso ontem, então eu tentei ao invés de setar uma tabela na conta do usuário, simplesmente colocar uma string qualquer, e mesmo assim não funcionou, como se não estivesse armazenando nada na conta do usuário quando o mesmo quitasse, deixando de lado o meu erro de tentar armazenar uma tabela na conta do usuário, o foco aqui é descobrir o motivo deste setAccountData não estar armazenando nada na conta do usuário..

O meu objetivo neste script é que:

Quando o usuário desconectar, o script irá verificar se o mesmo tem um veículo comprado na concessionaria, se houver (e se o carro estiver espawnado), seria guardado as armas do veículo do usuário com o setAccountData na conta do usuário, pra quando logar novamente as armas do carro guardado estarem lá, e quando ele spawnar o veículo, o segundo script iria fazer a verificação, se ele tem ou não armas guardadas na conta, se caso houver, iria setar as armas no carro pra quando o usuário abrir o carro as armas estiverem lá, a parte de guardar as armas na conta do usuário é o meu próximo passo, mas antes tenho que descobrir por que o setAccountData não está funcionando..

Edited by Mickey2
Link to comment
  • Moderators

print e outputConsole mostram a saída no console (do servidor), se não tiver mostrando algo de errado tem aí.
Faça uma output com a função iprint na tabela retornada em getElementData para verificar se tá tudo certo; se tiver como deve, vá para o próximo passo.
 

4 hours ago, Mickey2 said:

pois o getElementData está me retornando uma tabela de armas guardadas no veículo, e não dá pra armazenar tabelas em setAccountData certo? eu descobri isso ontem, então eu tentei ao invés de setar uma tabela na conta do usuário, simplesmente colocar uma string qualquer

Não salva tabelas, mas você pode converter ela para JSON com a função toJSON. E quando puxar o valor com getAccountData usar fromJSON,

 

4 hours ago, Mickey2 said:

mesmo assim não funcionou, como se não estivesse armazenando nada na conta do usuário quando o mesmo quitasse

Criar outputs em todo o processo da execução irá ajudar você a descobrir onde supostamente está o problema.
Se você constatar que no onPlayerQuit não há problemas, pode fazer o seguinte: Depois do quit, abra a internal.db e verifique se o valor salvo referente a essa conta está como deveria.
Se tiver tudo certo, provavelmente tem um problema no carregamento dos dados (getAccountData -> setElementData).

  • Thanks 1
Link to comment

Muito bem consegui, minha solução:

addEventHandler('onPlayerQuit', root, function()
    local account = getPlayerAccount(source)
    if not isGuestAccount(account) then
        for i, vehicl in pairs(getElementsByType('vehicle')) do
            if getElementData(vehicl, "ownercar") == getAccountName(getPlayerAccount(source)) or getElementData(vehicl, "Owner") == source then
                setAccountData(account, 'vehitem', toJSON(getElementData(vehicl, 'armasG')))
                -- setAccountData(account, 'vehitem', weap)
                break
            end
        end
    end
end)

esta é a primeira parte, aqui está a segunda:

local accsalvo = getPlayerAccount(source)
if getAccountData(accsalvo, 'vehitem') then
	exports._infobox:addNotification(source, 'funcionou finalmente caralhoo', 'warning')
	setElementData(vehicle, 'armasG', fromJSON(getAccountData(accsalvo, 'vehitem')))
else
	exports._infobox:addNotification(source, 'não tá funcionando maaano', 'warning')
end

solução:

retirei o ipairs da primeira parte e coloquei pairs, depois eu testei assim:

addEventHandler('onPlayerQuit', root, function()
    local account = getPlayerAccount(source)
    if not isGuestAccount(account) then
        for i, vehicle in pairs(getElementsByType('vehicle')) do
            if getElementData(vehicle, "armasG") then
                iprint(getElementData(vehicle, 'armasG'))
                -- setAccountData(account, 'vehitem', weap)
                break
            end
        end
    end
end)

funcionou é claro, porém não era meu objetivo, e sim fazer uma verificação se o carro achado pelo getElements, é do usuário que saiu do servidor, então eu dei uma olhada no outro script de quando o usuário espawna o veículo e estava assim:

-- parte do script que importa -- 
setElementData(vehicle, "ownercar", getAccountName(getPlayerAccount(source)))
setElementData(vehicle, "Owner", source)

Então eu testei desta forma:

addEventHandler('onPlayerQuit', root, function()
    local account = getPlayerAccount(source)
    if not isGuestAccount(account) then
        for i, vehicl in pairs(getElementsByType('vehicle')) do
            if getElementData(vehicl, "ownercar") == getAccountName(getPlayerAccount(source)) or getElementData(vehicl, "Owner") == source then
                setAccountData(account, 'vehitem', toJSON(getElementData(vehicl, 'armasG')))
                -- setAccountData(account, 'vehitem', weap)
                break
            end
        end
    end
end)

(é claro que eu podia ter escolhido entre 'ownercar' e 'owner', mas só por segurança usei os dois)

e como resultado não funcionou, por que? eu não sei, porém.. Quando eu fui olhar o script da concessionaria novamente, percebi que  a minha parte da verificação:

local accsalvo = getPlayerAccount(source)
if getAccountData(accsalvo, 'vehitem') then
    exports._infobox:addNotification(source, 'funcionou finalmente caralhoo', 'warning')
    setElementData(vehicle, 'armasG', getAccountData(accsalvo, 'vehitem'))
else
    exports._infobox:addNotification(source, 'não tá funcionando maaano', 'warning')
end

ela estava quase no começo da função de espawnar o veículo, então eu mudei a posição dela e coloquei no final da função, fui testar novamente, e funcionou, mas não entendi o por que de não ter funcionado com ela no começo da função, mas o importante é que está funcionando agora, e o resultado está nos 2 primeiros codes, vou salvar este script e tentar descobrir a fundo por que não estava funcionando, muito obrigado a todos vcs!

(um simples erro de lógica que meu um baita trabalho!)

Edited by Mickey2
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...