Vazern Posted January 21, 2019 Share Posted January 21, 2019 Olá pessoal! Tudo bem? Espero que sim. Então, estou fazendo um sistema de uma moeda diferente, que seriam "diamantes", fiz todo o código, ele armazena no banco de dados SQLite normalmente, mas na hora de carregar os dados (no evento onPlayerLogin que utiliza a função que eu fiz {loadDiamonds}) eles simplesmente não são carregados para o element-data. Poderiam me falar o que fiz de errado? local db = exports.ds_sqlite db:exec("CREATE TABLE IF NOT EXISTS Diamonds (Nick TEXT, Usuario TEXT, Serial TEXT, Diamantes INT)") function loadDiamonds(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Diamonds WHERE Usuario=? LIMIT 1", accName) if (#datas == 0) then setElementData(player, "CRP:Diamonds", 10) db:exec("INSERT INTO Diamonds VALUES (?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds")) else db:query("UPDATE Diamonds SET Nick=?, Usuario=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), datas[4]["Diamantes"]) setElementData(player, "CRP:Diamonds", tonumber(datas[4]["Diamantes"])) end end function saveDiamonds(player, acc) if (getElementData(player, "CRP:Diamonds")) then local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Diamonds WHERE Usuario=? LIMIT 1", accName) if (#datas > 0) then db:query("UPDATE Diamonds SET Nick=?, Usuario=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds")) end end end addEventHandler("onPlayerLogin", root, function() for index, players in ipairs(getElementsByType("player")) do local account = getPlayerAccount(players) loadDiamonds(players, account) end end ) addEventHandler("onPlayerQuit", root, function() for index, players in ipairs(getElementsByType("player")) do local account = getPlayerAccount(players) if (account) then saveDiamonds(players, account) end end end ) Link to comment
DNL291 Posted January 21, 2019 Share Posted January 21, 2019 (edited) Tenta isto: function loadDiamonds(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Diamonds WHERE Usuario=? LIMIT 1", accName) if (datas and type(datas) == "table" and #datas > 0) then datas = datas[1] db:query("UPDATE Diamonds SET Nick=?, Usuario=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), datas["Diamantes"]) setElementData(player, "CRP:Diamonds", tonumber(datas["Diamantes"])) else setElementData(player, "CRP:Diamonds", 10) db:exec("INSERT INTO Diamonds VALUES (?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds") or 10) end end Edit: correção. Edited January 21, 2019 by DNL291 1 Link to comment
Vazern Posted January 21, 2019 Author Share Posted January 21, 2019 (edited) 24 minutes ago, DNL291 said: Tenta isto: function loadDiamonds(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Diamonds WHERE Usuario?=? LIMIT 1", accName) if (datas and type(datas) == "table" and #datas > 0) then datas = datas[1] db:query("UPDATE Diamonds SET Nick=?, Usuario?=?, Serial=?, Diamantes=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), datas["Diamantes"]) setElementData(player, "CRP:Diamonds", tonumber(datas[4]["Diamantes"])) else setElementData(player, "CRP:Diamonds", 10) db:exec("INSERT INTO Diamonds VALUES (?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementData(player, "CRP:Diamonds") or 10) end end Obrigado! Mas ainda continua praticamente a mesma coisa, ele definiu o valor padrão (10), porém, eu alterei este valor, e após isto quando reconectei, ficou salvo no banco de dados, mas ao logar, não é definido valor nenhum, ao utilizar o execute no painel admin ele simplesmente retorna "false". NOTA: Eu removi o "tonumber" e continua a mesma coisa, o que poderia ser? 11 minutes ago, VazErn said: Obrigado! Mas ainda continua praticamente a mesma coisa, ele definiu o valor padrão (10), porém, eu alterei este valor, e após isto quando reconectei, ficou salvo no banco de dados, mas ao logar, não é definido valor nenhum, ao utilizar o execute no painel admin ele simplesmente retorna "false". NOTA: Eu removi o "tonumber" e continua a mesma coisa, o que poderia ser? Consegui! Havia esqueci de mudar de datas[4]["Diamantes"] para datas["Diamantes"], rs. Muito obrigado. Edited January 21, 2019 by VazErn Link to comment
DNL291 Posted January 21, 2019 Share Posted January 21, 2019 10 minutes ago, VazErn said: Obrigado! Mas ainda continua praticamente a mesma coisa, ele definiu o valor padrão (10), porém, eu alterei este valor, e após isto quando reconectei, ficou salvo no banco de dados, mas ao logar, não é definido valor nenhum, ao utilizar o execute no painel admin ele simplesmente retorna "false". NOTA: Eu removi o "tonumber" e continua a mesma coisa, o que poderia ser? Consegui! Havia esqueci de mudar de datas[4]["Diamantes"] para datas["Diamantes"], rs. Muito obrigado. Eu tinha mandado o código com o [4], depois corrigi o erro kk. E aquele loop nos players no onPlayerLogin? o certo não seria chamar só pra quem logou? E o loop no evento onResourceStart. Link to comment
Vazern Posted January 21, 2019 Author Share Posted January 21, 2019 10 minutes ago, DNL291 said: Eu tinha mandado o código com o [4], depois corrigi o erro kk. E aquele loop nos players no onPlayerLogin? o certo não seria chamar só pra quem logou? E o loop no evento onResourceStart. Boa observação. No caso eu faria: addEventHandler("onPlayerLogin", root, function() for index, players in ipairs(getElementsByType("player")) do if (players == source) then local account = getPlayerAccount(players) loadDiamonds(players, account) end end end ) addEventHandler("onPlayerQuit", root, function() for index, players in ipairs(getElementsByType("player")) do if (players == source) then local account = getPlayerAccount(players) if (account) then saveDiamonds(players, account) end end end end ) Certo? Link to comment
DNL291 Posted January 21, 2019 Share Posted January 21, 2019 Não entendi o propósito do loop aí, se for executar só pro source então mais fácil você tirar o resto que é desnecessário: addEventHandler("onPlayerLogin", root, function() loadDiamonds(source) end ) --quit addEventHandler("onPlayerQuit", root, function() if not (isGuestAccount(getPlayerAccount(source))) then saveDiamonds(source) end end ) Link to comment
Vazern Posted January 21, 2019 Author Share Posted January 21, 2019 24 minutes ago, DNL291 said: Não entendi o propósito do loop aí, se for executar só pro source então mais fácil você tirar o resto que é desnecessário: addEventHandler("onPlayerLogin", root, function() loadDiamonds(source) end ) --quit addEventHandler("onPlayerQuit", root, function() if not (isGuestAccount(getPlayerAccount(source))) then saveDiamonds(source) end end ) Então, é que quando eu altero para source, simplesmente não funciona, por isso o loop. Em relação ao código do tópico, uma coisa que gostaria de ressaltar, e caso alguém veja isto, talvez sirva de ajuda. Eu utilizei datas[4] porque pensei que o o índice "4" era a 4° coluna do banco de dados, sendo que um amigo meu (@Blowid) me explicou que se refere a linha do banco de dados, por isso os dados não eram definidos, já que quando eu colocava [4] além do LIMIT 1 não permitir, não havia uma 4° linha de dados para aquele usuário. Link to comment
DNL291 Posted January 21, 2019 Share Posted January 21, 2019 Entendi. Mas deveria funcionar com o source, pode ser que você tenha definido uma variável global com esse mesmo nome e esteja dando conflito. Sobre o LIMIT 1 ele vai fazer retornar apenas 1 resultado da consulta; e valor do banco de dados, é retornado numa tabela definida com chaves (o datas["Diamantes"] por exemplo). 1 Link to comment
Other Languages Moderators Lord Henry Posted January 21, 2019 Other Languages Moderators Share Posted January 21, 2019 (edited) Eu usaria o programa DB Browser For SQLite para mexer no banco de dados. Outra coisa que eu faria é usar setAccountData pra salvar a quantidade de diamantes na conta do jogador em vez de criar uma tabela nova no banco de dados e getAccountData para obter essa quantidade depois. Edited January 21, 2019 by Lord Henry 1 Link to comment
DNL291 Posted January 21, 2019 Share Posted January 21, 2019 10 hours ago, Lord Henry said: Eu usaria o programa DB Browser For SQLite para mexer no banco de dados. Outra coisa que eu faria é usar setAccountData pra salvar a quantidade de diamantes na conta do jogador em vez de criar uma tabela nova no banco de dados e getAccountData para obter essa quantidade depois. O salvamento em banco de dados no lugar do setAccountData acho que foi uma escolha dele, em banco de dados pode ser feito um sistema para mostrar os dados fora do server por exemplo. E o set/get dos diamantes no server está sendo feito com element-data fazendo com que o banco de dados seja utilizado quando é realmente necessário - pelo que eu vejo no código e que está correto em questão de otimização. Embora seja uma forma melhor armazenar temporariamente com tabelas, mas se tiver usando esses dados no lado cliente então não vejo problemas; se não tiver usando esses dados no lado cliente, de fato, o mínimo a se fazer é desativar a sinc no setElementData. 1 Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now