I want to be able to store variables within a player, not to be confused with DataStores.
I made a module script that stores the variables/values and placed it in “StarterPlayerScripts” but the problem with that is that the module script can only be accessed on local scripts. I could just change the scripts into local scripts but I was wondering if there is a better way to do this.
[16th Janurary 2026 Edit]
Learnt a lot the past 3 years and I believe the most effective way to save values for a player would be to just make a table and every time a player joins, make a new table for that player:
local PlayerService = game:GetService("Players")
local DataOfPlr = {} -- { [Player] = {stuff} }
PlayerService.PlayerAdded:Connect(function(Player)
DataOfPlr[player] = {
cool = true,
smart = false
}
end)
PlayerService.PlayerRemoving:Connect(function(Player)
DataOfPlr[player] = nil -- removes player's data when they leave to prevent memory leaks
end)
You can furthermore move the DataOfPlr into a module so that it can be accessed from any (Server) script. I refuse to give myself the check so if anyone wants to copy paste what I said I’ll gladly give you the check. If I’m even still active..
you can call the module script on the local script and then fire a remote event? but if you don’t want to you should rewrite the module to work on the server.
I want each player to have there own separate variables/values, but also be accessible from server or client scripts. Though like I said before I don’t mind changing it to just client scripts.
Definitely don’t do that. Exploiters will be able to change it super easily. You could have a script in the Server with a table containing all the values, and the Client can invoke a RemoteFunction whenever they need the data.
There are three ways that you could do this.
- InstanceValues
- Each player object has a folder that contains values. There are multiple types of InstanceValues, so it should cover up most value types that you will store.
- Attributes
- You can add attributes to the Player object. It is the same as InstanceValues, but it is considered a “property” inside the Player object rather than a Folder inside the Player object.
- Variables
- You can store player values in a script inside a table.
1 Like
The most effective way to do it is by setting a list of variables to each connected player. Furthermore, if you want to store their data permanently, you can listen the “PlayerService.PlayerRemoving:Connect” event, retrieve the list’s data and use the DataStore service.
As the OP stated:
local PlayerService = game:GetService("Players")
local DataOfPlr = {} -- { [Player] = {stuff} }
PlayerService.PlayerAdded:Connect(function(Player)
DataOfPlr[player] = {
cool = true,
smart = false
}
end)
PlayerService.PlayerRemoving:Connect(function(Player)
DataOfPlr[player] = nil -- removes player's data when they leave to prevent memory leaks
end)
attributes + ecs like style
local health = {}::{[Player]:number}
local Armor = {}::{[Player]:number}
OR alternatively just using fixed size buffer accessed/position from dictionary