How would I add this to my datastore script? (Using the datastore2 module)

Basically, I am trying to add a name system to my game, But I don’t know how to make it work with the datastore and I am trying to not have seperate datastores, just one big one.

This is my datamanager script

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

-- Dependecies
local ContentLibrary = require(ReplicatedStorage.Modules.ContentLibrary)
local GameConfig = require(ReplicatedStorage.GameConfig)
local DataStore2 = require(script.DataStore2)



-- DataStore
DataStore2.Combine("UserData", "Items", "Stats", "Additions", "Badges", "ActiveArmor", "Hotbar")

-- PlayerData
local PlayerData = Instance.new("Configuration")
PlayerData.Name = "PlayerData"
PlayerData.Parent = ReplicatedStorage

--------------------------------------------------------------------------------------------------------------

-- Clamp the passed ValueObject (must be int/number) to the given bounds.
local function ClampStat(ValueObject: IntValue, Min: number?, Max: number?)
	ValueObject.Changed:Connect(function()
		ValueObject.Value = math.clamp(ValueObject.Value, Min or -math.huge, Max or math.huge)
	end)
end

-- Create and return a stat value object, used for player stats
-- ClampInfo is an optional table for clamping it to a min/max. If you don't need it, simply don't include it.
local function CreateStat(ClassName: string, Name: string, DefaultValue, ClampInfo)
	local Stat = Instance.new(ClassName)
	Stat.Name = Name
	Stat.Value = DefaultValue
	if ClampInfo and (Stat:IsA("NumberValue") or Stat:IsA("IntValue")) then
		ClampStat(Stat, unpack(ClampInfo))
	end
	return Stat
end

--------------------------------------------------------------------------------------------------------------

local function CreateDataFolder(player)
	local pData = Instance.new("Configuration")
	pData.Name = player.UserId

	-- Stats
	local Stats = Instance.new("Folder")
	Stats.Name = "Stats"
	Stats.Parent = pData

	local Level = CreateStat("NumberValue", "Level", 1, {1, GameConfig.MaxLevel})
	Level.Parent = Stats
	local XP = CreateStat("NumberValue", "XP", 0, {0})
	XP.Parent = Stats
	local Gold = CreateStat("NumberValue", "Gold", 0, {0})
	Gold.Parent = Stats
	-- Items
	local Items = Instance.new("Folder")
	Items.Name = "Items"
	Items.Parent = pData

	local Tool = Instance.new("Folder")
	Tool.Name = "Tool"
	Tool.Parent = Items

	local Armor = Instance.new("Folder")
	Armor.Name = "Armor"
	Armor.Parent = Items


	-- Badges
	local Badges = Instance.new("Folder")
	Badges.Name = "Badges"
	Badges.Parent = pData

	-- Preferences / Misc
	local ActiveArmor = CreateStat("StringValue", "ActiveArmor", "")
	ActiveArmor.Parent = pData

	local Hotbar = Instance.new("Folder")
	Hotbar.Name = "Hotbar"
	Hotbar.Parent = pData

	for n = 1, 9 do
		local ValueObject = CreateStat("StringValue", n, "")
		ValueObject.Parent = Hotbar
	end

	return pData
end

--------------------------------------------------------------------------------------------------------------

