Fighter

Como salvar os itens do inventário dos seus jogadores

Neste tutorial, vou mostrar de forma simples e prática como salvar os itens do inventário dos jogadores, garantindo que eles não percam seus equipamentos, recursos ou objetos importantes ao sair do jogo, trocar de servidor ou retornar à partida posteriormente.

Configuração

A maneira como faço isso com ferramentas é criando uma pasta dentro de ServerStorage chamada Tools, e todas as ferramentas do meu jogo ficam armazenadas lá de forma organizada. Assim, em vez de deixar as ferramentas espalhadas pelo projeto ou colocá-las diretamente no inventário dos jogadores, mantenho tudo em um único local seguro no servidor. Isso facilita bastante na hora de encontrar, editar ou adicionar novas ferramentas, além de evitar que os jogadores tenham acesso direto a elas antes do momento correto. Quando preciso entregar uma ferramenta para um jogador, eu simplesmente procuro essa ferramenta dentro da pasta Tools, faço uma cópia dela e envio para o Backpack do jogador ou para outro local apropriado. Essa abordagem é útil porque o ServerStorage não é acessível pelo cliente, o que ajuda a manter as ferramentas protegidas contra uso indevido. Dessa forma, o jogo fica mais organizado, mais fácil de manter e também mais seguro. Por exemplo, minha estrutura costuma ficar assim: dentro de ServerStorage, crio uma pasta chamada Tools; dentro dela, coloco itens como espadas, armas, lanternas, chaves ou qualquer outro objeto que o jogador possa equipar. Sempre que o jogo precisar conceder uma dessas ferramentas, o script apenas clona o item correto dessa pasta e entrega ao jogador.

image

Uma segunda pasta seria uma pasta contendo subpastas, que conteriam o inventário de cada jogador.
Exemplo de hierarquia:

image
A pasta Inventories começaria vazia, mas uma pasta com o nome do jogador que entra será criada, e as ferramentas que eles têm serão colocadas lá também.

Agora vamos para a codificação real!

Carregamento

Antes de falar sobre o carregamento, vou falar rapidamente sobre como vamos salvar em primeiro lugar.

Neste tutorial, vamos salvar o nome das ferramentas em uma tabela, mas você sempre pode usar algo diferente para identificar cada ferramenta.

Certo, de volta ao carregamento.

Quando o jogador entra, basta dar a ele suas ferramentas:

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local ServerStorage = game:GetService("ServerStorage")

local player_data = DataStoreService:GetDataStore("player_data")

local tools = ServerStorage.Tools
local inventories = ServerStorage.Inventories

Players.PlayerAdded:Connect(function(client)
	local key = "client_" .. client.UserId
	local inventory = player_data:GetAsync(key) -- Não se preocupe com pcalls, faça isso você mesmo
		
	local inventory_folder = Instance.new("Folder")
	inventory_folder.Name = client.Name
	inventory_folder.Parent = inventories

	for _, name in ipairs(inventory or { }) do
		local tool = tools[name]
		tool:Clone().Parent = client.Backpack -- Para o jogador usar
		tool:Clone().Parent = inventory_folder -- Para salvar e carregar
	end
end)

Não é muito complicado. Criamos uma nova pasta com o nome deles. Clonamos quaisquer ferramentas que eles tenham para sua pasta e mochila.
Se não houver dados presentes, você pode usar uma tabela vazia ou uma tabela inicial de itens gratuitos.

Salvamento

Ao salvar, basta percorrer a pasta Inventories deles. Salve todos os nomes das ferramentas em uma tabela e salve isso no data store. Finalmente, exclua a pasta, pois não é mais útil.

Players.PlayerRemoving:Connect(function(client)
	local key = "client_" .. client.UserId
	local tools = { }
	local inventory_folder = inventories[client.Name]
	
	for _, item in ipairs(inventory_folder:GetChildren()) do
		table.insert(tools, item.Name)
	end

	player_data:UpdateAsync(key, function(prev)
		return tools
	end)

	inventory_folder:Destroy()
end)

E aí está. Bam. Você tem um sistema de salvamento de inventário totalmente funcional. Mas este tutorial ainda não acabou, irmão.

Você pode perguntar como adicionar itens ao inventário deles em primeiro lugar. Geralmente, os jogos têm uma interface de loja onde você pode comprar itens.
Então, com o poder dos remotes, podemos implementar um:

image

Não é o melhor, mas apenas para demonstrar. Quando o botão é clicado, envie uma solicitação ao servidor para comprar uma ferramenta:

local ui = script.Parent
local frame = ui:WaitForChild("Frame")
local remote = game:GetService("ReplicatedStorage"):WaitForChild("OnRequest")

for _, button in ipairs(frame:GetChildren()) do
	button.Activated:Connect(function()
		remote:FireServer(button.Name)
	end)
end

A maneira como faço isso é nomear os botões com o nome do item correspondente. Assim, posso facilmente executar um loop for assim.

O código do servidor simplesmente dá ao jogador o item solicitado e o adiciona à pasta do inventário.

local remote = game:GetService("ReplicatedStorage").OnRequest

local ServerStorage = game:GetService("ServerStorage")
local tools = ServerStorage.Tools
local inventories = ServerStorage.Inventories

remote.OnServerEvent:Connect(function(client, request)
	local inventory_folder = inventories[client.Name]
	local tool = tools[request]
	tool:Clone().Parent = client.Backpack
	tool:Clone().Parent = inventory_folder	
end)

Eu não codifiquei um sistema de moeda completo, nem adicionei verificações de sanidade; isso é para você implementar.re

3 Comentários

  • admin 7 de abril de 2022

    Borem Ipsum is simply dummy text of the printing and typesetting indusem Ipsum has is simply dumhe printing.

    • admin 15 de abril de 2022

      Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versionsome to WordPress. This is your first post. Edit or delete it, then start writing!

  • admin 7 de abril de 2022

    Borem Ipsum is simply dummy text of the printing and typesetting indusem Ipsum has is simply dumhe printing. It was popularised in the of Letraset sheets.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *