--[[
╔══════════════════════════════════════════════════════╗
║         🔍  ULTIMATE ROBLOX SCANNER  v1.0           ║
║    ⚔️ Weapons | ❤️ Health | 🪙 AC | 📍 Locations    ║
║         drag · tab · auto-rescan · console log       ║
╚══════════════════════════════════════════════════════╝
]]

-- ═══════════════════════════════════════════════
--  ⚙️  CONFIG  —  edit keywords here
-- ═══════════════════════════════════════════════
local CONFIG = {
    weaponKeywords = {
        "sword","gun","knife","blade","rifle","pistol","shotgun","bow",
        "axe","hammer","weapon","dagger","spear","staff","wand","launcher",
        "cannon","musket","sniper","smg","ak","m4","glock","uzi","revolver",
        "crossbow","flamethrower","grenade","bomb","explosive","saber","katana",
    },
    healthKeywords = {
        "health","medkit","heal","hp","potion","aid","bandage","regen",
        "medipack","firstaid","kit","life","cure","antidote","food","drink",
        "flask","elixir","berry","fruit","mushroom","meat","bread",
    },
    acKeywords = {
        "coin","gem","crystal","orb","pickup","collect","loot","token",
        "shard","fragment","star","cash","money","gold","silver","ring",
        "pearl","chest","drop","reward","item","xp","exp","soul","core",
        "essence","rune","badge","trophy","collectible","egg","seed",
    },
    locationKeywords = {
        "spawn","checkpoint","waypoint","gate","door","portal","region",
        "zone","area","base","flag","point","node","objective","marker",
        "platform","lobby","teleport","exit","entrance","hub","warp",
        "shop","npc","vendor","boss","arena","safe","vault","tower",
    },
    scanInterval  = 5,    -- seconds between auto-rescans
    maxResults    = 500,  -- cap per category
    showInConsole = true, -- also print to output
}

-- ═══════════════════════════════════════════════
--  🔧  SERVICES
-- ═══════════════════════════════════════════════
local Players          = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local lp               = Players.LocalPlayer

-- ═══════════════════════════════════════════════
--  🛠️  UTILITY
-- ═══════════════════════════════════════════════
local function matchKW(name, kws)
    local low = name:lower()
    for _, kw in ipairs(kws) do
        if low:find(kw, 1, true) then return true end
    end
    return false
end

local function getPos(obj)
    if obj:IsA("BasePart") then
        return obj.Position
    elseif obj:IsA("Model") then
        local r = obj:FindFirstChild("HumanoidRootPart")
                   or obj:FindFirstChildWhichIsA("BasePart")
        if r then return r.Position end
        local ok, cf = pcall(function() return obj:GetModelCFrame() end)
        if ok and cf then return cf.Position end
    elseif obj:IsA("Tool") then
        local h = obj:FindFirstChild("Handle")
        if h then return h.Position end
    end
    return nil
end

local function vStr(v)
    if not v then return "N/A" end
    return string.format("(%.1f, %.1f, %.1f)", v.X, v.Y, v.Z)
end

local function dist(pos)
    if not pos then return 99999 end
    local c = lp.Character
    if not c then return 99999 end
    local r = c:FindFirstChild("HumanoidRootPart")
    if not r then return 99999 end
    return (r.Position - pos).Magnitude
end

-- ═══════════════════════════════════════════════
--  🔍  SCANNERS
-- ═══════════════════════════════════════════════

-- ⚔️ WEAPONS
local function scanWeapons()
    local out = {}
    for _, obj in pairs(game:GetDescendants()) do
        if #out >= CONFIG.maxResults then break end
        local hit = obj:IsA("Tool") or obj:IsA("HopperBin")
        if not hit then hit = matchKW(obj.Name, CONFIG.weaponKeywords) end
        if hit then
            local p = getPos(obj)
            table.insert(out, {
                name   = obj.Name,
                class  = obj.ClassName,
                parent = obj.Parent and obj.Parent.Name or "?",
                pos    = p,
                dist   = dist(p),
            })
        end
    end
    table.sort(out, function(a,b) return a.dist < b.dist end)
    return out
end

-- ❤️ HEALTH
local function scanHealth()
    local out = {}
    for _, obj in pairs(game:GetDescendants()) do
        if #out >= CONFIG.maxResults then break end
        if obj:IsA("Humanoid") then
            local par = obj.Parent
            local p   = getPos(par)
            table.insert(out, {
                name  = par and par.Name or "Unknown",
                class = "Humanoid",
                hp    = string.format("%.0f / %.0f", obj.Health, obj.MaxHealth),
                pos   = p,
                dist  = dist(p),
                isNPC = par ~= lp.Character,
            })
        elseif matchKW(obj.Name, CONFIG.healthKeywords) then
            local p = getPos(obj)
            table.insert(out, {
                name  = obj.Name,
                class = obj.ClassName,
                hp    = "pickup",
                pos   = p,
                dist  = dist(p),
                isNPC = false,
            })
        end
    end
    table.sort(out, function(a,b) return a.dist < b.dist end)
    return out
end

-- 🪙 AUTO-COLLECT
local function scanAC()
    local out = {}
    for _, obj in pairs(game:GetDescendants()) do
        if #out >= CONFIG.maxResults then break end
        if matchKW(obj.Name, CONFIG.acKeywords) then
            local p = getPos(obj)
            if p then
                table.insert(out, {
                    name   = obj.Name,
                    class  = obj.ClassName,
                    parent = obj.Parent and obj.Parent.Name or "?",
                    pos    = p,
                    dist   = dist(p),
                })
            end
        end
    end
    table.sort(out, function(a,b) return a.dist < b.dist end)
    return out
end

-- 📍 LOCATIONS
local function scanLocations()
    local out = {}
    for _, obj in pairs(game:GetDescendants()) do
        if #out >= CONFIG.maxResults then break end
        local hit = obj:IsA("SpawnLocation")
        if not hit then hit = matchKW(obj.Name, CONFIG.locationKeywords) end
        if hit then
            local p = getPos(obj)
            table.insert(out, {
                name   = obj.Name,
                class  = obj.ClassName,
                parent = obj.Parent and obj.Parent.Name or "?",
                pos    = p,
                dist   = dist(p),
            })
        end
    end
    table.sort(out, function(a,b) return a.dist < b.dist end)
    return out
end

