Hello. I am wondering how to save these NumberValues. It is for a level up and exp system. With the way I have tried, the bar breaks and it makes Level and Exp the same value. Please help!
This first script is a 'leaderstats' script in ServerScriptService
local DataStoreService = game:GetService("DataStoreService") local playerData = DataStoreService:GetDataStore("PlayerData") game.Players.PlayerAdded:Connect(function(Player) -- Leaderstats -- local leaderstats = Instance.new("Folder", Player) leaderstats.Name = "leaderstats" local Level = Instance.new("NumberValue", leaderstats) Level.Name = "Level" Level.Value = 1 local Exp = Instance.new("NumberValue", leaderstats) Exp.Name = "Exp" Exp.Value = 0 local RequiredExp = Instance.new("NumberValue", Player) RequiredExp.Name = "RequiredExp" RequiredExp.Value = Level.Value * 1000 local playerUserId = "Player_"..Player.UserId local data = playerData:GetAsync(playerUserId) if data then Level.Value = data Exp.Value = data else Level.Value = 1 Exp.Value = 1 end --Level Up & Exp-- Exp.Changed:Connect(function(Changed) if Exp.Value >= RequiredExp.Value then Exp.Value = Exp.Value - RequiredExp.Value Level.Value += 1 RequiredExp.Value = Level.Value * 1000 end end) end) local function onPlayerExit(Player) local success, err = pcall(function() local playerUserId = "Player_"..Player.UserId playerData:SetAsync(playerUserId, Player.leaderstats.Exp.Value) playerData:SetAsync(playerUserId, Player.leaderstats.Level.Value) end) if not success then warn("Could not save data") end end game.Players.PlayerRemoving:Connect(onPlayerExit)
This second script is in 'BackgroundFrame'.
local Player = game.Players.LocalPlayer local Exp = Player.leaderstats.Exp local RequiredExp = Player.RequiredExp Exp.Changed:Connect(function(Changed) if Changed then script.Parent.ExpBar:TweenSize(UDim2.new(Exp.Value / RequiredExp.Value, 0, 1, 0)) end end) while wait() do script.Parent.ExpLabel.Text = Exp.Value.." / "..RequiredExp.Value end
The final script is in 'LevelLabel'.
local Player = game.Players.LocalPlayer while wait() do script.Parent.Text = "Level : "..Player.leaderstats.Level.Value end
Level Label displays the level. Example = Level : 1
Exp Label displays how much Exp you have. Example = 10 / 1000
Exp Bar is a bar that goes up depending on how much exp you have. For example, if you have 500 / 1000 exp the bar would be at half.
hiya!
your issue here (described by greatneil80) is when you're saving the data and when you're setting the NumberValue's values
this can be seen on lines 27, 28, 49 and 50
greatneil's solution is to impliment this data into a table: a table (also known as an array or a dictionary) can store multiple values of any type except nil values tables are constructed as follows:
-- Construct an empty table assigned to variable "t" local t = {} print(t) -- {}
what we need to do, is create a dictionary using a table (defining a specific key and value) and defining a player's experience and level
local UserData = { Exp = 0, Level = 0 } print(UserData) -- {Exp = 0, Level = 0}
we can access this data by calling a key on the table
local UserData = { Exp = 0, Level = 0 } print(UserData.Exp) -- 0
using this, and your code above: we can merge these two together to make your game work
local DataStoreService = game:GetService("DataStoreService") local playerData = DataStoreService:GetDataStore("PlayerData") game.Players.PlayerAdded:Connect(function(Player) -- Leaderstats -- local leaderstats = Instance.new("Folder", Player) leaderstats.Name = "leaderstats" local Level = Instance.new("NumberValue", leaderstats) Level.Name = "Level" Level.Value = 1 local Exp = Instance.new("NumberValue", leaderstats) Exp.Name = "Exp" Exp.Value = 0 local RequiredExp = Instance.new("NumberValue", Player) RequiredExp.Name = "RequiredExp" RequiredExp.Value = Level.Value * 1000 local playerUserId = "Player_"..Player.UserId local data = playerData:GetAsync(playerUserId) if data and type(data) == "table" then -- changes here! Level.Value = data.Level Exp.Value = data.Exp else Level.Value = 1 Exp.Value = 1 end --Level Up & Exp-- Exp.Changed:Connect(function(Changed) if Exp.Value >= RequiredExp.Value then Exp.Value = Exp.Value - RequiredExp.Value Level.Value += 1 RequiredExp.Value = Level.Value * 1000 end end) end) local function onPlayerExit(Player) local success, err = pcall(function() -- and more changes over here! local playerUserId = "Player_"..Player.UserId local playerData = { Exp = Player.leaderstats.Exp.Value, Level = Player.leaderstats.Level.Value } playerData:SetAsync(playerUserId, playerData ) end) if not success then warn("Could not save data") end end game.Players.PlayerRemoving:Connect(onPlayerExit)
hopefully this answers your question, if it doesn't; feel free to leave a comment and i'll elaborate.
have a good day (and if you celeberate), a happy christmas :)
The script didn't seem to work. I didn't get any errors in output.
Also sorry for late reply!