Universal npc detection
Key RequiredUniversal

Universal npc detection

Universal Scriptdpz3dpz3 1.3K views 397 executesUpdated Feb 21, 2026
3.3/ 5(3 votes)
2167% Positive
Lua Script•1580 lines (53132 chars)
getgenv().crosshair = {
    enabled = true,
    refreshrate = 0,
    mode = 'mouse',
    position = Vector2.new(0, 0),

    width = 1.5,
    length = 10,
    radius = 11,
    color = Color3.fromRGB(128, 16, 255),

    spin = true,
    spin_speed = 150,
    spin_max = 340,
    spin_style = Enum.EasingStyle.Sine,

    resize = true,
    resize_speed = 150,
    resize_min = 5,
    resize_max = 22,
}

local old; old = hookfunction(Drawing.new, function(class, properties)
    local drawing = old(class)
    for i, v in next, properties or {} do
        drawing[i] = v
    end
    return drawing
end)

local runservice = game:GetService('RunService')
local inputservice = game:GetService('UserInputService')
local tweenservice = game:GetService('TweenService')
local camera = workspace.CurrentCamera

local last_render = 0

local drawings = {
    crosshair = {},
    text = {Drawing.new('Text', {Size = 13, Font = 2, Outline = true, Text = 'Client', Color = Color3.new(1, 1, 1)}),
            Drawing.new('Text', {Size = 13, Font = 2, Outline = true, Text = ".cc"}),},
}

for idx = 1, 8 do
    drawings.crosshair[idx] = Drawing.new('Line')
end

function solve(angle, radius)
    return Vector2.new(
        math.sin(math.rad(angle)) * radius,
        math.cos(math.rad(angle)) * radius
    )
end

runservice.PostSimulation:Connect(function()

    local _tick = tick()

    if _tick - last_render > crosshair.refreshrate then
        last_render = _tick

        local position = (
            crosshair.mode == 'center' and camera.ViewportSize / 2 or
            crosshair.mode == 'mouse' and inputservice:GetMouseLocation() or
            crosshair.position
        )

        local text_x = drawings.text[1].TextBounds.X + drawings.text[2].TextBounds.X

        drawings.text[1].Visible = crosshair.enabled
        drawings.text[2].Visible = crosshair.enabled

        if crosshair.enabled then
            drawings.text[1].Position = position + Vector2.new(-text_x / 2, crosshair.radius + (crosshair.resize and crosshair.resize_max or crosshair.length) + 15)
            drawings.text[2].Position = drawings.text[1].Position + Vector2.new(drawings.text[1].TextBounds.X)
            drawings.text[2].Color = crosshair.color
            
            for idx = 1, 4 do
                local outline = drawings.crosshair[idx]
                local inline = drawings.crosshair[idx + 4]
    
                local angle = (idx - 1) * 90
                local length = crosshair.length
    
                if crosshair.spin then
                    local spin_angle = -_tick * crosshair.spin_speed % crosshair.spin_max
                    angle = angle + tweenservice:GetValue(spin_angle / 360, crosshair.spin_style, Enum.EasingDirection.InOut) * 360
                end
    
                if crosshair.resize then
                    local resize_length = tick() * crosshair.resize_speed % 180
                    length = crosshair.resize_min + math.sin(math.rad(resize_length)) * crosshair.resize_max
                end
    
                inline.Visible = true
                inline.Color = crosshair.color
                inline.From = position + solve(angle, crosshair.radius)
                inline.To = position + solve(angle, crosshair.radius + length)
                inline.Thickness = crosshair.width
    
                outline.Visible = true
                outline.From = position + solve(angle, crosshair.radius - 1)
                outline.To = position + solve(angle, crosshair.radius + length + 1)
                outline.Thickness = crosshair.width + 1.5    
            end
        else
            for idx = 1, 8 do
                drawings.crosshair[idx].Visible = false
            end
        end

    end
end)
--////////////
--////////////
_G.SilentAim = false 
_G.AimbotNPC = false 
_G.FOV = 150 
_G.VisibleCheck = true 
_G.TeamCheck = true 
_G.TeamCheckForNPCs = false 
_G.Prediction = 0.165 
_G.UpdateRate = 0.1 
_G.TargetMode = "NPCs" -- "NPCs", "Both"
_G.AimPart = "Head" -- "Head", "Torso", "Both", "Random"
_G.ShowTarget = true 
_G.HitChance = 100 
_G.BulletTeleport = false 
_G.ShowTargetName = true 
_G.ShowTargetType = true 
_G.ShowTargetHP = true 
_G.ShowTargetDistance = true 
_G.ShowHitChance = true 
_G.HighlightTarget = false 
_G.DebugNPCs = false 
_G.AggressiveNPCDetection = false 


_G.TargetPriority = "Distance" -- "Crosshair", "Distance", "LowestHP"
_G.StickyAim = true 
_G.FOVColor = Color3.fromRGB(255, 255, 255) 
_G.NPC_ESP_Enabled = false 
_G.NPC_ESP_Skeleton = true 
_G.NPC_ESP_Name = true 
_G.NPC_ESP_Distance = true 
_G.NPC_ESP_Color = Color3.fromRGB(255, 0, 0) 


task.spawn(function()
    for k, v in pairs(getgc(true)) do
        if pcall(function()
            return rawget(v, "indexInstance")
        end) and type(rawget(v, "indexInstance")) == "table" and (rawget(v, "indexInstance"))[1] == "kick" then
            setreadonly(v, false)
            v.tvk = {
                "kick",
                function()
                    return game.Workspace:WaitForChild("")
                end
            }
        end
    end
end)

