____op Posted December 13, 2019 Share Posted December 13, 2019 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
Other Languages Moderators Lord Henry Posted December 13, 2019 Other Languages Moderators Share Posted December 13, 2019 elementData é uma data temporária salva em um elemento. Quando esse elemento é destruído ou desconecta do servidor, sua data é perdida. Para datas permanentes, salve na conta do jogador com setAccountData. 1 Link to comment
Developer. Posted December 13, 2019 Share Posted December 13, 2019 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
____op Posted December 13, 2019 Author Share Posted December 13, 2019 Eu tentei fazer com essas coisas que vocês me mandaram mais eu não consegui pois eu sou iniciante alguem pode mandar um exemplo para eu usar de Base ou de Exemplo?? 1 Link to comment
KronoS Lettify Posted December 14, 2019 Share Posted December 14, 2019 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
____op Posted December 14, 2019 Author Share Posted December 14, 2019 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 --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 porte= getElementData(source, 'Porte) or '0' local portee = getPlayerAccount(source) setAccountData(portee, 'Porte', porte) -- 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 porte = getAccountData(acc, 'Porte') or '0' -- Lembrando sempre de usar a mesma chave quando você quer trabalhar com um só item setElementData(source, 'Porte', portee) -- 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) assim? Link to comment
____op Posted December 14, 2019 Author Share Posted December 14, 2019 Alguem pode fazer para mim to a 3 dias tentando fazer isso to pensando em desistir já Link to comment
beast99 Posted December 14, 2019 Share Posted December 14, 2019 Depende, qual o nome de seu elementData? 5 hours ago, Taay said: Alguem pode fazer para mim to a 3 dias tentando fazer isso to pensando em desistir já Porque pedir sem ter qualquer informação fica dificil.. Link to comment
____op Posted December 14, 2019 Author Share Posted December 14, 2019 1 hour ago, MesaDowN said: Depende, qual o nome de seu elementData? Porque pedir sem ter qualquer informação fica dificil.. Se chama Porte1 Link to comment
beast99 Posted December 14, 2019 Share Posted December 14, 2019 (edited) 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 December 14, 2019 by MesaDowN Corrigido alguns erros.. Link to comment
KronoS Lettify Posted December 14, 2019 Share Posted December 14, 2019 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
beast99 Posted December 14, 2019 Share Posted December 14, 2019 1 minute ago, KronoS Lettify said: Acho que o elementData do porte dele não tem números kk. Ou pode ser um booleano ou uma string. Pois, ele deveria ter mostrado o código.. 1 Link to comment
____op Posted December 14, 2019 Author Share Posted December 14, 2019 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
Jonas^ Posted December 14, 2019 Share Posted December 14, 2019 (edited) 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 December 14, 2019 by Jonas^ Correção de indentação. Link to comment
____op Posted December 14, 2019 Author Share Posted December 14, 2019 obrigado irei testar aqui! Obrigado pode fechar o tópico! 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