local function Load(player, pTable, pData)

	-- Stats
	local Stats = pData:FindFirstChild("Stats")
	if pTable.Stats then
		for StatName, StatValue in pTable.Stats do
			local Stat = Stats:FindFirstChild(StatName)
			if Stat then
				Stat.Value = StatValue
			end
		end
	end

	local Items = pData:FindFirstChild("Items")
	if pTable.Items then

		-- Tool
		local ToolFolder = Items:FindFirstChild("Tool")
		if pTable.Items.Tool then
			for _, ItemName in pTable.Items.Tool do
				local Tool = ContentLibrary.Tool[ItemName]
				if Tool then
					local ToolStarterGear = Tool.Instance:Clone() ToolStarterGear.Parent = player:WaitForChild("StarterGear")
					local ToolBackpack = Tool.Instance:Clone() ToolBackpack.Parent = player:WaitForChild("Backpack")
					local ToolDataValue = CreateStat("NumberValue", ItemName, 1) ToolDataValue.Parent = ToolFolder
					if pTable.Additions.Tool then
						if (Tool.Config.ItemStacking or GameConfig.GlobalStacking) and pTable.Additions.Tool[ItemName] then
							local Amount = pTable.Additions.Tool[ItemName][1]
							CreateStat("NumberValue", "Amount", Amount).Parent = ToolStarterGear
							CreateStat("NumberValue", "Amount", Amount).Parent = ToolBackpack
							ToolDataValue.Value = Amount
						end
					end
				end
			end
		end

		-- Armor
		local ArmorFolder = Items:FindFirstChild("Armor")
		if pTable.Items.Armor then
			for _, ItemName in pTable.Items.Armor do
				local Armor = ContentLibrary.Armor[ItemName]
				if Armor then
					local ArmorDataValue = CreateStat("NumberValue", ItemName, 1) ArmorDataValue.Parent = ArmorFolder
					if pTable.Additions.Armor then
						if (Armor.Config.ItemStacking or GameConfig.GlobalStacking) and pTable.Additions.Armor[ItemName] then
							local Amount = pTable.Additions.Armor[ItemName][1]
							ArmorDataValue.Value = Amount
						end
					end
				end
			end
		end
	end

	local Badges = pData:FindFirstChild("Badges")
	if pTable.Badges then
		for _, BadgeId in pTable.Badges do
			CreateStat("BoolValue", BadgeId).Parent = Badges
		end
	end

	-- Preferences / Misc
	if pTable.ActiveArmor then
		pData:FindFirstChild("ActiveArmor").Value = pTable.ActiveArmor
	end

	local HotbarFolder = pData:FindFirstChild("Hotbar")
	if pTable.Hotbar then
		for SlotNumber, ItemName in pTable.Hotbar do
			HotbarFolder:FindFirstChild(SlotNumber).Value = ItemName
		end
	end
end

--------------------------------------------------------------------------------------------------------------

local function Save(pData)
	local saveTable = {}

	saveTable.Stats = {}
	saveTable.Items = {
		Tool = {},
		Armor = {}
	}
	saveTable.Additions = {
		Tool = {},
		Armor = {}
	}
	saveTable.Quests = {
		Active = {},
		Completed = {}
	}
	saveTable.Badges = {}


	-- Stats
	local Stats = pData:FindFirstChild("Stats")
	for _, ValueObject in Stats:GetChildren() do
		saveTable.Stats[ValueObject.Name] = ValueObject.Value
	end

	local Items = pData:FindFirstChild("Items")

	-- Tool
	local Tool = Items:FindFirstChild("Tool")
	for _, ValueObject in Tool:GetChildren() do
		if ContentLibrary.Tool[ValueObject.Name] then
			table.insert(saveTable.Items.Tool, ValueObject.Name)
			saveTable.Additions.Tool[ValueObject.Name] = {
				ValueObject.Value
			}
		end
	end

	-- Armor
	local Armor = Items:FindFirstChild("Armor")
	for _, ValueObject in Armor:GetChildren() do
		if ContentLibrary.Armor[ValueObject.Name] then
			table.insert(saveTable.Items.Armor, ValueObject.Name)
			saveTable.Additions.Armor[ValueObject.Name] = {
				ValueObject.Value
			}
		end
	end

	local Quests = pData:FindFirstChild("Quests")

	-- Active
	local Active = Quests:FindFirstChild("Active")
	for _, ValueObject in Active:GetChildren() do
		local QuestTable = {
			ValueObject.Name,
			ValueObject.Objective.Value,
			ValueObject.Current.Value,
			ValueObject.Finish.Value,
			ValueObject.Item.Value,
			ValueObject.Stat.Value,
			ValueObject.Area.Value,
			{},
			{}

		}
		for _, v in ValueObject.Awards:GetChildren() do
			local v2 = v:FindFirstChildOfClass("NumberValue")
			local AwardsTable = {
				v2.Name,
				v.Value,
				v2.Value
			}
			table.insert(QuestTable[8], AwardsTable)
		end
		for _, v in ValueObject.Killable:GetChildren() do
			local KillsTable = {
				v.Name,
				v.Value,
			}
			table.insert(QuestTable[9], KillsTable)
		end
		table.insert(saveTable.Quests.Active, QuestTable)
	end

	-- Completed
	local Completed = Quests:FindFirstChild("Completed")
	for _, ValueObject in Completed:GetChildren() do
		table.insert(saveTable.Quests.Completed, ValueObject.Name)
	end

	-- Badges
	local Badges = pData:FindFirstChild("Badges")
	for _, ValueObject in Badges:GetChildren() do
		table.insert(saveTable.Badges, ValueObject.Name)
	end

	-- Preferences / Misc
	saveTable.ActiveArmor = pData.ActiveArmor.Value

	saveTable.Hotbar = {}
	for n, ValueObject in pData.Hotbar:GetChildren() do
		saveTable.Hotbar[n] = ValueObject.Value
	end

	return saveTable
