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

0

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."

0

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 :)

0

clone() is deprecated

0

no. That isn't the only way to code something.

0

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.)