--// Services
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local HttpService = game:GetService("HttpService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local CollectionService = game:GetService("CollectionService")
local Camera = workspace.CurrentCamera
local LocalPlayer = Players.LocalPlayer
local Mouse = LocalPlayer:GetMouse()

--// Fov circle
local Circle = getgenv().ScriptFOVCircle or Drawing.new("Circle")
getgenv().ScriptFOVCircle = Circle
Circle.Color = _G.FOVColor or Color3.fromRGB(255, 255, 255)
Circle.Thickness = 2
Circle.Visible = false
Circle.Radius = _G.FOV
Circle.Transparency = 0.7
Circle.Filled = false

--// Target info
local TargetInfo = getgenv().ScriptTargetInfo or Drawing.new("Text")
getgenv().ScriptTargetInfo = TargetInfo
TargetInfo.Visible = false
TargetInfo.Color = Color3.fromRGB(255, 255, 255)
TargetInfo.Size = 18
TargetInfo.Font = 2
TargetInfo.Outline = true
TargetInfo.OutlineColor = Color3.fromRGB(0, 0, 0)
TargetInfo.Text = ""

--// HIGHLIGHT
local TargetHighlight = nil
local HighlightConnection = nil

--// V
local CurrentTarget = nil
local TargetPart = nil
local TargetInRange = false
local NPCCache = {}
local PlayerCache = {}
local LastCacheUpdate = 0
local CacheUpdateInterval = 2
local NPCESPObjects = {}

--// hookvariables
local oldNamecall = nil
local oldIndex = nil

--// create highlights
local function CreateHighlight(target)
    if not target or not target:IsA("Model") then return nil end
    
    -- remove old highlight
    if TargetHighlight then
        TargetHighlight:Destroy()
        TargetHighlight = nil
    end
    
    if HighlightConnection then
        HighlightConnection:Disconnect()
        HighlightConnection = nil
    end
    
    -- create new highlight
    local highlight = Instance.new("Highlight")
    highlight.Name = "SilentAimHighlight"
    highlight.Adornee = target
    highlight.FillColor = Color3.fromRGB(255, 255, 255)
    highlight.FillTransparency = 0.7
    highlight.OutlineColor = Color3.fromRGB(255, 255, 255)
    highlight.OutlineTransparency = 0
    highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
    highlight.Parent = game:GetService("CoreGui")
    
    
    HighlightConnection = target.Destroying:Connect(function()
        if highlight then
            highlight:Destroy()
            TargetHighlight = nil
        end
    end)
    
    return highlight
end

--// update highlight
local function UpdateHighlight()
    if not _G.HighlightTarget then
        if TargetHighlight then
            TargetHighlight:Destroy()
            TargetHighlight = nil
        end
        if HighlightConnection then
            HighlightConnection:Disconnect()
            HighlightConnection = nil
        end
        return
    end
    
    if CurrentTarget then
        if not TargetHighlight or TargetHighlight.Adornee ~= CurrentTarget then
            TargetHighlight = CreateHighlight(CurrentTarget)
        end
        
        if TargetHighlight then
            -- update cores 
            local isPlayer = false
            for _, data in pairs(PlayerCache) do
                if data.Model == CurrentTarget then
                    isPlayer = true
                    break
                end
            end
            
            if isPlayer then
                TargetHighlight.FillColor = Color3.fromHSV(0.584951, 0.807843, 1)  -- Azul para players
            else
                TargetHighlight.FillColor = Color3.fromRGB(103, 206, 255)   -- Vermelho para NPCs
            end
            
            -- hit chance
            if _G.HitChance >= 80 then
                local pulse = math.sin(tick() * 3) * 0.2 + 0.8
                TargetHighlight.FillTransparency = 0.7 + (0.2 * (1 - pulse))
            else
                TargetHighlight.FillTransparency = 0.7
            end
        end
    else
        if TargetHighlight then
            TargetHighlight:Destroy()
            TargetHighlight = nil
        end
        if HighlightConnection then
            HighlightConnection:Disconnect()
            HighlightConnection = nil
        end
    end
end


local function CleanupUIOnly()
   
    if Circle then 
        Circle.Visible = false
    end
    
 
    if TargetInfo then
        TargetInfo.Visible = false
        TargetInfo.Text = ""  
    end
    
    
    if TargetHighlight then
        TargetHighlight:Destroy()
        TargetHighlight = nil
    end
    
    if HighlightConnection then
        HighlightConnection:Disconnect()
        HighlightConnection = nil
    end
    
    CurrentTarget = nil
    TargetPart = nil
    TargetInRange = false
    NPCCache = {}
    PlayerCache = {}
end

--// npcs function
local function GetCharacterPart(character, names)
    for _, name in ipairs(names) do
        local part = character:FindFirstChild(name)
        if part and part:IsA("BasePart") then
            return part
        end
    end
end


local NPCSkeletonBones = {
    {{"Head"}, {"UpperTorso", "Torso"}}, 
    {{"UpperTorso", "Torso"}, {"HumanoidRootPart"}}, 
    {{"UpperTorso", "Torso"}, {"LeftUpperArm", "Left Arm", "LeftArm"}}, 
    {{"UpperTorso", "Torso"}, {"RightUpperArm", "Right Arm", "RightArm"}}, 
    {{"HumanoidRootPart", "UpperTorso", "Torso"}, {"LeftUpperLeg", "Left Leg", "LeftLeg"}}, 
    {{"HumanoidRootPart", "UpperTorso", "Torso"}, {"RightUpperLeg", "Right Leg", "RightLeg"}}, 
}

local function EnsureNPCESPEntry(model)
    local esp = NPCESPObjects[model]
    if esp then return esp end

    esp = {
        SkeletonLines = {},
        Label = Drawing.new("Text"),
    }

    esp.Label.Visible = false
    esp.Label.Color = _G.NPC_ESP_Color
    esp.Label.Size = 14
    esp.Label.Font = 2
    esp.Label.Outline = true
    esp.Label.OutlineColor = Color3.fromRGB(0, 0, 0)
    esp.Label.Text = ""

    -- skeleton esp
    for i = 1, #NPCSkeletonBones do
        local line = Drawing.new("Line")
        line.Visible = false
        line.Thickness = 1.5
        line.Color = _G.NPC_ESP_Color
        esp.SkeletonLines[i] = line
    end

    NPCESPObjects[model] = esp
    return esp
end

local function HideNPCESPEntry(esp)
    if not esp then return end
    if esp.Label then
        esp.Label.Visible = false
    end
    if esp.SkeletonLines then
        for _, line in ipairs(esp.SkeletonLines) do
            line.Visible = false
        end
    end
end

local function UpdateNPCESP()
    if not _G.NPC_ESP_Enabled then
        for _, esp in pairs(NPCESPObjects) do
            HideNPCESPEntry(esp)
        end
        return
    end

    for model, esp in pairs(NPCESPObjects) do
        if not NPCCache[model] or not model.Parent then
            HideNPCESPEntry(esp)
            NPCESPObjects[model] = nil
        end
    end

   
    for model, data in pairs(NPCCache) do
        local humanoid = data.Humanoid
        if humanoid and humanoid.Health > 0 and model.Parent then
            local esp = EnsureNPCESPEntry(model)

            -- update color based on ui
            esp.Label.Color = _G.NPC_ESP_Color
            for _, line in ipairs(esp.SkeletonLines) do
                line.Color = _G.NPC_ESP_Color
            end

            
            local head = GetCharacterPart(model, {"Head"})
            local root = GetCharacterPart(model, {"HumanoidRootPart"})
            local basePart = head or root

            -- esp
            if _G.NPC_ESP_Name or _G.NPC_ESP_Distance then
                if basePart then
                    local screenPos, onScreen = Camera:WorldToViewportPoint(basePart.Position)
                    if onScreen then
                        local lines = {}
                        if _G.NPC_ESP_Name then
                            table.insert(lines, "[NPC] " .. model.Name)
                        end

                        if _G.NPC_ESP_Distance and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                            local localRoot = LocalPlayer.Character.HumanoidRootPart
                            local distance = (basePart.Position - localRoot.Position).Magnitude
                            table.insert(lines, string.format("Dist: %.1f studs", distance))
                        end

                        if #lines > 0 then
                            esp.Label.Visible = true
                            esp.Label.Position = Vector2.new(screenPos.X, screenPos.Y - 25)
                            esp.Label.Text = table.concat(lines, "\n")
                        else
                            esp.Label.Visible = false
                            esp.Label.Text = ""
                        end
                    else
                        esp.Label.Visible = false
                    end
                else
                    esp.Label.Visible = false
                end
            else
                esp.Label.Visible = false
            end

            -- Skeleton ESP
            if _G.NPC_ESP_Skeleton then
                for index, bone in ipairs(NPCSkeletonBones) do
                    local fromPart = GetCharacterPart(model, bone[1])
                    local toPart = GetCharacterPart(model, bone[2])
                    local line = esp.SkeletonLines[index]

                    if fromPart and toPart and line then
                        local s1, on1 = Camera:WorldToViewportPoint(fromPart.Position)
                        local s2, on2 = Camera:WorldToViewportPoint(toPart.Position)

                        if on1 and on2 then
                            line.Visible = true
                            line.From = Vector2.new(s1.X, s1.Y)
                            line.To = Vector2.new(s2.X, s2.Y)
                        else
                            line.Visible = false
                        end
                    elseif line then
                        line.Visible = false
                    end
                end
            else
                for _, line in ipairs(esp.SkeletonLines) do
                    line.Visible = false
                end
            end
        else
            local esp = NPCESPObjects[model]
            if esp then
                HideNPCESPEntry(esp)
            end
        end
    end
end

--// Npc tags list
local NPCTags = {
    -- NPC
    "NPC", "Npc", "npc",
    
    "Enemy", "enemy", "Enemies", "enemies",
    "Hostile", "hostile", "Bad", "bad", "BadGuy", "badguy",
    "Foe", "foe", "Opponent", "opponent",
    
    "Bot", "bot", "Bots", "bots",
    "Mob", "mob", "Mobs", "mobs",
    "Monster", "monster", "Monsters", "monsters",
    "Zombie", "zombie", "Zombies", "zombies",
    "Creature", "creature", "Animal", "animal", "Beast", "beast",
    
    "Villain", "villain", "Villian", "villian",
    "Boss", "boss", "MiniBoss", "miniboss",
    "Guard", "guard", "Guardian", "guardian",
    "Soldier", "soldier", "Warrior", "warrior",
    "Fighter", "fighter",
    
    "Target", "target",
    "Dummy", "dummy", "Dummies", "dummies",
    "Practice", "practice", "Training", "training",
    
    "Skeleton", "skeleton",
    "Orc", "orc", "Goblin", "goblin",
    "Troll", "troll", "Ogre", "ogre",
    "Demon", "demon", "Devil", "devil",
    "Ghost", "ghost", "Spirit", "spirit",
    "Vampire", "vampire", "Werewolf", "werewolf",
    "Dragon", "dragon", "Wyvern", "wyvern",
    
    "Gang", "gang", "Thug", "thug",
    "Bandit", "bandit", "Raider", "raider",
    "Pirate", "pirate", "Corsair", "corsair",
    
    "Agent", "agent", "Assassin", "assassin",
    "Mercenary", "mercenary", "Hunter", "hunter",
    
    "Robot", "robot", "Drone", "drone",
    "Android", "android", "Cyborg", "cyborg",
    "Automaton", "automaton",
    
    "Servant", "servant", "Minion", "minion",
    "Slave", "slave", "Pawn", "pawn",
    
    "AI", "ai", "A.I.",
    "Char", "char", "Character", "character",
    "Model", "model",
    
    "Event", "event", "Special", "special",
    "Holiday", "holiday", "Seasonal", "seasonal",
}

--// npcs debug
local function DebugNPCDetection(character, reason)
    if not _G.DebugNPCs then return end
end

local function IsPlayer(character)
    if not character or not character:IsA("Model") then
        return false
    end
    if character == LocalPlayer.Character then
        return true
    end
    local player = Players:GetPlayerFromCharacter(character)
    return player ~= nil
end

-- Is npc? function
local function IsNPC(character)
    if not character or not character:IsA("Model") then
        return false
    end
    
    -- Ignore if is player
    if IsPlayer(character) then
        return false
    end
    
    -- basics 
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    local head = character:FindFirstChild("Head")
    local hrp = character:FindFirstChild("HumanoidRootPart")
    
    if not humanoid or not head or not hrp or humanoid.Health <= 0 then
        return false
    end
    
    -- detects any humanoid model as npc
    if _G.AggressiveNPCDetection then
        DebugNPCDetection(character, "Npc")
        return true
    end
    
    local charName = character.Name:lower()
    
    -- verify tags
    for _, tag in pairs(NPCTags) do
        if charName:find(tag:lower(), 1, true) then
            DebugNPCDetection(character, "Tag: " .. tag)
            return true
        end
    end
    
    local npcFolders = {
        "NPCs", "Enemies", "Bots", "Mobs", "Targets", "Enemy", "Hostile",
        "Monsters", "Zombies", "Creatures", "Characters", "Spawns",
        "EnemySpawns", "NPCSpawns", "Bosses", "Minions"
    }
    
    for _, folderName in pairs(npcFolders) do
        local folder = workspace:FindFirstChild(folderName)
        if folder and character:IsDescendantOf(folder) then
            DebugNPCDetection(character, "Na pasta: " .. folderName)
            return true
        end
    end
    
    -- verify for values and customs ig
    local possibleNPCIndicators = {
        "NPC", "IsNPC", "IsEnemy", "Hostile", "Enemy", 
        "IsBot", "IsMob", "IsMonster", "Team", "Faction"
    }
    
    for _, indicator in pairs(possibleNPCIndicators) do
        local value = character:FindFirstChild(indicator)
        if value then
            if value:IsA("BoolValue") then
                if indicator == "NPC" or indicator == "IsNPC" or 
                   indicator == "IsEnemy" or indicator == "Hostile" then
                    if value.Value == true then
                        DebugNPCDetection(character, "BoolValue: " .. indicator .. " = true")
                        return true
                    end
                end
            elseif value:IsA("StringValue") then
                local valLower = value.Value:lower()
                if valLower == "enemy" or valLower == "hostile" or 
                   valLower == "npc" or valLower == "bot" or
                   valLower == "monster" or valLower == "mob" then
                    DebugNPCDetection(character, "StringValue: " .. indicator .. " = " .. value.Value)
                    return true
                end
            elseif value:IsA("IntValue") then
                if indicator == "Team" then
                    DebugNPCDetection(character, "Team Value: " .. value.Value)
                    return true
                end
            end
        end
    end
    
    local hasAIBehavior = false
    for _, child in pairs(character:GetChildren()) do
        local childName = child.Name:lower()
        if child:IsA("Script") or child:IsA("LocalScript") then
            if childName:find("ai") or childName:find("behavior") or 
               childName:find("path") or childName:find("attack") or
               childName:find("patrol") or childName:find("combat") then
                hasAIBehavior = true
                break
            end
        end
    end
    
    -- verify conection service tags ig
    local tags = CollectionService:GetTags(character)
    for _, tag in pairs(tags) do
        local tagLower = tag:lower()
        for _, npcTag in pairs(NPCTags) do
            if tagLower:find(npcTag:lower(), 1, true) then
                DebugNPCDetection(character, "CollectionService Tag: " .. tag)
                return true
            end
        end
    end
    
    local npcAbilities = {"Attack", "Damage", "Aggro", "Patrol", "Spawn", "Respawn", "AI", "BehaviorTree"}
    for _, ability in pairs(npcAbilities) do
        if character:FindFirstChild(ability) or character:FindFirstChild(ability .. "Script") then
            hasAIBehavior = true
            break
        end
    end
    
    if hasAIBehavior then
        DebugNPCDetection(character, "AI Behaviour detected")
        return true
    end
    
    -- verify for prefix
    local namePatterns = {"^npc_", "^enemy_", "^bot_", "^mob_", "_npc$", "_enemy$", "_bot$"}
    for _, pattern in pairs(namePatterns) do
        if string.match(charName, pattern) then
            DebugNPCDetection(character, "Name: " .. pattern)
            return true
        end
    end
    
    DebugNPCDetection(character, "Npc")
    return true
end

--// search for npcs everywhere ig
local function FindNPCsInWorkspaceRecursive(parent)
    local foundNPCs = {}
    
    for _, child in pairs(parent:GetChildren()) do
        if child:IsA("Model") then
            if IsNPC(child) then
                table.insert(foundNPCs, child)
            end
        end
        
        -- search npc thing too 
        if not child:IsA("BasePart") and not child:IsA("Decal") and not child:IsA("Texture") then
            local subNPCs = FindNPCsInWorkspaceRecursive(child)
            for _, npc in pairs(subNPCs) do
                table.insert(foundNPCs, npc)
            end
        end
    end
    
    return foundNPCs
end


local function IsEnemyPlayer(player)
    if not _G.TeamCheck then
        return true
    end
    
    if not player then
        return false
    end
    
    if not LocalPlayer.Team or not player.Team then
        return true
    end
    
    return LocalPlayer.Team ~= player.Team
end

--// verify team npc
local function IsEnemyNPC(npcModel)
    if not _G.TeamCheckForNPCs then
        return true
    end
    
    -- verify if npc has a team
    local npcTeamValue = npcModel:FindFirstChild("Team")
    if npcTeamValue and npcTeamValue:IsA("StringValue") then
        local npcTeam = npcTeamValue.Value
        local localTeam = LocalPlayer.Team and LocalPlayer.Team.Name or ""
        
        if npcTeam and localTeam and npcTeam ~= localTeam then
            return true
        end
    end
    
    -- Verify for enemy boolvalue
    local isEnemy = npcModel:FindFirstChild("IsEnemy")
    if isEnemy and isEnemy:IsA("BoolValue") and isEnemy.Value == true then
        return true
    end
    
    return true
end

--// Hit part selection
local function GetTargetPart(character)
    if _G.AimPart == "Head" then
        return character:FindFirstChild("Head")
    elseif _G.AimPart == "Torso" then
        return character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso") or character:FindFirstChild("HumanoidRootPart")
    elseif _G.AimPart == "Random" then
        local parts = {
            character:FindFirstChild("Head"),
            character:FindFirstChild("UpperTorso"),
            character:FindFirstChild("Torso"),
            character:FindFirstChild("HumanoidRootPart")
        }
        for _, part in pairs(parts) do
            if part then return part end
        end
    elseif _G.AimPart == "Both" then
        local head = character:FindFirstChild("Head")
        local torso = character:FindFirstChild("UpperTorso") or character:FindFirstChild("Torso") or character:FindFirstChild("HumanoidRootPart")
        if head and torso then
            return tick() % 1 > 0.5 and head or torso
        elseif head then
            return head
        elseif torso then
            return torso
        end
    end
    
    return character:FindFirstChild("HumanoidRootPart") or character:FindFirstChild("Head")
end

--// update cache function optimized
local function UpdateCaches()
    local currentTime = tick()
    
    if currentTime - LastCacheUpdate < CacheUpdateInterval then
        return
    end
    
    LastCacheUpdate = currentTime
    
    local tempNPCCache = {}
    local tempPlayerCache = {}
    local allModels = {}
    
    local wsChildren = workspace:GetChildren()
    for _, model in pairs(wsChildren) do
        if model:IsA("Model") and model ~= LocalPlayer.Character then
            table.insert(allModels, model)
        end
    end
    
    local npcFolders = {"NPCs", "Enemies", "Bots", "Mobs", "Targets", 
                        "Characters", "Spawns", "Monsters", "Zombies",
                        "Enemy", "Hostile", "Bosses", "Minions", "Creatures"}
    
    for _, folderName in pairs(npcFolders) do
        local folder = workspace:FindFirstChild(folderName)
        if folder then
            local npcsInFolder = FindNPCsInWorkspaceRecursive(folder)
            for _, npc in pairs(npcsInFolder) do
                table.insert(allModels, npc)
            end
        end
    end
    

    if _G.AggressiveNPCDetection then
        local counter = 0
        local descendants = workspace:GetDescendants() -- Get anythin
        
        for _, descendant in pairs(descendants) do
            -- Filter models
            if descendant:IsA("Model") and descendant ~= LocalPlayer.Character then
                table.insert(allModels, descendant)
                
                counter = counter + 1
                if counter % 150 == 0 then
                    task.wait() 
                end
            end
        end
    end
    
    local processCounter = 0
    for _, model in pairs(allModels) do
        processCounter = processCounter + 1
        if processCounter % 200 == 0 then task.wait() end

        local hrp = model:FindFirstChild("HumanoidRootPart")
        local humanoid = model:FindFirstChildOfClass("Humanoid")
        
        if hrp and humanoid and humanoid.Health > 0 then
            if IsPlayer(model) then
                tempPlayerCache[model] = {
                    Model = model,
                    HRP = hrp,
                    Humanoid = humanoid,
                    Player = Players:GetPlayerFromCharacter(model),
                    IsNPC = false
                }
            elseif IsNPC(model) then
                tempNPCCache[model] = {
                    Model = model,
                    HRP = hrp,
                    Humanoid = humanoid,
                    IsNPC = true
                }
            end
        end
    end
    
    for _, player in pairs(Players:GetPlayers()) do
        if player ~= LocalPlayer and player.Character then
            local char = player.Character
            local hrp = char:FindFirstChild("HumanoidRootPart")
            local humanoid = char:FindFirstChildOfClass("Humanoid")
            
            if hrp and humanoid and humanoid.Health > 0 then
                tempPlayerCache[char] = {
                    Model = char,
                    HRP = hrp,
                    Humanoid = humanoid,
                    Player = player,
                    IsNPC = false
                }
            end
        end
    end
    
    NPCCache = tempNPCCache
    PlayerCache = tempPlayerCache
end

local function ValidateCurrentTarget()
    if not CurrentTarget or not TargetPart then return false end
    
    local humanoid = CurrentTarget:FindFirstChildOfClass("Humanoid")
    local hrp = CurrentTarget:FindFirstChild("HumanoidRootPart")
    
    if not humanoid or humanoid.Health <= 0 or not hrp then return false end
    
    local screenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)
    local targetPos = TargetPart.Position
    local screenPos, onScreen = Camera:WorldToViewportPoint(targetPos)
    
    if not onScreen then return false end
    
    local screenPoint = Vector2.new(screenPos.X, screenPos.Y)
    local dist = (screenPoint - screenCenter).Magnitude
    
    if dist > _G.FOV then return false end
    
    -- wallcheck
    if _G.VisibleCheck then
        local raycastParams = RaycastParams.new()
        raycastParams.FilterDescendantsInstances = {LocalPlayer.Character, Camera}
        raycastParams.FilterType = Enum.RaycastFilterType.Blacklist
        raycastParams.IgnoreWater = true
        
        local origin = Camera.CFrame.Position
        local direction = (targetPos - origin).Unit * (targetPos - origin).Magnitude
        local ray = workspace:Raycast(origin, direction, raycastParams)
        
        if ray then
            local hitPart = ray.Instance
            if not hitPart:IsDescendantOf(CurrentTarget) then
                return false
            end
        end
    end
    
    return true
