So when a player dies then uses the ability, it stays there forever. Both scripts are inside the tool
--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)

2 comments
Where is this server script located? inside the player character?
Inside teh tool