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 ![]()