Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

How can I save/load this particular IntValue?

So I've recently started working on a simple game and as a beginning script writer, I can't get one of my values to save/load properly. I have 4 IntValues that I'm loading and saving, Level, CurrentExp, MaxExp, and Bending. Each number in the Bending IntValue corresponds to a bending from the Avatar series. For some reason, the player's bending value never saves/loads correctly but the others work just fine. I suspect I made a minor error that messes things up, but I've look for a long time now and I can't find it.

-- Storage Definitions
local DS = game:GetService("DataStoreService")
local LevelStore = DS:GetOrderedDataStore("level")
local ExpStore = DS:GetOrderedDataStore("CurrentExp")
local MaxExpStore = DS:GetOrderedDataStore("MaxExp")
local BendingStore = DS:GetOrderedDataStore("Bending")

-- Upon Joining
game.Players.PlayerAdded:Connect(function(player)
	local Level = Instance.new("IntValue", player)
	Level.Name = "Level"
	Level.Value = 1
	
	local CurrentExp = Instance.new("IntValue", Level)
	CurrentExp.Name = "CurrentExp"
	
	local MaxExp = Instance.new("IntValue", Level)
	MaxExp.Name = "MaxExp"
	MaxExp.Value = 100
	
	local Bending = Instance.new("IntValue", player) -- -1 = NonBender, 0 = Null, 1 = Fire, 2 = Air, 3 = Water, 4 = Earth
	Bending.Name = "Bending"
	
	pcall(function()
		local LvlVal = LevelStore:GetAsync(player.UserId)
		if LvlVal then
			Level.Value = LvlVal
		else
			Level.Value = 1
		end
		local ExpVal = ExpStore:GetAsync(player.UserId)
		if ExpVal then
			CurrentExp.Value = ExpVal
		else
			CurrentExp.Value = 0
		end
		local MaxExpVal = MaxExpStore:GetAsync(player.UserId)
		if MaxExpVal then
			MaxExp.Value = MaxExpVal
		else
			MaxExp.Value = 100
		end
		local BendingVal = BendingStore:GetAsync(player.UserId)
		if BendingVal then
			Bending.Value = BendingVal
		else
			Bending.Value = 0
		end
	end)
	
	-- Leveling Up
CurrentExp.Changed:Connect(function()
		if CurrentExp.Value >= MaxExp.Value then
			repeat
				Level.Value = Level.Value + 1
				CurrentExp.Value = CurrentExp.Value - MaxExp.Value
				MaxExp.Value = MaxExp.Value * 1.25
			until CurrentExp.Value < MaxExp.Value
		end
	end)
	
end)

-- Data Saving
game.Players.PlayerRemoving:Connect(function(player)
	pcall(function()
		
		if player:FindFirstChild("Level") and player.Level.Value > 1 then
			LevelStore:SetAsync(player.UserId, player.Level.Value)
		end
		if player.Level:FindFirstChild("CurrentExp") and player.Level.CurrentExp.Value > 0 then
			ExpStore:SetAsync(player.UserId, player.Level.CurrentExp.Value)
		end
		if player.Level:FindFirstChild("MaxExp") and player.Level.MaxExp.Value > 100 then
			MaxExpStore:SetAsync(player.UserId, player.Level.MaxExp.Value)
		end
		if player:FindFirstChild("Bending") and player.Bending.Value ~= 0 then
			BendingStore:SetAsync(player.UserId, player.Bending.Value)
		end
	end)
end)

Originally, Bending was a StringValue, but I couldn't get it to save/load, so I just made it an IntValue to keep it simple, but if I can make it a string Value again that would be nice. I put code to make a part spawn whenever a players bending is saved by leaving the game (line 78), and the part doesn't spawn. I'm not sure what I did wrong, but if you see it, that would be nice. If you need any more information just ask.

2 comments

0

Try rewriting it?

0

I rewrote the code and corrected a few spelling errors, but I still can't find the main issue.

1 answer

I figured out that the problem for the bending value, unlike the other IntValues, was that I was trying to change them with a LocalScript. I set up a few RemoteEvents and everything works as intended now. Sorry for posting an unsolvable problem, but the problem has been solved.

This discussion is preserved as it was. New answers, comments, and votes are closed.