end


Players.PlayerAdded:Connect(function(player)
	local Stores = {
		DataStore2("Stats", player),
		DataStore2("Items", player),
		DataStore2("Additions", player),
		DataStore2("Quests", player),
		DataStore2("Badges", player),
		DataStore2("ActiveArmor", player),
		DataStore2("Hotbar", player)
	}

	local pData = CreateDataFolder(player)
	local pTable = {
		Stats = {},
		Items = {},
		Additions = {},
		Quests = {},
		Badges = {},
		ActiveArmor = "",
		Hotbar = {}
	}

	for _, Store in Stores do
		Store:SetBackup(5)
		if Store:IsBackup() then
			player:Kick("DataStore-Services might be down. Please rejoin later.")
			return
		end
		pTable[Store.combinedName] = Store:Get(pTable[Store.combinedName])
	end
	Load(player, pTable, pData)
	print("Data loaded for " .. player.Name .. " | Level: " .. pData.Stats.Level.Value)

	pData.Parent = PlayerData

	player.AncestryChanged:Connect(function(plr) 
		if not plr:IsDescendantOf(game) then
			print("Saving Data for " .. player.Name)
			local SaveTable = Save(pData)
			for _, Store in Stores do 
				Store:Set(SaveTable[Store.combinedName])
			end
			pData:Destroy()
			pData = nil
		end
	end)

	while task.wait(180) and pData do
		print("Saving Data for " .. player.Name)
		local SaveTable = Save(pData)
		for _, Store in Stores do
			Store:Set(SaveTable[Store.combinedName])
		end
	end
end)

This is my reference script (taken from a tutorial)

local DSS = game:GetService("DataStoreService")
local Saves = DSS:GetDataStore("Save2")
 
