I'm doing a mirror game and i'm using a mirror script, im trying to be able to use several mirrors but when i put another, only one reflects

This is in a LocalScript

local player = game:GetService("Players").LocalPlayer
local character; repeat wait() character = player.Character until character
local camera = game:GetService("Workspace").CurrentCamera
 
local rs = game:GetService("RunService").RenderStepped
local reflections = require(script:WaitForChild("reflections"))
 
local mirrors = game:GetService("Workspace"):WaitForChild("Mirror model")
 
rs:connect(function()
    reflections:clearCharacters()
    local characters = {}
    for _, player in pairs(game:GetService("Players"):GetPlayers()) do
        table.insert(characters, player.Character)
    end
    for _, mirror in pairs(mirrors:GetChildren()) do
        if mirror:IsA("BasePart") then
            reflections:drawWorld(mirror, game:GetService("Workspace"), {mirrors, unpack(characters)})
            reflections:drawCharacters(characters, mirror)
        end
    end
end)
 

This is in a ModuleScript in the LocalScript

local class = {}
local camera = game:GetService("Workspace").CurrentCamera
 
local renderPacket = {}
 
local reflections = Instance.new("Model", camera)
local users = Instance.new("Model", reflections)
local environment = Instance.new("Model", reflections)
reflections.Name = "reflections"
users.Name = "users"
environment.Name = "environment"
 
--// Functions
 
function gather(children, class, tab)
    local tab = tab and tab or {}
    for _, child in pairs(children) do
        if child:IsA(class) then
            table.insert(tab, child)
        end
        tab = gather(type(child) == "table" and child or child:GetChildren(), class, tab)
    end
    return tab
end
 
function gather_Ignores(children, class, ignores)
    local tab = {}
    for _, part in pairs(gather(children, class)) do
        local pass = true
        for _, thing in pairs(ignores) do
            if part == thing or part:IsDescendantOf(thing) then
                pass = false
            end
        end
        if pass then
            table.insert(tab, part)
        end
    end
    return tab
end
 
--// Methods
 
function class:reflect(item, against)
    local cf = item:IsA("BasePart") and item.CFrame or item.PrimaryPart.CFrame
    local x, y, z, r00, r01, r02, r10, r11, r12, r20, r21,r22 = against.CFrame:toObjectSpace(cf):components()
    local newCf = against.CFrame:toWorldSpace(CFrame.new(-x ,y ,z , r00, -r01, -r02, -r10, r11, r12, -r20, r21, r22))
    if item:IsA("BasePart") then
        item.CFrame = newCf
        if item:IsA("CornerWedgePart") then
            item.Size = Vector3.new(item.Size.z, item.Size.y, item.Size.x)
            item.CFrame = item.CFrame * CFrame.Angles(0,math.rad(90),0)
        end
    elseif item:IsA("Model") then
        item:SetPrimaryPartCFrame(newCf)
    end
end
 
function class:drawWorld(against, parent, ignores)
    table.insert(ignores, camera)
    local renders = gather_Ignores({parent}, "BasePart", ignores)
    renderPacket[against] = renderPacket[against] or {}
    for _, part in pairs(renders) do
        if (not part.Locked or part.Parent:IsA("Hat")) and part.Transparency < 1 then
            if not renderPacket[against][part] or renderPacket[against][part].cf ~= part.CFrame then
                if renderPacket[against][part] then
                    renderPacket[against][part].focus:Destroy()
                end
                local focus = part:Clone()
                local joints = gather(focus:GetChildren(), "JointInstance")
                for _, joint in pairs(joints) do joint:Destroy() end
                focus.Anchored = true
                self:reflect(focus, against)
                focus.Parent = environment
                renderPacket[against][part] = {
                    cf = part.CFrame;
                    origin = part;
                    focus = focus;
                    event = part.AncestryChanged:connect(function() focus:Destroy() end);
                }
            end
        end
    end
end
 
function class:drawCharacters(characters, against)
    for _, character in pairs(characters) do
        character.Archivable = true
        local character = character:Clone()
        local hum = character:FindFirstChild("Humanoid")
        local scripts = gather(character:GetChildren(), "BaseScript")
        local parts = gather(character:GetChildren(), "BasePart")
        local joints = gather(character:GetChildren(), "JointInstance")
        if hum then
            hum.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
        end
        for _, src in pairs(scripts) do src:Destroy() end
        for _, joint in pairs(joints) do joint:Destroy() end
        for _, part in pairs(parts) do
            part.Anchored = true
            part.CanCollide = false
            self:reflect(part, against)
        end
        character.Parent = users
    end
end
 
function class:clearCharacters()
    users:ClearAllChildren()
end
 
function class:cleanup()
    environment:ClearAllChildren()
    users:ClearAllChildren()
    renderPacket = {}
end
 
return class

Again, it works, but only with one mirror if i put several mirrors. Help is appreciated