end

local function GetTarget()
    if not LocalPlayer.Character then 
        TargetInRange = false
        TargetPart = nil
        return nil 
    end
    
    UpdateCaches()
    
    if _G.StickyAim and CurrentTarget then
        if ValidateCurrentTarget() then
            TargetInRange = true
            return CurrentTarget
        else
            CurrentTarget = nil
            TargetPart = nil
        end
    end
    
    local bestScore = math.huge 
    local closestPart = nil
    local closestTarget = nil
    local screenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)
    local localChar = LocalPlayer.Character
    local localRoot = localChar:FindFirstChild("HumanoidRootPart")
    
    TargetInRange = false
    TargetPart = nil
    
    if not localRoot then return nil end
    
    local function ProcessTarget(data, isPlayer)
        local hrp = data.HRP
        local humanoid = data.Humanoid
        
        if hrp and humanoid and humanoid.Health > 0 then
            -- teamcheck
            if isPlayer then
                if not IsEnemyPlayer(data.Player) then return end
            else
                if not IsEnemyNPC(data.Model) then return end
            end
            
            -- hitpart
            local targetPart = GetTargetPart(data.Model)
            if not targetPart then targetPart = hrp end
            
            local targetPos = targetPart.Position
            
            if hrp.Velocity.Magnitude > 1 and _G.Prediction > 0 then
                targetPos = targetPos + (hrp.Velocity * _G.Prediction)
            end
            
            local screenPos, onScreen = Camera:WorldToViewportPoint(targetPos)
            
            if onScreen then
                local screenPoint = Vector2.new(screenPos.X, screenPos.Y)
                local distFromCenter = (screenPoint - screenCenter).Magnitude
                
                
                if distFromCenter <= _G.FOV then
                    local isVisible = true
                    
                    -- WALL CHECK
                    if _G.VisibleCheck then
                        local raycastParams = RaycastParams.new()
                        raycastParams.FilterDescendantsInstances = {localChar, Camera}
                        raycastParams.FilterType = Enum.RaycastFilterType.Blacklist
                        raycastParams.IgnoreWater = true
                        
                        local origin = Camera.CFrame.Position
                        local direction = (targetPos - origin).Unit * (targetPos - origin).Magnitude
                        local ray = workspace:Raycast(origin, direction, raycastParams)
                        
                        if ray then
                            local hitPart = ray.Instance
                            local isTargetPart = hitPart:IsDescendantOf(data.Model)
                            if not isTargetPart then isVisible = false end
                        end
                    end
                    
                    TargetInRange = true
                    
                    -- priority logic
                    if isVisible or not _G.VisibleCheck then
                        local currentScore = 0
                        
                        if _G.TargetPriority == "Crosshair" then
                            -- Prioridade padrão: Distância da mira
                            currentScore = distFromCenter
                        elseif _G.TargetPriority == "Distance" then
                            -- Nova Prioridade: Distância 3D (perto do player)
                            currentScore = (targetPos - localRoot.Position).Magnitude
                        elseif _G.TargetPriority == "LowestHP" then
                            -- Nova Prioridade: Menor Vida
                            currentScore = humanoid.Health
                        else
                            currentScore = distFromCenter
                        end
                        
                        if currentScore < bestScore then
                            bestScore = currentScore
                            closestPart = targetPart
                            closestTarget = data.Model
                        end
                    end
                end
            end
        end
    end
    
    if _G.TargetMode == "NPCs" or _G.TargetMode == "Both" then
        for _, data in pairs(NPCCache) do ProcessTarget(data, false) end
    end
    
    if _G.TargetMode == "Players" or _G.TargetMode == "Both" then
        for _, data in pairs(PlayerCache) do ProcessTarget(data, true) end
    end
    
    TargetPart = closestPart
    return closestTarget
