DataStoreService
Is a Advanced Topic, While the Most Basic ones work, but those are very simplistic and are highly likely to fail, But To Get/Save Data with a rare risk of Data Loss are the more Advanced DataStore’s, They take more code to Manage, and are usually more efficient.
It is best to Note that the Amount of Data you have doesn’t increase the chance of Data Loss, Which is what a lot of People think would Happen, Data Loss happens Randomly and Can easily be avoided depending on how you Handle your Data, Handling it poorly will ensure Data Loss, DataStoreService
is able to Handle up to 4 Megabytes which is about 4 million characters, you wont need to worry about ever reaching that limit
It is not the Best Solution to take a Module and use that, If you want to learn more of the Subject, It is best you look into documentation about DataStoreService
I only ever recommended using other Modules if you believe what you have doesn’t work.
However, Here is a run down of making a more efficient DataStore.
The First thing you can do is Manage the Current Sessions in your Game, To do this, we will create a table to store their Sessions, this is so we have a Much easier time Checking Data or Looking through it:
local Sessions = {} -- our table
So when we create a Session for our Player, we will Assign their UserId
as the Tables Name, Each Player has a unique Id, This is perfect for us as we can easy get their Data by something that will always be with them until their Account is Deleted.
Sessions[Player.UserId] = Data -- I will go Over this later
You can Add whatever Data you want, This is just an Example:
Sessions[Player.UserId] = { -- I will also go over this later
Level = 1;
EXP = 0;
Cash = 500;
}
It would be best to use a Better Prefix than id_
, like for Example, you could do:
DataStore/user/User_12345
Profiles/Data/User12345
It could be anything!
Now, You may be wondering when I’ll get to the Getting / Saving Part, Here it is:
A better way to Get / Save Data would be yo wrap GetAsync
and SetAsync
in a pcall()
When You are Getting/Saving Data, you have a chance to run into Errors. pcall()
will make it so you dont get these errors, however it comes with the side effect of returning false. When a pcall()
is Successful, it returns true. But if it catches an error, or something fails, it returns false, its best to check if it was successful everytime you use it by doing if Success then
, Your first parameter of the pcall()
is a boolean which determines whether it was successful or not. The Second Parameter is an Error Message, however, this can be changed into something if you return something, In this case, it is used for Data Collection.
Here is where we assign our Player their Data:
local Success, Data = pcall(function() -- Protected Call
return DataStore:GetAsync(key) -- returns Data
end)
if Success then -- If Successfully accessef DataStore
if Data then -- If Player Data found
Sessions[Player.UserId] = Data -- Adds Data for Player
elss
Sessions[Player.UserId] = {} -- new Data here
end
else -- If failed to Access DataStores
-- retry getting Data or Kick the Player
end
So when Saving Data, you would do almost the Same thing
local Success = pcall(function()
DataStore:SetAsync(key, Sessions[Player.UserId]) -- Saves Data
end)
if Success then return
else
warn(string.format("Failed to Save Data for %s", Player.Name)) -- you could just use the warn and not string.format
end
You Should use a loop to make sure that the Data is being Saved, Data Stores can Fail to Save, So we will try to Prevent that:
local Attempts = 0
local Success, Data
repeat task.wait(.5) -- I don't recommend setting this to a very low number like this, may cause a queue with how many you send in a short period of time
Success, Data = pcall(function()
DataStore:SetAsync(key, Sessions[Player.UserId])
end)
Attempts += 1
until Success or Attempts > 2 -- this will break the loop if any of these conditions are met
if not Success then
warn("Failed to Save Data!")
end
With this system, Data Loss should become less likely to Happen.
This Tutorial Would Basically be the exact same thing