Saving folders content with Datastore2

  1. What do you want to achieve?
    A clear and simple answer on how to save the children of a folder using How to use DataStore2 - Data Store caching and data loss prevention. (preferably with steps)

  2. What is the issue?
    I cant find any solutions that give a direct answer or an example that i can learn from.

  3. What solutions have you tried so far?
    Looked at the devforum for hours and watched yt videos. With every post it never gives an answer that i can understand, that is up to date with datastore2, yt videos are on older versions of datastore2.
    Ive went back and forth and with each post thats similar to my title it just didnt work, for me. Im not super experienced with datastores but i did know how to save folders content until i switched to datastore2.

local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local Workspace = game:GetService("Workspace")

local DataStore2 = require(ServerScriptService.DataStore2)

local toolTable = {}

-- Combine every key you use. This will eventually be the default, but for now read the "Gotchas" section to understand why we need this.
DataStore2.Combine("DATA",  "Tools")

Players.PlayerAdded:Connect(function(player)
	local ownedvalues = Instance.new("Folder")
	ownedvalues.Name = "OwnedValues"
	
	local toolsStore = DataStore2("Tools", player)
	local Tools = Instance.new("Folder")
	Tools.Name = "Tools"
	Tools.Parent = ownedvalues
	
	--Area of problem
	toolsStore:OnUpdate(function(newTools)
		toolsStore = newTools
		print(toolsStore)
	end)

	ownedvalues.Parent = player
end)

--This part works so ignore.
game.ReplicatedStorage.BuyTool.Event:Connect(function(player, ToolName)
	if not player:FindFirstChild("OwnedValues").Tools:FindFirstChild(ToolName) then
		local newInstance = Instance.new("IntValue", player:FindFirstChild("OwnedValues").Tools)
		newInstance.Name = ToolName
	end
end)

What about using ProfileService?
I can give you a basic usage to show how it works
You can even use it to make Inventory system to save as a table

Sure! But either way i still would want to know the solution to this problem.
ProfileService would probably be my last resort if i cant figure out the problem.

are you perhaps trying to save it like:

When value or something added under folder, save it to datastore auto?

So when i buy a tool it does send an int value into the correct folder, but when i leave it doesnt save.
Ive looked at the document of the datastore2 but it hasnt gave a way to save a folders content only a value of a int, string, etc.

ill give you the scripts when i am free :+1:

1 Like

Ah, my old script is too old and broken :d but I can say you can make it something like this

I don’t really have time to make a full tutorial from 0 so I have given my scripts

Save
function module.Save(player)
	if players:FindFirstChild(player.Name) and player:FindFirstChild("IsLoaded") then
		local status, message = pcall(function()
			local SaveFile = {}
			for i,v in ipairs(Values) do
				local Folder = player:findFirstChild(v)
				if Folder then
					for i,v in ipairs(Folder:GetChildren()) do
						local Value = v
						if Value:IsA('ValueBase') then
							table.insert(SaveFile,{
								Value.Name,
								Value.Value,
								Value.ClassName,
								Value.Parent.Name,
							})
						end
					end
				end
			end
			print(game:GetService('HttpService'):JSONEncode(SaveFile))
			DataStore:SetAsync(player.UserId, SaveFile)
		end)
		if status ~= true then
			print(player.Name .. " couldn't save, retrying... \n" .. message)
			module.Save(player)
		else
			print(player.Name .. " saved successfully!")
		end
	end
end
Load
function module.Load(player)
	if players:FindFirstChild(player.Name) then
		local status,errormsg = pcall(function()
			local SaveFile = DataStore:GetAsync(player.UserId)
			if SaveFile then
				print(game:GetService('HttpService'):JSONEncode(SaveFile))
				for i,v in ipairs(SaveFile) do
					local Value = PlayerValues[player.Name][v[1]]
					if not Value then
						local val = CreateObject(player,v[3],{
							Parent = player:findFirstChild(v[4]),
							Name = v[1],
						})
						PlayerValues[player.Name][v[1]] = val
						Value = val
					end
					
					Value.Value = v[2]
					
				end
			end
		end)
		if status ~= true then
			if player.LoadAttempts.Value < 5 then
				print(errormsg)
				player.LoadAttempts.Value = player.LoadAttempts.Value+1
				print(player.Name .. " couldn't load, retrying...")
				module.Load(player)
			else
				print('Error loading data')
			end
		else
			print(player.Name .. " loaded successfully!")
		end
	end
