I've got a script to disable NPC to NPC collisions, and Player to NPC collisions. It works just fine until an npc is killed and they respawn. Once they respawn, Players can collide with the NPCs again, and NPCs collide with NPCs again. Here is the collision script:
local PhysicsService = game:GetService("PhysicsService")
npcGroup = "npcGroup"
local Players = game:GetService("Players")
local playerCollisionGroupName = "Players"
PhysicsService:CreateCollisionGroup(playerCollisionGroupName)
PhysicsService:CreateCollisionGroup(npcGroup)
PhysicsService:CollisionGroupSetCollidable(npcGroup, npcGroup, false)
PhysicsService:CollisionGroupSetCollidable(playerCollisionGroupName, npcGroup, false)
local previousCollisionGroups = {}
local function setCollisionGroup(object)
if object:IsA("BasePart") then
previousCollisionGroups[object] = object.CollisionGroupId
PhysicsService:SetPartCollisionGroup(object, playerCollisionGroupName)
end
end
local function setCollisionGroupRecursive(object)
setCollisionGroup(object)
for _, child in ipairs(object:GetChildren()) do
setCollisionGroupRecursive(child)
end
end
local function resetCollisionGroup(object)
local previousCollisionGroupId = previousCollisionGroups[object]
if not previousCollisionGroupId then return end
local previousCollisionGroupName = PhysicsService:GetCollisionGroupName(previousCollisionGroupId)
if not previousCollisionGroupName then return end
PhysicsService:SetPartCollisionGroup(object, previousCollisionGroupName)
previousCollisionGroups[object] = nil
end
local function onCharacterAdded(character)
setCollisionGroupRecursive(character)
character.DescendantAdded:Connect(setCollisionGroup)
character.DescendantRemoving:Connect(resetCollisionGroup)
end
local function onPlayerAdded(player)
player.CharacterAdded:Connect(onCharacterAdded)
end
Players.PlayerAdded:Connect(onPlayerAdded)
local function setCollisionGroupRecursive(object)
if object:IsA("BasePart") then
PhysicsService:SetPartCollisionGroup(object, npcGroup)
end
for _, child in ipairs(object:GetChildren()) do
setCollisionGroupRecursive(child)
end
end
npc = workspace.NPC
setCollisionGroupRecursive(npc)
and here is the script that respawns the npcs:
robo=script.Parent:clone()
while true do
wait(20)
if script.Parent.NpcHumanoid.Health<1 then
robot=robo:clone()
robot.Parent=workspace.NPC
robot:makeJoints()
script.Parent:Destroy()
end
end
Thanks for reading!

6 comments
The last script is a free model. Refrain from breaking the community guidelines, specifically "Attempts should be your own work. Don't take a free model and expect us to fix it."
https://scriptinghelpers.org/help/community-guidelines
It's not actually a free model, I made it myself. Even if it was a free model, it is how I would do an NPC respawn script :)
clone() is deprecated
no. That isn't the only way to code something.
I never said that it was the only way, I said that it is how I would do it. (and it IS how I did it, because I made the script.)