Datastore issues

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!

I want my datastore to work.

  1. What is the issue? Include screenshots / videos if possible!

It only saves some data and gives me the error: DataStore request was added to queue. If request queue fills, further requests will be dropped. Try sending fewer requests.Key = ___________

  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?

I read many articles about datastores and this error. I tried their solutions but with no progress.

After that, you should include more details if you have any. Try to make your topic as descriptive as possible, so that it’s easier for people to help you!

This is my code:

Server:

local datastore = game:GetService("DataStoreService"):GetDataStore("PlayerInvenDatastore1")




local materialsdef = {}
local meleedef = {}
local rangeddef = {}
local magicdef = {}
local questsdef = {}
local headdef = {}
local middledef = {}
local lowdef = {}
local moneydef = 0


for i=1, 150 do
	materialsdef["Slot"..tostring(i).."Name"] = ""
	materialsdef["Slot"..tostring(i).."Amount"] = 0
	questsdef["Slot"..tostring(i)] = ""
	questsdef["Slot"..tostring(i).."Identifier"] = 0
	questsdef["Slot"..tostring(i).."Rewards"] = ""
end

for i=1, 10 do
	meleedef["Slot"..tostring(i)] = ""
	rangeddef["Slot"..tostring(i)] = ""
	magicdef["Slot"..tostring(i)] = ""
	
end
magicdef["Mana"] = 50

for i=1, 3 do
	headdef["Slot"..tostring(i)] = ""
	middledef["Slot"..tostring(i)] = ""
	lowdef["Slot"..tostring(i)] = ""
end

local defaulttable = {}

defaulttable["Materials"] = materialsdef
defaulttable["Melee"] = meleedef
defaulttable["Ranged"] = rangeddef
defaulttable["Magic"] = magicdef
defaulttable["Quests"] = questsdef
defaulttable["Head"] = headdef
defaulttable["Middle"] = middledef
defaulttable["Low"] = lowdef
defaulttable["Money"] = moneydef









game.ReplicatedStorage.SaveInvenData.OnServerEvent:Connect(function(player, materials, melee, ranged, magic, quests, head, middle, low, money) 

	local id = game.PrivateServerId..player.UserId
	local singletable = {}
	
	singletable["Materials"] = materials
	singletable["Melee"] = melee
	singletable["Ranged"] = ranged
	singletable["Magic"] = magic
	singletable["Quests"] = quests
	singletable["Head"] = head
	singletable["Middle"] = middle
	singletable["Low"] = low
	singletable["Money"] = money
	

	
	datastore:SetAsync(id, singletable)

end)


game.ReplicatedStorage.GetInvenData.OnServerEvent:Connect(function(player: Player, ...: any) 
	local tabletoget = datastore:GetAsync(game.PrivateServerId..player.UserId)
	
	if tabletoget then
		print("Retrived data")
		game.ReplicatedStorage.GetInvenData:FireClient(player, tabletoget)
	else
		print("Making new data")
		game.ReplicatedStorage.GetInvenData:FireClient(player, defaulttable)
	end
	
	
end)




Client:

