So when a player dies then uses the ability, it stays there forever. Both scripts are inside the tool. If I put the script inside ServerScriptService, when the ability is already activated, the other players cannot use it

--Server Script--
local tween = game:GetService("TweenService")
local casting = false

script.Parent.RemoteEvent.OnServerEvent:Connect(function(player)
	if casting == true then return end
	casting = true
	
	local iceSpikes = game.ReplicatedStorage.LightCage:Clone()
	local dmg = 3
	--Pre position
	iceSpikes:SetPrimaryPartCFrame(player.Character.HumanoidRootPart.CFrame)
	iceSpikes.Parent = workspace
	local endPositions = {Position = {}, Orientation = {}}
	for i,v in pairs(iceSpikes.Spikes:GetChildren()) do
		endPositions["Position"][i] = v.Position
		endPositions["Orientation"][i] = v.Orientation
		v.CFrame = CFrame.new(iceSpikes.Center.Position)
	end
	
	--Activate
	wait(0)
	local Sound = script.Parent.Lightning
	Sound:Play()
	for i,v in pairs(iceSpikes.Spikes:GetChildren()) do
		v.Orientation = endPositions["Orientation"][i]
		tween:Create(v, TweenInfo.new(0), {Position = endPositions["Position"][i]}):Play()
	end
	
	--Attack
	for i,v in pairs(iceSpikes.Spikes:GetChildren()) do
		v.Touched:Connect(function(hit)
			if hit.Parent:FindFirstChild("Humanoid") and not hit.Parent:FindFirstChild("AlreadyHit") and not hit:IsDescendantOf(player.Character) then --Check if its a player
				local enemyHumanoid = hit.Parent:FindFirstChild("Humanoid")
				enemyHumanoid:TakeDamage(dmg)
			end
		end)
	end
	
	--Remove
	wait(5)
	Sound:Stop()
	iceSpikes:Destroy()
	casting = false
	wait(2)
	if iceSpikes.Parent == workspace then
		iceSpikes:Destroy()
	end
end)

--Local Script--
local tool = script.Parent

tool.Activated:Connect(function()
script.Parent.RemoteEvent:FireServer()
end)