Datastore is not getting synced between 2 places in same universe

  1. What do you want to achieve? Keep it simple and clear!
    So topic explains everything
  2. What is the issue? Include screenshots / videos if possible!
    When i’m trying to print my data in second place it says nil, but in main place it exists(one universe)
  3. What solutions have you tried so far? Did you look for solutions on the Developer Hub?
    i looked in Internet and it says it should carry between places instantly, but for some reason it is not

DS code on main:

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local PlayerData = DataStoreService:GetDataStore("PlayerData")
local SyncData = workspace.Events.Data.SyncData
local BadgeService = game:GetService("BadgeService")
local InfiniteMath = require(game:GetService("ReplicatedStorage").InfiniteMath)


local function LoadData(player)
	local success, result = pcall(function()
		print("Data Loading...")
		return PlayerData:GetAsync(player.UserId)
	end)
	if not success then
		warn("LOADING DATASTORE ERROR, PLEASE FIX IT")
	end	
	return success, result
end

local function SaveData(player, data)
	local success, result = pcall(function()
		print("Data Saving...")
		PlayerData:SetAsync(player.UserId, data)
	end)
	if not success then
		warn("SAVING DATASTORE ERROR, PLEASE FIX IT")
	end
	return success
end

local sessionData = {}

local playerAdded = Instance.new("BindableEvent")
local playerRemoving = Instance.new("BindableEvent")

local PlayerManager = {}

PlayerManager.PlayerAdded = playerAdded.Event
PlayerManager.PlayerRemoving = playerRemoving.Event
function PlayerManager.Start()
	for _,player in ipairs(Players:GetPlayers()) do
		coroutine.wrap(PlayerManager.OnPlayerAdded)(player)	
	end
	
	Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded)	
	Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving)	

	game:BindToClose(PlayerManager.OnClose)
end

function PlayerManager.OnPlayerAdded(player)
	player.CharacterAdded:Connect(function(character)
		PlayerManager.OnCharacterAdded(player, character)
	end)

	local success, data = LoadData(player)
	sessionData[player.UserId] = success and data or {
		Voidonomicon = {
			["Owned"] = false,
			Catalysators = {
				["ShinyPhoton"] = {
					["Owned"] = false
				},
				
			}
		},
		Values = {
			["Photons"] = {Current = InfiniteMath.new(0), Max = InfiniteMath.new(0), Cap = InfiniteMath.new(320), BaseGain = InfiniteMath.new(1)}
		},
		Upgrades = {
			PhotonUpgrades = {
				["Gain"] = {Cap = 50, CurrLevel = 0},
				["Cap"] = {Cap = 5, CurrLevel = 0},
				["Cooldown"] = {Cap = 4, CurrLevel = 0},
				["Currency"] = {Currency1 = "Photons"}
			}
		},
		Unlockables = {
			BrightnessLevel = {ifOwn = false, Price = InfiniteMath.new(320), Currency = "Photons", Cap = 1}
		},
		Milestones = {
			BrightnessLevel = {["level"] = 0, Currency = "Photons"}
		},
		Buildings = {
			PhotonUpgrades = false,
			BrightnessLevel = false
		},
		StoryPart = "Beginning..."
	}
	SyncData:FireClient(player, sessionData[player.UserId])
	BadgeService:AwardBadge(player.UserId, 2149359820)
	playerAdded:Fire(player)
end
function PlayerManager.OnCharacterAdded(player, character)
	local humanoid = character:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Died:Connect(function()
			wait(1)
			player:LoadCharacter()
		end)
	end
end


--GET FUNCTIONS


function PlayerManager.GetValue(player, value, parameter)
	local val = sessionData[player.UserId]["Values"][value][parameter]
	return val
end	
function PlayerManager.GetStoryPart(player)
		return sessionData[player.UserId]["StoryPart"]
end	

function PlayerManager.GetBuildingInfo(player, buildingName)
	return sessionData[player.UserId]["Buildings"][buildingName]
end	

function PlayerManager.GetUpgrade(player,  Type, upgradeName, parameter)
	local val = sessionData[player.UserId]["Upgrades"][Type][upgradeName][parameter]
	return val
end