local plr = game.Players.LocalPlayer
local plrInven = Instance.new("Folder")
plrInven.Parent = plr
plrInven.Name = "PlayerInven"
--Material Slots
local materialinven = Instance.new("Folder", plrInven)
materialinven.Name = "Materials"
local numberofslots = 150
local materialdataslots = {}
for i=1, numberofslots do
	local current = Instance.new("StringValue", materialinven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	materialdataslots["Slot"..tostring(i)] = current
	local amount = Instance.new("IntValue", current)
	amount.Name = "Amount"
	
	
end



--Melee Slots
local meleeinven = Instance.new("Folder", plrInven)
meleeinven.Name = "Melee"
local numberofslots = 10
local meleedataslots = {}

for i=1, numberofslots do
	local current = Instance.new("StringValue", meleeinven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	meleedataslots["Slot"..tostring(i)] = current
end

--Head Armor Slots
local hArmorInven = Instance.new("Folder", plrInven)
hArmorInven.Name = "HeadArmor"
local numberofslots = 3
local harmordataslots = {}

for i=1, numberofslots do
	local current = Instance.new("StringValue", hArmorInven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	harmordataslots["Slot"..tostring(i)] = current
end

--Middle Armor Slots
local mArmorInven = Instance.new("Folder", plrInven)
mArmorInven.Name = "MiddleArmor"
local numberofslots = 3
local marmordataslots = {}

for i=1, numberofslots do
	local current = Instance.new("StringValue", mArmorInven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	marmordataslots["Slot"..tostring(i)] = current
end

--Legs Armor Slots
local lArmorInven = Instance.new("Folder", plrInven)
lArmorInven.Name = "LegArmor"
local numberofslots = 3
local larmordataslots = {}

for i=1, numberofslots do
	local current = Instance.new("StringValue", lArmorInven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	larmordataslots["Slot"..tostring(i)] = current
end




--Ranged Slots
local rangedinven = Instance.new("Folder", plrInven)
rangedinven.Name = "Ranged"
local numberofslots = 10
local rangeddataslots = {}

for i=1, numberofslots do
	local current = Instance.new("StringValue", rangedinven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	rangeddataslots["Slot"..tostring(i)] = current
end

arrows = Instance.new("StringValue", rangedinven)
arrows.Name = "Arrows"
amount = Instance.new("IntValue", arrows)
amount.Name = "Amount"
rangeddataslots["Arrows"] = arrows



--Magic Slots
local magicinven = Instance.new("Folder", plrInven)
magicinven.Name = "Magic"
local numberofslots = 10
local magicdataslots = {}

for i=1, numberofslots do
	local current = Instance.new("StringValue", magicinven)
	current.Name = "Slot"..tostring(i)
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	magicdataslots["Slot"..tostring(i)] = current
end
Mana = Instance.new("StringValue", magicinven)
Mana.Name = "Mana"
amount = Instance.new("IntValue", Mana)
amount.Name = "Amount"
magicdataslots["Mana"] = Mana



--Quest Slots
local completedquests = Instance.new("Folder", plrInven)
completedquests.Name = "Quests"
local questslots = {}
local numberofslots = 150

for i=1, numberofslots do
	
	currentslot = Instance.new("StringValue", completedquests)
	currentslot.Name = "Slot"..tostring(i)
	rewards = Instance.new("StringValue", currentslot)
	rewards.Name = "Rewards"
	identifier = Instance.new("NumberValue", currentslot)
	identifier.Name = "Slot"..tostring(i)
	questslots["Slot"..tostring(i)] = currentslot
end


local plrstats = Instance.new("Folder", plrInven)
plrstats.Name = "Stats"

local temperature = Instance.new("NumberValue", plrstats)
temperature.Name = "Temperature"

local stealth = Instance.new("NumberValue", plrstats)
stealth.Name = "Stealth"

local money = Instance.new("IntValue")
money.Name = "Money"
money.Parent = plrstats


function GetDataForAll()
	local materialdata = {}
	local meleedata = {}
	local rangeddata = {}
	local magicdata = {}
	local questdata = {}
	local headarmordata = {}
	local middlearmordata = {}
	local legarmordata = {}
	
	for i=1, 150 do
		local currentslot = materialdataslots["Slot"..tostring(i)]
		materialdata["Slot"..tostring(i).."Name"] = currentslot.Value
		materialdata["Slot"..tostring(i).."Amount"] = currentslot.Amount.Value
		
	end
	
	for i=1, 10 do
		local data = meleedataslots["Slot"..tostring(i)].Value
		meleedata["Slot"..tostring(i)] = data
	end --get melee
	
	for i=1, 10 do
		local data = rangeddataslots["Slot"..tostring(i)].Value
		rangeddata["Slot"..tostring(i)] = data
	end --get ranged
	
	for i=1, 10 do
		local data = magicdataslots["Slot"..tostring(i)].Value
		magicdata["Slot"..tostring(i)] = data
	end
	magicdata["Mana"] = magicdataslots["Mana"].Amount.Value --get magic
	
	for i=1, 150 do
		local data = questslots["Slot"..tostring(i)].Value
		questdata["Slot"..tostring(i)] = data
		questdata["Slot"..tostring(i).."Identifier"] = questslots["Slot"..tostring(i)]:FindFirstChild("Slot"..tostring(i)).Value
		questdata["Slot"..tostring(i).."Rewards"] = questslots["Slot"..tostring(i)].Rewards.Value
	end --get quests
	
	for i=1, 3 do
		local data = harmordataslots["Slot"..tostring(i)].Value
		headarmordata["Slot"..tostring(i)] = data
	end --get helmets
	
	for i=1, 3 do
		local data = marmordataslots["Slot"..tostring(i)].Value
		middlearmordata["Slot"..tostring(i)] = data
	end --get middle armor
	
	for i=1, 3 do
		local data = larmordataslots["Slot"..tostring(i)].Value
		legarmordata["Slot"..tostring(i)] = data
	end --
	

	

	return materialdata, meleedata, rangeddata, magicdata, questdata, headarmordata, middlearmordata, legarmordata, money.Value
	
end






function ApplySavedData()
	event = game.ReplicatedStorage.GetInvenData
	event:FireServer()
	event.OnClientEvent:Once(function(tabletoget)
		print("Appying")
		local materialsfrom = tabletoget["Materials"]
		local meleefrom = tabletoget["Melee"]
		local rangedfrom = tabletoget["Ranged"]
		local magicfrom = tabletoget["Magic"]
		local questsfrom = tabletoget["Quests"]
		local headfrom = tabletoget["Head"]
		local middlefrom = tabletoget["Middle"]
		local lowfrom = tabletoget["Low"]
		local moneyfrom = tabletoget["Money"]
		
		money.Value = moneyfrom
		Mana.Amount.Value = tabletoget["Magic"]["Mana"]
		
		for i=1, 150 do
			local materialslot = materialdataslots["Slot"..tostring(i)]
			materialslot.Value = materialsfrom["Slot"..tostring(i).."Name"]
			materialslot.Amount.Value = materialsfrom["Slot"..tostring(i).."Amount"]
			
			local questslot = questslots["Slot"..tostring(i)]
			questslot.Value = questsfrom["Slot"..tostring(i)]
			questslot:FindFirstChild("Slot"..tostring(i)).Value = questsfrom["Slot"..tostring(i).."Identifier"]
			questslot:WaitForChild("Rewards").Value = questsfrom["Slot"..tostring(i).."Rewards"]
		end
		
		for i=1, 10 do
			local meleeslot = meleedataslots["Slot"..tostring(i)]
			meleeslot.Value = meleefrom["Slot"..tostring(i)]
			
			local rangedslot = rangeddataslots["Slot"..tostring(i)]
			rangedslot.Value = rangedfrom["Slot"..tostring(i)]
			
			local magicslot = magicdataslots["Slot"..tostring(i)]
			magicslot.Value = rangedfrom["Slot"..tostring(i)]

			
		end
		
		for i=1, 3 do
			local headarmorslot = harmordataslots["Slot"..tostring(i)]
			headarmorslot.Value = headfrom["Slot"..tostring(i)]
			
			local middle = marmordataslots["Slot"..tostring(i)]
			headarmorslot.Value = middlefrom["Slot"..tostring(i)]
			
			local legarmorslot = larmordataslots["Slot"..tostring(i)]
			legarmorslot.Value = lowfrom["Slot"..tostring(i)]
		end
		
		
	end)
	
end






ApplySavedData()



money:GetPropertyChangedSignal("Value"):Connect(function() 
	game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
end)

Mana:GetPropertyChangedSignal("Value"):Connect(function() 
	game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
end)

arrows:GetPropertyChangedSignal("Value"):Connect(function() 
	game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
end)

for i=1, 150 do
	local currentmaterialslot = materialdataslots["Slot"..tostring(i)]
	local currentmaterialslotamount = currentmaterialslot.Amount

	local currentquestslot = questslots["Slot"..tostring(i)]
	local currentquestidentifier = currentquestslot:WaitForChild("Slot"..tostring(i))
	local currentquestrewards = currentquestslot.Rewards



	currentquestslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentquestidentifier:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentquestrewards:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentmaterialslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentmaterialslotamount:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

end


for i=1, 10 do
	local currentmeleeslot = meleedataslots["Slot"..tostring(i)]

	local currentrangedslot = rangeddataslots["Slot"..tostring(i)]

	local currentmagicslot = magicdataslots["Slot"..tostring(i)]

	currentmagicslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentrangedslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentmeleeslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

end

for i=1, 3 do
	local currentheadarmorslot = harmordataslots["Slot"..tostring(i)]

	local currentmiddlearmorslot = marmordataslots["Slot"..tostring(i)]

	local currentlegarmorslots = larmordataslots["Slot"..tostring(i)]

	currentheadarmorslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentlegarmorslots:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)

	currentmiddlearmorslot:GetPropertyChangedSignal("Value"):Connect(function() 
		game.ReplicatedStorage.SaveInvenData:FireServer(GetDataForAll())
	end)
end

Hoping Someone can tell me what’s wrong!

1 Like

I’m seeing about seven errors here and possibly nine… Has this ever worked?
A bit too much to post here. You can PM me if you want to go through them.
This will need some re-wrighting and a change in how it’s being done…

1 Like

Hello! Could you try these scripts?

Server:

-- Server Script

-- Get the DataStoreService and create a DataStore
local DataStoreService = game:GetService("DataStoreService")
local datastore = DataStoreService:GetDataStore("PlayerInvenDatastore1")

-- Define default data for various inventories
local materialsdef = {}
local meleedef = {}
local rangeddef = {}
local magicdef = {}
local questsdef = {}
local headdef = {}
local middledef = {}
local lowdef = {}
local moneydef = 0

-- Initialize default materials and quests data
for i = 1, 150 do
    materialsdef["Slot" .. tostring(i) .. "Name"] = ""
    materialsdef["Slot" .. tostring(i) .. "Amount"] = 0
    questsdef["Slot" .. tostring(i)] = ""
    questsdef["Slot" .. tostring(i) .. "Identifier"] = 0
    questsdef["Slot" .. tostring(i) .. "Rewards"] = ""
end

-- Initialize default melee, ranged, and magic data
for i = 1, 10 do
    meleedef["Slot" .. tostring(i)] = ""
    rangeddef["Slot" .. tostring(i)] = ""
    magicdef["Slot" .. tostring(i)] = ""
end
magicdef["Mana"] = 50

-- Initialize default armor data
for i = 1, 3 do
    headdef["Slot" .. tostring(i)] = ""
    middledef["Slot" .. tostring(i)] = ""
    lowdef["Slot" .. tostring(i)] = ""
end

-- Combine all default data into one table
local defaulttable = {}
defaulttable["Materials"] = materialsdef
defaulttable["Melee"] = meleedef
defaulttable["Ranged"] = rangeddef
defaulttable["Magic"] = magicdef
defaulttable["Quests"] = questsdef
defaulttable["Head"] = headdef
defaulttable["Middle"] = middledef
defaulttable["Low"] = lowdef
defaulttable["Money"] = moneydef

-- Handle saving inventory data from client
game.ReplicatedStorage.SaveInvenData.OnServerEvent:Connect(function(player, materials, melee, ranged, magic, quests, head, middle, low, money) 
    local id = game.PrivateServerId .. player.UserId
    local singletable = {}
    singletable["Materials"] = materials
    singletable["Melee"] = melee
    singletable["Ranged"] = ranged
    singletable["Magic"] = magic
    singletable["Quests"] = quests
    singletable["Head"] = head
    singletable["Middle"] = middle
    singletable["Low"] = low
    singletable["Money"] = money

    -- Save data with error handling
    local success, err = pcall(function()
        datastore:SetAsync(id, singletable)
    end)
    if not success then
        warn("Failed to save data for player " .. player.Name .. ": " .. err)
    end
end)

-- Handle loading inventory data to client
game.ReplicatedStorage.GetInvenData.OnServerEvent:Connect(function(player)
    local id = game.PrivateServerId .. player.UserId
    local success, data = pcall(function()
        return datastore:GetAsync(id)
    end)

    if success then
        if data then
            print("Retrieved data for player " .. player.Name)
            game.ReplicatedStorage.GetInvenData:FireClient(player, data)
        else
            print("No data found for player " .. player.Name .. ", sending default data")
            game.ReplicatedStorage.GetInvenData:FireClient(player, defaulttable)
        end
    else
        warn("Failed to retrieve data for player " .. player.Name .. ": " .. data)
        -- Optionally, send default data in case of error
        game.ReplicatedStorage.GetInvenData:FireClient(player, defaulttable)
    end
end)

Client:

-- Client Script

-- Get the local player
local plr = game.Players.LocalPlayer

-- Create a folder to store player inventory data
local plrInven = Instance.new("Folder")
plrInven.Name = "PlayerInven"
plrInven.Parent = plr

-- Material Slots
local materialinven = Instance.new("Folder", plrInven)
materialinven.Name = "Materials"
local numberofMaterialSlots = 150
local materialdataslots = {}

for i = 1, numberofMaterialSlots do
    local currentSlot = Instance.new("StringValue", materialinven)
    currentSlot.Name = "Slot" .. tostring(i)
    materialdataslots["Slot" .. tostring(i)] = currentSlot

    local amount = Instance.new("IntValue", currentSlot)
    amount.Name = "Amount"
end

-- Melee Slots
local meleeinven = Instance.new("Folder", plrInven)
meleeinven.Name = "Melee"
local numberofMeleeSlots = 10
local meleedataslots = {}

for i = 1, numberofMeleeSlots do
    local currentSlot = Instance.new("StringValue", meleeinven)
    currentSlot.Name = "Slot" .. tostring(i)
    meleedataslots["Slot" .. tostring(i)] = currentSlot
end

-- Head Armor Slots
local hArmorInven = Instance.new("Folder", plrInven)
hArmorInven.Name = "HeadArmor"
local numberofHeadArmorSlots = 3
local harmordataslots = {}

for i = 1, numberofHeadArmorSlots do
    local currentSlot = Instance.new("StringValue", hArmorInven)
    currentSlot.Name = "Slot" .. tostring(i)
    harmordataslots["Slot" .. tostring(i)] = currentSlot
end

-- Middle Armor Slots
local mArmorInven = Instance.new("Folder", plrInven)
mArmorInven.Name = "MiddleArmor"
local numberofMiddleArmorSlots = 3
local marmordataslots = {}

for i = 1, numberofMiddleArmorSlots do
    local currentSlot = Instance.new("StringValue", mArmorInven)
    currentSlot.Name = "Slot" .. tostring(i)
    marmordataslots["Slot" .. tostring(i)] = currentSlot
end

-- Leg Armor Slots
local lArmorInven = Instance.new("Folder", plrInven)
lArmorInven.Name = "LegArmor"
local numberofLegArmorSlots = 3
local larmordataslots = {}

for i = 1, numberofLegArmorSlots do
    local currentSlot = Instance.new("StringValue", lArmorInven)
    currentSlot.Name = "Slot" .. tostring(i)
    larmordataslots["Slot" .. tostring(i)] = currentSlot
end

-- Ranged Slots
local rangedinven = Instance.new("Folder", plrInven)
rangedinven.Name = "Ranged"
local numberofRangedSlots = 10
local rangeddataslots = {}

for i = 1, numberofRangedSlots do
    local currentSlot = Instance.new("StringValue", rangedinven)
    currentSlot.Name = "Slot" .. tostring(i)
    rangeddataslots["Slot" .. tostring(i)] = currentSlot
end

-- Arrows
local arrows = Instance.new("StringValue", rangedinven)
arrows.Name = "Arrows"
local arrowAmount = Instance.new("IntValue", arrows)
arrowAmount.Name = "Amount"
rangeddataslots["Arrows"] = arrows

-- Magic Slots
local magicinven = Instance.new("Folder", plrInven)
magicinven.Name = "Magic"
local numberofMagicSlots = 10
local magicdataslots = {}

for i = 1, numberofMagicSlots do
    local currentSlot = Instance.new("StringValue", magicinven)
    currentSlot.Name = "Slot" .. tostring(i)
    magicdataslots["Slot" .. tostring(i)] = currentSlot
end

-- Mana
local Mana = Instance.new("StringValue", magicinven)
Mana.Name = "Mana"
local manaAmount = Instance.new("IntValue", Mana)
manaAmount.Name = "Amount"
magicdataslots["Mana"] = Mana

-- Quest Slots
local completedquests = Instance.new("Folder", plrInven)
completedquests.Name = "Quests"
local questslots = {}
local numberofQuestSlots = 150

for i = 1, numberofQuestSlots do
    local currentSlot = Instance.new("StringValue", completedquests)
    currentSlot.Name = "Slot" .. tostring(i)
    questslots["Slot" .. tostring(i)] = currentSlot

    local rewards = Instance.new("StringValue", currentSlot)
    rewards.Name = "Rewards"

    local identifier = Instance.new("NumberValue", currentSlot)
    identifier.Name = "Identifier"
end

-- Player Stats
local plrstats = Instance.new("Folder", plrInven)
plrstats.Name = "Stats"

local temperature = Instance.new("NumberValue", plrstats)
temperature.Name = "Temperature"

local stealth = Instance.new("NumberValue", plrstats)
stealth.Name = "Stealth"

local money = Instance.new("IntValue", plrstats)
money.Name = "Money"

-- Function to get data for all inventories
function GetDataForAll()
    local materialdata = {}
    local meleedata = {}
    local rangeddata = {}
    local magicdata = {}
    local questdata = {}
    local headarmordata = {}
    local middlearmordata = {}
    local legarmordata = {}

    -- Get materials data
    for i = 1, numberofMaterialSlots do
        local currentSlot = materialdataslots["Slot" .. tostring(i)]
        materialdata["Slot" .. tostring(i) .. "Name"] = currentSlot.Value
        local amount = currentSlot:FindFirstChild("Amount")
        if amount then
            materialdata["Slot" .. tostring(i) .. "Amount"] = amount.Value
        else
            materialdata["Slot" .. tostring(i) .. "Amount"] = 0
        end
    end

    -- Get melee data
    for i = 1, numberofMeleeSlots do
        local data = meleedataslots["Slot" .. tostring(i)].Value
        meleedata["Slot" .. tostring(i)] = data
    end

    -- Get ranged data
    for i = 1, numberofRangedSlots do
        local data = rangeddataslots["Slot" .. tostring(i)].Value
        rangeddata["Slot" .. tostring(i)] = data
    end

    -- Get magic data
    for i = 1, numberofMagicSlots do
        local data = magicdataslots["Slot" .. tostring(i)].Value
        magicdata["Slot" .. tostring(i)] = data
    end
    magicdata["Mana"] = manaAmount.Value

    -- Get quest data
    for i = 1, numberofQuestSlots do
        local currentSlot = questslots["Slot" .. tostring(i)]
        questdata["Slot" .. tostring(i)] = currentSlot.Value

        local identifier = currentSlot:FindFirstChild("Identifier")
        if identifier then
            questdata["Slot" .. tostring(i) .. "Identifier"] = identifier.Value
        else
            questdata["Slot" .. tostring(i) .. "Identifier"] = 0
        end

        local rewards = currentSlot:FindFirstChild("Rewards")
        if rewards then
            questdata["Slot" .. tostring(i) .. "Rewards"] = rewards.Value
        else
            questdata["Slot" .. tostring(i) .. "Rewards"] = ""
        end
    end

    -- Get head armor data
    for i = 1, numberofHeadArmorSlots do
        local data = harmordataslots["Slot" .. tostring(i)].Value
        headarmordata["Slot" .. tostring(i)] = data
    end

    -- Get middle armor data
    for i = 1, numberofMiddleArmorSlots do
        local data = marmordataslots["Slot" .. tostring(i)].Value
        middlearmordata["Slot" .. tostring(i)] = data
    end

    -- Get leg armor data
    for i = 1, numberofLegArmorSlots do
        local data = larmordataslots["Slot" .. tostring(i)].Value
        legarmordata["Slot" .. tostring(i)] = data
    end

    return materialdata, meleedata, rangeddata, magicdata, questdata, headarmordata, middlearmordata, legarmordata, money.Value
end

-- Function to apply saved data from server
function ApplySavedData()
    local event = game.ReplicatedStorage.GetInvenData
    event:FireServer()
    event.OnClientEvent:Connect(function(tabletoget)
        print("Applying saved data")

        local materialsfrom = tabletoget["Materials"]
        local meleefrom = tabletoget["Melee"]
        local rangedfrom = tabletoget["Ranged"]
        local magicfrom = tabletoget["Magic"]
        local questsfrom = tabletoget["Quests"]
        local headfrom = tabletoget["Head"]
        local middlefrom = tabletoget["Middle"]
        local lowfrom = tabletoget["Low"]
        local moneyfrom = tabletoget["Money"]

        -- Apply money
        money.Value = moneyfrom

        -- Apply mana
        manaAmount.Value = magicfrom["Mana"]

        -- Apply materials data
        for i = 1, numberofMaterialSlots do
            local materialSlot = materialdataslots["Slot" .. tostring(i)]
            materialSlot.Value = materialsfrom["Slot" .. tostring(i) .. "Name"]
            local amount = materialSlot:FindFirstChild("Amount")
            if amount then
                amount.Value = materialsfrom["Slot" .. tostring(i) .. "Amount"]
            end
        end

        -- Apply melee data
        for i = 1, numberofMeleeSlots do
            local meleeSlot = meleedataslots["Slot" .. tostring(i)]
            meleeSlot.Value = meleefrom["Slot" .. tostring(i)]
        end

        -- Apply ranged data
        for i = 1, numberofRangedSlots do
            local rangedSlot = rangeddataslots["Slot" .. tostring(i)]
            rangedSlot.Value = rangedfrom["Slot" .. tostring(i)]
        end

        -- Apply magic data
        for i = 1, numberofMagicSlots do
            local magicSlot = magicdataslots["Slot" .. tostring(i)]
            magicSlot.Value = magicfrom["Slot" .. tostring(i)]
        end

        -- Apply quest data
        for i = 1, numberofQuestSlots do
            local questSlot = questslots["Slot" .. tostring(i)]
            questSlot.Value = questsfrom["Slot" .. tostring(i)]

            local identifier = questSlot:FindFirstChild("Identifier")
            if identifier then
                identifier.Value = questsfrom["Slot" .. tostring(i) .. "Identifier"]
            end

            local rewards = questSlot:FindFirstChild("Rewards")
            if rewards then
                rewards.Value = questsfrom["Slot" .. tostring(i) .. "Rewards"]
            end
        end

        -- Apply head armor data
        for i = 1, numberofHeadArmorSlots do
            local headArmorSlot = harmordataslots["Slot" .. tostring(i)]
            headArmorSlot.Value = headfrom["Slot" .. tostring(i)]
        end

        -- Apply middle armor data
        for i = 1, numberofMiddleArmorSlots do
            local middleArmorSlot = marmordataslots["Slot" .. tostring(i)]
            middleArmorSlot.Value = middlefrom["Slot" .. tostring(i)]
        end

        -- Apply leg armor data
        for i = 1, numberofLegArmorSlots do
            local legArmorSlot = larmordataslots["Slot" .. tostring(i)]
            legArmorSlot.Value = lowfrom["Slot" .. tostring(i)]
        end
    end)
end

-- Apply saved data on start
ApplySavedData()

-- Function to save data when properties change
local function onValueChanged()
    local materialdata, meleedata, rangeddata, magicdata, questdata, headarmordata, middlearmordata, legarmordata, moneyValue = GetDataForAll()
    game.ReplicatedStorage.SaveInvenData:FireServer(materialdata, meleedata, rangeddata, magicdata, questdata, headarmordata, middlearmordata, legarmordata, moneyValue)
end

-- Connect value changed events to save data
money:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
manaAmount:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
arrowAmount:GetPropertyChangedSignal("Value"):Connect(onValueChanged)

-- For materials
for i = 1, numberofMaterialSlots do
    local currentMaterialSlot = materialdataslots["Slot" .. tostring(i)]
    local amount = currentMaterialSlot:FindFirstChild("Amount")
    if amount then
        amount:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
    end
    currentMaterialSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

-- For quests
for i = 1, numberofQuestSlots do
    local currentQuestSlot = questslots["Slot" .. tostring(i)]
    currentQuestSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)

    local identifier = currentQuestSlot:FindFirstChild("Identifier")
    if identifier then
        identifier:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
    end

    local rewards = currentQuestSlot:FindFirstChild("Rewards")
    if rewards then
        rewards:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
    end
end

-- For melee slots
for i = 1, numberofMeleeSlots do
    local currentMeleeSlot = meleedataslots["Slot" .. tostring(i)]
    currentMeleeSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

-- For ranged slots
for i = 1, numberofRangedSlots do
    local currentRangedSlot = rangeddataslots["Slot" .. tostring(i)]
    currentRangedSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

-- For magic slots
for i = 1, numberofMagicSlots do
    local currentMagicSlot = magicdataslots["Slot" .. tostring(i)]
    currentMagicSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

-- For head armor slots
for i = 1, numberofHeadArmorSlots do
    local currentHeadArmorSlot = harmordataslots["Slot" .. tostring(i)]
    currentHeadArmorSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

-- For middle armor slots
for i = 1, numberofMiddleArmorSlots do
    local currentMiddleArmorSlot = marmordataslots["Slot" .. tostring(i)]
    currentMiddleArmorSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

-- For leg armor slots
for i = 1, numberofLegArmorSlots do
    local currentLegArmorSlot = larmordataslots["Slot" .. tostring(i)]
    currentLegArmorSlot:GetPropertyChangedSignal("Value"):Connect(onValueChanged)
end

1 Like

Thanks! I’ll try these and get back to you about their success.

1 Like

Yes so it has worked. The problem is that its only saving some data. I believe this is because I get a warning about to many requests and future requests being dropped. If it helps, you can re-create my situation by pasting the server code into serverscriptservice and the client code into a local script under starterplayerscripts. Thanks! Note: this is a reply to the first reply to my topic.

1 Like

You’re attempting to save the data every time a property changes. This will very likely overload the datastore limits. Why don’t you just load once when the player joins, and save once when they exit? Maybe with another server-side timed loop that saves all player’s data once every few minutes?

Rather than pulling from the datastore every time you request data from the server, store the data in a table in the server script and just pull/update from/to that?

1 Like

That was one of the possible issues.

1 Like

Update. The script provided by @rocketman392 worked and helped me find the solution. In the end, (even though I tried to avoid the issue) it turns out that whenever it loads the data, it re-saves it for every property, resulting in overloading the datastore service. I would like to thank everyone that contributed to this topic as well for taking your time to help fix my issue! :slight_smile: :+1:

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.