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.

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

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:

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