take this for severe roblox external but add some ui with  my rage one heres the one i want added SET_MEMORY_READ_STRENGTH(0.06)

local attrSys = {
    utility = { pack = {}, unpack = {} },
    offset = {
        list = 0x138,
        to_next = 0x70,
        value = 0x30
    }
}

function attrSys.utility.pack:number(val)
    if val == 0 then return val end
    local str = string.pack("d", val)
    local res = string.unpack("I8", str)
    return res
end

function attrSys.utility.unpack:number(val)
    if type(val) ~= "number" then return val end
    if val == 0 then return val end
    if val > 9223372036854775807 then
        val = val - 18446744073709551616
    end
    local str = string.pack("i8", val)
    local res = string.unpack("d", str)
    return res
end

function attrSys:get(ud, attrName)
    if not ud then return nil end
    local demand = getmemoryvalue(ud, self.offset.value, "qword")
    if not demand or demand == 0 then return nil end
    
    local data = pointer_to_user_data(demand)
    local num = getmemoryvalue(data, self.offset.list, "qword")
    if not num or num == 0 then return nil end
    
    local ptr = pointer_to_user_data(num)
    local i = 0
    
    while i < 0x400 do
        local name = getmemoryvalue(ptr, i, "string")
        local val = getmemoryvalue(ptr, i + self.offset.value, "string")
        
        if not val then 
            val = getmemoryvalue(ptr, i + self.offset.value, "qword") 
        end
        
        if not name or (name == "" and (not val or val == "")) then break end
        
        if name == attrName then
            local retVal
            if val == 1 then
                retVal = true
            elseif val == 0 then
                retVal = false
            else
                retVal = self.utility.unpack:number(val)
            end
            return retVal
        end

        i += self.offset.to_next
    end
    
    return nil
end

local activeDrawings = {}

local function createTextDrawing(model)
    local txt = Drawing.new("Text")
    txt.Text = "FAKE"
    txt.Color = {255, 0, 0}
    txt.Size = 20
    txt.Center = true
    txt.Outline = true
    txt.OutlineColor = {0, 0, 0}
    txt.Visible = false 
    activeDrawings[model] = txt
end

local function scanModels()
    local ws = findservice(Game, "Workspace")
    if not ws then warn("Workspace not found!"); return end

    local gb = findfirstchild(ws, "GlassBridge")
    if not gb then return end

    local gh = findfirstchild(gb, "GlassHolder")
    if not gh then return end

    local currentModels = {}

    for i = 0, 11 do
        local panelName = "ClonedPanel"..tostring(i)
        local panel = findfirstchild(gh, panelName)
        
        if panel then
            for j = 1, 2 do
                local glassName = "glassmodel"..tostring(j)
                local gm = findfirstchild(panel, glassName)
                
                if gm and getclassname(gm) == "Model" then
                    local pp = getprimarypart(gm)
                    if pp then
                        local hasAttr = attrSys:get(pp, "exploitingisevil")
                        if hasAttr then
                            currentModels[gm] = true
                            if not activeDrawings[gm] then
                                createTextDrawing(gm)
                            end
                        end
                    end
                end
            end
        end
    end

    for model, txt in pairs(activeDrawings) do
        if not currentModels[model] or not getparent(model) then
            txt:Remove()
            activeDrawings[model] = nil
        end
    end
end

local function updateDrawingPositions()
    for model, txt in pairs(activeDrawings) do
        local pp = getprimarypart(model)
        if pp and getparent(model) then
            local pos = getposition(pp)
            if pos then
                local scrPt, onScr = worldtoscreenpoint(pos)
                if onScr then
                    txt.Position = {scrPt.x, scrPt.y}
                    txt.Visible = true
                else
                    txt.Visible = false
                end
            else
                txt.Visible = false
            end
        else
            txt.Visible = false -- hide if model gets deleted
        end
    end
end

local function startScript()
    thread.create("ModelScanner", function()
        while true do
            scanModels()
            wait(7) -- scan every 7 sec
        end
    end)
    
    thread.create("TextPositionUpdater", function()
        while true do
            updateDrawingPositions()
            wait(0.03) -- update pos
        end
    end)
end

startScript()

local function cleanup()
    thread.terminate("ModelScanner")
    thread.terminate("TextPositionUpdater")
    for _, txt in pairs(activeDrawings) do
        txt:Remove()
    end
    activeDrawings = {}
end

shared.set("GlassModelTextCleanup", cleanup) and heres tha rage one SET_MEMORY_READ_STRENGTH(0.06)

local attrSys = {
    utility = { pack = {}, unpack = {} },
    offset = {
        list = 0x138,
        to_next = 0x70,
        value = 0x30
    }
}

function attrSys.utility.pack:number(val)
    if val == 0 then return val end
    local str = string.pack("d", val)
    local res = string.unpack("I8", str)
    return res
end

function attrSys.utility.unpack:number(val)
    if type(val) ~= "number" then return val end
    if val == 0 then return val end
    if val > 9223372036854775807 then
        val = val - 18446744073709551616
    end
    local str = string.pack("i8", val)
    local res = string.unpack("d", str)
    return res
end

function attrSys:get(ud, attrName)
    if not ud then return nil end
    local demand = getmemoryvalue(ud, self.offset.value, "qword")
    if not demand or demand == 0 then return nil end
    
    local data = pointer_to_user_data(demand)
    local num = getmemoryvalue(data, self.offset.list, "qword")
    if not num or num == 0 then return nil end
    
    local ptr = pointer_to_user_data(num)
    local i = 0
    
    while i < 0x400 do
        local name = getmemoryvalue(ptr, i, "string")
        local val = getmemoryvalue(ptr, i + self.offset.value, "string")
        
        if not val then 
            val = getmemoryvalue(ptr, i + self.offset.value, "qword") 
        end
        
        if not name or (name == "" and (not val or val == "")) then break end
        
        if name == attrName then
            local retVal
            if val == 1 then
                retVal = true
            elseif val == 0 then
                retVal = false
            else
                retVal = self.utility.unpack:number(val)
            end
            return retVal
        end

        i += self.offset.to_next
    end
    
    return nil
end

local activeDrawings = {}

local function createTextDrawing(model)
    local txt = Drawing.new("Text")
    txt.Text = "FAKE"
    txt.Color = {255, 0, 0}
    txt.Size = 20
    txt.Center = true
    txt.Outline = true
    txt.OutlineColor = {0, 0, 0}
    txt.Visible = false 
    activeDrawings[model] = txt
end

local function scanModels()
    local ws = findservice(Game, "Workspace")
    if not ws then warn("Workspace not found!"); return end

    local gb = findfirstchild(ws, "GlassBridge")
    if not gb then return end

    local gh = findfirstchild(gb, "GlassHolder")
    if not gh then return end

    local currentModels = {}

    for i = 0, 11 do
        local panelName = "ClonedPanel"..tostring(i)
        local panel = findfirstchild(gh, panelName)
        
        if panel then
            for j = 1, 2 do
                local glassName = "glassmodel"..tostring(j)
                local gm = findfirstchild(panel, glassName)
                
                if gm and getclassname(gm) == "Model" then
                    local pp = getprimarypart(gm)
                    if pp then
                        local hasAttr = attrSys:get(pp, "exploitingisevil")
                        if hasAttr then
                            currentModels[gm] = true
                            if not activeDrawings[gm] then
                                createTextDrawing(gm)
                            end
                        end
                    end
                end
            end
        end
    end

    for model, txt in pairs(activeDrawings) do
        if not currentModels[model] or not getparent(model) then
            txt:Remove()
            activeDrawings[model] = nil
        end
    end
end

local function updateDrawingPositions()
    for model, txt in pairs(activeDrawings) do
        local pp = getprimarypart(model)
        if pp and getparent(model) then
            local pos = getposition(pp)
            if pos then
                local scrPt, onScr = worldtoscreenpoint(pos)
                if onScr then
                    txt.Position = {scrPt.x, scrPt.y}
                    txt.Visible = true
                else
                    txt.Visible = false
                end
            else
                txt.Visible = false
            end
        else
            txt.Visible = false -- hide if model gets deleted
        end
    end
end

local function startScript()
    thread.create("ModelScanner", function()
        while true do
            scanModels()
            wait(7) -- scan every 7 sec
        end
    end)
    
    thread.create("TextPositionUpdater", function()
        while true do
            updateDrawingPositions()
            wait(0.03) -- update pos
        end
    end)
end

startScript()

local function cleanup()
    thread.terminate("ModelScanner")
    thread.terminate("TextPositionUpdater")
    for _, txt in pairs(activeDrawings) do
        txt:Remove()
    end
    activeDrawings = {}
end

shared.set("GlassModelTextCleanup", cleanup)