So, this is what I’ve written to manage my player collision groups.
local playerCollision = {}
local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:CreateCollisionGroup("Players")
PhysicsService:CollisionGroupSetCollidable("Players", "Players", false)
playerCollision.currentCharacterCollisionGroup = {}
local previousCollisionGroups = {}
local collisionGroupSet = {}
function playerCollision.setCharacterCollisionGroup(character, collisionGroupName)
playerCollision.currentCharacterCollisionGroup[character] = collisionGroupName
if character:IsA("BasePart") then
PhysicsService:SetPartCollisionGroup(character, collisionGroupName)
if not collisionGroupSet[character] then
previousCollisionGroups[character] = character.CollisionGroupId
collisionGroupSet[character] = true
end
end
for _,descendant in pairs(character:GetDescendants()) do
if descendant:IsA("BasePart") then
PhysicsService:SetPartCollisionGroup(descendant, collisionGroupName)
if not collisionGroupSet[descendant] then
previousCollisionGroups[descendant] = descendant.CollisionGroupId
collisionGroupSet[descendant] = true
end
end
end
end
function playerCollision.setPartCollisionGroup(object, collisionGroupName)
if object:IsA("BasePart") then
if not collisionGroupSet[object] then
previousCollisionGroups[object] = object.CollisionGroupId
collisionGroupSet[object] = true
end
PhysicsService:SetPartCollisionGroup(object, collisionGroupName)
end
end
function playerCollision.resetCollisionGroup(object)
print("hpaodsf")
if object:IsA("BasePart") then
local previousCollisionGroupId = previousCollisionGroups[object]
if not previousCollisionGroupId then return end
collisionGroupSet[object] = nil
local previousCollisionGroupName = PhysicsService:GetCollisionGroupName(previousCollisionGroupId)
PhysicsService:SetPartCollisionGroup(object, previousCollisionGroupName)
end
end
function playerCollision.run()
local function onCharacterAdded(character)
if playerCollision.currentCharacterCollisionGroup[character] then
playerCollision.setCharacterCollisionGroup(character, playerCollision.currentCharacterCollisionGroup[character])
else -- If the character spawns for the first time.
playerCollision.setCharacterCollisionGroup(character, "Players")
end
character.DescendantAdded:Connect(function(object)
playerCollision.setPartCollisionGroup(object, playerCollision.currentCharacterCollisionGroup[character])
end)
character.DescendantRemoving:Connect(playerCollision.resetCollisionGroup)
end
local function onPlayerAdded(player)
local characterAddedEvent
characterAddedEvent = player.CharacterAdded:Connect(onCharacterAdded)
end
Players.PlayerAdded:Connect(onPlayerAdded)
end
return playerCollision
I was thinking, maybe I should move the stuff in playerCollision.run() into another script?
Tell me if you find something I should rewrite