Jump to content

Recommended Posts

eu estou fazendo um sistema de salvamento XML so que preciso de ajuda, ele nao esta setando o level e o EXP quando do o comando ou quando eu logo podem me ajuda?

Nunca mexi com o XML

OPS: o "XLevel" ja esta com os itens salvo nele, so falta setar

function LoadLevels()
	xml = xmlLoadFile("XLevel.xml")
	for i,node in pairs(xmlNodeGetChildren(xml)) do
		if xmlNodeGetAttribute(node,"Account") == getAccountName(getPlayerAccount(source)) then
	    	setElementData(source,"level",tonumber(xmlNodeGetAttribute(node,"LV")))
			setElementData(source,"experience",tonumber(xmlNodeGetAttribute(node,"EX")))
		end
	end
	xmlUnloadFile(xml)
end
addEventHandler("onPlayerLogin",getRootElement(),LoadLevels)
addCommandHandler("loglev",LoadLevels)

 

Edited by felipebaidoloko
Link to comment
  • Moderators

Você pode usar setAccountData e guardar na conta do jogador o nível e XP.

Da mesma forma que está fazendo com XML, quando logar na conta, define os dados da conta em setElementData e assim que deslogar/sair do servidor/parar o resource salva na conta usando getElementData. Além do que o Lord Henry disse, também é mais fácil de usar.

Link to comment

eu quero salvar um XML separado isso pq o setAccountData, ele vai salvar na internal e as vezes eu reseto a internal e tudo no meu servidor to salvo um XML.. unico problema é que ele nao ta setando o level que ta salvo no XML "XLevel.xml" para o player, precisava dessa ajuda.

consegue me ajuda nesse script que eu estou com problema!? pois so falta isso.. e estou me batendo, ai minha unica opção foi pedir ajuda aqui no forum

Link to comment
  • Moderators

Depure o código pra encontrar os erros. Faça uma verificação com os valores 'xml', 'node' e xmlNodeGetAttribute usando outputChatBox. Use também o comando /debugscript 3 e veja se mostra algum erro com o script.

A propósito, eu usaria um banco de dados local nesse caso. Mesmo que não queira salvar nos dados da conta, pode salvar numa database local que é muito melhor que XML.

Link to comment
  • Moderators

Aqui no fórum tem um tutorial sobre as funções de banco de dados do MTA: 

Eu fiz um código que usa um banco de dados local pra armazenar o LV e XP dos jogadores:


db = dbConnect( "sqlite", "server_data.db" )

addEventHandler( "onResourceStart", resourceRoot, function( )

	dbExec( db, "CREATE TABLE IF NOT EXISTS players ( account TEXT, Level INT, Exp INT )" )

	for _,p in pairs( getElementsByType"player" ) do
		local acc = getPlayerAccount(p)
		if not isGuestAccount(acc) then
			local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) )
			if d then
				setElementData( p, "level", d[1]["Level"] or "false" )
				setElementData( p, "exp", d[1]["Exp"] or "false" )
			end
		end
	end
end )

addEventHandler( "onPlayerLogin", root,
	function ( _, acc )
		local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) )
		if d then
			setElementData( source, "level", d[1]["Level"] or "false" )
			setElementData( source, "exp", d[1]["Exp"] or "false" )
		end
	end
)

addEventHandler( "onPlayerQuit", root,
	function()
		savePlayerData( source )
	end
)

addEventHandler( "onPlayerLogout", root,
	function()
		savePlayerData( source )
	end
)

addEventHandler( "onResourceStop", resourceRoot,
	function()
		for _,p in pairs( getElementsByType"player" ) do
			savePlayerData( p )
		end
	end
)

function savePlayerData( p )
	local acc = getPlayerAccount(p)
	if not isGuestAccount(acc) then
		local lvl = getElementData( p, "level" )
		local exp = getElementData( p, "exp" )
		dbExec( db, "UPDATE players SET Level=?, Exp=? WHERE account=?", lvl or 0, exp or 0, getAccountName(acc) )
	end
end

function db_query( ... ) 
	return dbPoll( dbQuery ( db, ... ), - 1 )
end

Você pode ler o tutorial e aproveitar o código pra entender como funciona.

Pra criar o arquivo .db é só abrir o seu notepad e criar um novo arquivo com a extensão .db.

Edit: O código não foi testado.

Edited by DNL291
Link to comment

testei o codigo, mas como nunca mexi com .db o salvamento dos dados, nao salva o data base

essa do xml eu consegui salvar


function SalveLevel(player)
  if isElement(player) then
    if not isObjectInACLGroup("user."..getAccountName(getPlayerAccount(player)),aclGetGroup("Admin"))then
      return
    end
  end
  fileDelete("XLevel.xml")
  xml = xmlCreateFile("XLevel.xml","config")
  xmlSaveFile(xml)
  count = 0
  for _,playerLv in pairs(getElementsByType("player")) do
    if getElementData(playerLv,"level") and getElementData(playerLv,"experience") then
      count = count + 1
      xmlLevel = xmlCreateChild(xml,"Level")
      tonumber(xmlNodeSetAttribute(xmlLevel,"Account",getAccountName(getPlayerAccount(playerLv))))
      xmlPlayers = xmlCreateChild(xmlLevel,"Info")
      tonumber(xmlNodeSetAttribute(xmlPlayers,"LV",getElementData(playerLv,"level")))
      tonumber(xmlNodeSetAttribute(xmlPlayers,"EX",getElementData(playerLv,"experience")))
    end
  end
  xmlSaveFile(xml)
  xmlUnloadFile(xml)
  if isElement(player) then
    if isObjectInACLGroup("user."..getAccountName(getPlayerAccount(player)),aclGetGroup("Admin"))then
      outputChatBox("#7BFF00[AVISO] #FFFFFFLevel Salvo com Sucesso [#FF0000"..count.."#FFFFFF]",player,255,0,0,true)
    end
  end
end
addCommandHandler("lvs",SalveLevel)

 

Edited by felipebaidoloko
Link to comment
  • Moderators

Bom saber que conseguiu fazer funcionar. O código parece ter alguns trechos incorretos, mas se você não recebe nenhum erro então tá ótimo.

Ainda assim, acho que seria bom pra você mesmo tentar aprender o básico das funções de banco de dados, meu código já tá aí, se tiver algum problema só pedir ajuda aqui.

Link to comment

então eu fiz isso aqui olha 
 

function savePlayerData(p)
    --dbExec(db, "DELETE FROM players")
    if isElement(p) then
        if not isObjectInACLGroup("user."..getAccountName(getPlayerAccount(p)),aclGetGroup("Admin"))then
            return
        end
    end
    local acc = getPlayerAccount(p)
    count = 0
    if not isGuestAccount(acc) then
    count = count + 1
        local lvl = (getElementData(p, "level") or 0)
        local exps = (getElementData(p, "experience")or 0)
        dbExec(db, "INSERT INTO players (account, Level, Exp) VALUES(?,?,?)", getAccountName(acc), lvl, exps)
    end
    if isElement(p) then
        if isObjectInACLGroup("user."..getAccountName(getPlayerAccount(p)),aclGetGroup("Admin"))then
            outputChatBox("#7BFF00[AVISO] #FFFFFFLevel Salvo com Sucesso [#FF0000"..count.."#FFFFFF]",p,255,0,0,true)
        end
    end
end
addCommandHandler("lvs",savePlayerData)

 é pra testa, para ver se salva, e salvo so que ela repete varias vezes, queria que nao repeti-se, pois ela esta na tabela ja e queria so alterar os valores dela usando update, ai as contas que nao estão na tabela no .db usar o inset into, entendeu? pq se nao vou ter que usa o dbExec(db, "DELETE FROM players"), e nao quero usa ele, pq ai nao vai adianta nada, so vai salvar para quem esta online no jogo, e nao é essa minha intenção, pode me ajuda?

aquele script que vc me passo que vc fez, ele nao pego e tive que fazer isso ai, pois o seu script nao tava salvando no .db e esse ai agora esta

so que ta salvando varias vezes quando do o comando, pode me ajuda?

 

Link to comment
  • Moderators

Fiz um teste com o meu código e mudei algumas coisas; e funcionou:


db = dbConnect( "sqlite", "testdb.db" )

addEventHandler( "onResourceStart", resourceRoot, function( )

	dbExec( db, "CREATE TABLE IF NOT EXISTS players ( account TEXT, Level INT, Exp INT )" )

	for _,p in pairs( getElementsByType"player" ) do
		local acc = getPlayerAccount(p)
		if not isGuestAccount(acc) then
			local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) )
			if d and #d > 0 then
				setElementData( p, "level", d[1]["Level"] or 0 )
				setElementData( p, "experience", d[1]["Exp"] or 0 )
			else
				setElementData( p, "level", 0 )
				setElementData( p, "experience", 0 )
			end
		end
	end
end )

addEventHandler( "onPlayerLogin", root,
	function ( _, acc )
		local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) )
		if d and #d > 0 then
			setElementData( source, "level", d[1]["Level"] or 0 )
			setElementData( source, "experience", d[1]["Exp"] or 0 )
		else
			setElementData( source, "level", 0 )
			setElementData( source, "experience", 0 )
		end
	end
)

addEventHandler( "onPlayerQuit", root,
	function()
		savePlayerData( source )
	end
)

addEventHandler( "onPlayerLogout", root,
	function()
		savePlayerData( source )
	end
)

addEventHandler( "onResourceStop", resourceRoot,
	function()
		for _,p in pairs( getElementsByType"player" ) do
			savePlayerData( p )
		end
	end
)

function savePlayerData( p )
	local acc = getPlayerAccount(p)
	if not isGuestAccount(acc) then
		local lvl = getElementData( p, "level" )
		local exp = getElementData( p, "experience" )
		
		local d = db_query( "SELECT * FROM players WHERE account=? LIMIT 1", getAccountName(acc) )
		if d and #d > 0 then
			dbExec( db, "DELETE FROM players WHERE account=?", getAccountName(acc) )
		end
		dbExec( db, "INSERT INTO `players` ( `account`, `Level`, `Exp` ) VALUES ( ?, ?, ? );", getAccountName(acc), lvl or 0, exp or 0 )
	end
end

function db_query( ... ) 
	return dbPoll( dbQuery ( db, ... ), - 1 )
end

INSERT INTO vai inserir sempre um valor, ele só faz a função de atualizar se você excluir o valor antigo primeiro.

Você pode substituir pelo UPDATE na linha 64 e colocar else para adicionar na tabela usando INSERT INTO caso os dados não constem na DB.

Edited by DNL291
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...