local Names = {
	"Liam","Noah","Oliver","William","Elijah","James","Benjamin","Lucas","Mason","Ethan","Alexander","Henry","Jacob","Michael","Daniel","Logan","Jackson","Sebastian","Jack","Aiden","Owen","Samuel","Matthew","Joseph","Levi","Mateo","David","John","Wyatt","Carter","Julian","Luke","Grayson","Isaac","Jayden","Theodore","Gabriel","Anthony","Dylan","Leo","Lincoln","Jaxon","Asher","Christopher","Josiah","Andrew","Thomas","Joshua","Ezra","Hudson","Charles","Caleb","Isaiah","Ryan","Nathan","Adrian","Christian","Maverick","Colton","Elias","Aaron","Eli","Landon","Jonathan","Nolan","Hunter","Cameron","Connor","Santiago","Jeremiah","Ezekiel","Angel","Roman","Easton","Miles","Robert","Jameson","Nicholas","Greyson","Cooper","Ian","Carson","Axel","Jaxson","Dominic","Leonardo","Luca","Austin","Jordan","Adam","Xavier","Jose","Jace","Everett","Declan","Evan","Kayden","Parker","Wesley","Kai","Brayden","Bryson","Weston","Jason","Emmett","Sawyer","Silas","Bennett","Brooks","Micah","Damian","Harrison","Waylon","Ayden","Vincent","Ryder","Kingston","Rowan","George","Luis","Chase","Cole","Nathaniel","Zachary","Ashton","Braxton","Gavin","Tyler","Diego","Bentley","Amir","Beau","Gael","Carlos","Ryker","Jasper","Max","Juan","Ivan","Brandon","Jonah","Giovanni","Kaiden","Myles","Calvin","Lorenzo","Maxwell","Jayce","Kevin","Legend","Tristan","Jesus","Jude","Zion","Justin","Maddox","Abel","King","Camden","Elliott","Malachi","Milo","Emmanuel","Karter","Rhett","Alex","August","River","Xander","Antonio","Brody","Finn","Elliot","Dean","Emiliano","Eric","Miguel","Arthur","Matteo","Graham","Alan","Nicolas","Blake","Thiago","Adriel","Victor","Joel","Timothy","Hayden","Judah","Abraham","Edward","Messiah","Zayden","Theo","Tucker","Grant","Richard","Alejandro","Steven","Jesse","Dawson","Bryce","Avery","Oscar","Patrick","Archer","Barrett","Leon","Colt","Charlie","Peter","Kaleb","Lukas","Beckett","Jeremy","Preston","Enzo","Luka","Andres","Marcus","Felix","Mark","Ace","Brantley","Atlas","Remington","Maximus","Matias","Walker","Kyrie","Griffin","Kenneth","Israel","Javier","Kyler","Jax","Amari","Zane","Emilio","Knox","Adonis","Aidan","Kaden","Paul","Omar","Brian","Louis","Caden","Maximiliano","Holden","Paxton","Nash","Bradley","Bryan","Simon","Phoenix","Lane","Josue","Colin","Rafael","Kyle","Riley","Jorge","Beckham","Cayden","Jaden","Emerson","Ronan","Karson","Arlo","Tobias","Brady","Clayton","Francisco","Zander","Erick","Walter","Daxton","Cash","Martin","Damien","Dallas","Cody","Chance","Jensen","Finley","Jett","Corbin","Kash","Reid","Kameron","Andre","Gunner","Jake","Hayes","Manuel","Prince","Bodhi","Cohen","Sean","Khalil","Hendrix","Derek","Cristian","Cruz","Kairo","Dante","Atticus","Killian","Stephen","Orion","Malakai","Ali","Eduardo","Fernando","Anderson","Angelo","Spencer","Gideon","Mario","Titus","Travis","Rylan","Kayson","Ricardo","Tanner","Malcolm","Raymond","Odin","Cesar","Lennox","Joaquin","Kane","Wade","Muhammad","Iker","Jaylen","Crew","Zayn","Hector","Ellis","Leonel","Cairo","Garrett","Romeo","Dakota","Edwin","Warren","Julius","Major","Donovan","Caiden","Tyson","Nico","Sergio","Nasir","Rory","Devin","Jaiden","Jared","Kason","Malik","Jeffrey","Ismael","Elian","Marshall","Lawson","Desmond","Winston","Nehemiah","Ari","Conner","Jay","Kade","Andy","Johnny","Jayceon","Marco","Seth","Ibrahim","Raiden","Collin","Edgar","Erik","Troy","Clark","Jaxton","Johnathan","Gregory","Russell","Royce","Fabian","Ezequiel","Noel","Pablo","Cade","Pedro","Sullivan","Trevor","Reed","Quinn","Frank","Harvey","Princeton","Zayne","Matthias","Conor","Sterling","Dax","Grady","Cyrus","Gage","Leland","Solomon","Emanuel","Niko","Ruben","Kasen","Mathias","Kashton","Franklin","Remy","Shane","Kendrick","Shawn","Otto","Armani","Keegan","Finnegan","Memphis","Bowen","Dominick","Kolton","Jamison","Allen","Philip","Tate","Peyton","Jase","Oakley","Rhys","Kyson","Adan","Esteban","Dalton","Gianni","Callum","Sage","Alexis","Milan","Moises","Jonas","Uriel","Colson","Marcos","Zaiden","Hank","Damon","Hugo","Ronin","Royal","Kamden","Dexter","Luciano","Alonzo","Augustus","Kamari","Eden","Roberto","Baker","Bruce","Kian","Albert","Frederick","Mohamed","Abram","Omari","Porter","Enrique","Alijah","Francis","Leonidas","Zachariah","Landen","Wilder","Apollo","Santino","Tatum","Pierce","Forrest","Corey","Derrick","Isaias","Kaison","Kieran","Arjun","Gunnar","Rocco","Emmitt","Abdiel","Braylen","Maximilian","Skyler","Phillip","Benson","Cannon","Deacon","Dorian","Asa","Moses","Ayaan","Jayson","Raul","Briggs","Armando","Nikolai","Cassius","Drew","Rodrigo","Raphael","Danny","Conrad","Moshe","Zyaire","Julio","Casey","Ronald","Scott","Callan","Roland","Saul","Jalen","Brycen","Ryland","Lawrence","Davis","Rowen","Zain","Ermias","Jaime","Duke","Stetson","Alec","Yusuf","Case","Trenton","Callen","Ariel","Jasiah","Soren","Dennis","Donald","Keith","Izaiah","Lewis","Kylan","Kobe","Makai","Rayan","Ford","Zaire","Landyn","Roy","Bo","Chris","Jamari","Ares","Mohammad","Darius","Drake","Tripp","Marcelo","Samson","Dustin","Layton","Gerardo","Johan","Kaysen","Keaton","Reece","Chandler","Lucca","Mack","Baylor","Kannon","Marvin","Huxley","Nixon","Tony","Cason","Mauricio","Quentin","Edison","Quincy","Ahmed","Finnley","Justice","Taylor","Gustavo","Brock","Ahmad","Kyree","Arturo","Nikolas","Boston","Sincere","Alessandro","Braylon","Colby","Leonard","Ridge","Trey","Aden","Leandro","Sam","Uriah","Ty","Sylas","Axton","Issac","Fletcher","Julien","Wells","Alden","Vihaan","Jamir","Valentino","Shepherd","Keanu","Hezekiah","Lionel","Kohen","Zaid","Alberto","Neil","Denver","Aarav","Brendan","Dillon","Koda","Sutton","Kingsley","Sonny","Alfredo","Wilson","Harry","Jaziel","Salvador","Cullen","Hamza","Dariel","Rex","Zeke","Mohammed","Nelson","Boone","Ricky","Santana","Cayson","Lance","Raylan","Lucian","Eliel","Alvin","Jagger","Braden","Curtis","Mathew","Jimmy","Kareem","Archie","Amos","Quinton","Yosef","Bodie","Jerry","Langston","Axl","Stanley","Clay","Douglas","Layne","Titan","Tomas","Houston","Darren","Lachlan","Kase","Korbin","Leighton","Joziah","Samir","Watson","Colten","Roger","Shiloh","Tommy","Mitchell","Azariah","Noe","Talon","Deandre","Lochlan","Joe","Carmelo","Otis","Randy","Byron","Chaim","Lennon","Devon","Nathanael","Bruno","Aryan","Flynn","Vicente","Brixton","Kyro","Brennan","Casen","Kenzo","Orlando","Castiel","Rayden","Ben","Grey","Jedidiah","Tadeo","Morgan","Augustine","Mekhi","Abdullah","Ramon","Saint","Emery","Maurice","Jefferson","Maximo","Koa","Ray","Jamie","Eddie","Guillermo","Onyx","Thaddeus","Wayne","Hassan","Alonso","Dash","Elisha","Jaxxon","Rohan","Carl","Kelvin","Jon","Larry","Reese","Aldo","Marcel","Melvin","Yousef","Aron","Kace","Vincenzo","Kellan","Miller","Jakob","Reign","Kellen","Kristopher","Ernesto","Briar","Gary","Trace","Joey","Clyde","Enoch","Jaxx","Crosby","Magnus","Fisher","Jadiel","Bronson","Eugene","Lee","Brecken","Atreus","Madden","Khari","Caspian","Ishaan","Kristian","Westley","Hugh","Kamryn","Musa","Rey","Thatcher","Alfred","Emory","Kye","Reyansh","Yahir","Cain","Mordechai","Zayd","Demetrius","Harley","Felipe","Louie","Branson","Graysen","Allan","Kole","Harold","Alvaro","Harlan","Amias","Brett","Khalid","Misael","Westin","Zechariah","Aydin","Kaiser","Lian","Bryant","Junior","Legacy","Ulises","Bellamy","Brayan","Kody","Ledger","Eliseo","Gordon","London","Rocky","Valentin","Terry","Damari","Trent","Bentlee","Canaan","Gatlin","Kiaan","Franco","Eithan","Idris","Krew","Yehuda","Marlon","Rodney","Creed","Salvatore","Stefan","Tristen","Adrien","Jamal","Judson","Camilo","Kenny","Nova","Robin","Rudy","Van","Bjorn","Brodie","Mac","Jacoby","Sekani","Vivaan","Blaine","Ira","Ameer","Dominik","Alaric","Dane","Jeremias","Kyng","Reginald","Bobby","Kabir","Jairo","Alexzander","Benicio","Vance","Wallace","Zavier","Billy","Callahan","Dakari","Gerald","Turner","Bear","Jabari","Cory","Fox","Harlem","Jakari","Jeffery","Maxton","Ronnie","Yisroel","Zakai","Bridger","Remi","Arian","Blaze","Forest","Genesis","Jerome","Reuben","Wesson","Anders","Banks","Calum","Dayton","Kylen","Dangelo","Emir","Malakhi","Salem","Blaise","Tru","Boden","Kolten","Kylo","Aries","Henrik","Kalel","Landry","Marcellus","Zahir","Lyle","Dario","Rene","Terrance","Xzavier","Alfonso","Darian","Kylian","Maison","Foster","Keenan","Yahya","Heath","Javion","Jericho","Aziel","Darwin","Marquis","Mylo","Ambrose","Anakin","Jordy","Juelz","Toby","Yael","Azrael","Brentley","Tristian","Bode","Jovanni","Santos","Alistair","Braydon","Kamdyn","Marc","Mayson","Niklaus","Simeon","Colter","Davion","Leroy","Ayan","Dilan","Ephraim","Anson","Merrick","Wes","Will","Jaxen","Maxim","Howard","Jad","Jesiah","Ignacio","Zyon","Ahmir","Jair","Mustafa","Jermaine","Yadiel","Aayan","Dhruv","Seven","Stone","Rome"
}
 