end

--// update target
task.spawn(function()
    while true do
        task.wait(_G.UpdateRate)
        if _G.SilentAim or _G.AimbotNPC then
            CurrentTarget = GetTarget()
        else
            CurrentTarget = nil
            TargetInRange = false
            TargetPart = nil
        end
    end
end)

--// hit chance
local function ShouldHit()
    if _G.HitChance >= 100 then
        return true
    end
    if _G.HitChance <= 0 then
        return false
    end
    local randomNumber = math.random(1, 100)
    return randomNumber <= _G.HitChance
end

-- hitchance display
local function CalculateHitChanceDisplay()
    if not CurrentTarget or not TargetPart then
        return 0
    end
    local baseChance = _G.HitChance
    local distanceFactor = 1.0
    local fovFactor = 1.0
    
    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
        local localPos = LocalPlayer.Character.HumanoidRootPart.Position
        local targetPos = TargetPart.Position
        local distance = (targetPos - localPos).Magnitude
        
        if distance < 50 then distanceFactor = 1.1 
        elseif distance > 200 then distanceFactor = 0.8 end
    end
    
    if _G.FOV < 100 then fovFactor = 1.15 elseif _G.FOV > 250 then fovFactor = 0.9 end
    local finalChance = baseChance * distanceFactor * fovFactor
    local randomVariation = math.random(-5, 5)
    finalChance = math.clamp(finalChance + randomVariation, 1, 100)
    
    return math.floor(finalChance)
