Recommended Posts

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

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 by DNL291
  • Thanks 1

Share this post


Link to post

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 by MaligNos
Correção unpack
  • Thanks 1

Share this post


Link to post

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 by VazErn
Não sei o que é JSON .-.

Share this post


Link to post

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 by stranger6
  • Thanks 1

Share this post


Link to post

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 by Lord Henry
  • Like 1

Share this post


Link to post
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".

  • Thanks 1

Share this post


Link to post

Agora entendi, muito obrigado a todos! ❤️

Share this post


Link to post

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.