Whenever you go on the arena it keeps giving you the sword, deleting it, giving it back, over and over and I don't know why because I added checks if the player is still touching the arena and if they still have the sword.

Doesn't print any errors or anything

Server script:



local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")

local TouchEvent = ReplicatedStorage:WaitForChild("ToolEvent")
local Areas = workspace:FindFirstChild("SwordFightZone")

game.Players.PlayerAdded:Connect(function(Player)
	local Folder = Instance.new('Folder')
	Folder.Name = Player.Name.. "'s Tools"
	Folder.Parent = game.ReplicatedStorage
end)

local function FireRemote(plr,val)
	local itemname = plr:WaitForChild("Sword")
	local item = ReplicatedStorage:WaitForChild("Swords"):FindFirstChild(itemname.Value)
	if val == 'steppedOn' then
		local Character = plr.Character
		local hasSword = false
		
		for i,v in pairs(Character:GetChildren()) do
			if v:IsA("Tool") and v.Name == item.Name then
				hasSword = true
			end
		end
		
		for i,v in pairs(plr:WaitForChild("Backpack"):GetChildren()) do
			if v:IsA("Tool") and v.Name == item.Name then
				hasSword = true
			end
		end

		local stillTouching = false

		for _,v in pairs(Character:FindFirstChild("HumanoidRootPart"):GetTouchingParts()) do
			if v:IsDescendantOf(Areas) and v.Name == "Main" then
				stillTouching = true
			end
		end

		if hasSword or (stillTouching and hasSword) then
			return 
		end
		
		for i,v in pairs(Character:GetChildren()) do
			if v:IsA('Tool') then
				v.Parent = game.ReplicatedStorage[plr.Name.. "'s Tools"]
			end
		end
		
		for i,v in pairs(plr.Backpack:GetChildren()) do
			if v.Name ~= item.Name then
				if game.ReplicatedStorage[plr.Name.. "'s Tools"] then
					v.Parent = game.ReplicatedStorage[plr.Name.. "'s Tools"]
				end
			end
		end
		
		local NewWEAPON = item:Clone()
		NewWEAPON.Parent = plr.Backpack
		Character.Humanoid:EquipTool(NewWEAPON)
		Character:FindFirstChild("Humanoid").MaxHealth = 100
		Character:FindFirstChild("Humanoid").WalkSpeed = 16
		Character:FindFirstChild("Head"):FindFirstChild("Rank"):FindFirstChild("Frame"):FindFirstChild("Rank").Text = "Kills: "..plr:FindFirstChild("Kills").Value
		Character:FindFirstChild("Sprint").Enabled = false
	elseif val == 'steppedOff' then
		local Character = plr.Character
		
		local stillTouching = false
		
		for _,v in pairs(Character:FindFirstChild("HumanoidRootPart"):GetTouchingParts()) do
			if v:IsDescendantOf(Areas) and v.Name == "Main" then
				stillTouching = true
			end
		end
		
		for i,v in pairs(Areas:GetChildren()) do
			if v:IsA("BasePart") then
				for _, t in pairs(v:GetTouchingParts()) do
					if t.Name == "HumanoidRootPart" then
						if t.Parent.Name == plr.Name then
							stillTouching = true
						end
					end
				end
			end
		end
		
		if stillTouching then
			return
		end
		for i,v in pairs(Character:GetChildren()) do
			if v then
				if v:IsA('Tool') then
					if v.Name == item.Name then
						v:Destroy()
					end
				end
			end
		end
		for i,v in pairs(plr.Backpack:GetChildren()) do
			if v then
				if v:IsA('Tool') then
					if v.Name == item.Name then
						v:Destroy()
					end
				end
			end
		end
		for i,tool in pairs(game.ReplicatedStorage[plr.Name.. "'s Tools"]:GetChildren()) do -- now we get all our tools back
			tool.Parent = plr.Backpack
		end
		Character:FindFirstChild("Humanoid").MaxHealth = math.huge
		Character:FindFirstChild("Humanoid").Health = math.huge
		Character:FindFirstChild("Head"):FindFirstChild("Rank"):FindFirstChild("Frame"):FindFirstChild("Rank").Text = "Level: "..plr:FindFirstChild("Level").Value
		Character:FindFirstChild("Sprint").Enabled = true
	end
end

TouchEvent.OnServerEvent:Connect(FireRemote)

game.Players.PlayerRemoving:Connect(function(Player)
	if game.ReplicatedStorage:FindFirstChild(Player.Name.. "'s Tools") then
		game.ReplicatedStorage:FindFirstChild(Player.Name.. "'s Tools"):Destroy()
	end
end)

Local Script:



local RS = game:GetService('ReplicatedStorage')

local GotSword = false
TOUCHING = nil
local Player = game.Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()
local Humanoid = Character.Humanoid
local Areas = workspace.SwordFightZone
local HumanoidRootPart = Character:WaitForChild('HumanoidRootPart')
local RemoteEvent = RS:WaitForChild('ToolEvent')


HumanoidRootPart.Touched:Connect(function(newPart)
	local hasSword = false
	
	for i,v in pairs(Character:GetChildren()) do
		if v:IsA("Tool") and v.Name == Player:FindFirstChild("Sword").Value then
			hasSword = true
		end
	end
	
	for i,v in pairs(Player:WaitForChild("Backpack"):GetChildren()) do
		if v:IsA("Tool") and v.Name == Player:FindFirstChild("Sword").Value then
			hasSword = true
		end
	end
	
	if newPart:IsDescendantOf(Areas) and newPart.Name == 'Main' and TOUCHING == nil and not hasSword and not GotSword then
		TOUCHING = newPart
		if GotSword == false then

			RemoteEvent:FireServer('steppedOn')

			GotSword = true
		end
	end
end)

HumanoidRootPart.TouchEnded:Connect(function(newPart)
	for _, part in pairs(HumanoidRootPart:GetTouchingParts()) do
		if part == TOUCHING and newPart.Name == 'Main' then return end
	end

	RemoteEvent:FireServer('steppedOff')

	TOUCHING = nil
	GotSword = false
end)