Jump to content

[AJUDA] Uso de Vector3


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
)

 

Link to comment
  • Moderators

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
Link to comment

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
Link to comment

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 .-.
Link to comment

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
Link to comment
  • Other Languages Moderators

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

  • Thanks 1
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...