Jump to content

Não consigo salvar elementData


Recommended Posts

Eu fiz um script de Porte sou iniciante ainda tudo funcionou a ElementData seta no Player que ele tem o Porte, mais quando eu dou reconnect e outros jogadores também usam esse comando perdem o Porte simplesmente já vi outro forum testei tudo e continuava sem salvar alguem pode me ajudar?

Link to comment

Bom esta perca ocorre devido ao fato de que o setElementData trabalha somente na "sessão" atual do player, toda vez que ele sair ou reconectar, ele irá iniciar uma nova "sessão", no seu caso para salvar estas informações vc vai precisar de:

getElementData  verifica a data do porte se for verdadeiro "true" ou seja lá o valor que você tenha colocado para a data então

setAccountData  seta uma data na conta do player

getAccountData verifica se existe a data criada com setAccountData

setElementData seta a data do porte novamente, fazendo com o player não a perca!

Basicamente o que vc deve fazer é toda vez que o player entrar no servidor se ele já tiver o porte da-lo novamente a ele!

Eventos Usados:

onPlayerQuit  para quando o player sair do servidor, vc irá verificar se ele tem o porte (getElementData) e salvar na conta (setAccountData)

onPlayerLogin  para quando o player Logar no servidor, vc irá verificar se a conta dele esta salva o porte ( getAccountData) e dará novamente a ele ( setElementData)

 

Link to comment

Bom. Você inicialmente precisa aprender tudo sobre o elementData e accountData para criar esse sistema. Começando pela página de introdução ao scripting do MTA, depois de compreendido o básico, estude todas as  funções que você imaginar que possa ser útil nas suas idéias, leia e usufrua de todo o conteúdo da página da função que você imaginou, se não tiver você pode criá-la.

Já entendido sobre a lógica de programação e sobre algumas funções situacionais de Lua, atente-se a página que fala sobre o elementData e o accountData.

Sobre o exemplo que você pediu, leia a página das seguintes funções: getAccountData, setAccountData, getElementData, setElementData. E você vai consegui ter uma noção sobre cada função.


Um exemplo sobre sua dúvida seria da seguinte forma:   (Sistema simples para salvar o dinheiro de um banco personalizado do jogador através da conta)

 

--Esta função irá salvar o dinheiro do jogador quando ele sair do servidor
--O source deste primeiro evento é o jogador que saiu do servidor
function salvarDados (qType, reason, respElement)
  if (isGuestAccount(getPlayerAccount(source))) then -- isso verifica se o jogador estava logado quando desconectou
  	local saldo_bancario = getElementData(source, 'Banco') or '0'
    local conta_do_jogador = getPlayerAccount(source)
    setAccountData(conta_do_jogador, 'Banco', saldo_bancario) 
    -- Não é necessário colocar a chave do setAccountData igual ao setElementData ou getElementData, não há o que temer.
  end
end
addEventHandler('onPlayerQuit', root, salvarDados)


-- Esta próxima função irá carregar os dados que foram salvos na conta do jogador através da função anterior
-- O source deste evento é o jogador que logou no servidor
function carregarDados (prevAcc, acc)
  local saldo_do_banco = getAccountData(acc, 'Banco') or '0' -- Lembrando sempre de usar a mesma chave quando você quer trabalhar com um só item
  setElementData(source, 'Banco', saldo_do_banco)
  -- Depois de carregado os dados da conta do jogador onde tinham valores no banco personalizado, é executada a função para definir a 'memória' ao source onde continha o saldo do banco.
end
addEventHandler('onPlayerLogin', root, carregarDados)


 

Link to comment
1 hour ago, KronoS Lettify said:

Bom. Você inicialmente precisa aprender tudo sobre o elementData e accountData para criar esse sistema. Começando pela página de introdução ao scripting do MTA, depois de compreendido o básico, estude todas as  funções que você imaginar que possa ser útil nas suas idéias, leia e usufrua de todo o conteúdo da página da função que você imaginou, se não tiver você pode criá-la.

Já entendido sobre a lógica de programação e sobre algumas funções situacionais de Lua, atente-se a página que fala sobre o elementData e o accountData.

Sobre o exemplo que você pediu, leia a página das seguintes funções: getAccountData, setAccountData, getElementData, setElementData. E você vai consegui ter uma noção sobre cada função.


