Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why is this collision script not working? (Intermediate Question)

Asked by 5 years ago

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!

Answer this question