I have been trying to work with collisions (specifically with characters) and this script should be working according to Roblox wiki, and gives no errors, so I've come to ask you guys what you think the issue is. I've checked, and I know that the first part works to put the children of the parent in the collision group, so the issue is the second part where they add the player parts, but I still can't figure what is wrong. Anything helps.
local work = script.Parent local PhysicsService = game:GetService("PhysicsService") local Players = game:GetService("Players") local admin = "admin" local allranks = {} -- table where all the ranks are stored for i, v in pairs(work:GetChildren()) do -- goes through the parent containing all the objects that shouldn't collide with players (it's children should not collide) if v.Name == "Group Rank Door" then local config = v:FindFirstChild("Configuration") if config then local rankid = config:FindFirstChild("RankId") if rankid then local TheRankId = config:WaitForChild("RankId") local isrkn = false for i = 1, #allranks do -- sees if such rank exists to decide if it should create a new rank if allranks[i] == TheRankId.Value then isrkn = true end end if isrkn == false then allranks[#allranks + 1] = TheRankId.Value print(TheRankId.Value) PhysicsService:CreateCollisionGroup(tostring(TheRankId.Value).. "Num") -- creates the collision group with the id followed by "num" PhysicsService:CreateCollisionGroup(tostring(TheRankId.Value).."Players") -- creates another one with players and id PhysicsService:SetPartCollisionGroup(v, tostring(TheRankId.Value) .. "Num") -- adds the specific object in list to the non-player collision group PhysicsService:CollisionGroupSetCollidable(tostring(TheRankId.Value).. "Num",tostring(TheRankId.Value).."Players", false) -- makes it so the two groups don't collide end end end end wait() end local function setCollisionGroupRecursive(object, groupName) if object:IsA("BasePart") then PhysicsService:SetPartCollisionGroup(object, groupName) -- would set the part in the collision group if it is basepart end for _, child in ipairs(object:GetChildren()) do -- otherwise, it would list through it's children setCollisionGroupRecursive(child, groupName) end end local function onCharacterAdded(character, rank)-- when character is added for i = 1, #allranks do -- nil for some reason if allranks[i] <= rank then -- every time a rank in the table is less, it would add all of the player's parts to it print("setting another one") local collisionGroupName = tostring(allranks[i]) .. "Players" -- makes the key to put in the player parts setCollisionGroupRecursive(character, collisionGroupName, allranks[i] .. "Num") end end end local function onPlayerAdded(player)-- when the player is added print("Ok done") player.CharacterAdded:Connect(function(character) local rank = player:GetRankInGroup(4921500) -- gets the rank of player (in this group) and then tells it to wait for character onCharacterAdded(character, rank) end) end Players.PlayerAdded:Connect(onPlayerAdded)
If you have any questions about some variable or aspect, just write a comment, but once again, anything helps. Thanks!