function PlayerManager.GetMilestoneBoost(player, MilestoneName, parameter)
		return sessionData[player.UserId]["Milestones"][MilestoneName][parameter]
end

function PlayerManager.GetUnlockable(player,  unlockableName, parameter)
	return sessionData[player.UserId]["Unlockables"][tostring(unlockableName)][parameter]
end


--SET FUNCTIONS


function PlayerManager.SetValue(player, value, parameter, amount, maxAmount)
	if parameter == "Both" then
		if amount then
		sessionData[player.UserId]["Values"][value]["Current"] = amount
		sessionData[player.UserId]["Values"][value]["Max"] = maxAmount
		end	
	else
		if amount then
			sessionData[player.UserId]["Values"][value][parameter] = amount
		end
	end
	SyncData:FireClient(player, sessionData[player.UserId])
end

function PlayerManager.SetStoryPart(player, value)
	sessionData[player.UserId]["StoryPart"] = value
	SyncData:FireClient(player, sessionData[player.UserId])
end

function PlayerManager.SetBuildingInfo(player, buildingName, value)
	sessionData[player.UserId]["Buildings"][buildingName] = value
	SyncData:FireClient(player, sessionData[player.UserId])
end	

function PlayerManager.SetUpgrade(player, Type, upgradeName, parameter, value)
	sessionData[player.UserId]["Upgrades"][Type][upgradeName][parameter] = value
	SyncData:FireClient(player, sessionData[player.UserId])
end

function PlayerManager.SetUnlockable(player, unlockableName, parameter, value)
	sessionData[player.UserId]["Unlockables"][tostring(unlockableName)][parameter] = value
	SyncData:FireClient(player, sessionData[player.UserId])
end

function PlayerManager.SetMilestoneBoost(player, MilestoneName, parameter, index, value)
	sessionData[player.UserId]["Milestones"][MilestoneName][parameter] = value
	SyncData:FireClient(player, sessionData[player.UserId])
end

--OTHER FUNCTIONS


function PlayerManager.OnPlayerRemoving(player)
	SaveData(player, sessionData[player.UserId])
	playerRemoving:Fire(player)
end

function PlayerManager.OnClose()	
	for _, player in ipairs(Players:GetPlayers()) do
		coroutine.wrap(PlayerManager.OnPlayerRemoving(player))()
	end
end
return PlayerManager

On other place(same universe):

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local PlayerData = DataStoreService:GetDataStore("PlayerData")
local BadgeService = game:GetService("BadgeService")


local function LoadData(player)
	local success, result = pcall(function()
		print("Data Loading...")
		return PlayerData:GetAsync(player.UserId)
	end)
	if not success then
		warn("LOADING DATASTORE ERROR, PLEASE FIX IT")
	end	
	return success, result
end

local function SaveData(player, data)
	local success, result = pcall(function()
		print("Data Saving...")
		PlayerData:SetAsync(player.UserId, data)
	end)
	if not success then
		warn("SAVING DATASTORE ERROR, PLEASE FIX IT")
	end
	return success
end

local sessionData = {}

local playerAdded = Instance.new("BindableEvent")
local playerRemoving = Instance.new("BindableEvent")

local PlayerManager = {}

PlayerManager.PlayerAdded = playerAdded.Event
PlayerManager.PlayerRemoving = playerRemoving.Event
function PlayerManager.Start()
	for _,player in ipairs(Players:GetPlayers()) do
		coroutine.wrap(PlayerManager.OnPlayerAdded)(player)	
	end

	Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded)	
	Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving)	

	game:BindToClose(PlayerManager.OnClose)
end

function PlayerManager.OnPlayerAdded(player)
	player.CharacterAdded:Connect(function(character)
		PlayerManager.OnCharacterAdded(player, character)
	end)

	local success, data = LoadData(player)
	sessionData[player.UserId] = success and data
	playerAdded:Fire(player)
end
function PlayerManager.OnCharacterAdded(player, character)
	local humanoid = character:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Died:Connect(function()
			wait(1)
			player:LoadCharacter()
		end)
	end
end


--GET FUNCTIONS


function PlayerManager.GetValue(player, value, parameter)
	local val = sessionData[player.UserId]["Values"][value][parameter]
	return val
end	
function PlayerManager.GetStoryPart(player)
	return sessionData[player.UserId]["StoryPart"]
