Transferring Datastore Data to New Datastore

I have recently switched datastore scripts within a game, changing the first script below to the second.

First:

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

	local playerData = leaderstatsData:GetAsync(player.UserId) --A
	local playerData2 = leaderstatsData2:GetAsync(player.UserId) --B
	local playerData3 = leaderstatsData3:GetAsync(player.UserId) --C

	if not playerData then --A
		playerData = {
			Credits = 300
		}
		leaderstatsData:SetAsync(player.UserId, playerData)
	end

	if not playerData2 then --B
		playerData2 = {
			Playtime = 0
		}
		leaderstatsData2:SetAsync(player.UserId, playerData2)
	end

	if not playerData3 then --C
		playerData3 = {
			["Prizes Won"] = 0
		}
		leaderstatsData3:SetAsync(player.UserId, playerData3)
	end

	player.leaderstats.Credits.Value = playerData.Credits --A
	player.leaderstats.Playtime.Value = playerData2.Playtime --B
	player.leaderstats["Prizes Won"].Value = playerData3["Prizes Won"] --C
end)

game.Players.PlayerRemoving:Connect(function(player)
	local playerData = { --A
		Credits = player.leaderstats.Credits.Value
	}
	leaderstatsData:SetAsync(player.UserId, playerData)

	local playerData2 = { --B
		Playtime = player.leaderstats.Playtime.Value
	}
	leaderstatsData2:SetAsync(player.UserId, playerData2)

	local playerData3 = { --C
		["Prizes Won"] = player.leaderstats["Prizes Won"].Value
	}
	leaderstatsData3:SetAsync(player.UserId, playerData3)
end)

Second:

local DataStoreService = game:GetService("DataStoreService")
local leaderstatsData = DataStoreService:GetDataStore("LeaderstatsData")

local defaultData = {
	Credits = 300,
	Playtime = 0,
	PrizesWon = 0
}

game.Players.PlayerAdded:Connect(function(player)
	local success, playerData = pcall(function()
		return leaderstatsData:GetAsync("SaveKey_" .. player.UserId)
	end)

	if not success or not playerData then
		playerData = defaultData
	end

	player:WaitForChild("leaderstats").Credits.Value = playerData.Credits
	player.leaderstats.Playtime.Value = playerData.Playtime
	player.leaderstats["Prizes Won"].Value = playerData.PrizesWon
end)

game.Players.PlayerRemoving:Connect(function(player)
	local playerData = {
		Credits = player.leaderstats.Credits.Value,
		Playtime = player.leaderstats.Playtime.Value,
		PrizesWon = player.leaderstats["Prizes Won"].Value
	}

	local success, errorMessage = pcall(function()
		leaderstatsData:SetAsync("SaveKey_" .. player.UserId, playerData)
	end)

	if not success then
		warn("Failed to save data for player", player.UserId, errorMessage)
	end
end)

task.spawn(function()
	while true do
		task.wait(60)
		for _, player in pairs(game.Players:GetPlayers()) do
			local playerData = {
				Credits = player.leaderstats.Credits.Value,
				Playtime = player.leaderstats.Playtime.Value,
				PrizesWon = player.leaderstats["Prizes Won"].Value
			}

			pcall(function()
				leaderstatsData:SetAsync("SaveKey_" .. player.UserId, playerData)
			end)
		end
	end
end)

Some players may have data in the original datastore which needs to be transferred over to the new datastore. How would I go about doing this?

Thank You :slight_smile:

2 Likes

when a player joins check if the old datastores contain data with their UserId
if they do, convert it and save it to the new datastores

1 Like

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