Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Why is the datastore telling me to send fewer requests?

these are my data store scripts: Leaderstats:

game.StarterGui.ResetPlayerGuiOnSpawn = false
local DataStoreService = game:GetService("DataStoreService")

local playerData = DataStoreService:GetDataStore("PlayerData")

game.Players.PlayerAdded:connect(function(Player)
	local leaderstats = Instance.new("Folder", Player)
	leaderstats.Name = "leaderstats"

	local val1 = Instance.new("StringValue",Player)
	val1.Name = 'GotPet'
	val1.Value = ''

	local val2 = Instance.new("StringValue",Player)
	val2.Name = 'OpenValue'
	val2.Value = ''

	local Gems = Instance.new("IntValue", leaderstats)
	Gems.Name = "Gems"
	Gems.Value = 0

	local Rebirths = Instance.new("IntValue", leaderstats)
	Rebirths.Name = "Rebirths"
	Rebirths.Value = 0

	local Coins = Instance.new("IntValue", leaderstats)
	Coins.Name = "Coins"
	Coins.Value = 0

	local playerUserId = "Player_" .. Player.UserId  --Gets player ID

	local Success, Result = pcall(function()
		return playerData:GetAsync(playerUserId)
	end)

	if Result then
		print("Data found!")

		Coins.Value = Result[1] -- // Since in the saving part, Coins are the one that is set as the first value of the table, we set Coins as [1]
		Rebirths.Value = Result[2]
		Gems.Value = Result[3]
	else
		print("DataStore working but No data found")
		warn(Result)
	end

end)

local function onPlayerExit(player)  --Runs when players exit



	local success, Err = pcall(function()
		print("Data Saved successfully")

		local playerUserId = "Player_" .. player.UserId

		playerData:SetAsync(playerUserId, {player.leaderstats.Coins.Value, player.leaderstats.Rebirths.Value, player.leaderstats.Gems.Value}) -- Now set as a table instead of individually

	end)



	if not success then
		warn(Err)
		warn('Could not save data!')
	end
end

game.Players.PlayerRemoving:Connect(onPlayerExit)

here is the Pet datastore:

local Players = game:GetService("Players")
local DS = game:GetService("DataStoreService"):GetDataStore("PetsSave")
local SaveOnChange = true
local Cooldown = 0 

local function Thread(f) 
	coroutine.resume(coroutine.create(f))
end

local Array = {
	["Stats"] = {
	},
	["PlayerValues"] = { 
	},
	["Pets"] = {
		['CurrentPet'] = '',
		["Orange puppy"] = 'unowned',
		["Dequinious"] = 'unowned',
		["Gerreard"] = 'unowned',
		["Amazing Pet"] = 'unowned',
		["Uncommon Pet"] = 'unowned',
		["Rare Pet"] = 'unowned',
		["Unobtainable Pet"] = 'unowned',
		["Lollie"] = 'unowned',
		["Dog"] = 'unowned',
		["Panda"] = 'unowned',
		["Bunny"] = 'unowned',
		["Cat"] = 'owned',
	}	
}