end

For Profile Service I recommend watching all the tutorials they have and Make a mix of them :d

First get the Profile Service:

Make a Folder under ServerScriptService, Put ProfileService under it
image

and Make another folder
image

I prefer Seperating them to edit it easly

Lets start with easiest:
Template is the Module script where you put your Values to use inside profile:

Template
local module = {
	Gold = 0,
	Level = 1,
	Rebirth = 0,

	XP = 0,
	XPNeeded = 50,

	LevelLimit = 100,

	AttackSpeed = 2,
	DamageBoost = 1,
	RewardsBoost = 1,
	
	UpgradesDone = 0,

	Damage = 15,

	XPBoost = 1,
	GoldBoost = 1,

	TotalGoldEarned = 0,
	TotalBlocksMined = 0,

	PickaxeEquipped = "LvL. 1 Pickaxe",

	GiftGold = 0,
	GiftAttackSpeed = 0,
	GiftDamageBoost = 0,
	GiftRewardsBoost = 0,
	GiftXPBoost = 0,
	GiftGoldBoost = 0
	
}

return module

Then next is Manager!

Manager
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TownLevel = ReplicatedStorage:WaitForChild("TownLevel")
local CurrentTownLevel = TownLevel:WaitForChild("CurrentTownLevel")
local EXPBOOST = CurrentTownLevel:WaitForChild("EXPBOOST")
local GOLDBOOST = CurrentTownLevel:WaitForChild("GOLDBOOST")

local module = {}

module.Profiles = {}


--- LeaderStats STUFF


function module:AddGold(player, amount)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

    profile.Data.Gold += (amount * profile.Data.GoldBoost) * GOLDBOOST.Value
    player.leaderstats.Gold.Value = profile.Data.Gold
end

function module:GiftGold(player, NameOfValue, AmountOfValue, target)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

	local Players = game:GetService("Players")
	
	if target == player.Name then
		warn("Bro trying to put Stat from his 1 pocket to another")
	else
		if Players:FindFirstChild(target) then
			local RealTarget = Players:FindFirstChild(target)
			local Gifts = RealTarget:WaitForChild("Gifts")
			local Gold = Gifts:WaitForChild("GiftGold")
			local AttackSpeed = Gifts:WaitForChild("GiftAttackSpeed")
			local DamageBoost = Gifts:WaitForChild("GiftDamageBoost")
			local RewardsBoost = Gifts:WaitForChild("GiftRewardsBoost")
			local XPBoost = Gifts:WaitForChild("GiftXPBoost")
			local GoldBoost = Gifts:WaitForChild("GiftGoldBoost")

			if AmountOfValue >= 1 then
				if profile.Data[NameOfValue] - AmountOfValue >= 0 then
					if NameOfValue == "Gold" then
						
						profile.Data[NameOfValue] -= AmountOfValue
						Gifts["Gift"..NameOfValue].Value += AmountOfValue
						
						player.leaderstats.Gold.Value = profile.Data.Gold

						print("Successfully Sent "..AmountOfValue.." Amount Of Gold to: "..RealTarget.Name)

					elseif NameOfValue == "AttackSpeed" or
					       NameOfValue == "DamageBoost" or
					       NameOfValue == "RewardsBoost" or
					       NameOfValue == "XPBoost" or
					       NameOfValue == "GoldBoost" then
			
						profile.Data[NameOfValue] -= AmountOfValue
						Gifts["Gift"..NameOfValue].Value += AmountOfValue

						player.Stats[NameOfValue].Value = profile.Data[NameOfValue]
			
						print("Successfully Sent "..AmountOfValue.." Amount Of "..NameOfValue.." to: "..RealTarget.Name)

					else
						warn("Value Not Found: ", NameOfValue)
					end
				else
					warn("You can't go Negative Stats! Stat Used: ", NameOfValue)
				end
			elseif AmountOfValue == 0 then
				warn("Can't Send 0, its pointless")
			elseif AmountOfValue < 0 then
				warn("You trying to Steal from Player?")
			end
		else
			warn("Target not Found ", target)
		end
	end

end