end

--// target
local function UpdateTargetInfo()
    if not _G.ShowTarget or not TargetInfo then
        TargetInfo.Visible = false
        TargetInfo.Text = "" 
        return
    end
    
    if not (_G.SilentAim or _G.AimbotNPC) then
        TargetInfo.Visible = false
        TargetInfo.Text = "" 
        return
    end
    
    local shouldShowHitChance = _G.ShowHitChance and _G.HitChance > 0
    
    if CurrentTarget and TargetPart then
        local screenPos, onScreen = Camera:WorldToViewportPoint(TargetPart.Position)
        
        if onScreen then
            TargetInfo.Visible = true
            TargetInfo.Position = Vector2.new(screenPos.X, screenPos.Y + 20)
            
            local infoLines = {}
            
            if _G.ShowTargetName then
                local targetName = CurrentTarget.Name
                local targetType = "NPC"
                for _, data in pairs(PlayerCache) do
                    if data.Model == CurrentTarget then
                        targetType = "Player"
                        targetName = data.Player.Name
                        break
                    end
                end
                
                if _G.ShowTargetType then
                    table.insert(infoLines, string.format("[%s] %s", targetType, targetName))
                else
                    table.insert(infoLines, targetName)
                end
            end
            
            if _G.ShowTargetHP then
                local humanoid = CurrentTarget:FindFirstChildOfClass("Humanoid")
                if humanoid then
                    local health = string.format("%.0f", humanoid.Health)
                    local maxHealth = string.format("%.0f", humanoid.MaxHealth)
                    table.insert(infoLines, string.format("HP: %s/%s", health, maxHealth))
                end
            end
            
            if _G.ShowTargetDistance then
                if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                    local localPos = LocalPlayer.Character.HumanoidRootPart.Position
                    local targetPos = TargetPart.Position
                    local distance = string.format("%.1f", (targetPos - localPos).Magnitude)
                    table.insert(infoLines, string.format("Dist: %s studs", distance))
                end
            end
            
            if shouldShowHitChance then
                local displayChance = CalculateHitChanceDisplay()
                table.insert(infoLines, string.format("Chance: %d%%", displayChance))
            end
            
            if #infoLines > 0 then
                TargetInfo.Text = table.concat(infoLines, "\n")
            else
                TargetInfo.Text = "nigger detected"
            end
        else
            TargetInfo.Visible = false
            TargetInfo.Text = ""
        end
    else
        TargetInfo.Visible = false
        TargetInfo.Text = "" 
    end