Um exemplo sobre sua dúvida seria da seguinte forma:   (Sistema simples para salvar o dinheiro de um banco personalizado do jogador através da conta)

 


--Esta função irá salvar o dinheiro do jogador quando ele sair do servidor
--O source deste primeiro evento é o jogador que saiu do servidor
function salvarDados (qType, reason, respElement)
  if (isGuestAccount(getPlayerAccount(source))) then -- isso verifica se o jogador estava logado quando desconectou
  	local saldo_bancario = getElementData(source, 'Banco') or '0'
    local conta_do_jogador = getPlayerAccount(source)
    setAccountData(conta_do_jogador, 'Banco', saldo_bancario) 
    -- Não é necessário colocar a chave do setAccountData igual ao setElementData ou getElementData, não há o que temer.
  end
end
addEventHandler('onPlayerQuit', root, salvarDados)


-- Esta próxima função irá carregar os dados que foram salvos na conta do jogador através da função anterior
-- O source deste evento é o jogador que logou no servidor
function carregarDados (prevAcc, acc)
  local saldo_do_banco = getAccountData(acc, 'Banco') or '0' -- Lembrando sempre de usar a mesma chave quando você quer trabalhar com um só item
  setElementData(source, 'Banco', saldo_do_banco)
  -- Depois de carregado os dados da conta do jogador onde tinham valores no banco personalizado, é executada a função para definir a 'memória' ao source onde continha o saldo do banco.
end
addEventHandler('onPlayerLogin', root, carregarDados)

