Okay I have hesitated to pose my question because I think is a big script to put it on scripting helpers. But I do it anyway.
The probleme is, when a player reset he don't have the good stats. If Player1 have 100 exp and 10 money and the Player2 don't have money and have 80 exp. If the Player2 reset he have now 100 exp and 10 money as Player1.. But why? I don't understant why.. So if anybody can help it's would be nice..
local DataManager = {}
--< Services
local RunService = game:GetService('RunService')
local PlayerService = game:GetService('Players')
local RStorageService = game:GetService('ReplicatedStorage')
local DataStoreService = game:GetService('DataStoreService')
--< Variables
-- Relative game variables
local PlayerData = DataStoreService:GetDataStore('PlayerData')
local SessionData = {}
local StartData = {Level = 1, Money = 0, Experience1 = 0, Experience2 = 400, Language = 1}
-- Links game variables
local Events = RStorageService.Events
local UpdateData = Events.UpdateData
-- Value game variables
local AutoSave_Interval = 60
local DataStora_Retries = 3
--< Usable module functions
local function DataStoreRetry(DataStoreFunction)
local tries = 0
local success = true
local data = nil
repeat
tries = tries + 1
success = pcall(function() data = DataStoreFunction() end)
if not success then wait(1) end
until tries == DataStora_Retries or success
if not success then
error('Could not access DataStore! Warn players that their data might not get saved!')
end
return success, data
end
local function SavePlayerData(Player)
if SessionData[Player.UserId] then
return DataStoreRetry(function()
return PlayerData:SetAsync(Player.UserId, SessionData[Player.UserId])
end)
end
end
local function GetPlayerData(Player)
return DataStoreRetry(function()
return PlayerData:GetAsync(Player.UserId)
end)
end
local function SetupPlayerData(Player)
if not RunService:IsStudio() then
local Success, Data = GetPlayerData(Player)
if not Success then
Player:Kick('Retry later (stats not found)')
else
if not Data then
SessionData[Player.UserId] = StartData
SavePlayerData(Player)
else
SessionData[Player.UserId] = Data
end
end
else
SessionData[Player.UserId] = StartData
end
end
local function CheckExperience(Player)
if SessionData[Player.UserId]['Experience1'] >= SessionData[Player.UserId]['Experience2'] then
SessionData[Player.UserId]['Experience1'] = math.floor(SessionData[Player.UserId]['Experience1'] - SessionData[Player.UserId]['Experience2'])
SessionData[Player.UserId]['Experience2'] = math.floor(SessionData[Player.UserId]['Experience2'] / 1.5 + 100 * (SessionData[Player.UserId]['Experience2'] / 20 * 0.02) + 204)
SessionData[Player.UserId]['Level'] = SessionData[Player.UserId]['Level'] + 1
SessionData[Player.UserId]['Money'] = SessionData[Player.UserId]['Money'] + (SessionData[Player.UserId]['Level'] * 10)
end
end
--< Usable game functions
function DataManager:PlayerDataUpdate(Player)
UpdateData:FireClient(Player, SessionData[Player.UserId])
end
function DataManager:ChangeStat(Player, isLanguage, isStat, Value, Stat, Any)
if isLanguage then
SessionData[Player.UserId]['Language'] = Value
elseif isStat then
if Any then
SessionData[Player.UserId][Stat] = SessionData[Player.UserId][Stat] + Value
else
SessionData[Player.UserId][Stat] = SessionData[Player.UserId][Stat] - Value
end
end
CheckExperience(Player)
DataManager:PlayerDataUpdate(Player)
end
function DataManager:GetStat(Player, Stat)
return SessionData[Player.UserId][Stat]
end
--< Events
PlayerService.PlayerAdded:Connect(SetupPlayerData)
PlayerService.PlayerRemoving:Connect(function(Player)
if not RunService:IsStudio() then
SavePlayerData(Player)
end
SessionData[Player.UserId] = nil -- Stop keep track of data
end)
spawn(function()
while wait(AutoSave_Interval) do
for player, data in pairs(SessionData) do
SavePlayerData(player)
end
end
end)
return DataManager
Thank for help..

2 comments
Where are you testing this from?
hello, my name is Quentin I think you need to play in the preset values of your asset number 2 which auto generates a kind of script vector 7