end

--// bullet tp
local function TeleportBulletToTargetImproved(origin, direction, bulletName)
    if not _G.BulletTeleport or not TargetPart or not CurrentTarget then
        return origin, direction
end
    
    local bulletNames = {"bullet", "ammo", "shot", "projectile", "missile", "rocket", "hit", "damage", "fire", "shoot"}
    local isBullet = false
    
    for _, name in pairs(bulletNames) do
        if string.find(bulletName:lower(), name) then
            isBullet = true
            break
        end
    end
    
    if not isBullet then return origin, direction end
    if not ShouldHit() then return origin, direction end
    
    local targetPosition = TargetPart.Position
    
    if _G.Prediction > 0 and TargetPart.Parent:FindFirstChild("HumanoidRootPart") then
        local hrp = TargetPart.Parent:FindFirstChild("HumanoidRootPart")
        if hrp and hrp.Velocity.Magnitude > 1 then
            targetPosition = targetPosition + (hrp.Velocity * _G.Prediction)
        end
    end
    
    local randomOffset = Vector3.new(
        (math.random() - 0.5) * 0.5,
        (math.random() - 0.5) * 0.3,
        (math.random() - 0.5) * 0.5
    )
    
    targetPosition = targetPosition + randomOffset
    local newDirection = (targetPosition - origin).Unit * direction.Magnitude
    
    return origin, newDirection
end

--// HOOKS
if not oldNamecall then
    oldNamecall = hookmetamethod(game, "__namecall", function(self, ...)
        if not _G.SilentAim or not TargetPart or not CurrentTarget then
            return oldNamecall(self, ...)
        end
        
        local method = getnamecallmethod()
        local args = {...}
        
        -- bullet tp
        if _G.BulletTeleport and (method == "FireServer" or method == "InvokeServer") and typeof(self) == "Instance" then
            local selfName = self.Name:lower()
        end
        
        -- HIT REDIRECTION
        if (method == "FireServer" or method == "InvokeServer") and typeof(self) == "Instance" then
            local selfName = self.Name:lower()
            if string.find(selfName, "fire") or string.find(selfName, "hit") or string.find(selfName, "attack") or string.find(selfName, "damage") then
                if not ShouldHit() then
                    return oldNamecall(self, ...)
                end
                
                local newArgs = {}
                local modified = false
                
                for i, arg in pairs(args) do
                    if typeof(arg) == "Vector3" then
                        newArgs[i] = TargetPart.Position
                        modified = true
                    elseif typeof(arg) == "CFrame" then
                        newArgs[i] = CFrame.new(TargetPart.Position)
                        modified = true
                    elseif typeof(arg) == "Ray" then
                        local origin = arg.Origin
                        newArgs[i] = Ray.new(origin, (TargetPart.Position - origin).Unit * 100)
                        modified = true
                    else
                        newArgs[i] = arg
                    end
                end
        
                if modified then
                    return oldNamecall(self, unpack(newArgs))
                end
            end
        end
        
        if method == "Raycast" and self == workspace then
            local origin = args[1]
            local direction = args[2]
            
            if origin and TargetPart then
                if not ShouldHit() then
                    return oldNamecall(self, ...)
                end
                
                local newDir = (TargetPart.Position - origin).Unit * direction.Magnitude
                return oldNamecall(self, origin, newDir, args[3], args[4])
            end
        end
        
        return oldNamecall(self, ...)
    end)
