Script doesn't create a folder

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)
1 Like

Is the module script in serverscriptservice? LocalScripts basically cant interact with serverscriptservice.

Sorry for replying late; I live in a different timezone.
ModuleScript is in ReplicatedStorage, under ANOTHER ModuleScript whose parent is a folder named MainModules.

You’re creating the folder from a local script. Try creating it using server script. Also, if I were you, I’d put it inside ReplicatedStorage where both the server and client can communicate.

I use a LocalScript for creating a folder because only the client can interact with and modify them.

Maybe you’re forgetting to parent the folder, try adding a comma and the parent wanted alike this: Instance.new(“Folder”, script.Parent). Nvm, I just noticed it was parented.

It was an issue between client and server side; should be working now.

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