Character Added Being Spammed

Hello, I’m trying to make it so it changes the character on being spawned to one that is skinned mesh, with data save.
However, the character added keeps being spammed :frowning:

I hope the script makes sense, even tho it’s a little messy :stuck_out_tongue:

local var = require(game:GetService("ServerScriptService").ServerVariables)
local DH = var.CustomService.DataHandler
local PS = game:GetService("PhysicsService")


--//Functions


--Data

local function DataStart(Player)
	local NewPlayer = DH.PlayerEntered(Player)
end

local function DataLeave(Player)
	DH.PlayerLeave(Player)
end

--Collsion Group
local function SetCollisionGroup(Parts,CG)
	assert(type(Parts) == "table", "Parts must be an array of parts!");
	for _, Part in ipairs(Parts) do
		if (Part:IsA("BasePart")) then
			PS:SetPartCollisionGroup(Part, CG);
		end
	end
end

PS:CreateCollisionGroup("mobs")
PS:CreateCollisionGroup("players")
PS:CollisionGroupSetCollidable("players", "players", false) 
PS:CollisionGroupSetCollidable("mobs", "mobs", false) 
PS:CollisionGroupSetCollidable("mobs", "players", false) 
--//MainFunctions

--Added
local dontrepeat

function ChangeRig(Player)
	local rig = var.Service.RS.Characters[DH[Player.UserId].Characters.CurrentModel]:Clone()
	rig.Parent = workspace
	rig.Humanoid.Health = 100
	rig.Humanoid.NameDisplayDistance = 0
	rig.Humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
	rig.Humanoid.BreakJointsOnDeath = false
	rig.HumanoidRootPart.CFrame = Player.Character.HumanoidRootPart.CFrame
	rig.Name = Player.Name
	Player.Character = rig
end

function CharacterAdded(char)
	--//char
	warn("CharacterAdded")
	game:GetService("RunService").Stepped:wait()
	
	local Player = game.Players:GetPlayerFromCharacter(char)
	local System = script.StarterCharacter.System:Clone()
	
	ChangeRig(Player)
	char = Player.Character
	SetCollisionGroup(char:GetDescendants(),"players")
	
	var.Remotes.Joining.SetCharacter:FireClient(Player,Player.Character)
--	System.Parent = Player.Character
	--//Tools
	Player.Backpack:ClearAllChildren()
	for i,toolname in pairs (DH[Player.UserId].Weapons.Current) do
		local tool = var.Service.RS.Items[toolname]:Clone()
		tool.ToolTip = i
		tool.CanBeDropped = false
		tool.Parent = Player.Backpack
		print("Added tool: "..toolname)
	end

	char.DescendantAdded:Connect(function(AddedObj)
		if AddedObj:IsA('BasePart') then 
			PS:SetPartCollisionGroup(AddedObj, "players") -- Setting The Part's CollisionGroup ID
		end			
	end)
	char:WaitForChild("Humanoid").Died:Connect(function()
		print(Player.Name.."Has died")
		for i,v in pairs (char:GetDescendants()) do
			if v:IsA("MeshPart") then
				--v.Color = Color3.new(1, 0.666667, 1)
				v.TextureID = " "
			    v.Material = Enum.Material.Neon
				coroutine.wrap(function()
					require(game:GetService("ReplicatedStorage").Scripts.Tween)(v, {Transparency = 1},{Time = 4},true)
				end)()
			elseif v:IsA("Decal")then
				v:Destroy()
			end
		end
	
		wait(10)
		char:Destroy()
		wait(5)
		Player:LoadCharacter()
	end)
end


function PlayerAdded(Player)
	DataStart(Player)	
	CharacterAdded(Player.Character)
	Player.CharacterAdded:Connect(CharacterAdded)
end



--Removed
function PlayerRemoved(Player)
	DataLeave(Player)
end

This function calls these two events first:

  • Player.Character sets
  • Player.CharacterAdded fires

So you are calling it in your PlayerAdded() function which then calls Player:LoadCharacter(), which then calls Player.CharacterAdded which you have hooked to your PlayerAdded() function so this whole thing just keeps repeating.