end

if not oldIndex then
    oldIndex = hookmetamethod(game, "__index", function(self, key)
        if self == Mouse and _G.SilentAim and TargetPart then
            local keyLower = string.lower(key)
            if keyLower == "hit" then
                if not ShouldHit() then
                    return oldIndex(self, key)
                end
                return CFrame.new(TargetPart.Position)
            elseif keyLower == "target" then
                return TargetPart
            end
        end
        return oldIndex(self, key)
    end)
end

-- update loop visuals
RunService.RenderStepped:Connect(function()
    Circle.Visible = _G.SilentAim or _G.AimbotNPC
    
    if _G.SilentAim or _G.AimbotNPC then
        local screenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)
        Circle.Position = screenCenter
        Circle.Radius = _G.FOV
        
        -- fov color
        Circle.Color = _G.FOVColor or Color3.fromRGB(255, 255, 255)
    else
        Circle.Visible = false
    end
    
    UpdateTargetInfo()
    UpdateHighlight()

    -- aimbot
    if _G.AimbotNPC then
        CurrentTarget = GetTarget()
    end

    if _G.AimbotNPC and CurrentTarget and TargetPart then
        if _G.TargetMode == "NPCs" or not IsPlayer(CurrentTarget) then
            local camPos = Camera.CFrame.Position
            local targetPos = TargetPart.Position

            -- prediction
            if _G.Prediction > 0 then
                local vel = (typeof(TargetPart.Velocity) == "Vector3") and TargetPart.Velocity or nil
                local hrp = CurrentTarget:FindFirstChild("HumanoidRootPart")
                if (not vel or vel.Magnitude < 0.01) and hrp then
                    vel = (typeof(hrp.Velocity) == "Vector3") and hrp.Velocity or nil
                end
                if vel and vel.Magnitude > 0.01 then
                    targetPos = targetPos + (vel * _G.Prediction)
                end
            end

            local desired = CFrame.new(camPos, targetPos)
            Camera.CFrame = desired
        end
    end

    -- ESP npc
    UpdateNPCESP()
end)


local Library = loadstring(game:HttpGet(
    "https://raw.githubusercontent.com/qxkzx/NpcDetection/refs/heads/main/Ui-Open-Source"
))()

local Window = Library:CreateWindow({
    Title = "Client.cc",
    Author = "6qxs",
    Keybind = Enum.KeyCode.RightControl
})

--// Tabs
local TabMain = Window:CreateTab("SilentAim")
local TabAimbotNPC = Window:CreateTab("Aimbot")
local TabNPC = Window:CreateTab("Npc detection")
local TabESP = Window:CreateTab("Esp (npc)")
local TabTarget = Window:CreateTab("Target")
local TabAim = Window:CreateTab("Fov color")
local TabTeam = Window:CreateTab("Team")
local TabInfo = Window:CreateTab("target info")
local TabExtra = Window:CreateTab("Extra")

--// Main tab
TabMain:CreateLabel("Main")
TabMain:CreateToggle("Silent Aim", function(Value)
    _G.SilentAim = Value
    if Value then
        LastCacheUpdate = 0; UpdateCaches()
        Library:Notification({Title = "SILENT AIM", Text = "On", Duration = 1.5, Type = "Success"})
    else
        if TargetHighlight then TargetHighlight:Destroy(); TargetHighlight = nil end
        Library:Notification({Title = "SILENT AIM", Text = "Off", Duration = 1.5, Type = "Error"})
    end
end, false)

TabMain:CreateSlider("FOV", 50, 300, 150, function(Value) _G.FOV = math.floor(Value); Circle.Radius = _G.FOV end)
TabMain:CreateSlider("Prediction", 0, 0.5, 0.165, function(Value) _G.Prediction = tonumber(string.format("%.3f", Value)) end)
TabMain:CreateSlider("Hit Chance", 0, 100, 100, function(Value) _G.HitChance = math.floor(Value) end)
TabMain:CreateSlider("update rate", 0.05, 0.5, 0.1, function(Value) _G.UpdateRate = tonumber(string.format("%.2f", Value)) end)

TabMain:CreateLabel("")
TabMain:CreateLabel("Configurations")
TabTarget:CreateDropdown("Mode", {"NPCs", "Both"}, function(Value) _G.TargetMode = Value end)
TabMain:CreateDropdown("Hit part", {"Head", "Torso", "Both", "Random"}, function(Value) _G.AimPart = Value; CurrentTarget = nil end)
TabMain:CreateToggle("Wall Check", function(Value) _G.VisibleCheck = Value end, true)
TabMain:CreateToggle("Bullet Teleport", function(Value) _G.BulletTeleport = Value end, false)
TabTarget:CreateToggle("Show Target", function(Value) _G.ShowTarget = Value end, true)


TabMain:CreateDropdown("priority mode", {"Crosshair", "Distance", "LowestHP"}, function(Value)
    _G.TargetPriority = Value
    CurrentTarget = nil -- Resetar alvo ao mudar
    Library:Notification({Title = "Mode changed", Text = "Prioridade: " .. Value, Duration = 2})
end)

TabMain:CreateToggle("Sticky Aim", function(Value)
    _G.StickyAim = Value
end, true)

TabMain:CreateLabel("Crosshair")
TabMain:CreateLabel("Distance")
TabMain:CreateLabel("LowestHP")
TabMain:CreateLabel("Sticky Aim")

--// aim
TabAim:CreateColorPicker("Fov color", Color3.fromRGB(255, 255, 255), function(Color) _G.FOVColor = Color; Circle.Color = Color end)

--// team
TabTeam:CreateLabel("Teamcheck")
TabTeam:CreateToggle("Team Check - Players", function(Value) _G.TeamCheck = Value end, true)
TabTeam:CreateToggle("Team Check - NPCs", function(Value) _G.TeamCheckForNPCs = Value end, false)

--// extra
TabExtra:CreateLabel("Extra")
TabExtra:CreateToggle("Highlight", function(Value) _G.HighlightTarget = Value end, false)
TabExtra:CreateColorPicker("Highlight NPC", Color3.fromRGB(255, 255, 255), function(Color) end)
TabExtra:CreateColorPicker("Highlight Player", Color3.fromRGB(50, 150, 255), function(Color) end)
TabExtra:CreateTextBox("Cache Interval (s)", "2", function(Text) local num = tonumber(Text); if num and num > 0 then CacheUpdateInterval = num end end)

