Vazern Posted February 1, 2019 Share Posted February 1, 2019 Olá pessoas deliciosamente bonitas! Bom, estou desenvolvendo um save-system por SQLite, porém, na parte de salvar as coordenadas do jogador, do contrário de salvar cada um dos tipos de coordenadas em uma coluna (X - Y - Z) eu queria salvar em uma única coluna (Coordenadas), mas como vocês devem saber, dados obtidos de um db são retornados como string, então utilizei Vector3 e tonumber, mas com o tonumber retorna um valor nulo, e sem ele retorna uma string, como eu poderia fazer para retornar o valor original de coordenadas? Código: local x2, y2, z2 = 675.99396,-1692.27075,8.70498 -- LUGAR QUE VAI SPAWNAR QUANDO CRIAR CONTA NOVA local db = exports.ds_sqlite db:exec("CREATE TABLE IF NOT EXISTS Usuarios (Nick TEXT, Usuario TEXT, Serial TEXT, Skin INT, Dinheiro INT, Coordenadas TEXT, Interior INT, Dimensao INT, Procurado INT)") function loadUsuarios(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Usuarios WHERE Usuario=? LIMIT 1", accName) if (datas and type(datas) == "table" and #datas > 0) then -- @Datas setElementData(player, "CRP:Skin", tonumber(datas[1]["Skin"])) setElementData(player, "CRP:Dinheiro", tonumber(datas[1]["Dinheiro"])) setElementData(player, "CRP:Coordenadas", datas[1]["Coordenadas"]) setElementData(player, "CRP:Interior", tonumber(datas[1]["Interior"])) setElementData(player, "CRP:Dimensao", tonumber(datas[1]["Dimensao"])) setElementData(player, "CRP:Procurado", tonumber(datas[1]["Procurado"])) iprint(datas[1]["Coordenadas"]) -- @Funções setCameraTarget(player, player) fadeCamera(player, true, 2.0) spawnPlayer(player, Vector3(datas[1]["Coordenadas"])) setElementPosition(player, Vector3(datas[1]["Coordenadas"])) setElementModel(player, tonumber(datas[1]["Skin"])) setPlayerMoney(player, tonumber(datas[1]["Dinheiro"])) setElementInterior(player, tonumber(datas[1]["Interior"])) setElementDimension(player, tonumber(datas[1]["Dimensao"])) setPlayerWantedLevel(player, tonumber(datas[1]["Procurado"])) else setCameraTarget(player, player) fadeCamera(player, true, 2.0) spawnPlayer(player, x2, y2, z2) setElementPosition(player, x2, y2, z2) local x, y, z = getElementPosition(player) db:exec("INSERT INTO Usuarios VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementModel(player), getPlayerMoney(player), x..","..y..","..z + 0.7, getElementInterior(player), getElementDimension(player), getPlayerWantedLevel(player)) end end function saveUsuarios(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Usuarios WHERE Usuario=? LIMIT 1", accName) if (#datas > 0) then local x, y, z = getElementPosition(player) db:query("UPDATE Usuarios SET Nick=?, Usuario=?, Serial=?, Skin=?, Dinheiro=?, Coordenadas=?, Interior=?, Dimensao=?, Procurado=?", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementModel(player), getPlayerMoney(player), x..","..y..","..z + 0.7, getElementInterior(player), getElementDimension(player), getPlayerWantedLevel(player)) end end addEventHandler("onPlayerLogin", root, function() for index, players in ipairs(getElementsByType("player")) do if (players == source) then local account = getPlayerAccount(players) loadUsuarios(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 saveUsuarios(players, account) end end end end ) Link to comment
DNL291 Posted February 1, 2019 Share Posted February 1, 2019 (edited) Eu usaria from/toJSON para converter as coordenadas de uma tabela > string e vice-versa. Um exemplo no seu código: function loadUsuarios(player, acc) local accName = getAccountName(getPlayerAccount(player)) local datas = db:query("SELECT * FROM Usuarios WHERE Usuario=? LIMIT 1", accName) if (datas and type(datas) == "table" and #datas > 0) then -- @Datas local coordsTable = fromJSON( datas[1]["Coordenadas"] ) or { 0,0,0 } setElementData(player, "CRP:Skin", tonumber(datas[1]["Skin"])) setElementData(player, "CRP:Dinheiro", tonumber(datas[1]["Dinheiro"])) setElementData(player, "CRP:Coordenadas", datas[1]["Coordenadas"]) setElementData(player, "CRP:Interior", tonumber(datas[1]["Interior"])) setElementData(player, "CRP:Dimensao", tonumber(datas[1]["Dimensao"])) setElementData(player, "CRP:Procurado", tonumber(datas[1]["Procurado"])) iprint(datas[1]["Coordenadas"]) -- @Funções setCameraTarget(player, player) fadeCamera(player, true, 2.0) spawnPlayer(player, unpack( coordsTable ) ) setElementPosition(player, unpack( coordsTable )) setElementModel(player, tonumber(datas[1]["Skin"])) setPlayerMoney(player, tonumber(datas[1]["Dinheiro"])) setElementInterior(player, tonumber(datas[1]["Interior"])) setElementDimension(player, tonumber(datas[1]["Dimensao"])) setPlayerWantedLevel(player, tonumber(datas[1]["Procurado"])) else setCameraTarget(player, player) fadeCamera(player, true, 2.0) spawnPlayer(player, x2, y2, z2) setElementPosition(player, x2, y2, z2) local x, y, z = getElementPosition(player) local pos = toJSON( { x, y, z + 0.7 } ) db:exec("INSERT INTO Usuarios VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", getPlayerName(player):gsub("#%x%x%x%x%x%x", ""), accName, getPlayerSerial(player), getElementModel(player), getPlayerMoney(player), pos, getElementInterior(player), getElementDimension(player), getPlayerWantedLevel(player)) end end Edited February 1, 2019 by DNL291 1 Link to comment
[M]ister Posted February 1, 2019 Share Posted February 1, 2019 (edited) Eu também optaria por utilizar o formato JSON como mencionado pelo @DNL291 Mas segue um modo que talvez funcione da maneira que deseja: local vecPos = Vector3(unpack(split(datas[1]["Coordenadas"],", "))) spawnPlayer(player, vecPos:getX(), vecPos:getY(), vecPos:getZ()) Edited February 1, 2019 by MaligNos Correção unpack 1 Link to comment
Vazern Posted February 2, 2019 Author Share Posted February 2, 2019 (edited) Muito obrigado a ambos! Mas poderiam me explicar pequenos detalhes? É que não gosto de pegar o código pronto para entender. @DNL291 poderia me explicar como funciona o fromJSON/toJSON? Eu olhei na Wiki, mas não entendi direito, além do meu inglês ser péssimo. @MaligNos poderia me explicar sobre o uso e como funciona o unpack e o split? Caso não queiram/possam entendo perfeitamente, mesmo que seja o mínimo possível sobre ambos, eu tentarei o máximo possível entender. EDIT: Não sei o que é JSON .-. Edited February 2, 2019 by VazErn Não sei o que é JSON .-. Link to comment
STR6 Posted February 2, 2019 Share Posted February 2, 2019 (edited) JSON é uma linguagem de programação. Com toJSON você pode converter um valor para string, e com fromJSON o você converte um valor que já está em JSON para o valor original novamente. addEventHandler( "onResourceStart", resourceRoot, function( ) executeSQLQuery( "CREATE TABLE IF NOT EXISTS save ( account TEXT, pos TEXT )" ); end ); function savePosition( player ) local account = getPlayerAccount( player ); if ( not isGuestAccount( account ) ) then local account_name = getAccountName( account ); local result = executeSQLQuery( "SELECT pos FROM save WHERE account = ? LIMIT 1", account_name ); local x, y, z = getElementPosition( player ); local pos = toJSON( { x, y, z } ); if ( table.maxn( result ) == 0 ) then executeSQLQuery( "INSERT INTO save ( account, pos ) VALUES ( ?, ? )", account_name, pos ); else executeSQLQuery( "UPDATE save SET pos = ? WHERE account = ?", pos, account_name ); end end end function loadPosition( player ) local account = getPlayerAccount( player ); if ( not isGuestAccount( account ) ) then local account_name = getAccountName( account ); local result = executeSQLQuery( "SELECT pos FROM save WHERE account = ? LIMIT 1", account_name ); if ( table.maxn( result ) > 0 ) then local x, y, z = fromJSON( result[ 1 ][ "pos" ] ); setElementPosition( player, x, y, z + 1 ); end end end split separa uma string em substrings, você especifica um caractere que sera usado como separador, ele ira retornar uma table com as substrings. local string = "a;b"; local table_ = split( string, ";" ); -- table_ está com o valor de uma tabela, com duas substrings. { "a", "b" }; for _, character in ipairs( table_ ) do outputChatBox( character ); end -- result; --> a; --> b; unpack separa todos os valores que estão na table. local pos = { 0, 0, 0 }; addCommandHandler( "gotozero", function( ply ) local x, y, z = unpack( pos ); -- { 0, 0, 0 } to 0, 0, 0; setElementPosition( ply, x, y, z ); end ); Acho que consegui explicar corretamente ;x Edited February 2, 2019 by stranger6 1 Link to comment
Other Languages Moderators Lord Henry Posted February 2, 2019 Other Languages Moderators Share Posted February 2, 2019 (edited) Cara, recomendo que estude inglês. Tudo na área da tecnologia precisa de inglês. Ou vc faz curso em uma escola de idiomas (tipo Wizard, CCAA, etc) ou vc baixa o app do Duolingo e aprende jogando. Edited February 2, 2019 by Lord Henry 1 Link to comment
[M]ister Posted February 2, 2019 Share Posted February 2, 2019 7 hours ago, stranger6 said: JSON é uma linguagem de programação. JSON passa longe de ser uma linguagem de programação. Ele é um formato hierárquico de dados (como XML) muito utilizado no armazenamento e transferência de dados @Vazern vamos supor que eu tenha o seguinte arquivo: info.txt ou info.json { "player1" : { "nick" : "zLastink", "mail" : "[email protected]", "pass" : "1234", }, "player2" : { "nick" : "Jonnut", "mail" : "[email protected]", "pass" : "4321", } } Eu consigo facilmente carrega-lo como uma tabela no MTA: file = fileOpen("info.txt") json = fileRead(file, fileGetSize(file) tbl = fromJSON(json) print(tbl["player1"]["nick"]) print(tbl["player2"]["nick"]) fileClose(file) E o mesmo pode ser feito transformando uma tabela do MTA em JSON (toJSON) e salvando como se fosse uma "string". 1 Link to comment
Vazern Posted February 3, 2019 Author Share Posted February 3, 2019 Agora entendi, muito obrigado a todos! 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