Jump to content

Qual melhor forma de fazer isso...


Recommended Posts

Posted (edited)

Olá, então eu estou com uma duvida tremenda, já dei uma olhada na wiki e nada de encontrar então venho pedir a ajuda de vocês brasileiros q utilizam o fórum.

 

Eu quero fazer uma especie de Cofre no meu banco, como assim cofre? Quando a pessoa deposita algo uma taxa vai pra esse cofre, e esse cofre serviria pra realizar emprestimos. Isso tudo já está proogramado agora minha duvida é oq eu posso utilizar pra realizar esse cofre. Geralmente eu utilizaria ElementDate e faria um 

setElementData(??,"Cofre",getElementData(??,"Cofre") + 1000)

Mas ai que vem a minha duvida, pelo meu conhecimento ElementDate só serve pra players, oq eu quero fazer teria quer ser algo global. Algo que seria igual pra todos do servidor, e eu não sei como fazer isso. Eu pensei em fazer em mysql, criar uma coluna chamada cofre e sempre que alguém realizar um deposito adicionar a taxa nessa coluna da tabela e quando as pessoas forem realizar emprestimos puxar o valor da tabela e descontar da tabela mas acho que não tem necessidade nenhuma de utilizar mysql.

Alguém pode me ajudar?

Edited by juaosilv
  • Other Languages Moderators
Posted (edited)
2 hours ago, juaosilv said:

pelo meu conhecimento ElementDate só serve pra players, oq eu quero fazer teria quer ser algo global.

Tá. Duas observações:

  1. elementData serve para qualquer elemento, não só para jogadores. É claro que ele é utilizado com mais frequência em jogadores. A principal utilidade da elementData é que ela é uma data temporária. Ela é perdida se o servidor reiniciar ou se o elemento que continha a data for destruído. Outra vantagem da elementData é que ela é sincronizada entre servidor e clientes por padrão. Isso significa que se vc usar setElementData em um elemento, essa data pode ser lida tanto client-side quanto server-side. O grande problema é que pra manter essa sincronização both-side, ela consome muito tráfego de rede do seu servidor, podendo causar lag. Por esse motivo a maioria de nós (desenvolvedores) preferimos evitar o uso dela para manter a otimização e os scripts mais leves.
  2. Você quer algo global, pelo que entendi o mesmo cofre será usado para empréstimos para todos os jogadores (não será 1 cofre pra cada player e sim um único cofre global). Se eu fosse você, salvaria os dados do cofre em um banco de dados. Dessa forma os dados dele não serão perdidos se o server reiniciar ou o resource for reiniciado. Comece por ExecuteSQLQuery
Edited by Lord Henry
Posted (edited)
3 hours ago, Lord Henry said:

Tá. Duas observações:

  1. elementData serve para qualquer elemento, não só para jogadores. É claro que ele é utilizado com mais frequência em jogadores. A principal utilidade da elementData é que ela é uma data temporária. Ela é perdida se o servidor reiniciar ou se o elemento que continha a data for destruído. Outra vantagem da elementData é que ela é sincronizada entre servidor e clientes por padrão. Isso significa que se vc usar setElementData em um elemento, essa data pode ser lida tanto client-side quanto server-side. O grande problema é que pra manter essa sincronização both-side, ela consome muito tráfego de rede do seu servidor, podendo causar lag. Por esse motivo a maioria de nós (desenvolvedores) preferimos evitar o uso dela para manter a otimização e os scripts mais leves.
  2. Você quer algo global, pelo que entendi o mesmo cofre será usado para empréstimos para todos os jogadores (não será 1 cofre pra cada player e sim um único cofre global). Se eu fosse você, salvaria os dados do cofre em um banco de dados. Dessa forma os dados dele não serão perdidos se o server reiniciar ou o resource for reiniciado. Comece por ExecuteSQLQuery

Se meu servidor no futuro tiver muitos usuários e diversos usuários utilizando o banco por exemplo isso não pode causar lag no mysql? Eu utilizava mysql pra programar em outros jogos e tive muitos problemas em relação a conexões, como são muitos usuários sempre que eles utilizavam a função o mysql abria e fechava uma conexão e isso acabava dando problema no meu mysql por causa de muitas conexões por segundo, ai o mysql caia ou lagava.

Eu já fiz algumas funções em mysql em script mas não sei muito como funciona, se abre e fecha uma conexão a cada uso e etc...

Meu problema principal é esse, pois eu não vou utilizar esse cofre só pra bancos. Minha ideia principal é fazer um cofre da cidade, então sempre que você comprar um carro, comidas, armas uma % desse valor é enviada pro cofre, então seria muitas conexões e no momento estou com uma maquina razoável. 

