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

DataStore saving in studio but not in the actual game. Why?

So, I've made a shop in my simulator game and it works, you can purchase and equip your items, you know, everything essential to a shop. And it works 100% of the time in studio, but when I test it in the game it's basically a coin-flip, it works 50% of the time and the other 50% it chooses not to. Please help me, I've tried multiple things for over 2 days now and nothing works. Here's my DataStore:

local DatastoreService = game:GetService("DataStoreService") local Datastore = DatastoreService:GetDataStore("TrainingSimulatorDatastore8") local mps = game:GetService("MarketplaceService") local id = 11893526

function loadData(player)

local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player

local codesFolder = Instance.new("Folder")
codesFolder.Name = "CodesFolder"
codesFolder.Parent = player

local miscStats = Instance.new("Folder")
miscStats.Name = "MiscStats"
miscStats.Parent = player

local fistPowersFolder = Instance.new("Folder")
fistPowersFolder.Name = "FistPowers"
fistPowersFolder.Parent = player

local dnasFolder = Instance.new("Folder")
dnasFolder.Name = "DnasFolder"
dnasFolder.Parent = player

local folder = Instance.new("Folder")
folder.Name = player.Name
folder.Parent = game.ServerStorage:WaitForChild("RemoteData")

local debounce = Instance.new("BoolValue")
debounce.Name = "Debounce"
debounce.Parent = folder

local coins = Instance.new("NumberValue")
coins.Name = "Coins"
coins.Parent = leaderstats

local fistPower = Instance.new("NumberValue")
fistPower.Name = "FistPower"
fistPower.Parent = miscStats

local diamonds = Instance.new("NumberValue")
diamonds.Name = "Diamonds"
diamonds.Parent = leaderstats

local rank = Instance.new("StringValue")
rank.Name = "Rank"
rank.Parent = leaderstats

local rankMultiplier = Instance.new("NumberValue")
rankMultiplier.Name = "RankMultiplier"
rankMultiplier.Parent = rank

local strength = Instance.new("NumberValue")
strength.Name = "Strength"
strength.Parent = miscStats

local dnaAmount = Instance.new("NumberValue")
dnaAmount.Name = "Dna"
dnaAmount.Parent = miscStats

local coinData,strengthData,dnaData,rankData,rankMultiplierData,diamondData,fistPowerData,codeData,fistPowersData,dnasData,isEquippedFistPowerData,isEquippedDnaData

local success,errorMsg = pcall(function()
	
	coinData = Datastore:GetAsync("coinData-"..player.UserId)
	strengthData = Datastore:GetAsync("strengthData-"..player.UserId)
	dnaData = Datastore:GetAsync("dnaData-"..player.UserId)
	rankData = Datastore:GetAsync("rankData-"..player.UserId)
	rankMultiplierData = Datastore:GetAsync("rankMultiplierData-"..player.UserId)
	diamondData = Datastore:GetAsync("diamondData-"..player.UserId)
	fistPowerData = Datastore:GetAsync("fistPowerData-"..player.UserId)
	codeData = Datastore:GetAsync("codeData-"..player.UserId)
	fistPowersData = Datastore:GetAsync("fistPowersData-"..player.UserId)
	dnasData = Datastore:GetAsync("dnasData-"..player.UserId)
	isEquippedDnaData = Datastore:GetAsync("isEquippedDnaData-"..player.UserId)
	isEquippedFistPowerData = Datastore:GetAsync("isEquippedFistPowerData-"..player.UserId)
end)