--// npc
TabNPC:CreateLabel("Npc")
TabNPC:CreateToggle("Npc Detection", function(Value)
    _G.AggressiveNPCDetection = Value
    LastCacheUpdate = 0; UpdateCaches()

end, false)
TabNPC:CreateToggle("Debug NPCs", function(Value) _G.DebugNPCs = Value end, false)
TabNPC:CreateButton("Force cache update", function() LastCacheUpdate = 0; UpdateCaches() end)
TabNPC:CreateButton("detected npcs list", function()
    local npcCount = 0; for _ in pairs(NPCCache) do npcCount = npcCount + 1 end
    Library:Notification({Title = "detection", Text = string.format("NPCs: %d", npcCount), Duration = 2})
end)

--// ESP NPC TAB
TabESP:CreateLabel("ESP NPCs")
TabESP:CreateToggle("Enable ESP", function(Value)
    _G.NPC_ESP_Enabled = Value
    if not Value then
        -- Esconder imediatamente quando desligar
        for _, esp in pairs(NPCESPObjects) do
            if esp.Label then esp.Label.Visible = false end
            if esp.SkeletonLines then
                for _, line in ipairs(esp.SkeletonLines) do
                    line.Visible = false
                end
            end
        end
    end
end, false)

TabESP:CreateToggle("Skeleton ESP", function(Value)
    _G.NPC_ESP_Skeleton = Value
end, true)

TabESP:CreateToggle("Name ESP", function(Value)
    _G.NPC_ESP_Name = Value
end, true)

TabESP:CreateToggle("Distance ESP", function(Value)
    _G.NPC_ESP_Distance = Value
end, true)

TabESP:CreateColorPicker("ESP Color", Color3.fromRGB(255, 0, 0), function(Color)
    _G.NPC_ESP_Color = Color
end)

--// Aimbot
TabAimbotNPC:CreateLabel("")
TabAimbotNPC:CreateToggle("Aimbot", function(Value)
    _G.AimbotNPC = Value
    if Value then
        _G.TargetMode = "NPCs"
        _G.AimPart = "Head"
        LastCacheUpdate = 0
        UpdateCaches()
        Library:Notification({Title = "Aimbot", Text = "On", Duration = 1.5, Type = "Success"})
    else
        if TargetHighlight then TargetHighlight:Destroy(); TargetHighlight = nil end
        Library:Notification({Title = "Aimbot", Text = "Off", Duration = 1.5, Type = "Error"})
    end
end, false)

TabAimbotNPC:CreateSlider("FOV", 50, 350, 150, function(Value)
    _G.FOV = math.floor(Value)
    Circle.Radius = _G.FOV
end)

TabAimbotNPC:CreateSlider("Prediction", 0, 0.6, 0.165, function(Value)
    _G.Prediction = tonumber(string.format("%.3f", Value))
end)

TabAimbotNPC:CreateDropdown("Hit part", {"Head", "Torso", "Both", "Random"}, function(Value)
    _G.AimPart = Value
    CurrentTarget = nil
end)

TabAimbotNPC:CreateDropdown("Priority", {"Crosshair", "Distance", "LowestHP"}, function(Value)
    _G.TargetPriority = Value
    CurrentTarget = nil
    Library:Notification({Title = "Prioridade", Text = Value, Duration = 1.5})
end)

TabAimbotNPC:CreateLabel("")
TabAimbotNPC:CreateSlider("Hit Chance %", 0, 100, 100, function(Value)
    _G.HitChance = math.floor(Value)
end)

TabAimbotNPC:CreateSlider("Update rate", 0.05, 0.5, 0.1, function(Value)
    _G.UpdateRate = tonumber(string.format("%.2f", Value))
end)

TabAimbotNPC:CreateLabel("")
TabAimbotNPC:CreateToggle("Sticky Aim", function(Value) _G.StickyAim = Value end, true)
TabAimbotNPC:CreateToggle("Wall Check", function(Value) _G.VisibleCheck = Value end, true)
TabAimbotNPC:CreateToggle("Bullet Teleport", function(Value) _G.BulletTeleport = Value end, false)

TabAimbotNPC:CreateLabel("")
TabAimbotNPC:CreateButton("Force npcs mode", function()
    _G.TargetMode = "NPCs"
    CurrentTarget = nil
    Library:Notification({Title = "Modo", Text = "Alvo: apenas NPCs", Duration = 2})
end)

--// info
TabInfo:CreateLabel("Infos")
TabInfo:CreateToggle("Name", function(Value) _G.ShowTargetName = Value; if _G.SilentAim then UpdateTargetInfo() end end, true)
TabInfo:CreateToggle("HP", function(Value) _G.ShowTargetHP = Value; if _G.SilentAim then UpdateTargetInfo() end end, true)
TabInfo:CreateToggle("Distance", function(Value) _G.ShowTargetDistance = Value; if _G.SilentAim then UpdateTargetInfo() end end, true)
TabInfo:CreateToggle("Hit Chance", function(Value) _G.ShowHitChance = Value; if _G.SilentAim then UpdateTargetInfo() end end, true)
TabInfo:CreateLabel("")
TabInfo:CreateLabel("")
TabInfo:CreateButton("Cleanup ui", function() CleanupUIOnly() end)

Library:Notification({
    Title = "Client.cc",
    Text = "by $",
    Duration = 4,
    Type = "Loaded"
})

game:GetService("Players").PlayerRemoving:Connect(function(player)
    if player == LocalPlayer then CleanupUIOnly() end
end)

Features & Information

Credits: vitinhogamerzeal main script I just added more things such as aimbot and esp n other things - Custom crosshair -Universal Npc detection -Silent aim -Aimbot -Esp And more (Vibe coded but works well <3)
#npc#universal#npc detection#silentaim

Community Comments (9)

dpz3dpz3Feb 21, 2026

Note: if esp stops working just Force update cache at npc detection tab

textboxtextboxFeb 21, 2026

error cant load uI

dpz3dpz3Feb 21, 2026

which exec?

dpz3dpz3Feb 21, 2026

works fine on volt

*Mann2*Mann2Feb 23, 2026

trash script ngl

Replying to @*Mann2
*Mann2*Mann2Feb 23, 2026

does not work

Replying to @*Mann2
dpz3dpz3Feb 23, 2026(edited)

@Mann2 get a good executor

x444x444Feb 23, 2026

make it so silent aim can follow the crosshair when aiming without shiftlock

WAVE125WAVE125Jul 18, 2026

work w velocity

More Scripts for Universal Scripts