E sobre o ElementDate eu to com um save, sempre que um jogar sair ele salva.

Mas resumidamente minha pergunta é, existe outra forma de fazer isso ou é só em MYSQL? 


E uma outra pergunta, caso exista outra forma  além dessa que você disse em MYSQL, a que você mais me recomenda é a em MYSQL?

Obrigado pelo tempo q ta gastando p me ajudar.

 

 

Edited by juaosilv
  • Other Languages Moderators
Posted (edited)

Sim, conexão com banco de dados é pesada se for feita muitas vezes simultaneamente.

Edited by Lord Henry
Posted
5 minutes ago, Lord Henry said:

Sim, conexão com banco de dados é pesada se for feita muitas vezes simultaneamente.

Mas existe uma outra forma de fazer isso? Se sim qual?

E se tiver outras formas a que você mais me recomenda é outra ou MYSQL?

Posted

Você não precisa interagir com o db todo instante, você pode fazer isso apenas no start/stop do resource:

start: carrega os dados do banco em uma variável/tabela/elementdata ….
stop: salva no banco

Utilizando o banco de dados do MTA (SQLite) ao invés do MySQL, seria bem mais eficaz também! 

Particularmente não acho interessante criar uma tabela para armazenar pouquíssimas informações, vai ser apenas o campo cofre consumindo uma única linha na tabela ? Eu optaria por salvar em um arquivo, ou então em uma conta “cobaia” responsável apenas por salvar informações relacionadas ao servidor, exemplo:

-- Vamos supor que eu tenha uma conta "serverData"

local accData = getAccount("serverData")
local bancoElem = createElement("banco")

addEventHandler("onResourceStart", resourceRoot,
	function()
		local cofre = getAccountData(accData, "banco.cofre") or 0
		setElementData(bancoElem, "cofre", cofre)
	end
)

addEventHandler("onResourceStop", resourceRoot,
	function()
		local cofre = getElementData(bancoElem, "cofre")
		setAccountData(accData, "banco.cofre", cofre )
	end
)

-- Para manipular o elementData em outros scripts, pode ser usado algo do tipo:
print(getElementData(getElementsByType("banco")[1], "cofre")) -- obter
setElementData(getElementsByType("banco")[1], "cofre", 500) -- alterar

 

  • Other Languages Moderators
Posted

Se for usar esse esquema de conta "cobaia", seria interessante colocar um verificador se a conta existe ou não.

Posted (edited)
12 hours ago, MaligNos said:

Você não precisa interagir com o db todo instante, você pode fazer isso apenas no start/stop do resource:

start: carrega os dados do banco em uma variável/tabela/elementdata ….
stop: salva no banco

Utilizando o banco de dados do MTA (SQLite) ao invés do MySQL, seria bem mais eficaz também! 

Particularmente não acho interessante criar uma tabela para armazenar pouquíssimas informações, vai ser apenas o campo cofre consumindo uma única linha na tabela ? Eu optaria por salvar em um arquivo, ou então em uma conta “cobaia” responsável apenas por salvar informações relacionadas ao servidor, exemplo:


-- Vamos supor que eu tenha uma conta "serverData"

local accData = getAccount("serverData")
local bancoElem = createElement("banco")

addEventHandler("onResourceStart", resourceRoot,
	function()
		local cofre = getAccountData(accData, "banco.cofre") or 0
		setElementData(bancoElem, "cofre", cofre)
	end
)

addEventHandler("onResourceStop", resourceRoot,
	function()
		local cofre = getElementData(bancoElem, "cofre")
		setAccountData(accData, "banco.cofre", cofre )
	end
)

-- Para manipular o elementData em outros scripts, pode ser usado algo do tipo:
print(getElementData(getElementsByType("banco")[1], "cofre")) -- obter
setElementData(getElementsByType("banco")[1], "cofre", 500) -- alterar

 

Consegui entender mais ou menos, mas ao utilizar o código de alterar que você mandou isso seria global ne? Se eu fizer pra descontar 1000 ou adicionar mais 1000, isso não seria só pra um jogador isso afetaria o valor do cofre de todos?

 

Pois a principio minha ideia é fazer um cofre pra cidade que sempre que qualquer jogador realizar uma taxa ir pro cofre, então o valor do cofre tem q ser igual e atualizar igual pra todos.

Edited by juaosilv
  • Other Languages Moderators
Posted

Sim, vai pra todos. Pelo menos no exemplo que ele deu. As contas são globais.

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...