-- ═══════════════════════════════════════════════
--  🖥️  GUI
-- ═══════════════════════════════════════════════
local function buildGUI()
    if lp.PlayerGui:FindFirstChild("UltraScanner") then
        lp.PlayerGui.UltraScanner:Destroy()
    end

    local sg = Instance.new("ScreenGui")
    sg.Name            = "UltraScanner"
    sg.ResetOnSpawn    = false
    sg.ZIndexBehavior  = Enum.ZIndexBehavior.Sibling
    sg.Parent          = lp.PlayerGui

    -- ── MAIN FRAME ──────────────────────────────
    local main = Instance.new("Frame")
    main.Name                = "Main"
    main.Size                = UDim2.new(0, 560, 0, 500)
    main.Position            = UDim2.new(0.5, -280, 0.5, -250)
    main.BackgroundColor3    = Color3.fromRGB(12, 12, 18)
    main.BorderSizePixel     = 0
    main.ClipsDescendants    = true
    main.Parent              = sg
    do
        local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(0,10); c.Parent = main
        local s = Instance.new("UIStroke"); s.Color = Color3.fromRGB(70,70,110); s.Thickness = 1; s.Parent = main
    end

    -- ── TITLE BAR ───────────────────────────────
    local titleBar = Instance.new("Frame")
    titleBar.Size             = UDim2.new(1, 0, 0, 38)
    titleBar.BackgroundColor3 = Color3.fromRGB(18, 18, 28)
    titleBar.BorderSizePixel  = 0
    titleBar.Parent           = main

    local title = Instance.new("TextLabel")
    title.Text               = "🔍  ULTIMATE SCANNER  v1.0"
    title.Font               = Enum.Font.GothamBold
    title.TextSize           = 14
    title.TextColor3         = Color3.fromRGB(190, 190, 255)
    title.BackgroundTransparency = 1
    title.Size               = UDim2.new(1, -50, 1, 0)
    title.Position           = UDim2.new(0, 12, 0, 0)
    title.TextXAlignment     = Enum.TextXAlignment.Left
    title.Parent             = titleBar

    local closeBtn = Instance.new("TextButton")
    closeBtn.Text            = "✕"
    closeBtn.Font            = Enum.Font.GothamBold
    closeBtn.TextSize        = 14
    closeBtn.TextColor3      = Color3.fromRGB(255, 90, 90)
    closeBtn.BackgroundTransparency = 1
    closeBtn.Size            = UDim2.new(0, 38, 0, 38)
    closeBtn.Position        = UDim2.new(1, -38, 0, 0)
    closeBtn.Parent          = titleBar
    closeBtn.MouseButton1Click:Connect(function() sg:Destroy() end)

    -- drag
    local dragging, dragStart, startPos
    titleBar.InputBegan:Connect(function(i)
        if i.UserInputType == Enum.UserInputType.MouseButton1 then
            dragging = true; dragStart = i.Position; startPos = main.Position
        end
    end)
    UserInputService.InputChanged:Connect(function(i)
        if dragging and i.UserInputType == Enum.UserInputType.MouseMovement then
            local d = i.Position - dragStart
            main.Position = UDim2.new(
                startPos.X.Scale, startPos.X.Offset + d.X,
                startPos.Y.Scale, startPos.Y.Offset + d.Y)
        end
    end)
    UserInputService.InputEnded:Connect(function(i)
        if i.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
    end)

    -- ── TAB BAR ─────────────────────────────────
    local tabBar = Instance.new("Frame")
    tabBar.Size             = UDim2.new(1, 0, 0, 36)
    tabBar.Position         = UDim2.new(0, 0, 0, 38)
    tabBar.BackgroundColor3 = Color3.fromRGB(16, 16, 24)
    tabBar.BorderSizePixel  = 0
    tabBar.Parent           = main
    do
        local l = Instance.new("UIListLayout")
        l.FillDirection = Enum.FillDirection.Horizontal
        l.SortOrder     = Enum.SortOrder.LayoutOrder
        l.Parent        = tabBar
    end

    -- ── CONTENT AREA ────────────────────────────
    local content = Instance.new("Frame")
    content.Size                = UDim2.new(1, 0, 1, -114)
    content.Position            = UDim2.new(0, 0, 0, 74)
    content.BackgroundTransparency = 1
    content.Parent              = main

    -- ── BOTTOM BAR ──────────────────────────────
    local botBar = Instance.new("Frame")
    botBar.Size             = UDim2.new(1, 0, 0, 40)
    botBar.Position         = UDim2.new(0, 0, 1, -40)
    botBar.BackgroundColor3 = Color3.fromRGB(16, 16, 24)
    botBar.BorderSizePixel  = 0
    botBar.Parent           = main

    local scanBtn = Instance.new("TextButton")
    scanBtn.Text            = "🔄  SCAN NOW"
    scanBtn.Font            = Enum.Font.GothamBold
    scanBtn.TextSize        = 12
    scanBtn.TextColor3      = Color3.fromRGB(130, 255, 130)
    scanBtn.BackgroundColor3= Color3.fromRGB(20, 45, 20)
    scanBtn.Size            = UDim2.new(0, 130, 0, 28)
    scanBtn.Position        = UDim2.new(0, 8, 0.5, -14)
    scanBtn.Parent          = botBar
    do local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(0,5); c.Parent = scanBtn end

    local statusLbl = Instance.new("TextLabel")
    statusLbl.Text           = "idle — press scan"
    statusLbl.Font           = Enum.Font.Gotham
    statusLbl.TextSize       = 11
    statusLbl.TextColor3     = Color3.fromRGB(110, 110, 140)
    statusLbl.BackgroundTransparency = 1
    statusLbl.Size           = UDim2.new(1, -150, 1, 0)
    statusLbl.Position       = UDim2.new(0, 148, 0, 0)
    statusLbl.TextXAlignment = Enum.TextXAlignment.Left
    statusLbl.Parent         = botBar

    -- ── TABS DATA ───────────────────────────────
    local TABS = {
        { id="weapons",   label="⚔️ Weapons",  color=Color3.fromRGB(255,185,80)  },
        { id="health",    label="❤️ Health",   color=Color3.fromRGB(255,100,100) },
        { id="ac",        label="🪙 A-Collect", color=Color3.fromRGB(255,225,80)  },
        { id="locations", label="📍 Locations", color=Color3.fromRGB(80,190,255)  },
    }

    local tabFrames  = {}
    local tabButtons = {}
    local activeTab  = TABS[1].id

    -- build scroll frames
    local function mkFrame(id)
        local sf = Instance.new("ScrollingFrame")
        sf.Name                = id
        sf.Size                = UDim2.new(1, 0, 1, 0)
        sf.BackgroundTransparency = 1
        sf.BorderSizePixel     = 0
        sf.ScrollBarThickness  = 4
        sf.ScrollBarImageColor3= Color3.fromRGB(80, 80, 120)
        sf.CanvasSize          = UDim2.new(0, 0, 0, 0)
        sf.AutomaticCanvasSize = Enum.AutomaticSize.Y
        sf.Visible             = false
        sf.Parent              = content
        local lay = Instance.new("UIListLayout")
        lay.SortOrder  = Enum.SortOrder.LayoutOrder
        lay.Padding    = UDim.new(0, 2)
        lay.Parent     = sf
        local pad = Instance.new("UIPadding")
        pad.PaddingLeft  = UDim.new(0, 8)
        pad.PaddingRight = UDim.new(0, 8)
        pad.PaddingTop   = UDim.new(0, 6)
        pad.Parent       = sf
        tabFrames[id] = sf
    end

    for _, t in ipairs(TABS) do mkFrame(t.id) end

    -- switch tab
    local function switchTab(id)
        activeTab = id
        for _, t in ipairs(TABS) do
            tabButtons[t.id].BackgroundColor3 =
                t.id == id and Color3.fromRGB(22,22,36) or Color3.fromRGB(16,16,24)
            tabButtons[t.id].TextColor3 =
                t.id == id and t.color or Color3.fromRGB(90,90,110)
            tabFrames[t.id].Visible = (t.id == id)
        end
    end

    -- build tab buttons
    for _, t in ipairs(TABS) do
        local btn = Instance.new("TextButton")
        btn.Text             = t.label
        btn.Font             = Enum.Font.GothamSemibold
        btn.TextSize         = 11
        btn.TextColor3       = Color3.fromRGB(90, 90, 110)
        btn.BackgroundColor3 = Color3.fromRGB(16, 16, 24)
        btn.BorderSizePixel  = 0
        btn.Size             = UDim2.new(0.25, 0, 1, 0)
        btn.Parent           = tabBar
        btn.MouseButton1Click:Connect(function() switchTab(t.id) end)
        tabButtons[t.id] = btn
    end
    switchTab(activeTab)

    -- ── ROW / HEADER BUILDERS ────────────────────
    local function mkHeader(parent, txt, color, order)
        local f = Instance.new("Frame")
        f.Size             = UDim2.new(1, 0, 0, 26)
        f.BackgroundColor3 = Color3.fromRGB(25, 25, 40)
        f.BorderSizePixel  = 0
        f.LayoutOrder      = order
        f.Parent           = parent
        do local c = Instance.new("UICorner"); c.CornerRadius=UDim.new(0,4); c.Parent=f end
        local l = Instance.new("TextLabel")
        l.Text             = txt
        l.Font             = Enum.Font.GothamBold
        l.TextSize         = 12
        l.TextColor3       = color
        l.BackgroundTransparency = 1
        l.Size             = UDim2.new(1,-10,1,0)
        l.Position         = UDim2.new(0,10,0,0)
        l.TextXAlignment   = Enum.TextXAlignment.Left
        l.Parent           = f
    end

    local function mkRow(parent, txt, color, order)
        local f = Instance.new("Frame")
        f.Size             = UDim2.new(1, 0, 0, 20)
        f.BackgroundColor3 = Color3.fromRGB(20, 20, 30)
        f.BorderSizePixel  = 0
        f.LayoutOrder      = order
        f.Parent           = parent
        do local c = Instance.new("UICorner"); c.CornerRadius=UDim.new(0,3); c.Parent=f end
        local l = Instance.new("TextLabel")
        l.Text             = txt
        l.Font             = Enum.Font.Code
        l.TextSize         = 11
        l.TextColor3       = color or Color3.fromRGB(200,200,200)
        l.BackgroundTransparency = 1
        l.Size             = UDim2.new(1,-10,1,0)
        l.Position         = UDim2.new(0,10,0,0)
        l.TextXAlignment   = Enum.TextXAlignment.Left
        l.TextTruncate     = Enum.TextTruncate.AtEnd
        l.Parent           = f
    end

    local function clearFrame(id)
        for _, c in pairs(tabFrames[id]:GetChildren()) do
            if c:IsA("Frame") then c:Destroy() end
        end
    end

    -- ── POPULATE FUNCTIONS ───────────────────────
    local function popWeapons(r)
        clearFrame("weapons")
        local f = tabFrames["weapons"]
        mkHeader(f, string.format("⚔️  WEAPONS  ─  %d found", #r), Color3.fromRGB(255,185,80), 0)
        if #r == 0 then mkRow(f, "  nothing found.", Color3.fromRGB(90,90,110), 1); return end
        for i, v in ipairs(r) do
            mkRow(f,
                string.format("🗡️  %-22s | 📁 %-14s | 📍 %-28s | 📏 %.0fm",
                    v.name, v.parent, vStr(v.pos), v.dist),
                Color3.fromRGB(255,210,120), i)
        end
    end

    local function popHealth(r)
        clearFrame("health")
        local f = tabFrames["health"]
        mkHeader(f, string.format("❤️  HEALTH  ─  %d found", #r), Color3.fromRGB(255,100,100), 0)
        if #r == 0 then mkRow(f, "  nothing found.", Color3.fromRGB(90,90,110), 1); return end
        for i, v in ipairs(r) do
            local tag = v.isNPC and "👾" or (v.hp == "pickup" and "💊" or "👤")
            mkRow(f,
                string.format("%s  %-22s | HP: %-12s | 📍 %-22s | 📏 %.0fm",
                    tag, v.name, v.hp, vStr(v.pos), v.dist),
                v.isNPC and Color3.fromRGB(255,150,150) or Color3.fromRGB(150,255,150), i)
        end
    end

    local function popAC(r)
        clearFrame("ac")
        local f = tabFrames["ac"]
        mkHeader(f, string.format("🪙  AUTO-COLLECT  ─  %d found", #r), Color3.fromRGB(255,225,80), 0)
        if #r == 0 then mkRow(f, "  nothing found.", Color3.fromRGB(90,90,110), 1); return end
        for i, v in ipairs(r) do
            mkRow(f,
                string.format("💰  %-22s | 📁 %-14s | 📍 %-28s | 📏 %.0fm",
                    v.name, v.parent, vStr(v.pos), v.dist),
                Color3.fromRGB(255,240,160), i)
        end
    end

    local function popLocations(r)
        clearFrame("locations")
        local f = tabFrames["locations"]
        mkHeader(f, string.format("📍  LOCATIONS  ─  %d found", #r), Color3.fromRGB(80,190,255), 0)
        if #r == 0 then mkRow(f, "  nothing found.", Color3.fromRGB(90,90,110), 1); return end
        for i, v in ipairs(r) do
            mkRow(f,
                string.format("📌  %-22s | 📁 %-14s | 📍 %-28s | 📏 %.0fm",
                    v.name, v.parent, vStr(v.pos), v.dist),
                Color3.fromRGB(160,215,255), i)
        end
    end

    -- ── RUN SCAN ─────────────────────────────────
    local scanning = false
    local function runScan()
        if scanning then return end
        scanning = true
        scanBtn.Text     = "⏳ scanning..."
        statusLbl.Text   = "🔄 scanning all..."

        local w = scanWeapons()
        local h = scanHealth()
        local a = scanAC()
        local l = scanLocations()

        popWeapons(w)
        popHealth(h)
        popAC(a)
        popLocations(l)

        statusLbl.Text = string.format(
            "✅  ⚔️%d  ❤️%d  🪙%d  📍%d",
            #w, #h, #a, #l)
        scanBtn.Text = "🔄  SCAN NOW"
        scanning = false

        if CONFIG.showInConsole then
            print("\n╔══════════════════════════════════════╗")
            print("║     🔍 ULTRA SCANNER  —  RESULTS     ║")
            print("╚══════════════════════════════════════╝")
            print(string.format("\n⚔️  WEAPONS (%d)", #w))
            for _, v in ipairs(w) do
                print(string.format("  🗡️  %s  [%s]  @  %s  (%.0fm)", v.name, v.parent, vStr(v.pos), v.dist))
            end
            print(string.format("\n❤️  HEALTH (%d)", #h))
            for _, v in ipairs(h) do
                print(string.format("  💉  %s  HP:%s  @  %s  (%.0fm)", v.name, v.hp, vStr(v.pos), v.dist))
            end
            print(string.format("\n🪙  AUTO-COLLECT (%d)", #a))
            for _, v in ipairs(a) do
                print(string.format("  💰  %s  [%s]  @  %s  (%.0fm)", v.name, v.parent, vStr(v.pos), v.dist))
            end
            print(string.format("\n📍  LOCATIONS (%d)", #l))
            for _, v in ipairs(l) do
                print(string.format("  📌  %s  [%s]  @  %s  (%.0fm)", v.name, v.parent, vStr(v.pos), v.dist))
            end
            print("─────────────────────────────────────────")
        end
    end

    scanBtn.MouseButton1Click:Connect(runScan)

    -- auto-rescan loop
    task.spawn(function()
        task.wait(0.5)
        runScan()
        while sg and sg.Parent do
            task.wait(CONFIG.scanInterval)
            if sg and sg.Parent then runScan() end
        end
    end)
end

buildGUI()

--standalonehere

--[[  ⚔️ WEAPONS SCANNER — standalone console  ]]
local lp = game:GetService("Players").LocalPlayer
local KEYWORDS = {
    "sword","gun","knife","blade","rifle","pistol","shotgun","bow",
    "axe","hammer","weapon","dagger","spear","staff","wand","launcher",
    "cannon","musket","sniper","smg","revolver","crossbow","grenade","saber",
}

local function match(name)
    local low = name:lower()
    for _, kw in ipairs(KEYWORDS) do
        if low:find(kw,1,true) then return true end
    end
    return false
end

local function getPos(obj)
    if obj:IsA("BasePart") then return obj.Position end
    if obj:IsA("Tool") then
        local h = obj:FindFirstChild("Handle"); if h then return h.Position end
    end
    if obj:IsA("Model") then
        local r = obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChildWhichIsA("BasePart")
        if r then return r.Position end
    end
end

local function dist(pos)
    local c = lp.Character; if not c then return 0 end
    local r = c:FindFirstChild("HumanoidRootPart"); if not r then return 0 end
    return pos and (r.Position - pos).Magnitude or 0
end

local results = {}
for _, obj in pairs(game:GetDescendants()) do
    if obj:IsA("Tool") or obj:IsA("HopperBin") or match(obj.Name) then
        local p = getPos(obj)
        table.insert(results, { name=obj.Name, class=obj.ClassName,
            parent=obj.Parent and obj.Parent.Name or "?", pos=p, dist=dist(p) })
    end
end
table.sort(results, function(a,b) return a.dist < b.dist end)

print("\n⚔️ ══════════ WEAPONS SCANNER ══════════ ⚔️")
print(string.format("  found: %d weapons\n", #results))
for i, v in ipairs(results) do
    print(string.format("  [%02d] 🗡️  %-20s | 📁 %-12s | 📍 (%.0f, %.0f, %.0f) | 📏 %.0fm",
        i, v.name, v.parent,
        v.pos and v.pos.X or 0, v.pos and v.pos.Y or 0, v.pos and v.pos.Z or 0,
        v.dist))
end
print("\n⚔️ ═══════════════════════════════════════ ⚔️")

--[[  ❤️ HEALTH SCANNER — standalone console  ]]
local lp = game:GetService("Players").LocalPlayer
local KEYWORDS = {
    "health","medkit","heal","hp","potion","aid","bandage","regen",
    "medipack","firstaid","kit","life","cure","food","drink","flask","elixir",
}

local function dist(pos)
    local c = lp.Character; if not c then return 0 end
    local r = c:FindFirstChild("HumanoidRootPart"); if not r then return 0 end
    return pos and (r.Position - pos).Magnitude or 0
end

local function getPos(obj)
    if obj:IsA("BasePart") then return obj.Position end
    if obj:IsA("Model") then
        local r = obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChildWhichIsA("BasePart")
        if r then return r.Position end
    end
end

local function match(name)
    local low = name:lower()
    for _, kw in ipairs(KEYWORDS) do if low:find(kw,1,true) then return true end end
end

local results = {}
for _, obj in pairs(game:GetDescendants()) do
    if obj:IsA("Humanoid") then
        local par = obj.Parent
        local p   = getPos(par)
        table.insert(results, {
            name  = par and par.Name or "?",
            hp    = string.format("%.0f/%.0f", obj.Health, obj.MaxHealth),
            pos   = p, dist = dist(p),
            isNPC = par ~= lp.Character,
            class = "Humanoid",
        })
    elseif match(obj.Name) then
        local p = getPos(obj)
        table.insert(results, {
            name  = obj.Name, hp="pickup",
            pos   = p, dist = dist(p),
            isNPC = false, class = obj.ClassName,
        })
    end
end
table.sort(results, function(a,b) return a.dist < b.dist end)

print("\n❤️ ══════════ HEALTH SCANNER ══════════ ❤️")
print(string.format("  found: %d entries\n", #results))
for i, v in ipairs(results) do
    local tag = v.isNPC and "👾 NPC" or (v.hp=="pickup" and "💊 item" or "👤 player")
    print(string.format("  [%02d] %s  %-18s | HP: %-10s | 📍 (%.0f,%.0f,%.0f) | 📏 %.0fm",
        i, tag, v.name, v.hp,
        v.pos and v.pos.X or 0, v.pos and v.pos.Y or 0, v.pos and v.pos.Z or 0,
        v.dist))
end
print("\n❤️ ══════════════════════════════════════ ❤️")

--[[  🪙 AUTO-COLLECT SCANNER — standalone console  ]]
local lp = game:GetService("Players").LocalPlayer
local KEYWORDS = {
    "coin","gem","crystal","orb","pickup","collect","loot","token",
    "shard","fragment","star","cash","money","gold","silver","ring",
    "pearl","chest","drop","reward","item","xp","exp","soul","core",
    "essence","rune","badge","egg","seed","collectible",
}

local function match(name)
    local low = name:lower()
    for _, kw in ipairs(KEYWORDS) do if low:find(kw,1,true) then return true end end
end

local function getPos(obj)
    if obj:IsA("BasePart") then return obj.Position end
    if obj:IsA("Model") then
        local r = obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChildWhichIsA("BasePart")
        if r then return r.Position end
    end
end

local function dist(pos)
    local c = lp.Character; if not c then return 0 end
    local r = c:FindFirstChild("HumanoidRootPart"); if not r then return 0 end
    return pos and (r.Position - pos).Magnitude or 0
end

local results = {}
for _, obj in pairs(game:GetDescendants()) do
    if match(obj.Name) then
        local p = getPos(obj)
        if p then
            table.insert(results, {
                name=obj.Name, class=obj.ClassName,
                parent=obj.Parent and obj.Parent.Name or "?",
                pos=p, dist=dist(p),
            })
        end
    end
end
table.sort(results, function(a,b) return a.dist < b.dist end)

print("\n🪙 ════════ AUTO-COLLECT SCANNER ════════ 🪙")
print(string.format("  found: %d collectibles\n", #results))
for i, v in ipairs(results) do
    print(string.format("  [%02d] 💰  %-20s | 📁 %-12s | 📍 (%.0f,%.0f,%.0f) | 📏 %.0fm",
        i, v.name, v.parent,
        v.pos.X, v.pos.Y, v.pos.Z, v.dist))
end
print("\n🪙 ══════════════════════════════════════ 🪙")

--[[  📍 LOCATIONS SCANNER — standalone console  ]]
local lp = game:GetService("Players").LocalPlayer
local KEYWORDS = {
    "spawn","checkpoint","waypoint","gate","door","portal","region",
    "zone","area","base","flag","point","node","objective","marker",
    "platform","lobby","teleport","exit","entrance","hub","warp",
    "shop","vendor","boss","arena","safe","vault","tower","npc",
}

local function match(name)
    local low = name:lower()
    for _, kw in ipairs(KEYWORDS) do if low:find(kw,1,true) then return true end end
end

local function getPos(obj)
    if obj:IsA("BasePart") then return obj.Position end
    if obj:IsA("Model") then
        local r = obj:FindFirstChild("HumanoidRootPart") or obj:FindFirstChildWhichIsA("BasePart")
        if r then return r.Position end
    end
end

local function dist(pos)
    local c = lp.Character; if not c then return 0 end
    local r = c:FindFirstChild("HumanoidRootPart"); if not r then return 0 end
    return pos and (r.Position - pos).Magnitude or 0
end

local results = {}
for _, obj in pairs(game:GetDescendants()) do
    local hit = obj:IsA("SpawnLocation") or match(obj.Name)
    if hit then
        local p = getPos(obj)
        table.insert(results, {
            name=obj.Name, class=obj.ClassName,
            parent=obj.Parent and obj.Parent.Name or "?",
            pos=p, dist=dist(p),
        })
    end
end
table.sort(results, function(a,b) return a.dist < b.dist end)

print("\n📍 ════════ LOCATIONS SCANNER ════════ 📍")
print(string.format("  found: %d locations\n", #results))
for i, v in ipairs(results) do
    print(string.format("  [%02d] 📌  %-20s | 📁 %-12s | 📍 (%.0f,%.0f,%.0f) | 📏 %.0fm",
        i, v.name, v.parent,
        v.pos and v.pos.X or 0, v.pos and v.pos.Y or 0, v.pos and v.pos.Z or 0,
        v.dist))
end
print("\n📍 ══════════════════════════════════════ 📍")

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: