Big Smoker Posted October 13, 2017 Share Posted October 13, 2017 (edited) 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 October 13, 2017 by felipebaidoloko Link to comment
Other Languages Moderators Lord Henry Posted October 13, 2017 Other Languages Moderators Share Posted October 13, 2017 Seria mais seguro vc fazer com banco de dados em vez de XML. Ainda mais pq, como vc mesmo disse, não tem experiência alguma com XML. 1 Link to comment
Big Smoker Posted October 13, 2017 Author Share Posted October 13, 2017 nunca mexi com sql tb todos meu sistemas é usado o XML precisava so de ajuda nisso, que vai setar o level e o EXP de cada player salvo pode me ajuda ver a onde ta o erro Link to comment
DNL291 Posted October 13, 2017 Share Posted October 13, 2017 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
Big Smoker Posted October 13, 2017 Author Share Posted October 13, 2017 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
DNL291 Posted October 14, 2017 Share Posted October 14, 2017 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
Big Smoker Posted October 14, 2017 Author Share Posted October 14, 2017 como eu posso aprender o sql? pq eu estou aprendendo XML pq eu ja tinha um salvo aqui Link to comment
DNL291 Posted October 16, 2017 Share Posted October 16, 2017 (edited) 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 October 16, 2017 by DNL291 Link to comment
Big Smoker Posted October 16, 2017 Author Share Posted October 16, 2017 (edited) 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 October 16, 2017 by felipebaidoloko Link to comment
DNL291 Posted October 16, 2017 Share Posted October 16, 2017 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
Big Smoker Posted October 17, 2017 Author Share Posted October 17, 2017 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
DNL291 Posted October 22, 2017 Share Posted October 22, 2017 (edited) 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 October 22, 2017 by DNL291 Link to comment
Big Smoker Posted October 22, 2017 Author Share Posted October 22, 2017 sim foi o que eu fiz, eu consegui arrumar aquele dia.. mais muito obrigadoo me ajudo bastante ! 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