IntValue changes in Script but not in Game

local ds = game:GetService("DataStoreService")
local dataStore = ds:GetDataStore("LeaderstatsData")
local plrs = game:GetService("Players")

plrs.PlayerAdded:Connect(function(plr)
	local leaderstats = Instance.new("Folder")
	leaderstats.Parent = plr
	leaderstats.Name = "leaderstats"

	local souls = Instance.new("IntValue")
	souls.Parent = leaderstats
	souls.Name = "Souls"
	souls.Value = 0
	
	local gems = Instance.new("IntValue")
	gems.Parent = leaderstats
	gems.Name = "Gems"
	gems.Value = 0
	
	local privateValues = Instance.new("Folder")
	privateValues.Parent = plr
	privateValues.Name = "privateValues"
	
	local gemMultiplication = Instance.new("IntValue")
	gemMultiplication.Parent = privateValues
	gemMultiplication.Name = "gemMultiplication"
	gemMultiplication.Value = 0
	
	local soulMultiplication = Instance.new("IntValue")
	soulMultiplication.Parent = privateValues
	soulMultiplication.Name = "soulMultiplication"
	soulMultiplication.Value = 0
	
	local data = nil

	local succ, err = pcall(function()
		data = dataStore:GetAsync(plr.UserId)
	end)

	if not succ then
		warn(err)
	end
	
	if type(data) == "table" then
		souls.Value = data[1] or 0
		gems.Value = data[2] or 0
		gemMultiplication.Value = data[3] or 0
		soulMultiplication.Value = data[4] or 0
	end
end)

plrs.PlayerRemoving:Connect(function(plr)
	local data = {
		plr.leaderstats.Souls.Value,
		plr.leaderstats.Gems.Value,
		plr.privateValues.gemMultiplication.Value,
		plr.privateValues.soulMultiplication.Value
	}

	local succ, err = pcall(function()
		dataStore:SetAsync(plr.UserId, data)
	end)

	if not succ then
		warn(err)
	end
end)

Instance all of the necessary instances first, then load the stored values at once. Also, avoid using the parent parameter of the instance class constructor function “Instance.new()”.