[SOLVED] Big problem with Attribute Points System

Greetings,

So I made an Attribute System,
but the problem is that it seems like when there is another player in my server and I rejoin, the points gets doubled. Clicking the Reset Points button fixes everything.


leaderstats Script (Server)
-- Services

local RS = game:GetService("ReplicatedStorage")
local TS = game:GetService("TweenService")
local PLRS = game:GetService("Players")
local SSS = game:GetService("ServerScriptService")
local SS = game:GetService("ServerStorage")
local LIGHTNING = game:GetService("Lighting")
local SG = game:GetService("StarterGui")
local SP = game:GetService("StarterPack")

----------------------------------------------------------------------------------------------

-- DataStore Variables

local DataStoreService = game:GetService("DataStoreService")

local DataStore = DataStoreService:GetDataStore("DataStore")
local ToolDataStore = DataStoreService:GetDataStore("ToolDataStore")

----------------------------------------------------------------------------------------------

-- Variables

local TablePrinterModule = require(3148021300)

local Pets = game:GetService("ReplicatedStorage"):WaitForChild("Pets")
local PlayerPets = workspace:WaitForChild("Pets")

local Weapons = SS:WaitForChild("Weapons")

local HealthRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddHealth")
local SpeedRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddSpeed")
local AttackRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddAttack")
local MaxStaminaRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddMaxStamina")
local ResetRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("Reset")

----------------------------------------------------------------------------------------------

-- Values

local StarterSpeed = game:GetService("ReplicatedStorage"):WaitForChild("CurrentWalkSpeed").Value
local StarterHealth = 100
local StarterJumpPower = 50
local starterMaxStamina = 100

local spdPerPoint = 0.5
local hpPerPoint = 10
local jumpPowerPerPoint = 1
local maxStaminaPerPoint = 10

local speedCap = 80
local jumpCap = 120

local HealthIncrementPerLevel = 5
local AttributeIncrement = 1

----------------------------------------------------------------------------------------------

-- Cancel Quest

local remote = game:GetService("ReplicatedStorage"):WaitForChild("QuestRemote")

remote.OnServerEvent:Connect(function(player, val)
	local questInfoF = player:WaitForChild("QuestInformation")
	if val == "CancelQuest" then
		for i, v in pairs(questInfoF:GetChildren()) do
			if v.className == "StringValue" then
				v.Value = "Default"
			elseif v.className == "IntValue" then
				v.Value = 0
			end
		end
	end
end)

----------------------------------------------------------------------------------------------

