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)