Players.PlayerAdded:connect(function(plr)
	for i,v in pairs(Array.PlayerValues) do 
		local x
		if type(v) == "number" then 
			x = Instance.new("NumberValue", plr) 
			x.Name = tostring(i) 
			x.Value = v 
			
		elseif type(v)=="string" then 
			x=Instance.new("StringValue",plr) 
			x.Name=tostring(i) 
			x.Value=v
			
		elseif type(v)=="boolean" then 
			x=Instance.new("BoolValue",plr) 
			x.Name=tostring(i) x.Value=v 
			
		end
	end
	local ID = plr.userId
	if DS:GetAsync("User_"..tostring(ID)) == nil then 
		print("Player "..plr.Name.."("..tostring(ID)..") has no data file, creating a new data file.")
		local NewData=DS:SetAsync("User_"..tostring(ID),Array) 
	end
	local Data = DS:GetAsync("User_"..tostring(ID)) 
	repeat wait() until Data ~= nil 
	print("User_"..tostring(ID).." Data Loading...")
	--Create leaderstats
	local Stats = Instance.new("IntValue",plr) 
	Stats.Name = "leaderstats" 
	--Create Pets
	local Pets = Instance.new("Configuration",plr) 
	Pets.Name = "Pets"
	Thread(function()
		for i,v in pairs(Array.Stats) do
			local x
			if type(v) == "number" then
				x = Instance.new("NumberValue",Stats) 
				x.Name = tostring(i)
				x.Value = Data.Stats[i] or v
				
			elseif type(v) == "string" then
				x = Instance.new("StringValue",Stats) 
				x.Name = tostring(i) 
				x.Value = Data.Stats[i] or v 
				
			elseif type(v) == "boolean" then 
				x = Instance.new("BoolValue",Stats) 
				x.Name = tostring(i) 
				x.Value = Data.Stats[i] or v 
				
			end
			if x == nil or x["Value"] == nil or SaveOnChange == false then
				return
			end
			local Deb = false
			x.Changed:connect(function(val)
					Deb=true
					local NewArray = {["Stats"]={};["Pets"]={}} 
					Thread(function() 
						for i,v in pairs(plr:WaitForChild("leaderstats"):GetChildren()) do 
							NewArray.Stats[v.Name] = v.Value 
						end 
					end)
					for i,v in pairs(plr:WaitForChild("Pets"):GetChildren()) do 
						NewArray.Pets[v.Name]=v.Value 
					end
					DS:UpdateAsync("User_"..tostring(ID), function(OldVal) 
						local NewVal=NewArray or OldVal 
						return NewVal 
					end) 
					wait(Cooldown) 
					Deb=false
			end)	
		end
	end)
	for i,v in pairs(Array.Pets) do 
		local x
		if type(v) == "number" then 
			x = Instance.new("NumberValue", Pets) 
			x.Name = tostring(i) 
			x.Value = Data.Pets[i] or v 
			
		elseif type(v)=="string" then 
			x=Instance.new("StringValue",Pets) 
			x.Name=tostring(i) 
			x.Value=Data.Pets[i] or v
			
		elseif type(v)=="boolean" then 
			x=Instance.new("BoolValue",Pets) 
			x.Name=tostring(i) x.Value=Data.Pets[i] or v 
			
		end
		if x==nil or x["Value"]==nil or SaveOnChange==false then 
			return 
		end
		local Deb=false 
		x.Changed:connect(function(val) 
				Deb=true
				local NewArray={["Stats"]={};["Pets"]={}} 
				Thread(function() 
					for i,v in pairs(plr:WaitForChild("leaderstats"):GetChildren()) do 
						NewArray.Stats[v.Name] = v.Value 
					end 
				end)
				for i,v in pairs(plr:WaitForChild("Pets"):GetChildren()) do 
					NewArray.Pets[v.Name]=v.Value 
				end
				DS:UpdateAsync("User_"..tostring(ID),function(OldVal) 
					local NewVal = NewArray or OldVal 
					return NewVal 
				end) 
				wait(Cooldown) 
				Deb=false 
		end) 
	end 
	print(plr.Name.."("..tostring(ID)..")'s Data is ready.") 
end)

Players.PlayerRemoving:connect(function(plr) 
	local ID=plr.userId
	local Data=DS:GetAsync("User_"..tostring(ID)) 
	if Data==nil then 
		return 
	end 
	local NewArray={["Stats"]={};["Pets"]={}}
	Thread(function() 
		for i,v in pairs(plr:WaitForChild("leaderstats"):GetChildren()) do 
			NewArray.Stats[v.Name]=v.Value 
		end 
	end)
	for i,v in pairs(plr:WaitForChild("Pets"):GetChildren()) do 
		NewArray.Pets[v.Name]=v.Value 
	end
	DS:UpdateAsync("User_"..tostring(ID), function(OldVal) 
		local NewVal = NewArray or OldVal 
		return NewVal 
	end) 
end) 

local function SaveAll()
	for _,v in ipairs(Players:GetPlayers()) do
		Thread(function()
				local ID = v.userId
				local Data = DS:GetAsync("User_"..tostring(ID))
				if Data ~= nil then
					local NewArray = {["Stats"] = {}; ["Pets"] = {}}
					Thread(function()
						for _,v2 in pairs(v:WaitForChild("leaderstats"):GetChildren()) do
							NewArray.Stats[v2.Name] = v2.Value 
						end
					end)
					for _,v2 in pairs(v:WaitForChild("Pets"):GetChildren()) do
						NewArray.Pets[v2.Name] = v2.Value 
					end
					DS:UpdateAsync("User_"..tostring(ID), function(OldVal)
						local NewVal=NewArray or OldVal
						return NewVal
					end)
				
			end
		end)
	end
end

game:BindToClose(function() 
	SaveAll() 
end)

1 answer

This discussion is preserved as it was. New answers, comments, and votes are closed.