Child added not running

i am making data store scirpt for game and i try to save the child of stuff with savechild() function but the child added event inside that function doesnt run when i add child

-- Services
local DatastoreService = game:GetService("DataStoreService")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

-- Events
local LoadedEvent = ReplicatedStorage.Events.LoadedEvent

-- Variables
local PlayersLoaded = {}
local SessionData = {}
local DataStore = DatastoreService:GetDataStore("TestingDatastore")
local DataFolders = ServerStorage.MockPlayer

-- Functions
local function SaveChild(data, folder, player)
	print("child", folder.Parent)
	folder.ChildAdded:Connect(function(child)
		print("hello")
		if PlayersLoaded[player.UserId] then
			if child:IsA("folder") then
				data[child.Name] = {}
				SaveChild(data[child.Name], child, player)
			else
				data[child.Name] = child.Value
			end
		end
	end)
end

local function SetUpAndCheck(Folder, PlayerData, Player)
	SaveChild(PlayerData, Folder, Player)
	for _, value in pairs(Folder:GetChildren()) do
		if value:IsA("Folder") then
			PlayerData[value.Name] = {}
			SetUpAndCheck(value, PlayerData[value.Name])
		else
			PlayerData[value.Name] = value.Value
			value.Changed:Connect(function(changedValue)
				PlayerData[value.Name] = changedValue
			end)
		end
	end
end

local function SetPlayerData(Folder, PlayerData, Player)
	SaveChild(PlayerData, Folder, Player)
	for _, value in pairs(Folder:GetChildren()) do
		print(value)
		if value:IsA("Folder") then
			PlayerData[value.Name] = {}
			SetPlayerData(value, PlayerData[value.Name], Player)
		else
			for item, itemValue in pairs(PlayerData) do
				-- checks if item already exists or not. it create new value if it doesnt already exists and for both it updates the values
				if Folder:FindFirstChild(item) then
					local ExistingValue = Folder:FindFirstChild(item)
					ExistingValue.Value = itemValue
					
					ExistingValue.Changed:Connect(function(valueChanged)
						PlayerData[item] = valueChanged
					end)
					ExistingValue.Destroying:Connect(function()
						PlayerData[item] = nil
					end)
				else
					local NewValue
					if type(itemValue) == "string" then
						NewValue = Instance.new("StringValue")
					elseif type(itemValue) == "number" then
						NewValue = Instance.new("NumberValue")
					elseif type(itemValue) == "boolean" then
						NewValue = Instance.new("BoolValue")
					end 
					NewValue.Value = itemValue
					NewValue.Name = item
					NewValue.Parent = Folder
					
					NewValue.Changed:Connect(function(value)
						PlayerData[item] = value
					end)
					NewValue.Destroying:Connect(function()
						PlayerData[item] = nil
					end)
				end
			end
		end
	end
end

local function LoadData(Player)
	PlayersLoaded[Player.Name] = false
	-- Folders
	local PlayerFolder = Instance.new("Folder", ReplicatedStorage.Players)
	PlayerFolder.Name = Player.Name
	local FolderClone = DataFolders:Clone()
	FolderClone.Parent = PlayerFolder
	
	-- taking folders from mock player folder and putting inside player folder
	for _, folder in pairs(FolderClone:GetChildren()) do
		folder.Parent = PlayerFolder
	end
	FolderClone:Destroy()
	
	-- Data loading
	local success, PlayerData
	local Attempts = 1
	-- load dataa
	repeat
		success, PlayerData = pcall(function()
			return DataStore:GetAsync(Player.UserId)
		end)
		
		if not success then
			Attempts += 1
		end
	until success or Attempts == 5
	if not success then
		Player:Kick("Unable to load data. Please join again or contact the owner via discord if this persists")
		return nil
	end
	
	SessionData[Player.UserId] = PlayerData	
	-- if the player is new then it will create default data
	if SessionData[Player.UserId] == nil or SessionData[Player.UserId] == false then
		SessionData[Player.UserId] = {}

		-- Automatically sets up the folders
		for _, folder in pairs(DataFolders:GetChildren()) do
			SessionData[Player.UserId][folder.Name] = {}
			SetUpAndCheck(folder, SessionData[Player.UserId][folder.Name], Player)
		end
	else -- if player not nil then load their data
		for _, folder in pairs(PlayerFolder:GetChildren()) do
			print(folder.Parent, folder)
			SetPlayerData(folder, SessionData[Player.UserId][folder.Name], Player)
		end
	end
	PlayersLoaded[Player.Name] = true
	print(SessionData[Player.UserId])
	LoadedEvent:FireClient(Player, PlayerFolder.InventoryFolder.Hotbar, PlayerFolder.InventoryFolder.Inventory)
end

local function SaveData(Player)
	local Attempts = 1
	local success, errMsg
	
	repeat
		print(SessionData[Player.UserId])
		success, errMsg = pcall(function()
			return DataStore:SetAsync(Player.UserId, SessionData[Player.UserId])
		end)
		
		Attempts += 1
		if not success then
			print(errMsg)
			task.wait(2)
		end
	until Attempts == 3 or success
	
	if not success and Attempts == 3 then
		print(errMsg)
	end
end

local function ServerShutdownSave()
	for i, player in Players:GetPlayers() do 
		task.spawn(function()
			local Attempts = 1
			local success, errMsg

			repeat
				success, errMsg = pcall(function()
					return DataStore:SetAsync(player.UserId, SessionData[player.UserId])
				end)

				Attempts += 1
				if not success then
					print(errMsg)
					task.wait(2)	
				end
			until Attempts == 3 or success

			if not success and Attempts == 3 then
				print(errMsg)
			end
		end)
	end
end

-- Events
Players.PlayerAdded:Connect(LoadData)
Players.PlayerRemoving:Connect(SaveData)
game:BindToClose(function()
	ServerShutdownSave()
end)





1 Like

It will not work if the child is being added from the client

1 Like

it on server char vchar char char

1 Like