Vazern 18 Posted February 1 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 ) Share this post Link to post
DNL291 616 Posted February 1 (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 by DNL291 1 Share this post Link to post
MaligNos 138 Posted February 1 (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 by MaligNos Correção unpack 1 Share this post Link to post
Vazern 18 Posted February 2 (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 by VazErn Não sei o que é JSON .-. Share this post Link to post
STR6 3 Posted February 2 (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 by stranger6 1 Share this post Link to post
Lord Henry 1,032 Posted February 2 (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 by Lord Henry 1 Share this post Link to post
MaligNos 138 Posted February 2 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" : "exemple@email.com", "pass" : "1234", }, "player2" : { "nick" : "Jonnut", "mail" : "exemple2@email.com", "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 Share this post Link to post