I use a ModuleScript to load data from DataStoreService. However, the script doesn’t create a new folder inside the ModuleScript.
(You might need the full script to understand)
ModuleScript:
-- THIS MODULE CAN ONLY BE USED SERVER SIDE.
local module = {}
local players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local HttpService = game:GetService("HttpService")
local defaultPlayerCFrame = workspace:WaitForChild("DatastoreStuff").default_PlayerCFrame.CFrame
local missionsFolder = script.Parent.Missions
local playerData = DataStoreService:GetDataStore("PlayerData")
local defaultValues = {
Missions = {},
PlayerCFrame = defaultPlayerCFrame
}
local function savePlayerCFrame(player)
local CFrameSavedSuccess, CFrameSavedError = pcall(function()
playerData:SetAsync("PlayerCFrame", {player.Character:FindFirstChild("HumanoidRootPart").CFrame:GetComponents()})
defaultValues.PlayerCFrame = CFrame.new(table.unpack({player.Character:FindFirstChild("HumanoidRootPart").CFrame:GetComponents()}))
end)
if CFrameSavedSuccess then
print("Returned true!")
return true
elseif CFrameSavedError then
print("Returned false!")
return false
end
end
local function saveAllMissions(player)
local romFunction = script.Parent.Parent.Parent.RemoteFunctions.Player.plr_checkDataStoreValues
local r = romFunction:InvokeClient(player)
if r == true then
print("Found mission!")
local children = missionsFolder:GetChildren()
for _, missionFolder in pairs(children) do
if not table.find(defaultValues.Missions, missionFolder.Name) then --making sure there's no duplicates
local folder = {
MissionName = missionFolder.Name,
MissionObjective = missionFolder.objectiveName.Value,
MissionType = missionFolder.missionType.Value
}
defaultValues.Missions[missionFolder.Name] = folder
else -- if there's already something, it updates the values of that mission.
defaultValues.Missions[missionFolder.Name].MissionName = missionFolder.Name
defaultValues.Missions[missionFolder.Name].MissionObjective = missionFolder.objectiveName.Value
defaultValues.Missions[missionFolder.Name].MissionType = missionFolder.missionType.Value
end
end
print(defaultValues.Missions)
local MissionsSavedSuccess, MissionsSavedError = pcall(function()
playerData:SetAsync("Missions", HttpService:JSONEncode(defaultValues.Missions))
end)
if MissionsSavedSuccess then
return true
elseif MissionsSavedError then
error(MissionsSavedError)
return false
end
else
print("No mission found.")
return true
end
end
local function loadPlayerCFrame(player)
local playerCFrame
local CFrameLoadSuccess, CFrameLoadError = pcall(function()
playerCFrame = playerData:GetAsync("PlayerCFrame")
end)
if CFrameLoadSuccess then
print("Returned true!")
player.Character:FindFirstChild("HumanoidRootPart").CFrame = CFrame.new(table.unpack(playerCFrame))
return true
elseif CFrameLoadError then
print("Returned false!")
return false
end
end
local function createMissionFolder(player, missionName, objectiveName, missionType)
local romEvent = script.Parent.Parent.Parent.RemoteEvents.Player.plr_createNewMissionFolder
romEvent:FireClient(player, missionName, objectiveName, missionType)
end
local function loadMissions(player)
local missionsTable
local MissionLoadSuccess, MissionLoadError = pcall(function()
missionsTable = HttpService:JSONDecode(playerData:GetAsync("Missions"))
end)
if MissionLoadSuccess then
print("Returned true!")
print(missionsTable)
for _, mission in pairs(missionsTable) do
createMissionFolder(player, mission.MissionName, mission.MissionObjective, mission.MissionType)
end
return true
elseif MissionLoadError then
print("Returned false!")
return false
end
end
function module:SaveData(player)
local s = savePlayerCFrame(player)
local r = saveAllMissions(player)
if s == true and r == true then
return true
else
return false
end
end
function module:LoadData(player)
local s = loadPlayerCFrame(player)
local r = loadMissions(player)
if s == true and r == true then
return true
else
return false
end
end
return module
LocalScript (from where I bind the remoteEvent):
playerRomEvents.plr_createNewMissionFolder.OnClientEvent:Connect(function(missionName, objectiveName, missionType)
local newMissionFolder = Instance.new("Folder")
newMissionFolder.Parent = romEventsFolder.Parent.MainModules.MainModule.Missions
newMissionFolder.Name = missionName
local newMissionName = Instance.new("StringValue")
newMissionName.Parent = newMissionFolder
newMissionName.Name = "missionName"
newMissionName.Value = missionName
local newMissionObjective = Instance.new("StringValue")
newMissionObjective.Parent = newMissionFolder
newMissionObjective.Name = "objectiveName"
newMissionObjective.Value = objectiveName
local newMissionType = Instance.new("StringValue")
newMissionType.Parent = newMissionFolder
newMissionType.Name = "missionType"
newMissionType.Value = missionType
end)