eu mudei o banco pra Porte e nao funcionou :(


 

 

  1. --Esta função irá salvar o dinheiro do jogador quando ele sair do servidor
  2. --O source deste primeiro evento é o jogador que saiu do servidor
  3. function salvarDados (qType, reason, respElement)
  4. if (isGuestAccount(getPlayerAccount(source))) then -- isso verifica se o jogador estava logado quando desconectou
  5. local porte= getElementData(source, 'Porte) or '0'
  6. local portee = getPlayerAccount(source)
  7. setAccountData(portee, 'Porte', porte)
  8. -- Não é necessário colocar a chave do setAccountData igual ao setElementData ou getElementData, não há o que temer.
  9. end
  10. end
  11. addEventHandler('onPlayerQuit', root, salvarDados)
  12.  
  13.  
  14. -- Esta próxima função irá carregar os dados que foram salvos na conta do jogador através da função anterior
  15. -- O source deste evento é o jogador que logou no servidor
  16. function carregarDados (prevAcc, acc)
  17. local porte = getAccountData(acc, 'Porte') or '0' -- Lembrando sempre de usar a mesma chave quando você quer trabalhar com um só item
  18. setElementData(source, 'Porte', portee)
  19. -- Depois de carregado os dados da conta do jogador onde tinham valores no banco personalizado, é executada a função para definir a 'memória' ao source onde continha o saldo do banco.
  20. end
  21. addEventHandler('onPlayerLogin', root, carregarDados)

assim?

 

Link to comment

Tente assim! 
 

addEventHandler ( "onPlayerLogin", root,
  function ( _, acc )
	setTimer ( Carregar_TS, 50, 1, acc )
  end
)

function Carregar_TS ( conta )
	if not isGuestAccount ( conta ) then
		if conta then	
			local source = getAccountPlayer ( conta )
			local Porte = getAccountData ( conta, "Porte1" ) or 0
			setElementData ( source, "Porte1", Porte )
		end
	end	
end

function Iniciar_Resource ( res )
	if res == getThisResource ( ) then
		for i, player in ipairs(getElementsByType("player")) do
			local acc = getPlayerAccount ( player )
			if not isGuestAccount ( acc ) then
				Carregar_TS ( acc )
			end
		end
	end
end
addEventHandler ( "onResourceStart", getRootElement ( ), Iniciar_Resource )

function Salvar_TS ( conta )
	if conta then
		local source = getAccountPlayer ( conta )
		local Porte = getElementData ( source, "Porte1" ) or 0
		setAccountData ( conta, "Porte1", Porte )
	end
end

function Desligar_TS ( res )
    if res == getThisResource ( ) then
		for i, player in ipairs(getElementsByType("player")) do
			local acc = getPlayerAccount ( player )
			if not isGuestAccount ( acc ) then
				Salvar_TS ( acc )
			end
		end
	end
end 
addEventHandler ( "onResourceStop", getRootElement(), Desligar_TS )

function Sair_TS_Servidor ( quitType )
	local acc = getPlayerAccount(source)
	if not isGuestAccount ( acc ) then
		if acc then
			Salvar_TS ( acc )
		end
	end
end
addEventHandler ( "onPlayerQuit", getRootElement(), Sair_TS_Servidor )

Tenta ai, não testei..

 

Edited by MesaDowN
Corrigido alguns erros..
Link to comment
1 hour ago, MesaDowN said:

Tente assim! 
 


addEventHandler ( "onPlayerLogin", root,
  function ( _, acc )
	setTimer ( Carregar_TS, 50, 1, acc )
  end
)

function Carregar_TS ( conta )
	if not isGuestAccount ( conta ) then
		if conta then	
			local source = getAccountPlayer ( conta )
			local Porte = getAccountData ( conta, "Porte1" ) or 0
			setElementData ( source, "Porte1", Porte )
		end
	end	
end

function Iniciar_Resource ( res )
	if res == getThisResource ( ) then
		for i, player in ipairs(getElementsByType("player")) do
			local acc = getPlayerAccount ( player )
			if not isGuestAccount ( acc ) then
				Carregar_TS ( acc )
			end
		end
	end
end
addEventHandler ( "onResourceStart", getRootElement ( ), Iniciar_Resource )

function Salvar_TS ( conta )
	if conta then
		local source = getAccountPlayer ( conta )
		local Porte = getElementData ( source, "Porte1" ) or 0
		setAccountData ( conta, "Porte1", Porte )
	end
end

function Desligar_TS ( res )
    if res == getThisResource ( ) then
		for i, player in ipairs(getElementsByType("player")) do
			local acc = getPlayerAccount ( player )
			if not isGuestAccount ( acc ) then
				Salvar_TS ( acc )
			end
		end
	end
end 
addEventHandler ( "onResourceStop", getRootElement(), Desligar_TS )

function Sair_TS_Servidor ( quitType )
	local acc = getPlayerAccount(source)
	if not isGuestAccount ( acc ) then
		if acc then
			Salvar_TS ( acc )
		end
	end
end
addEventHandler ( "onPlayerQuit", getRootElement(), Sair_TS_Servidor )

Tenta ai, não testei..

 

 

Acho que o elementData do porte dele não tem números kk. Ou pode ser um booleano ou uma string.

Link to comment

mPorte = createMarker(1154.28467, -1743.70789, 12.39844, "cylinder", 2,255,255,255,50)
lojaArma = createMarker(1154.50305, -1749.57227, 12.57031, "cylinder",2,255,255,255,50)

function adquirirPORTEMSG(source)
    outputChatBox("Você deseja um porte de armas por 10K? Use o comando /porte")
end
addEventHandler("onMarkerHit", mPorte, adquirirPORTEMSG)
-----------------------------------------------------------------------------------------------
function comprarP(source)
    if getPlayerMoney(source) >= 10000 then
        if getElementData(source,"Porte1") == false then
           setElementData(source,"Porte1", true)
    outputChatBox("Você adquiriu o porte de armas!", source)
    takePlayerMoney(source, 10000)
else
    outputChatBox("Você já tem um porte de armas!", source)
    end
end
end

addCommandHandler("porte", comprarP)
-----------------------------------------------------------------------------------------------
function comprararmaMSG(source)
    outputChatBox("Para comprar uma glock por R$7.500, digite /glock", source)
end
addEventHandler("onMarkerHit", lojaArma, comprararmaMSG )
----------------------------------------------------------------------------------------------

function comprarArma(source)
    if isElementWithinMarker(source, lojaArma) then
                if getElementData(source, "Porte1") == true then
            giveWeapon(source, 22, 250)
            takePlayerMoney(source, 7500)
            outputChatBox("Você comprou sua glock e pagou R$7500!", source)
        else
            outputChatBox("Você não tem o porte de armas!", source)
        end
    end
end
addCommandHandler("glock", comprarArma)
---------------------------------------------------------------------------------------------

 

]

 


Este e meu codigo não sei como deixa desse jeito de voces :(
 

Este e meu codigo não sei como deixa desse jeito de voces :(
Eu testei e não foi aparece que eu tenho o porte de armas porem quando eu vou comprar aparece q não

 

Link to comment

Levando em consideração que este comando só sera utilizado uma vez por conta, é viável setar diretamente a data na conta do jogador sem usar element-data, além do mais se o servidor der crash por algum motivo, os dados não serão perdidos.

 

local mPorte = createMarker (1154.28467, -1743.70789, 12.39844, "cylinder", 2, 255, 255, 255, 50)
local lojaArma = createMarker (1154.50305, -1749.57227, 12.57031, "cylinder", 2, 255, 255, 255, 50)

addEventHandler ("onMarkerHit", mPorte, function (hitElement, matchingDimension)
	if getElementType (hitElement) == "player" then -- Se o elemento que colidiu no marker for um player, então:
		outputChatBox ("Você deseja um porte de armas por 10K? Use o comando /porte", hitElement)
	end	
end)

addEventHandler ("onMarkerHit", lojaArma, function (hitElement, matchingDimension)
	if getElementType (hitElement) == "player" then -- Se o elemento que colidiu no marker for um player, então:
		outputChatBox ("Para comprar uma glock por R$7.500, digite /glock", hitElement)
	end	
end)
	
addCommandHandler ("porte", function (thePlayer, cmd)
	if not isGuestAccount (getPlayerAccount (thePlayer)) then -- Se o jogador estiver logado, então:
		if isElementWithinMarker (thePlayer, mPorte) then -- Se o jogador estiver no marker da "mPorte", então:
			if getPlayerMoney(thePlayer) >= 10000 then -- Se o jogador tiver um saldo igual ou mais que 10000, então:
				if getAccountData (getPlayerAccount(thePlayer), "Porte1") then -- Se o jogador possuir porte de armas, então:
					outputChatBox ("Você já tem um porte de armas!", thePlayer, 255, 0, 0) -- Feedback negativo informando que ele já possui porte de armas.
				else -- Se o jogador não possuir porte de armas, então:
					setAccountData (getPlayerAccount(thePlayer), "Porte1", true) -- Seta a data com o bool true informando que o jogador agora possue porte de armas.
					outputChatBox ("Você adquiriu o porte de armas e pagou $10000!", thePlayer, 0, 255, 0) -- Feedback positivo informando que ele adquiriu o porte de armas com sucesso.
					takePlayerMoney (thePlayer, 10000) -- Retira 10000 do saldo atual do jogador.
				end
			else -- Se o jogador não tiver a quantia de $10000, então:
				outputChatBox ("Você não possui um valor superior a $10000!", thePlayer, 255, 0, 0) -- Feedback negativo informando que ele não possui esse valor.
			end	
		else -- Se o jogador não estiver no marker de pegar o porte, então:
			outputChatBox ("Você deve estar no lugar de compra de porte de armas...!", thePlayer, 255, 0, 0) -- Feedback negativo informando que o jogador não esta no local correto.
		end	
	else
		outputChatBox ("Você precisa estar logado para executar este comando!", thePlayer, 255, 0, 0) -- Feedback negativo informando que o jogador precisa logar no servidor.
	end	
end)

addCommandHandler ("glock", function (thePlayer, cmd)
	if isElementWithinMarker (thePlayer, lojaArma) then -- Se o jogador estiver no marker da "lojaArma", então:
		if getPlayerMoney(thePlayer) >= 7500 then -- Se o jogador tiver um saldo igual ou mais que 7500, então:
			if getAccountData (getPlayerAccount(thePlayer), "Porte1") then -- Se o jogador possuir porte de armas, então:
				giveWeapon (thePlayer, 22, 250) -- Recebe uma glock com 250 munições.
				takePlayerMoney (thePlayer, 7500) -- É retirado 7500 de seu saldo.
				outputChatBox ("Você comprou sua glock e pagou R$7500!", thePlayer, 0, 255, 0) -- Feedback positivo informando a compra da arma.
			else -- Se o jogador não possuir porte de armas, então:
				outputChatBox ("Você não tem o porte de armas!", thePlayer, 255, 0, 0) -- Feedback negativo informando que o jogador não possui porte de armas.
			end
		else -- Se o jogador não tiver a quantia de $7500, então:
			outputChatBox ("Você não possui um valor superior a $7500!", thePlayer, 255, 0, 0) -- Feedback negativo informando que ele não possui esse valor.
		end	
	end
end)

@Taay

Edited by Jonas^
Correção de indentação.
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...