function module:ControlGifts(player)
	local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end
	
	local function UpdateGiftGold()
		
		if player.Gifts.GiftGold.Value > 0 then
		profile.Data.Gold += player.Gifts.GiftGold.Value
		player.leaderstats.Gold.Value = profile.Data.Gold
		player.Gifts.GiftGold.Value -= player.Gifts.GiftGold.Value

		else
			return false
		end
	end

	local function UpdateGiftAttackSpeed()
		
		if player.Gifts.GiftAttackSpeed.Value > 0 then
		profile.Data.AttackSpeed += player.Gifts.GiftAttackSpeed.Value
		player.Stats.AttackSpeed.Value = profile.Data.AttackSpeed
		player.Gifts.GiftAttackSpeed.Value -= player.Gifts.GiftAttackSpeed.Value

		else
			return false
		end
	end

	local function UpdateGiftDamageBoost()
		
		if player.Gifts.GiftDamageBoost.Value > 0 then
		profile.Data.DamageBoost += player.Gifts.GiftDamageBoost.Value
		player.Stats.DamageBoost.Value = profile.Data.DamageBoost
		player.Gifts.GiftDamageBoost.Value -= player.Gifts.GiftDamageBoost.Value

		else
			return false
		end
	end

	local function UpdateGiftRewardsBoost()
		
		if player.Gifts.GiftRewardsBoost.Value > 0 then
		profile.Data.RewardsBoost += player.Gifts.GiftRewardsBoost.Value
		player.Stats.RewardsBoost.Value = profile.Data.RewardsBoost
		player.Gifts.GiftRewardsBoost.Value -= player.Gifts.GiftRewardsBoost.Value

		else
			return false
		end
	end

	local function UpdateGiftXPBoost()
		
		if player.Gifts.GiftXPBoost.Value > 0 then
		profile.Data.XPBoost += player.Gifts.GiftXPBoost.Value
		player.Stats.XPBoost.Value = profile.Data.XPBoost
		player.Gifts.GiftXPBoost.Value -= player.Gifts.GiftXPBoost.Value
		
		else
			return false
		end
	end

	local function UpdateGiftGoldBoost()
		
		if player.Gifts.GiftGoldBoost.Value > 0 then
		profile.Data.GoldBoost += player.Gifts.GiftGoldBoost.Value
		player.Stats.GoldBoost.Value = profile.Data.GoldBoost
		player.Gifts.GiftGoldBoost.Value -= player.Gifts.GiftGoldBoost.Value

		else
			return false
		end
	end

	local function UpdateGiftDataToProfile()
		profile.Data.GiftGold = player.Gifts.GiftGold.Value
		profile.Data.GiftAttackSpeed = player.Gifts.GiftAttackSpeed.Value
		profile.Data.GiftDamageBoost = player.Gifts.GiftDamageBoost.Value
		profile.Data.GiftRewardsBoost = player.Gifts.GiftRewardsBoost.Value
		profile.Data.GiftXPBoost = player.Gifts.GiftXPBoost.Value
		profile.Data.GiftGoldBoost = player.Gifts.GiftGoldBoost.Value

		UpdateGiftGold()
		UpdateGiftAttackSpeed()
		UpdateGiftDamageBoost()
		UpdateGiftRewardsBoost()
		UpdateGiftXPBoost()
		UpdateGiftGoldBoost()
	end

	UpdateGiftDataToProfile()

end

function module:AddLevel(player, amount)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

    profile.Data.Level += amount
    player.leaderstats.Level.Value = profile.Data.Level
end

function module:AddRebirth(player)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

if player.leaderstats.Level.Value == player.Stats.LevelLimit.Value then

    profile.Data.Rebirth += 1
	player.leaderstats.Rebirth.Value = profile.Data.Rebirth

	local RebirthStatMultipler = 0.5

	profile.Data.GoldBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value)
	profile.Data.XPBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value)
	profile.Data.DamageBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value)
	profile.Data.RewardsBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value)
	profile.Data.LevelLimit = 100 * 2 ^ player.leaderstats.Rebirth.Value 
	profile.Data.Damage *= 2

	profile.Data.Level = 1
	player.leaderstats.Level.Value = profile.Data.Level

	profile.Data.Gold = 0
	player.leaderstats.Gold.Value = profile.Data.Gold

	player.Stats.GoldBoost.Value = profile.Data.GoldBoost
	player.Stats.XPBoost.Value = profile.Data.XPBoost
	player.Stats.DamageBoost.Value = profile.Data.DamageBoost
	player.Stats.RewardsBoost.Value = profile.Data.RewardsBoost
	player.Stats.LevelLimit.Value = profile.Data.LevelLimit
	player.Stats.Damage.Value = profile.Data.Damage
	
	else
		return false
	end

end