if success then
	
	if strengthData then
		strength.Value = strengthData
		coins.Value = coinData
		dnaAmount.Value = dnaData
		rank.Value = rankData
		rankMultiplier.Value = rankMultiplierData
		diamonds.Value = diamondData
		fistPower.Value = fistPowerData
	else
		fistPower.Value = 1
		dnaAmount.Value = 50
		rank.Value = "Noob"
		
		local firstFistPower = Instance.new("StringValue")
		firstFistPower.Name = "FistPower1"
		firstFistPower.Parent = player.FistPowers
		
		local isEquipped = Instance.new("BoolValue")
		isEquipped.Name = "IsEquipped"
		isEquipped.Parent = firstFistPower
		isEquipped.Value = true
		
		local firstDna = Instance.new("StringValue")
		firstDna.Name = "Dna1"
		firstDna.Parent = player.DnasFolder
		
		local isEquippedDna = Instance.new("BoolValue")
		isEquippedDna.Name = "IsEquipped"
		isEquippedDna.Parent = firstDna
		isEquippedDna.Value = true
	end
	
	if codeData then
		
		for x = 1,#codeData do
			
			local newCode = Instance.new("StringValue")
			newCode.Name = "Code"..x
			newCode.Parent = player.CodesFolder
		end
	end
	
	if fistPowersData then
		
		for x = 1,#fistPowersData do
			
			local newFistPower = Instance.new("StringValue")
			newFistPower.Name = "FistPower"..x
			newFistPower.Parent = player.FistPowers
			
			local isEquipped = Instance.new("BoolValue")
			isEquipped.Name = "IsEquipped"
			isEquipped.Parent = newFistPower
			isEquipped.Value = isEquippedFistPowerData[x]
			
			wait()
		end
	end
	
	if dnasData then
		
		for x = 1,#dnasData do
			
			local newDna = Instance.new("StringValue")
			newDna.Name = "Dna"..x
			newDna.Parent = player.DnasFolder
			
			local isEquipped = Instance.new("BoolValue")
			isEquipped.Name = "IsEquipped"
			isEquipped.Parent = newDna
			isEquipped.Value = isEquippedDnaData[x]
		end
	end
	
else
	print("Something went wrong whilst giving "..player.Name.." their data!")
end	

end

function saveData(player)

local usedCodes = {}
local isEquippedFistPowers = {}
local fistPowers = {}
local dnas = {}
local isEquippedDnas = {}

for _,code in pairs(player.CodesFolder:GetChildren()) do
	
	table.insert(usedCodes,code.Name)
	wait()
end

for _,fistPower in pairs(player.FistPowers:GetChildren()) do
	table.insert(fistPowers,fistPower.Name)
	table.insert(isEquippedFistPowers,fistPower.IsEquipped.Value)
	
	wait()
end

for _,DNA in pairs(player.DnasFolder:GetChildren()) do
	table.insert(dnas,DNA.Name)
	table.insert(isEquippedDnas,DNA.IsEquipped.Value)
	
	wait()
end


local success,errorMsg = pcall(function()
	
	Datastore:SetAsync("coinData-"..player.UserId,player.leaderstats.Coins.Value)
	Datastore:SetAsync("strengthData-"..player.UserId,player.MiscStats.Strength.Value)
	Datastore:SetAsync("dnaData-"..player.UserId,player.MiscStats.Dna.Value)
	Datastore:SetAsync("rankData-"..player.UserId,player.leaderstats.Rank.Value)
	Datastore:SetAsync("rankMultiplierData-"..player.UserId,player.leaderstats.Rank.RankMultiplier.Value)
	Datastore:SetAsync("diamondData-"..player.UserId,player.leaderstats.Diamonds.Value)
	Datastore:SetAsync("fistPowerData-"..player.UserId,player.MiscStats.FistPower.Value)
	Datastore:SetAsync("codeData-"..player.UserId,usedCodes)
	Datastore:SetAsync("fistPowersData-"..player.UserId,fistPowers)
	Datastore:SetAsync("dnasData-"..player.UserId,dnas)
	Datastore:SetAsync("isEquippedDnaData-"..player.UserId,isEquippedDnas)
	Datastore:SetAsync("isEquippedFistPowerData-"..player.UserId,isEquippedFistPowers)
end)

end

game.Players.PlayerAdded:Connect(function(player)

loadData(player)

end)

game.ReplicatedStorage.RemoteEvents.MiscEvents.CodeEvent.OnServerEvent:Connect(function(player,code,amount,folder,currency)

local newCode = Instance.new("StringValue")
newCode.Name = code
newCode.Parent = player.CodesFolder

player[folder][currency].Value = player[folder][currency].Value + amount

end)

game.Players.PlayerRemoving:Connect(function(player)

saveData(player)

end)

game:BindToClose(function()

for _,player in pairs(game.Players:GetPlayers()) do
	
	saveData(player)
end

end)

1 comment

0

Use code block on all of the code of lines!

1 answer

lol, don't answer to this, but basically what was happening was that I was using 2 strings to save 2 different datas, so it was really a coin-toss when you loaded into the game.

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