game.Players.PlayerAdded:Connect(function(plr)
 
	local StatsFolder = Instance.new("Folder", plr)
	StatsFolder.Name = "Stats"
 
	local FirstName = Instance.new("StringValue", StatsFolder)
	FirstName.Name = "FirstName"
 
	local LastName = Instance.new("StringValue", StatsFolder)
	LastName.Name = "LastName"
 
	local success, Data = pcall(function()
		return Saves:GetAsync(plr.UserId)
	end)
 
	if success then
		if Data then
			FirstName.Value = Data.FirstName
			LastName.Value = Data.LastName
		else
			FirstName.Value = Names[math.random(1,#Names)]
			LastName.Value = Names[math.random(1, #Names)]
		end
	else
		plr:Kick("Failed to Load Data")
	end
 
	plr:WaitForChild("PlayerGui"):WaitForChild("Name"):WaitForChild("Name").Text = FirstName.Value .. " " .. LastName.Value
end)
 
local function SaveData(Player)
	local Data = {
		FirstName = Player.Stats.FirstName.Value;
		LastName = Player.Stats.LastName.Value
	}
	Saves:SetAsync(Player.UserId, Data)
end
 
game.Players.PlayerRemoving:Connect(SaveData)
 
game:BindToClose(function()
	for i,v in pairs(game.Players:GetPlayers()) do
		SaveData(v)
	end
end)

Please guide me as I am pretty new to datastores :sweat_smile:

I’m not too familiar but I have worked with it before. Try this.

To

DataStore2.Combine("UserData", "Items", "Stats", "Additions", "Badges", "ActiveArmor", "Hotbar", "Names")

To

local pTable = {
		Stats = {},
		Items = {},
		Additions = {},
		Quests = {},
		Badges = {},
		ActiveArmor = "",
		Hotbar = {},
		Names = {}
		
		--[[
		Data format for names:
		
		Names = {
			FirstName = "",
			Lastname = ""
		}
		
		]]
	}

After this create instances to hold the data, you’d have to update your Load, Save, and CreateDataFolder functions too.


Example of how to do this in your load function:

local NamesFolder = pData:FindFirstChild("Names")
	if pTable.Names then
		local FirstName = Instance.new("StringValue")
		local LastName = Instance.new("StringValue")
		
		FirstName.Name = "FirstName"
		LastName.Name = "LastName"
		
		FirstName.Value = pTable.Names["FirstName"]
		LastName.Value = pTable.Names["LastName"]
		
		FirstName.Parent = NamesFolder
		LastName.Parent = NamesFolder
	end