game.Players.PlayerAdded:Connect(function(player)
	
	player.PlayerGui:WaitForChild("GameMusic"):Play()
	
	----------------------------------------------------------------------------------------------
	
	-- Variables
	
	local playerID = player.UserId
	local character = player.Character
	local playerGui = player.PlayerGui
	local backpack = player:WaitForChild("Backpack")
	local starterGear = player:WaitForChild("StarterGear")
	
	----------------------------------------------------------------------------------------------
	
	-- Stats
	
	local leaderstats = Instance.new("Folder", player)
	leaderstats.Name = "leaderstats"
	
	local weapon = Instance.new("Folder", player)
	weapon.Name = "Weapon"
	
	local attacks = Instance.new("Folder", weapon)
	attacks.Name = "WeaponAttacks"

	local projectiles = Instance.new("IntValue", leaderstats)
	projectiles.Name = "Projectiles"
	projectiles.Value = 0

	local currentProjectile = Instance.new("StringValue", leaderstats)
	currentProjectile.Name = "CurrentProjectile"
	currentProjectile.Value = "Shuriken"

	local QuestInformation = Instance.new("Folder", player)
	QuestInformation.Name = "QuestInformation"
	
	local attributes = Instance.new("Folder")
	attributes.Name = "Attributes"
	attributes.Parent = player
	
	local petBoostMultiplier = Instance.new("NumberValue", player)
	petBoostMultiplier.Name = "PetBoostMultiplier"
	petBoostMultiplier.Value = 1

	local hasReadTheTutorial = Instance.new("BoolValue", player)
	hasReadTheTutorial.Name = "HasReadTheTutorial"
	hasReadTheTutorial.Value = false

	local customizedCharacter = Instance.new("BoolValue", player)
	customizedCharacter.Name = "CustomizedCharacter"
	customizedCharacter.Value = false
	
	local loadingScreen = Instance.new("BoolValue", player)
	loadingScreen.Name = "LoadingScreen"
	loadingScreen.Value = false
	
	local ownsHouse = Instance.new("BoolValue", player)
	ownsHouse.Name = "OwnsHouse"
	ownsHouse.Value = false
	
	local yen = Instance.new("IntValue", leaderstats)
	yen.Name = "Yen"
	yen.Value = 0
	
	local soulPoints = Instance.new("IntValue", leaderstats)
	soulPoints.Name = "Souls"
	soulPoints.Value = 0
	
	local Level = Instance.new("IntValue", leaderstats)
	Level.Name = "Level"
	Level.Value = 1
	
	local XP = Instance.new("IntValue", leaderstats)
	XP.Name = "XP"
	XP.Value = 0
	
	local MaxXP = Instance.new("IntValue", leaderstats)
	MaxXP.Name = "MaxXP"
	MaxXP.Value = 100
	
	local rebirths = Instance.new("IntValue", leaderstats)
	rebirths.Name = "Rebirths"
	rebirths.Value = 0
	
	local rebirthTokens = Instance.new("IntValue", leaderstats)
	rebirthTokens.Name = "RebirthTokens"
	rebirthTokens.Value = 0
	
	local rebirthYenBoost = Instance.new("IntValue", leaderstats)
	rebirthYenBoost.Name = "RebirthYenBoost"
	rebirthYenBoost.Value = 1
	
	local stamina = Instance.new("IntValue", leaderstats)
	stamina.Name = "Stamina"
	stamina.Value = 100
	
	local maxStamina = Instance.new("IntValue", leaderstats)
	maxStamina.Name = "MaxStamina"
	maxStamina.Value = 100
	
	local timePlayed = Instance.new("IntValue", leaderstats)
	timePlayed.Name = "Time Played"
	timePlayed.Value = 0
	
	local pet = Instance.new("StringValue", leaderstats)
	pet.Name = "Pet"
	pet.Value = "None"
	
	local achievements = Instance.new("Folder", player)
	achievements.Name = "Achievements"
	
	local goldenShurikens = Instance.new("IntValue", achievements)
	goldenShurikens.Name = "GoldenShurikens"
	goldenShurikens.Value = 0
	
	local currentWeapon = Instance.new("StringValue", weapon)
	currentWeapon.Name = "CurrentWeapon"
	currentWeapon.Value = "None"
	
	local Items = Instance.new("Folder")
	Items.Name = "Items"
	Items.Parent = player
	
	local AzuraHorns = Instance.new("IntValue")
	AzuraHorns.Value = 5
	AzuraHorns.Name = "Azura Horns"
	AzuraHorns.Parent = Items
	
	local AzuraEyes = Instance.new("IntValue")
	AzuraEyes.Value = 3
	AzuraEyes.Name = "Azura Eyes"
	AzuraEyes.Parent = Items
	
	local AzuraTeeth = Instance.new("IntValue")
	AzuraTeeth.Value = 9
	AzuraTeeth.Name = "Azura Teeth"
	AzuraTeeth.Parent = Items
	
	local IceGem = Instance.new("IntValue")
	IceGem.Value = 2
	IceGem.Name = "Ice Gem"
	IceGem.Parent = Items
	
	local Title = Instance.new("StringValue", QuestInformation)
	Title.Name = "QuestTitle"
	Title.Value = "Default"

	local Task = Instance.new("StringValue", QuestInformation)
	Task.Name = "QuestTask"
	Task.Value = "Default"

	local Objective = Instance.new("IntValue", QuestInformation)
	Objective.Name = "QuestObjective"
	Objective.Value = 0

	local Progress = Instance.new("IntValue", QuestInformation)
	Progress.Name = "QuestProgress"
	Progress.Value = 0

	local Reward = Instance.new("IntValue", QuestInformation)
	Reward.Name = "QuestReward"
	Reward.Value = 0

	local Reward2 = Instance.new("IntValue", QuestInformation)
	Reward2.Name = "QuestReward2"
	Reward2.Value = 0
	
	local IsUsingAttack1 = Instance.new("BoolValue", attacks)
	IsUsingAttack1.Name = "IsUsingAttack1"
	IsUsingAttack1.Value = false
	
	local IsUsingAttack2 = Instance.new("BoolValue", attacks)
	IsUsingAttack2.Name = "IsUsingAttack2"
	IsUsingAttack2.Value = false
	
	local IsUsingAttack3 = Instance.new("BoolValue", attacks)
	IsUsingAttack3.Name = "IsUsingAttack3"
	IsUsingAttack3.Value = false
	
	local IsUsingAttack4 = Instance.new("BoolValue", attacks)
	IsUsingAttack4.Name = "IsUsingAttack4"
	IsUsingAttack4.Value = false
	
	local IsUsingAttack5 = Instance.new("BoolValue", attacks)
	IsUsingAttack5.Name = "IsUsingAttack5"
	IsUsingAttack5.Value = false
	
	local IsUsingAttack6 = Instance.new("BoolValue", attacks)
	IsUsingAttack6.Name = "IsUsingAttack6"
	IsUsingAttack6.Value = false

	local IsUsingAttack7 = Instance.new("BoolValue", attacks)
	IsUsingAttack7.Name = "IsUsingAttack7"
	IsUsingAttack7.Value = false
	
	local health = Instance.new("IntValue")
	health.Name = "Health"
	health.Parent = attributes
	health.Value = 0
	
	local attack = Instance.new("IntValue")
	attack.Name = "Attack"
	attack.Parent = attributes
	attack.Value = 0
	
	local speed = Instance.new("IntValue")
	speed.Name = "Speed"
	speed.Parent = attributes
	speed.Value = 0
	
	local maximumStamina = Instance.new("IntValue")
	maximumStamina.Name = "MaximumStamina"
	maximumStamina.Parent = attributes
	maximumStamina.Value = 0
	
	local WeaponNames = Instance.new("Folder", player)
	WeaponNames.Name = "WeaponNames"
	
	local Gamepasses = Instance.new("Folder")
	Gamepasses.Name = "Gamepasses"
	Gamepasses.Parent = player
	
	local InventorySlots = Instance.new("IntValue")
	InventorySlots.Name = "InventorySlots"
	InventorySlots.Parent = Gamepasses
	InventorySlots.Value = 3
	
	local Avatar = Instance.new("Folder")
	Avatar.Parent = player
	Avatar.Name = "Avatar"
	
	local Hair = Instance.new("StringValue")
	Hair.Parent = Avatar
	Hair.Name = "Hair"
	
	----------------------------------------------------------------------------------------------
	
	-- Attribute System

	local PointsUsed
	local PointsAvailable

	PointsUsed = (player.Attributes.Health.Value + player.Attributes.Speed.Value + player.Attributes.Attack.Value + player.Attributes.MaximumStamina.Value)
	PointsAvailable = player.leaderstats.Level.Value - PointsUsed

	-- player.leaderstats.Level.Changed:Connect(function()
		-- PointsUsed = player.Attributes.Health.Value + player.Attributes.Speed.Value + player.Attributes.Attack.Value + player.Attributes.MaximumStamina.Value
		-- PointsAvailable = player.leaderstats.Level.Value - PointsUsed
	-- end)

	HealthRemote.OnServerEvent:Connect(function(player)
		if PointsAvailable <= 0 then return end
		
		PointsUsed = (player.Attributes.Health.Value + player.Attributes.Speed.Value + player.Attributes.Attack.Value + player.Attributes.MaximumStamina.Value)
		PointsAvailable = player.leaderstats.Level.Value - PointsUsed
		player.Attributes.Health.Value += AttributeIncrement
		player.Character.Humanoid.MaxHealth = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
		player.Character.Humanoid.Health = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
	end)

	SpeedRemote.OnServerEvent:Connect(function(player)
		if player.Attributes.Speed.Value < speedCap then
			player.Attributes.Speed.Value += AttributeIncrement
			player.Character.Humanoid.WalkSpeed = StarterSpeed + (player.Attributes.Speed.Value * spdPerPoint)
		end
	end)

	AttackRemote.OnServerEvent:Connect(function(player)
		player.Attributes.Attack.Value += AttributeIncrement
	end)

	MaxStaminaRemote.OnServerEvent:Connect(function(player)
		player.Attributes.MaximumStamina.Value += AttributeIncrement
		player.leaderstats.Stamina.Value += maxStaminaPerPoint
		player.leaderstats.MaxStamina.Value += maxStaminaPerPoint
	end)

	ResetRemote.OnServerEvent:Connect(function(player)
		player.Attributes.Health.Value = 0
		player.Attributes.Attack.Value = 0
		player.Attributes.Speed.Value = 0
		player.Attributes.MaximumStamina.Value = 0
		player.Character.Humanoid.MaxHealth = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
		player.Character.Humanoid.Health = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
		player.Character.Humanoid.WalkSpeed = (StarterSpeed + player.Attributes.Speed.Value * spdPerPoint)
		player.leaderstats.MaxStamina.Value = starterMaxStamina
		player.leaderstats.Stamina.Value = starterMaxStamina
	end)
	
	----------------------------------------------------------------------------------------------

	-- Load House

	player.CharacterAdded:Connect(function(character)
		local function LoadHouse(player)
			local remote = SG:WaitForChild("HouseSystem"):WaitForChild("LoadHouseRemote")
			remote:FireAllClients()
		end
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Load Health
	
	player.CharacterAdded:Connect(function(character)
		wait(2)
		local humanoid = character:WaitForChild("Humanoid")
		humanoid.MaxHealth = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
		wait(0.25)
		humanoid.Health = humanoid.MaxHealth
	end)
	
	player.leaderstats.Level.Changed:Connect(function()
		local humanoid = character:WaitForChild("Humanoid")
		humanoid.MaxHealth = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Load Speed
	
	player.CharacterAdded:Connect(function(character)
		local humanoid = character:WaitForChild("Humanoid")
		humanoid.WalkSpeed = StarterSpeed + player.Attributes.Speed.Value
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Level Up System

	XP:GetPropertyChangedSignal('Value'):Connect(function()
		repeat
			if XP.Value >= MaxXP.Value then
				Level.Value += 1
				XP.Value -= MaxXP.Value
				MaxXP.Value *= 1.25
				character.Humanoid.MaxHealth = StarterHealth + ((Level.Value * HealthIncrementPerLevel) + (health.Value * hpPerPoint))
			end
		until XP.Value < MaxXP.Value
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Quest Reward System
	
	local rewarded = false

	Title.Changed:Connect(function()
			Progress.Changed:Connect(function()
			if Progress.Value >= Objective.Value and rewarded == false then
				rewarded = true
				local function GiveReward()
					player:WaitForChild("leaderstats"):WaitForChild("Yen").Value += Reward.Value
					player:WaitForChild("leaderstats"):WaitForChild("XP").Value += Reward2.Value
					Title.Value = "Default"
					Task.Value = "Default"
					Progress.Value = 0
					Objective.Value = 0
					Reward.Value = 0
					Reward2.Value = 0
					player:WaitForChild("PlayerGui"):WaitForChild("Notifications"):WaitForChild("CompletedQuest").Visible = true
					wait(2)
					player:WaitForChild("PlayerGui"):WaitForChild("Notifications"):WaitForChild("CompletedQuest").Visible = false
				end
				GiveReward()
				wait(0.001)
				remote:FireClient(player, "CancelQuest")
				wait(0.5)
				rewarded = false
			end
		end)
	end)
	
	----------------------------------------------------------------------------------------------

	-- DataStore (Joining)

	local data
	
	local Success, ErrorMessage = pcall(function()
		data = DataStore:GetAsync(playerID)
	end)

	if Success then
		player.leaderstats.Yen.Value = data.Yen -- Saves
		player.leaderstats.Souls.Value = data.Souls -- Saves
		player.leaderstats.Level.Value = data.Level -- Saves
		player.leaderstats.Rebirths.Value = data.Rebirths -- Saves
		player.leaderstats.RebirthTokens.Value = data.RebirthTokens -- Saves
		player.leaderstats.RebirthYenBoost.Value = data.RebirthYenBoost -- Saves
		player.PetBoostMultiplier.Value = data.PetBoostMultiplier -- Saves
		player.leaderstats["Time Played"].Value = data.TimePlayed -- Saves
		
		player.Achievements.GoldenShurikens.Value = data.GoldenShurikens -- Saves
		
		player.Attributes.Health.Value = data.Health -- Saves
		player.Attributes.Speed.Value = data.Speed -- Saves
		player.Attributes.Attack.Value = data.Attack -- Saves
		player.Attributes.MaximumStamina.Value = data.MaximumStamina -- Saves
		
		player.leaderstats.MaxStamina.Value = data.MaxStamina -- Saves
		
		player.Weapon.CurrentWeapon.Value = data.CurrentWeapon -- Saves
		
		player.leaderstats.Pet.Value = data.Pet -- Saves
		
		player.OwnsHouse.Value = data.House -- Saves
		
		player.Avatar.Hair.Value = data.Hair -- Saves
		
		player.leaderstats.Projectiles.Value = data.Projectiles -- Saves
		player.leaderstats.CurrentProjectile.Value = data.CurrentProjectile -- Saves
		
		player.Gamepasses.InventorySlots.Value = data.InventorySlots
		
		player.QuestInformation.QuestTitle.Value = data.QuestTitle -- Saves
		player.QuestInformation.QuestTask.Value = data.QuestTask -- Saves
		player.QuestInformation.QuestObjective.Value = data.QuestObjective -- Saves
		player.QuestInformation.QuestProgress.Value = data.QuestProgress -- Saves
		player.QuestInformation.QuestReward.Value = data.QuestReward -- Saves
		player.QuestInformation.QuestReward2.Value = data.QuestReward2 -- Saves
		
		player.CustomizedCharacter.Value = data.CustomizedCharacter -- Saves
		player.HasReadTheTutorial.Value = data.HasReadTheTutorial -- Saves
		
		player.leaderstats.MaxXP.Value = data.MaxXP
		player.leaderstats.XP.Value = data.XP
	else
		print("An error has occured whilst loading your data.")
		warn(ErrorMessage)
	end
	
	----------------------------------------------------------------------------------------------
	
	-- Tool DataStore
	
	local toolData = ToolDataStore:GetAsync(playerID)
	
	if toolData ~= nil then
		for i, v in pairs(toolData) do
			for i, weaponFolder in pairs(Weapons:GetChildren()) do
				if weaponFolder:FindFirstChild(v) and backpack:FindFirstChild(v) == nil and starterGear:FindFirstChild(v) == nil then
					weaponFolder:FindFirstChild(v):Clone().Parent = backpack
					weaponFolder:FindFirstChild(v):Clone().Parent = starterGear
				end
			end
		end
	end
	
	player.CharacterRemoving:Connect(function(char)
		char:WaitForChild("Humanoid"):UnequipTools()
	end)
	
end)

----------------------------------------------------------------------------------------------

-- DataStore (Leaving)

game.Players.PlayerRemoving:Connect(function(player)
	
	local ToolTable = {}
	local Data = {
		Yen = player.leaderstats.Yen.Value, -- Saves
		Souls = player.leaderstats.Souls.Value, -- Saves
		Level = player.leaderstats.Level.Value, -- Saves
		Rebirths = player.leaderstats.Rebirths.Value, -- Saves
		RebirthTokens = player.leaderstats.RebirthTokens.Value, -- Saves
		RebirthYenBoost = player.leaderstats.RebirthYenBoost.Value, -- Saves
		PetBoostMultiplier = player.PetBoostMultiplier.Value, -- Saves
		TimePlayed = player.leaderstats["Time Played"].Value, -- Saves
		
		GoldenShurikens = player.Achievements.GoldenShurikens.Value, -- Saves
		
		Health = player.Attributes.Health.Value, -- Saves
		Speed = player.Attributes.Speed.Value, -- Saves
		Attack = player.Attributes.Attack.Value, -- Saves
		MaximumStamina = player.Attributes.MaximumStamina.Value, -- Saves
		
		MaxStamina = player.leaderstats.MaxStamina.Value, -- Saves
		
		CurrentWeapon = player.Weapon.CurrentWeapon.Value, -- Saves
		
		Pet = player.leaderstats.Pet.Value, -- Saves
		
		House = player.OwnsHouse.Value, -- Saves
		
		Hair = player.Avatar.Hair.Value, -- Saves
		
		Projectiles = player.leaderstats.Projectiles.Value, -- Saves
		CurrentProjectile = player.leaderstats.CurrentProjectile.Value, -- Saves
		
		InventorySlots = player.Gamepasses.InventorySlots.Value,
		
		QuestTitle = player.QuestInformation.QuestTitle.Value, -- Saves
		QuestTask = player.QuestInformation.QuestTask.Value, -- Saves
		QuestObjective = player.QuestInformation.QuestObjective.Value, -- Saves
		QuestProgress = player.QuestInformation.QuestProgress.Value, -- Saves
		QuestReward = player.QuestInformation.QuestReward.Value, -- Saves
		QuestReward2 = player.QuestInformation.QuestReward2.Value, -- Saves
		
		CustomizedCharacter = player.CustomizedCharacter.Value, -- Saves
		HasReadTheTutorial = player.HasReadTheTutorial.Value, -- Saves
		
		MaxXP = player.leaderstats.MaxXP.Value,
		XP = player.leaderstats.XP.Value
	}

	for i, v in pairs(player.Backpack:GetChildren()) do
		table.insert(ToolTable, v.Name)
	end

	local Success, ErrorMessage = pcall(function()
		DataStore:SetAsync(player.UserId, Data)
	end)

	if Success then
		print("Data successfully saved!")
		print(TablePrinterModule(Data))
	else
		print("An error has occured whilst loading your data.")
		warn(ErrorMessage)
	end
	
	if ToolDataStore ~= nil then
		ToolDataStore:SetAsync(player.UserId, ToolTable)
	end
	
end)

----------------------------------------------------------------------------------------------

-- Enable DataStore in studio

game:BindToClose(function()
	if game:GetService('RunService'):IsStudio() then
		wait(2)
	end
end)
ResetButton Script (Client)
-- Services

local remote = game:GetService("ReplicatedStorage"):WaitForChild("AttributeRemotes"):WaitForChild("Reset")

----------------------------------------------

-- Variables

local player = game.Players.LocalPlayer
local points = player:WaitForChild("leaderstats"):WaitForChild("Level")

----------------------------------------------

-- Functions

script.Parent.Activated:Connect(function()
	
	script.Parent.Parent:WaitForChild("Attack"):WaitForChild("Value").Text = 0
	script.Parent.Parent:WaitForChild("Health"):WaitForChild("Value").Text = 0
	script.Parent.Parent:WaitForChild("MaxStamina"):WaitForChild("Value").Text = 0
	script.Parent.Parent:WaitForChild("Speed"):WaitForChild("Value").Text = 0
	script.Parent.Parent:WaitForChild("Total"):WaitForChild("Value").Text = points.Value

	remote:FireServer()
end)

----------------

-- Update

local function UpdateGui()
	script.Parent.Parent:WaitForChild("Total"):WaitForChild("Value").Text = points.Value
	script.Parent.Parent:WaitForChild("Health"):WaitForChild("Value").Text = player:WaitForChild("Attributes"):WaitForChild("Health").Value
	script.Parent.Parent:WaitForChild("MaxStamina"):WaitForChild("Value").Text = player:WaitForChild("Attributes"):WaitForChild("MaximumStamina").Value
	script.Parent.Parent:WaitForChild("Speed"):WaitForChild("Value").Text = player:WaitForChild("Attributes"):WaitForChild("Speed").Value
	script.Parent.Parent:WaitForChild("Attack"):WaitForChild("Value").Text = player:WaitForChild("Attributes"):WaitForChild("Attack").Value
end

UpdateGui()

player.CharacterAdded:Connect(function(character)
	wait(3)
	UpdateGui()
end)

game.Players.PlayerAdded:Connect(function(player)
	wait(3)
	UpdateGui()
end)
Screenshots

image
image


Any help is very appreciated!

2 Likes

this issue only happens when you join on a server with a player?

1 Like

It also happens when leveling up

Show me all scripts related to the leveling up and points system

1 Like

Everything is in the leaderstats script that I provided.

The leveling up is this part of the code :

The Points System is in this part :

These lines are before the player data has even loaded

1 Like

I tried putting the Attribute System under the DataStore Loading part but unfortunately didn’t work.

We’re still happy that you tried to help us, thanks.


We tried a bunch of stuff. This is the current code we have, if you’re interested…

Here it is
-- Services

local RS = game:GetService("ReplicatedStorage")
local TS = game:GetService("TweenService")
local PLRS = game:GetService("Players")
local SSS = game:GetService("ServerScriptService")
local SS = game:GetService("ServerStorage")
local LIGHTNING = game:GetService("Lighting")
local SG = game:GetService("StarterGui")
local SP = game:GetService("StarterPack")

----------------------------------------------------------------------------------------------

-- DataStore Variables

local DataStoreService = game:GetService("DataStoreService")

local DataStore = DataStoreService:GetDataStore("DataStore")
local ToolDataStore = DataStoreService:GetDataStore("ToolDataStore")

----------------------------------------------------------------------------------------------

-- Variables

local TablePrinterModule = require(3148021300)

local Pets = game:GetService("ReplicatedStorage"):WaitForChild("Pets")
local PlayerPets = workspace:WaitForChild("Pets")

local Weapons = SS:WaitForChild("Weapons")

local HealthRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddHealth")
local SpeedRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddSpeed")
local AttackRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddAttack")
local MaxStaminaRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("AddMaxStamina")
local ResetRemote = RS:WaitForChild("AttributeRemotes"):WaitForChild("Reset")

----------------------------------------------------------------------------------------------

-- Values

local StarterSpeed = game:GetService("ReplicatedStorage"):WaitForChild("CurrentWalkSpeed").Value
local StarterHealth = 100
local StarterJumpPower = 50
local starterMaxStamina = 100

local spdPerPoint = 0.5
local hpPerPoint = 10
local jumpPowerPerPoint = 1
local maxStaminaPerPoint = 10

local speedCap = 80
local jumpCap = 120

local HealthIncrementPerLevel = 5
local AttributeIncrement = 1

----------------------------------------------------------------------------------------------

-- Cancel Quest

local remote = game:GetService("ReplicatedStorage"):WaitForChild("QuestRemote")

remote.OnServerEvent:Connect(function(player, val)
	local questInfoF = player:WaitForChild("QuestInformation")
	if val == "CancelQuest" then
		for i, v in pairs(questInfoF:GetChildren()) do
			if v.className == "StringValue" then
				v.Value = "Default"
			elseif v.className == "IntValue" then
				v.Value = 0
			end
		end
	end
end)

----------------------------------------------------------------------------------------------

game.Players.PlayerAdded:Connect(function(player)
	
	player.PlayerGui:WaitForChild("Sounds"):WaitForChild("GameMusic"):Play()
	
	----------------------------------------------------------------------------------------------
	
	-- Variables
	
	local playerID = player.UserId
	local character = player.Character
	local playerGui = player.PlayerGui
	local backpack = player:WaitForChild("Backpack")
	local starterGear = player:WaitForChild("StarterGear")
	
	----------------------------------------------------------------------------------------------
	
	-- Stats
	
	local leaderstats = Instance.new("Folder", player)
	leaderstats.Name = "leaderstats"
	
	local weapon = Instance.new("Folder", player)
	weapon.Name = "Weapon"
	
	local attacks = Instance.new("Folder", weapon)
	attacks.Name = "WeaponAttacks"

	local projectiles = Instance.new("IntValue", leaderstats)
	projectiles.Name = "Projectiles"
	projectiles.Value = 0

	local currentProjectile = Instance.new("StringValue", leaderstats)
	currentProjectile.Name = "CurrentProjectile"
	currentProjectile.Value = "Shuriken"

	local QuestInformation = Instance.new("Folder", player)
	QuestInformation.Name = "QuestInformation"
	
	local attributes = Instance.new("Folder")
	attributes.Name = "Attributes"
	attributes.Parent = player
	
	local petBoostMultiplier = Instance.new("NumberValue", player)
	petBoostMultiplier.Name = "PetBoostMultiplier"
	petBoostMultiplier.Value = 1

	local hasReadTheTutorial = Instance.new("BoolValue", player)
	hasReadTheTutorial.Name = "HasReadTheTutorial"
	hasReadTheTutorial.Value = false

	local customizedCharacter = Instance.new("BoolValue", player)
	customizedCharacter.Name = "CustomizedCharacter"
	customizedCharacter.Value = false
	
	local loadingScreen = Instance.new("BoolValue", player)
	loadingScreen.Name = "LoadingScreen"
	loadingScreen.Value = false
	
	local ownsHouse = Instance.new("BoolValue", player)
	ownsHouse.Name = "OwnsHouse"
	ownsHouse.Value = false
	
	local yen = Instance.new("IntValue", leaderstats)
	yen.Name = "Yen"
	yen.Value = 0
	
	local soulPoints = Instance.new("IntValue", leaderstats)
	soulPoints.Name = "Souls"
	soulPoints.Value = 0
	
	local Level = Instance.new("IntValue", leaderstats)
	Level.Name = "Level"
	Level.Value = 1
	
	local XP = Instance.new("IntValue", leaderstats)
	XP.Name = "XP"
	XP.Value = 0
	
	local MaxXP = Instance.new("IntValue", leaderstats)
	MaxXP.Name = "MaxXP"
	MaxXP.Value = 100
	
	local rebirths = Instance.new("IntValue", leaderstats)
	rebirths.Name = "Rebirths"
	rebirths.Value = 0
	
	local rebirthTokens = Instance.new("IntValue", leaderstats)
	rebirthTokens.Name = "RebirthTokens"
	rebirthTokens.Value = 0
	
	local rebirthYenBoost = Instance.new("IntValue", leaderstats)
	rebirthYenBoost.Name = "RebirthYenBoost"
	rebirthYenBoost.Value = 1
	
	local stamina = Instance.new("IntValue", leaderstats)
	stamina.Name = "Stamina"
	stamina.Value = 100
	
	local maxStamina = Instance.new("IntValue", leaderstats)
	maxStamina.Name = "MaxStamina"
	maxStamina.Value = 100
	
	local timePlayed = Instance.new("IntValue", leaderstats)
	timePlayed.Name = "Time Played"
	timePlayed.Value = 0
	
	local pet = Instance.new("StringValue", leaderstats)
	pet.Name = "Pet"
	pet.Value = "None"
	
	local achievements = Instance.new("Folder", player)
	achievements.Name = "Achievements"
	
	local goldenShurikens = Instance.new("IntValue", achievements)
	goldenShurikens.Name = "GoldenShurikens"
	goldenShurikens.Value = 0
	
	local currentWeapon = Instance.new("StringValue", weapon)
	currentWeapon.Name = "CurrentWeapon"
	currentWeapon.Value = "None"
	
	local Items = Instance.new("Folder")
	Items.Name = "Items"
	Items.Parent = player
	
	local AzuraHorns = Instance.new("IntValue")
	AzuraHorns.Value = 5
	AzuraHorns.Name = "Azura Horns"
	AzuraHorns.Parent = Items
	
	local AzuraEyes = Instance.new("IntValue")
	AzuraEyes.Value = 3
	AzuraEyes.Name = "Azura Eyes"
	AzuraEyes.Parent = Items
	
	local AzuraTeeth = Instance.new("IntValue")
	AzuraTeeth.Value = 9
	AzuraTeeth.Name = "Azura Teeth"
	AzuraTeeth.Parent = Items
	
	local IceGem = Instance.new("IntValue")
	IceGem.Value = 2
	IceGem.Name = "Ice Gem"
	IceGem.Parent = Items
	
	local Title = Instance.new("StringValue", QuestInformation)
	Title.Name = "QuestTitle"
	Title.Value = "Default"

	local Task = Instance.new("StringValue", QuestInformation)
	Task.Name = "QuestTask"
	Task.Value = "Default"

	local Objective = Instance.new("IntValue", QuestInformation)
	Objective.Name = "QuestObjective"
	Objective.Value = 0

	local Progress = Instance.new("IntValue", QuestInformation)
	Progress.Name = "QuestProgress"
	Progress.Value = 0

	local Reward = Instance.new("IntValue", QuestInformation)
	Reward.Name = "QuestReward"
	Reward.Value = 0

	local Reward2 = Instance.new("IntValue", QuestInformation)
	Reward2.Name = "QuestReward2"
	Reward2.Value = 0
	
	local IsUsingAttack1 = Instance.new("BoolValue", attacks)
	IsUsingAttack1.Name = "IsUsingAttack1"
	IsUsingAttack1.Value = false
	
	local IsUsingAttack2 = Instance.new("BoolValue", attacks)
	IsUsingAttack2.Name = "IsUsingAttack2"
	IsUsingAttack2.Value = false
	
	local IsUsingAttack3 = Instance.new("BoolValue", attacks)
	IsUsingAttack3.Name = "IsUsingAttack3"
	IsUsingAttack3.Value = false
	
	local IsUsingAttack4 = Instance.new("BoolValue", attacks)
	IsUsingAttack4.Name = "IsUsingAttack4"
	IsUsingAttack4.Value = false
	
	local IsUsingAttack5 = Instance.new("BoolValue", attacks)
	IsUsingAttack5.Name = "IsUsingAttack5"
	IsUsingAttack5.Value = false
	
	local IsUsingAttack6 = Instance.new("BoolValue", attacks)
	IsUsingAttack6.Name = "IsUsingAttack6"
	IsUsingAttack6.Value = false

	local IsUsingAttack7 = Instance.new("BoolValue", attacks)
	IsUsingAttack7.Name = "IsUsingAttack7"
	IsUsingAttack7.Value = false
	
	local health = Instance.new("IntValue")
	health.Name = "Health"
	health.Parent = attributes
	health.Value = 0
	
	local attack = Instance.new("IntValue")
	attack.Name = "Attack"
	attack.Parent = attributes
	attack.Value = 0
	
	local speed = Instance.new("IntValue")
	speed.Name = "Speed"
	speed.Parent = attributes
	speed.Value = 0
	
	local maximumStamina = Instance.new("IntValue")
	maximumStamina.Name = "MaximumStamina"
	maximumStamina.Parent = attributes
	maximumStamina.Value = 0
	
	local WeaponNames = Instance.new("Folder", player)
	WeaponNames.Name = "WeaponNames"
	
	local Gamepasses = Instance.new("Folder")
	Gamepasses.Name = "Gamepasses"
	Gamepasses.Parent = player
	
	local InventorySlots = Instance.new("IntValue")
	InventorySlots.Name = "InventorySlots"
	InventorySlots.Parent = Gamepasses
	InventorySlots.Value = 3
	
	local Avatar = Instance.new("Folder")
	Avatar.Parent = player
	Avatar.Name = "Avatar"
	
	local Hair = Instance.new("StringValue")
	Hair.Parent = Avatar
	Hair.Name = "Hair"
	
	----------------------------------------------------------------------------------------------

	-- DataStore (Joining)

	local data

	local Success, ErrorMessage = pcall(function()
		data = DataStore:GetAsync(playerID)
	end)

	if Success then
		player.leaderstats.Yen.Value = data.Yen -- Saves
		player.leaderstats.Souls.Value = data.Souls -- Saves
		player.leaderstats.Level.Value = data.Level -- Saves
		player.leaderstats.Rebirths.Value = data.Rebirths -- Saves
		player.leaderstats.RebirthTokens.Value = data.RebirthTokens -- Saves
		player.leaderstats.RebirthYenBoost.Value = data.RebirthYenBoost -- Saves
		player.PetBoostMultiplier.Value = data.PetBoostMultiplier -- Saves
		player.leaderstats["Time Played"].Value = data.TimePlayed -- Saves

		player.Achievements.GoldenShurikens.Value = data.GoldenShurikens -- Saves

		player.Attributes.Health.Value = data.Health -- Saves
		player.Attributes.Speed.Value = data.Speed -- Saves
		player.Attributes.Attack.Value = data.Attack -- Saves
		player.Attributes.MaximumStamina.Value = data.MaximumStamina -- Saves

		player.leaderstats.MaxStamina.Value = data.MaxStamina -- Saves

		player.Weapon.CurrentWeapon.Value = data.CurrentWeapon -- Saves

		player.leaderstats.Pet.Value = data.Pet -- Saves

		player.OwnsHouse.Value = data.House -- Saves

		player.Avatar.Hair.Value = data.Hair -- Saves

		player.leaderstats.Projectiles.Value = data.Projectiles -- Saves
		player.leaderstats.CurrentProjectile.Value = data.CurrentProjectile -- Saves

		player.Gamepasses.InventorySlots.Value = data.InventorySlots

		player.QuestInformation.QuestTitle.Value = data.QuestTitle -- Saves
		player.QuestInformation.QuestTask.Value = data.QuestTask -- Saves
		player.QuestInformation.QuestObjective.Value = data.QuestObjective -- Saves
		player.QuestInformation.QuestProgress.Value = data.QuestProgress -- Saves
		player.QuestInformation.QuestReward.Value = data.QuestReward -- Saves
		player.QuestInformation.QuestReward2.Value = data.QuestReward2 -- Saves

		-- player.CustomizedCharacter.Value = data.CustomizedCharacter -- Saves
		-- player.HasReadTheTutorial.Value = data.HasReadTheTutorial -- Saves

		player.leaderstats.MaxXP.Value = data.MaxXP
		player.leaderstats.XP.Value = data.XP
	else
		print("An error has occured whilst loading your data.")
		warn(ErrorMessage)
	end

	----------------------------------------------------------------------------------------------

	-- Tool DataStore

	local toolData = ToolDataStore:GetAsync(playerID)

	if toolData ~= nil then
		for i, v in pairs(toolData) do
			for i, weaponFolder in pairs(Weapons:GetChildren()) do
				if weaponFolder:FindFirstChild(v) and backpack:FindFirstChild(v) == nil and starterGear:FindFirstChild(v) == nil then
					weaponFolder:FindFirstChild(v):Clone().Parent = backpack
					weaponFolder:FindFirstChild(v):Clone().Parent = starterGear
				end
			end
		end
	end

	player.CharacterRemoving:Connect(function(char)
		char:WaitForChild("Humanoid"):UnequipTools()
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Attribute System

	local PointsUsed
	local PointsAvailable
	
	while wait() do
		PointsUsed = (player.Attributes.Health.Value + player.Attributes.Speed.Value + player.Attributes.Attack.Value + player.Attributes.MaximumStamina.Value)
		PointsAvailable = Level.Value - PointsUsed
	end
	
	HealthRemote.OnServerEvent:Connect(function(plr)
		if PointsAvailable <= 0 then return end
		plr.Attributes.Health.Value += AttributeIncrement
		plr.Character.Humanoid.MaxHealth = StarterHealth + (plr.leaderstats.Level.Value * HealthIncrementPerLevel) + (plr.Attributes.Health.Value * hpPerPoint)
		plr.Character.Humanoid.Health = StarterHealth + (plr.leaderstats.Level.Value * HealthIncrementPerLevel) + (plr.Attributes.Health.Value * hpPerPoint)
	end)
	
	SpeedRemote.OnServerEvent:Connect(function(plr)
		if PointsAvailable <= 0 then return end
		if plr.Attributes.Speed.Value < speedCap then
			plr.Attributes.Speed.Value += AttributeIncrement
			plr.Character.Humanoid.WalkSpeed = StarterSpeed + (plr.Attributes.Speed.Value * spdPerPoint)
		end
	end)
	
	AttackRemote.OnServerEvent:Connect(function(plr)
		if PointsAvailable <= 0 then return end
		plr.Attributes.Attack.Value += AttributeIncrement
	end)
	
	MaxStaminaRemote.OnServerEvent:Connect(function(plr)
		if PointsAvailable <= 0 then return end
		plr.Attributes.MaximumStamina.Value += AttributeIncrement
		plr.leaderstats.Stamina.Value += maxStaminaPerPoint
		plr.leaderstats.MaxStamina.Value += maxStaminaPerPoint
	end)
	
	ResetRemote.OnServerEvent:Connect(function(plr)
		plr.Attributes.Health.Value = 0
		plr.Attributes.Attack.Value = 0
		plr.Attributes.Speed.Value = 0
		plr.Attributes.MaximumStamina.Value = 0
		plr.Character.Humanoid.MaxHealth = StarterHealth + (plr.leaderstats.Level.Value * HealthIncrementPerLevel) + (plr.Attributes.Health.Value * hpPerPoint)
		plr.Character.Humanoid.Health = StarterHealth + (plr.leaderstats.Level.Value * HealthIncrementPerLevel) + (plr.Attributes.Health.Value * hpPerPoint)
		plr.Character.Humanoid.WalkSpeed = (StarterSpeed + plr.Attributes.Speed.Value * spdPerPoint)
		plr.leaderstats.MaxStamina.Value = starterMaxStamina
		plr.leaderstats.Stamina.Value = starterMaxStamina
	end)
	
	----------------------------------------------------------------------------------------------

	-- Load House

	player.CharacterAdded:Connect(function(character)
		local function LoadHouse(player)
			local remote = SG:WaitForChild("HouseSystem"):WaitForChild("LoadHouseRemote")
			remote:FireAllClients()
		end
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Load Health
	
	player.CharacterAdded:Connect(function(character)
		local humanoid = character:WaitForChild("Humanoid")
		humanoid.MaxHealth = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
		humanoid.Health = humanoid.MaxHealth
	end)
	
	player.leaderstats.Level.Changed:Connect(function()
		local humanoid = character:WaitForChild("Humanoid")
		humanoid.MaxHealth = StarterHealth + (player.leaderstats.Level.Value * HealthIncrementPerLevel) + (player.Attributes.Health.Value * hpPerPoint)
		humanoid.Health = humanoid.MaxHealth
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Load Speed
	
	player.CharacterAdded:Connect(function(character)
		local humanoid = character:WaitForChild("Humanoid")
		humanoid.WalkSpeed = StarterSpeed + player.Attributes.Speed.Value
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Level Up System

	XP:GetPropertyChangedSignal('Value'):Connect(function()
		repeat
			if XP.Value >= MaxXP.Value then
				Level.Value += 1
				XP.Value -= MaxXP.Value
				MaxXP.Value *= 1.25
				character.Humanoid.MaxHealth = StarterHealth + ((Level.Value * HealthIncrementPerLevel) + (health.Value * hpPerPoint))
			end
		until XP.Value < MaxXP.Value
	end)
	
	----------------------------------------------------------------------------------------------
	
	-- Quest Reward System
	
	local rewarded = false

	Title.Changed:Connect(function()
			Progress.Changed:Connect(function()
			if Progress.Value >= Objective.Value and rewarded == false then
				rewarded = true
				local function GiveReward()
					player:WaitForChild("leaderstats"):WaitForChild("Yen").Value += Reward.Value
					player:WaitForChild("leaderstats"):WaitForChild("XP").Value += Reward2.Value
					Title.Value = "Default"
					Task.Value = "Default"
					Progress.Value = 0
					Objective.Value = 0
					Reward.Value = 0
					Reward2.Value = 0
					player:WaitForChild("PlayerGui"):WaitForChild("Notifications"):WaitForChild("CompletedQuest").Visible = true
					wait(2)
					player:WaitForChild("PlayerGui"):WaitForChild("Notifications"):WaitForChild("CompletedQuest").Visible = false
				end
				GiveReward()
				wait(0.001)
				remote:FireClient(player, "CancelQuest")
				wait(0.5)
				rewarded = false
			end
		end)
	end)
	
end)
	
----------------------------------------------------------------------------------------------

-- DataStore (Leaving)

game.Players.PlayerRemoving:Connect(function(player)
	
	local ToolTable = {}
	local Data = {
		Yen = player.leaderstats.Yen.Value, -- Saves
		Souls = player.leaderstats.Souls.Value, -- Saves
		Level = player.leaderstats.Level.Value, -- Saves
		Rebirths = player.leaderstats.Rebirths.Value, -- Saves
		RebirthTokens = player.leaderstats.RebirthTokens.Value, -- Saves
		RebirthYenBoost = player.leaderstats.RebirthYenBoost.Value, -- Saves
		PetBoostMultiplier = player.PetBoostMultiplier.Value, -- Saves
		TimePlayed = player.leaderstats["Time Played"].Value, -- Saves
		
		GoldenShurikens = player.Achievements.GoldenShurikens.Value, -- Saves
		
		Health = player.Attributes.Health.Value, -- Saves
		Speed = player.Attributes.Speed.Value, -- Saves
		Attack = player.Attributes.Attack.Value, -- Saves
		MaximumStamina = player.Attributes.MaximumStamina.Value, -- Saves
		
		MaxStamina = player.leaderstats.MaxStamina.Value, -- Saves
		
		CurrentWeapon = player.Weapon.CurrentWeapon.Value, -- Saves
		
		Pet = player.leaderstats.Pet.Value, -- Saves
		
		House = player.OwnsHouse.Value, -- Saves
		
		Hair = player.Avatar.Hair.Value, -- Saves
		
		Projectiles = player.leaderstats.Projectiles.Value, -- Saves
		CurrentProjectile = player.leaderstats.CurrentProjectile.Value, -- Saves
		
		InventorySlots = player.Gamepasses.InventorySlots.Value,
		
		QuestTitle = player.QuestInformation.QuestTitle.Value, -- Saves
		QuestTask = player.QuestInformation.QuestTask.Value, -- Saves
		QuestObjective = player.QuestInformation.QuestObjective.Value, -- Saves
		QuestProgress = player.QuestInformation.QuestProgress.Value, -- Saves
		QuestReward = player.QuestInformation.QuestReward.Value, -- Saves
		QuestReward2 = player.QuestInformation.QuestReward2.Value, -- Saves
		
		-- CustomizedCharacter = player.CustomizedCharacter.Value, -- Saves
		-- HasReadTheTutorial = player.HasReadTheTutorial.Value, -- Saves
		
		MaxXP = player.leaderstats.MaxXP.Value,
		XP = player.leaderstats.XP.Value
	}

	for i, v in pairs(player.Backpack:GetChildren()) do
		table.insert(ToolTable, v.Name)
	end

	local Success, ErrorMessage = pcall(function()
		DataStore:SetAsync(player.UserId, Data)
	end)

	if Success then
		print("Data successfully saved!")
		print(TablePrinterModule(Data))
	else
		print("An error has occured whilst loading your data.")
		warn(ErrorMessage)
	end
	
	if ToolDataStore ~= nil then
		ToolDataStore:SetAsync(player.UserId, ToolTable)
	end
	
end)

----------------------------------------------------------------------------------------------

-- Enable DataStore in studio

game:BindToClose(function()
	if game:GetService('RunService'):IsStudio() then
		wait(2)
	end
end)