end	

function PlayerManager.GetBuildingInfo(player, buildingName)
	return sessionData[player.UserId]["Buildings"][buildingName]
end	

function PlayerManager.GetUpgrade(player,  Type, upgradeName, parameter)
	local val = sessionData[player.UserId]["Upgrades"][Type][upgradeName][parameter]
	return val
end

function PlayerManager.GetVoidonomiconStatus(player, action, parameter)
	print(sessionData[player.UserId])
	if action == "Owned" then
		local val = sessionData[player.UserId]["Voidonomicon"][action]
		return val
	else
		local val = sessionData[player.UserId]["Voidonomicon"][action][parameter]
		return val
	end
end

function PlayerManager.GetMilestoneBoost(player, MilestoneName, parameter)
	return sessionData[player.UserId]["Milestones"][MilestoneName][parameter]
end

function PlayerManager.GetUnlockable(player,  unlockableName, parameter)
	return sessionData[player.UserId]["Unlockables"][tostring(unlockableName)][parameter]
end


--SET FUNCTIONS


function PlayerManager.SetValue(player, value, parameter, amount, maxAmount)
	if parameter == "Both" then
		if amount then
			sessionData[player.UserId]["Values"][value]["Current"] = amount
			sessionData[player.UserId]["Values"][value]["Max"] = maxAmount
		end	
	else
		if amount then
			sessionData[player.UserId]["Values"][value][parameter] = amount
		end
	end
end

function PlayerManager.SetStoryPart(player, value)
	sessionData[player.UserId]["StoryPart"] = value
end

function PlayerManager.SetBuildingInfo(player, buildingName, value)
	sessionData[player.UserId]["Buildings"][buildingName] = value
end	

function PlayerManager.SetUpgrade(player, Type, upgradeName, parameter, value)
	sessionData[player.UserId]["Upgrades"][Type][upgradeName][parameter] = value
end

function PlayerManager.SetVoidonomiconStatus(player, action, parameter, value)
	if action == "Owned" then
		sessionData[player.UserId]["Voidonomicon"][action] = value
	else
		sessionData[player.UserId]["Voidonomicon"][action][parameter] = value
	end
end

function PlayerManager.SetUnlockable(player, unlockableName, parameter, value)
	sessionData[player.UserId]["Unlockables"][tostring(unlockableName)][parameter] = value
end

function PlayerManager.SetMilestoneBoost(player, MilestoneName, parameter, index, value)
	sessionData[player.UserId]["Milestones"][MilestoneName][parameter] = value
end

--OTHER FUNCTIONS


function PlayerManager.OnPlayerRemoving(player)
	SaveData(player, sessionData[player.UserId])
	playerRemoving:Fire(player)
end

function PlayerManager.OnClose()	
	for _, player in ipairs(Players:GetPlayers()) do
		coroutine.wrap(PlayerManager.OnPlayerRemoving(player))()
	end
end
return PlayerManager

The data should be automatically synced across all places as long as it is under one game. If I understood correctly you try to transfer data between two places within the same game. You can try using MessagingService to communicate between the servers.

Like so:

local MessagingService = game:GetService("MessagingService")

-- Send a message
local success, errorMessage = pcall(function()
    MessagingService:PublishAsync("MyTopic", "Hello, world!")
end)

if not success then
    warn("Failed to send message: " .. errorMessage)
end

-- Receive messages
local function onMessageReceived(message)
    print("Received message: " .. message.Data)
end

MessagingService:SubscribeAsync("MyTopic", onMessageReceived)

Also make sure that your data is really being saved.

It is. But i assume data is shared itselfs between places under one universe, so it is weird what it don’t work. Data is 100% saved cuz it gets load in main place

So the data saves in one place but not the other in the same experience?

Is everything copied over correctly, modules, syncdata in workspace?

Yeah modules are absolutely same, except i don’t create an empty preset of data like in main place

have you tried it with the empty preset?

if the datastore works fine in the same experience something just doesn’t seem to be copied over correctly

Well if data is still nil it will just create empty preset of data in that place, instead of retrieving main one

Bumping this topic because i still didn’t figure issue

Ah lol i’m really dumb. I forgot to initialize datastore script in secondary place lol

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