function module:AddUpgrade(player)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

	local BaseGoldMultiplier = 10

	if profile.Data.Gold >= ((100 + BaseGoldMultiplier * player.leaderstats.Rebirth.Value) * 2 ^ player.Stats.UpgradesDone.Value) then

		local function UpgradeSTATS()

			local StatsBoostsToGive = 2.5
			local BoostsToGive = 1
			local RebirthStatMultipler = 0.5

			if player.Stats.UpgradesDone.Value >= 1 then
	        profile.Data.Gold -= ((100 + BaseGoldMultiplier * player.leaderstats.Rebirth.Value) * 2 ^ player.Stats.UpgradesDone.Value)
			elseif player.Stats.UpgradesDone.Value <= 0 then
				profile.Data.Gold -= 100 + (BaseGoldMultiplier * player.leaderstats.Rebirth.Value)
	    	end

			player.leaderstats.Gold.Value = profile.Data.Gold

			profile.Data.UpgradesDone += 1
			player.Stats.UpgradesDone.Value = profile.Data.UpgradesDone

			local function AttackSpeedCalculator()
				if profile.Data.AttackSpeed + 1 <= 100 then
					profile.Data.AttackSpeed += 1
				elseif profile.Data.AttackSpeed + 1 >= 100 then
					profile.Data.AttackSpeed = 100
				end
			end

			

			if player.Stats.UpgradesDone.Value == 1 then
				BoostsToGive = 1
				
				profile.Data.GoldBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)
				profile.Data.XPBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)
				profile.Data.DamageBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)
				profile.Data.RewardsBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)
			
				AttackSpeedCalculator()
			elseif player.Stats.UpgradesDone.Value > 1 then
				BoostsToGive = 2 ^ player.Stats.UpgradesDone.Value

				profile.Data.GoldBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive)
				profile.Data.XPBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive)
				profile.Data.DamageBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive)
				profile.Data.RewardsBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive)

				AttackSpeedCalculator()
			end

		end

		UpgradeSTATS()

		player.Stats.GoldBoost.Value = profile.Data.GoldBoost
		player.Stats.XPBoost.Value = profile.Data.XPBoost
		player.Stats.DamageBoost.Value = profile.Data.DamageBoost
		player.Stats.RewardsBoost.Value = profile.Data.RewardsBoost
		player.Stats.AttackSpeed.Value = profile.Data.AttackSpeed

	else
		print("Not Enough Gold: " , ((100 + BaseGoldMultiplier * player.leaderstats.Rebirth.Value) * 2 ^ player.Stats.UpgradesDone.Value) )
	end

end

--- LeaderStats STUFF


--- EXP STUFF

function module:AddXP(player, amount)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

	if player.leaderstats.Level.Value < player.Stats.LevelLimit.Value then

    profile.Data.XP += (amount * profile.Data.XPBoost) * EXPBOOST.Value
    player.Stats.XP.Value = profile.Data.XP

	else
		return false
	end
end

function module:CheckXP(player)
    local Profiles = module.Profiles
    local profile = Profiles[player]

	if player.Stats.XP.Value >= player.Stats.XPNeeded.Value then
		profile.Data.XP = 0
		profile.Data.Level += 1
	
		player.Stats.XP.Value = profile.Data.XP
		player.leaderstats.Level.Value = profile.Data.Level
	else
		return false
	end
	
	profile.Data.XPNeeded = (50 * 2 ^ player.leaderstats.Level.Value)
	player.Stats.XPNeeded.Value = profile.Data.XPNeeded

end

--- EXP STUFF


--- STATS STUFF

function module:AddTotalGoldEarned(player, amount)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

    profile.Data.TotalGoldEarned += (amount * profile.Data.GoldBoost) * GOLDBOOST.Value
    player.Stats.TotalGoldEarned.Value = profile.Data.TotalGoldEarned
end

function module:AddTotalBlocksMined(player, amount)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

    profile.Data.TotalBlocksMined += amount
    player.Stats.TotalBlocksMined.Value = profile.Data.TotalBlocksMined
end

--- STATS STUFF


--- Equipment STUFF

function module:EquipPickaxe(player, itemName)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    if not profile then return end

    profile.Data.PickaxeEquipped = itemName
    player.Equipped.PickaxeEquipped.Value = profile.Data.PickaxeEquipped
end

--- Equipment STUFF


--- Functions? which i don't use...

function module:Get(player, key)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    assert(profile.Data[key], string.format("Data Does not Exist for %s", key))

    return profile.Data[key]
end

function module:Set(player, key, value)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    assert(profile.Data[key], string.format("Data Does not Exist for %s", key))
    
    assert(type(profile.Data[key]) == type(value))

    profile.Data[key] = value
end

function module:Update(player, key, callback)
    local Profiles = module.Profiles
    local profile = Profiles[player]
    
    local oldData = self:Get(player, key)
    local newData = callback(oldData)

    self:Set(player, key, newData)
end

--- Functions? which i don't use...


---

return module

You make Functions in the Manager then use it with require in scripts like:

local ServerScriptService = game:GetService("ServerScriptService")
local playerdatahandler = require(script.Parent.Manager)

then you can use it like:

playerdatahandler:FunctionName(key1, key2, etc.)
Data:
local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")

local Template = require(script.Parent.Template)
local ProfileService = require(ServerScriptService.Libs.ProfileService)
local Manager = require(script.Parent.Manager)

-- Always set to Production when publishing
local ProfileStore = ProfileService.GetProfileStore("Production", Template)

local function GiveLeaderstats(player: Player)

	local profile = Manager.Profiles[player]
	if not profile then return end
	
	local leaderstats = Instance.new("Folder", player)
	leaderstats.Name = "leaderstats"
	
	local Gold = Instance.new("NumberValue", leaderstats)
	Gold.Name = "Gold"
	Gold.Value = profile.Data.Gold
	
	local Level = Instance.new("NumberValue", leaderstats)
	Level.Name = "Level"
	Level.Value = profile.Data.Level
	
	local Rebirth = Instance.new("NumberValue", leaderstats)
	Rebirth.Name = "Rebirth"
	Rebirth.Value = profile.Data.Rebirth

end

local function GiveOtherStuff(player: Player)

	local profile = Manager.Profiles[player]
	if not profile then return end
	
	local Stats = Instance.new("Folder", player)
	Stats.Name = "Stats"
	
	local Equipped = Instance.new("Folder", player)
	Equipped.Name = "Equipped"

	local Gifts = Instance.new("Folder", player)
	Gifts.Name = "Gifts"
	--- Folders
	
	local XP = Instance.new("NumberValue", Stats)
	XP.Name = "XP"
	XP.Value = profile.Data.XP

	local XPNeeded = Instance.new("NumberValue", Stats)
	XPNeeded.Name = "XPNeeded"
	XPNeeded.Value = profile.Data.XPNeeded

	local LevelLimit = Instance.new("NumberValue", Stats)
	LevelLimit.Name = "LevelLimit"
	LevelLimit.Value = profile.Data.LevelLimit

	local AttackSpeed = Instance.new("NumberValue", Stats)
	AttackSpeed.Name = "AttackSpeed"
	AttackSpeed.Value = profile.Data.AttackSpeed

	local Damage = Instance.new("NumberValue", Stats)
	Damage.Name = "Damage"
	Damage.Value = profile.Data.Damage

	local DamageBoost = Instance.new("NumberValue", Stats)
	DamageBoost.Name = "DamageBoost"
	DamageBoost.Value = profile.Data.DamageBoost
	
	local RewardsBoost = Instance.new("NumberValue", Stats)
	RewardsBoost.Name = "RewardsBoost"
	RewardsBoost.Value = profile.Data.RewardsBoost

	local UpgradesDone = Instance.new("NumberValue", Stats)
	UpgradesDone.Name = "UpgradesDone"
	UpgradesDone.Value = profile.Data.UpgradesDone

	local XPBoost = Instance.new("NumberValue", Stats)
	XPBoost.Name = "XPBoost"
	XPBoost.Value = profile.Data.XPBoost

	local GoldBoost = Instance.new("NumberValue", Stats)
	GoldBoost.Name = "GoldBoost"
	GoldBoost.Value = profile.Data.GoldBoost
	
	local TotalGoldEarned = Instance.new("NumberValue", Stats)
	TotalGoldEarned.Name = "TotalGoldEarned"
	TotalGoldEarned.Value = profile.Data.TotalGoldEarned
	
	local TotalBlocksMined = Instance.new("NumberValue", Stats)
	TotalBlocksMined.Name = "TotalBlocksMined"
	TotalBlocksMined.Value = profile.Data.TotalBlocksMined

	local PickaxeEquipped = Instance.new("StringValue", Equipped)
	PickaxeEquipped.Name = "PickaxeEquipped"
	PickaxeEquipped.Value = profile.Data.PickaxeEquipped

	local GiftGold = Instance.new("NumberValue", Gifts)
	GiftGold.Name = "GiftGold"
	GiftGold.Value = profile.Data.GiftGold

	local GiftAttackSpeed = Instance.new("NumberValue", Gifts)
	GiftAttackSpeed.Name = "GiftAttackSpeed"
	GiftAttackSpeed.Value = profile.Data.GiftAttackSpeed

	local GiftDamageBoost = Instance.new("NumberValue", Gifts)
	GiftDamageBoost.Name = "GiftDamageBoost"
	GiftDamageBoost.Value = profile.Data.GiftDamageBoost

	local GiftRewardsBoost = Instance.new("NumberValue", Gifts)
	GiftRewardsBoost.Name = "GiftRewardsBoost"
	GiftRewardsBoost.Value = profile.Data.GiftRewardsBoost

	local GiftXPBoost = Instance.new("NumberValue", Gifts)
	GiftXPBoost.Name = "GiftXPBoost"
	GiftXPBoost.Value = profile.Data.GiftXPBoost

	local GiftGoldBoost = Instance.new("NumberValue", Gifts)
	GiftGoldBoost.Name = "GiftGoldBoost"
	GiftGoldBoost.Value = profile.Data.GiftGoldBoost
	
end


local function PlayerAdded(player: Player)
	local profile = ProfileStore:LoadProfileAsync("Player_"..player.UserId)
	if profile == nil then
		player:Kick("Data issue, try again shortly. If issue persists, contact us!")
		return
	end
	
	profile:AddUserId(player.UserId)
	profile:Reconcile()
	profile:ListenToRelease(function()
		Manager.Profiles[player] = nil
		player:Kick("Data issue, try again shortly. If issue persists, contact us!")
	end)
	
	if player:IsDescendantOf(Players) == true then
		Manager.Profiles[player] = profile
		GiveLeaderstats(player)
		GiveOtherStuff(player)
	else
		profile:Release()
	end
end

for _, player in ipairs(Players:GetPlayers()) do
	task.spawn(PlayerAdded, player)
end

Players.PlayerAdded:Connect(PlayerAdded)

Players.PlayerRemoving:Connect(function(player: Player)
	local profile = Manager.Profiles[player]
	if not profile then return end
	profile:Release()
end)

For the data as you can see, you first give their paths
image

Then DataStore Name, in here which is “Production”
image

Then you can add Functions to make things easier:
image

Then PlayerAdded Stuff:

Don’t forget to call functions:
image

With this, you are ready to use ProfileService!
image

For Inventory Function:

To Template you add Inventroy as
Inventory = {}
then you can use it however you want

-- Add an item to the player's inventory
function module:AddToInventory(player, itemName, amount)
    local profile = module.Profiles[player]
    if not profile then return end

    -- Check if the item is already in the inventory, if not, create it
    if not profile.Inventory[itemName] then
        profile.Inventory[itemName] = 0
    end

    -- Add the specified amount to the inventory
    profile.Inventory[itemName] = profile.Inventory[itemName] + amount
end

-- Use this function to retrieve the player's inventory
function module:GetInventory(player)
    local profile = module.Profiles[player]
    if not profile then return end

    return profile.Inventory
end
1 Like

I am sorry, you have to Edit the scripts for your own values

Thanks! Thats alot to take in but yeah ill probably switch to profileservice, kinda annoying that i currently cant find a solution to my problem so now i have to switch to a different module, ill probably notify when ive converted and if it works (which ill prob finish tommorrrow)! :smile:

1 Like

Hi again, got busy with school.
So ive converted all the num values and now i have to do the table, but how would i actually show the tables contents in a folder?

local template = {
	OwnedTools = {},
}

return template
local module = {}

function module:Create(player: Player, profile)
	
	local ownedvalues = Instance.new("Folder")
	ownedvalues.Name = "OwnedValues"
	ownedvalues.Parent = player
	
	local ownedTools = Instance.new("Folder") -- where i want the tables content to go
	ownedTools.Name = "OwnedTools"
	ownedTools.Parent = ownedvalues
	
end
return module

With things like coins its simple because you would do

local module = {}

function module:Create(player: Player, profile)
	
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	local coins = Instance.new("NumberValue")
	coins.Name = "Coins"
	coins.Value = profile.Data.Coins -- where the value appears in game
	coins.Parent = leaderstats
	
end
return module

but i dont think you can do the same with a table like this right?