Enhanced Nightvision
Key RequiredUniversal

Enhanced Nightvision

Universal ScriptFNFCharterssFNFCharterss 7.4K views 25.8K executesUpdated Jan 18, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•889 lines (27874 chars)
-- Enhanced Night Vision and NPC Highlighter (FULLY FIXED PERSISTENCE)
local Players = game:GetService("Players")
local Lighting = game:GetService("Lighting")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local Teams = game:GetService("Teams")
local RunService = game:GetService("RunService")

local LocalPlayer = Players.LocalPlayer

-- GUI Creation
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "EnhancedVisionGui"
ScreenGui.ResetOnSpawn = false
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

pcall(function()
    ScreenGui.Parent = game.CoreGui
end)

if not ScreenGui.Parent then
    ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui")
end

local MainFrame = Instance.new("Frame")
MainFrame.Size = UDim2.new(0, 180, 0, 40)
MainFrame.Position = UDim2.new(0, 10, 0, 10)
MainFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
MainFrame.BorderSizePixel = 0
MainFrame.Active = true
MainFrame.Draggable = false
MainFrame.Parent = ScreenGui

local UICorner = Instance.new("UICorner")
UICorner.CornerRadius = UDim.new(0, 8)
UICorner.Parent = MainFrame

-- Draggable title area
local DragArea = Instance.new("Frame")
DragArea.Size = UDim2.new(1, 0, 0, 40)
DragArea.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
DragArea.BorderSizePixel = 0
DragArea.Active = true
DragArea.Parent = MainFrame

local DragCorner = Instance.new("UICorner")
DragCorner.CornerRadius = UDim.new(0, 8)
DragCorner.Parent = DragArea

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(0.7, 0, 1, 0)
Title.Position = UDim2.new(0, 5, 0, 0)
Title.BackgroundTransparency = 1
Title.Text = "Enhanced Vision ▼"
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.Font = Enum.Font.SourceSansBold
Title.TextSize = 14
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.Parent = DragArea

-- Expand/Collapse button
local ExpandButton = Instance.new("TextButton")
ExpandButton.Size = UDim2.new(0, 30, 0, 30)
ExpandButton.Position = UDim2.new(1, -35, 0, 5)
ExpandButton.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
ExpandButton.BorderSizePixel = 0
ExpandButton.Text = "▼"
ExpandButton.TextColor3 = Color3.fromRGB(255, 255, 255)
ExpandButton.Font = Enum.Font.SourceSansBold
ExpandButton.TextSize = 14
ExpandButton.Parent = DragArea

local ExpandCorner = Instance.new("UICorner")
ExpandCorner.CornerRadius = UDim.new(0, 5)
ExpandCorner.Parent = ExpandButton

local ContentFrame = Instance.new("Frame")
ContentFrame.Size = UDim2.new(1, 0, 0, 0)
ContentFrame.Position = UDim2.new(0, 0, 0, 40)
ContentFrame.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
ContentFrame.BorderSizePixel = 0
ContentFrame.ClipsDescendants = true
ContentFrame.Parent = MainFrame

local TabButtons = Instance.new("Frame")
TabButtons.Size = UDim2.new(1, 0, 0, 30)
TabButtons.BackgroundTransparency = 1
TabButtons.Parent = ContentFrame

local VisionTab = Instance.new("TextButton")
VisionTab.Size = UDim2.new(0.5, 0, 0, 30)
VisionTab.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
VisionTab.BorderSizePixel = 0
VisionTab.Text = "Vision"
VisionTab.TextColor3 = Color3.fromRGB(255, 255, 255)
VisionTab.Font = Enum.Font.SourceSans
VisionTab.TextSize = 12
VisionTab.Parent = TabButtons

local HealthTab = Instance.new("TextButton")
HealthTab.Size = UDim2.new(0.5, 0, 0, 30)
HealthTab.Position = UDim2.new(0.5, 0, 0, 0)
HealthTab.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
HealthTab.BorderSizePixel = 0
HealthTab.Text = "Health/Names"
HealthTab.TextColor3 = Color3.fromRGB(255, 255, 255)
HealthTab.Font = Enum.Font.SourceSans
HealthTab.TextSize = 12
HealthTab.Parent = TabButtons

local VisionFrame = Instance.new("Frame")
VisionFrame.Size = UDim2.new(1, 0, 0, 150)
VisionFrame.Position = UDim2.new(0, 0, 0, 30)
VisionFrame.BackgroundTransparency = 1
VisionFrame.Visible = true
VisionFrame.Parent = ContentFrame

local HealthFrame = Instance.new("Frame")
HealthFrame.Size = UDim2.new(1, 0, 0, 220)
HealthFrame.Position = UDim2.new(0, 0, 0, 30)
HealthFrame.BackgroundTransparency = 1
HealthFrame.Visible = false
HealthFrame.Parent = ContentFrame

-- Helper function to create buttons
local function createButton(text, order, parent)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(0.9, 0, 0, 25)
    btn.Position = UDim2.new(0.05, 0, 0, 10 + (order * 30))
    btn.BackgroundColor3 = Color3.fromRGB(80, 80, 80)
    btn.BorderSizePixel = 0
    btn.Text = text .. ": OFF"
    btn.TextColor3 = Color3.fromRGB(255, 255, 255)
    btn.Font = Enum.Font.SourceSans
    btn.TextSize = 12
    btn.Parent = parent
    
    local corner = Instance.new("UICorner")
    corner.CornerRadius = UDim.new(0, 5)
    corner.Parent = btn
    
    return btn
end

local NightVisionToggle = createButton("Night Vision", 0, VisionFrame)
local PlayerHeatToggle = createButton("Player Heat", 1, VisionFrame)
local NPCHeatToggle = createButton("NPC Heat", 2, VisionFrame)

local PlayerHealthToggle = createButton("Player Health", 0, HealthFrame)
local NPCHealthToggle = createButton("NPC Health", 1, HealthFrame)
local PlayerNamesToggle = createButton("Player Names", 2, HealthFrame)
local NPCNamesToggle = createButton("NPC Names", 3, HealthFrame)
local TeamCheckToggle = createButton("Team Check", 4, HealthFrame)

-- Status labels
local StatusLabelHealth = Instance.new("TextLabel")
StatusLabelHealth.Size = UDim2.new(0.9, 0, 0, 40)
StatusLabelHealth.Position = UDim2.new(0.05, 0, 0, 160)
StatusLabelHealth.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
StatusLabelHealth.BorderSizePixel = 0
StatusLabelHealth.Text = "All modes inactive"
StatusLabelHealth.TextColor3 = Color3.fromRGB(200, 200, 200)
StatusLabelHealth.Font = Enum.Font.SourceSans
StatusLabelHealth.TextSize = 10
StatusLabelHealth.TextWrapped = true
StatusLabelHealth.Parent = HealthFrame

local StatusCornerH = Instance.new("UICorner")
StatusCornerH.CornerRadius = UDim.new(0, 5)
StatusCornerH.Parent = StatusLabelHealth

local StatusLabelVision = Instance.new("TextLabel")
StatusLabelVision.Size = UDim2.new(0.9, 0, 0, 40)
StatusLabelVision.Position = UDim2.new(0.05, 0, 0, 100)
StatusLabelVision.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
StatusLabelVision.BorderSizePixel = 0
StatusLabelVision.Text = "All modes inactive"
StatusLabelVision.TextColor3 = Color3.fromRGB(200, 200, 200)
StatusLabelVision.Font = Enum.Font.SourceSans
StatusLabelVision.TextSize = 10
StatusLabelVision.TextWrapped = true
StatusLabelVision.Parent = VisionFrame

local StatusCornerV = Instance.new("UICorner")
StatusCornerV.CornerRadius = UDim.new(0, 5)
StatusCornerV.Parent = StatusLabelVision

-- State
local Settings = {
    NightVision = false,
    PlayerHeat = false,
    NPCHeat = false,
    PlayerHealth = false,
    NPCHealth = false,
    PlayerNames = false,
    NPCNames = false,
    TeamCheck = false,
    GuiExpanded = false
}

local Cache = {
    PlayerHighlights = {},
    NPCHighlights = {},
    PlayerHealthBars = {},
    NPCHealthBars = {},
    NPCNameTags = {},
    OriginalLighting = {},
    OriginalAtmosphere = {},
    VisionEffects = {},
    NPCData = {},
    TrackedNPCs = {}
}

local npcMonitorConnection = nil
local playerConnections = {}

-- Helper functions
local function hasTeams()
    return #Teams:GetTeams() > 0
end

local function isEnemy(player)
    if not Settings.TeamCheck then return true end
    if player == LocalPlayer then return false end
    if not hasTeams() then return true end
    if not player.Team or not LocalPlayer.Team then return true end
    return player.Team ~= LocalPlayer.Team
end

local function isNPC(model)
    if not model or not model:IsA("Model") then return false end
    if Players:GetPlayerFromCharacter(model) then return false end
    
    local humanoid = model:FindFirstChildOfClass("Humanoid")
    if not humanoid then return false end
    
    if not (model:FindFirstChild("Head") or model:FindFirstChild("HumanoidRootPart")) then
        return false
    end
    
    return true
end

-- Night Vision
local function enableNightVision()
    if not Cache.OriginalLighting.Stored then
        Cache.OriginalLighting = {
            Ambient = Lighting.Ambient,
            Brightness = Lighting.Brightness,
            FogEnd = Lighting.FogEnd,
            FogStart = Lighting.FogStart,
            GlobalShadows = Lighting.GlobalShadows,
            FogColor = Lighting.FogColor,
            Stored = true
        }
    end
    
    Lighting.Ambient = Color3.fromRGB(100, 100, 100)
    Lighting.Brightness = 3
    Lighting.FogEnd = 100000
    Lighting.FogStart = 0
    Lighting.GlobalShadows = false
    
    for _, effect in ipairs(Lighting:GetChildren()) do
        if effect:IsA("Atmosphere") then
            if not Cache.OriginalAtmosphere.Stored then
                Cache.OriginalAtmosphere = {
                    Effect = effect,
                    Density = effect.Density,
                    Offset = effect.Offset,
                    Glare = effect.Glare,
                    Haze = effect.Haze,
                    Stored = true
                }
            end
            effect.Density = 0
            effect.Offset = 0
            effect.Glare = 0
            effect.Haze = 0
        end
    end
    
    if not Cache.VisionEffects.NightVision then
        local cc = Instance.new("ColorCorrectionEffect")
        cc.Name = "NV_CC"
        cc.TintColor = Color3.fromRGB(0, 255, 0)
        cc.Saturation = -0.8
        cc.Brightness = 0.3
        cc.Parent = Lighting
        Cache.VisionEffects.NightVision = cc
    end
end

local function disableNightVision()
    if Cache.OriginalLighting.Stored then
        Lighting.Ambient = Cache.OriginalLighting.Ambient
        Lighting.Brightness = Cache.OriginalLighting.Brightness
        Lighting.FogEnd = Cache.OriginalLighting.FogEnd
        Lighting.FogStart = Cache.OriginalLighting.FogStart
        Lighting.GlobalShadows = Cache.OriginalLighting.GlobalShadows
        Lighting.FogColor = Cache.OriginalLighting.FogColor
    end
    
    if Cache.OriginalAtmosphere.Stored and Cache.OriginalAtmosphere.Effect then
        local atm = Cache.OriginalAtmosphere.Effect
        if atm.Parent then
            atm.Density = Cache.OriginalAtmosphere.Density
            atm.Offset = Cache.OriginalAtmosphere.Offset
            atm.Glare = Cache.OriginalAtmosphere.Glare
            atm.Haze = Cache.OriginalAtmosphere.Haze
        end
    end
    
    if Cache.VisionEffects.NightVision then
        Cache.VisionEffects.NightVision:Destroy()
        Cache.VisionEffects.NightVision = nil
    end
    
    Cache.OriginalLighting = {}
    Cache.OriginalAtmosphere = {}
end

-- Create Highlight with FORCED persistence
local function createHighlight(model, color, isNPC)
    if not model or not model.Parent then return end
    
    local existingHL = model:FindFirstChildOfClass("Highlight")
    if existingHL and existingHL.Name == "ESP_Highlight" then
        existingHL:Destroy()
    end
    
    local highlight = Instance.new("Highlight")
    highlight.Name = "ESP_Highlight"
    highlight.FillColor = color
    highlight.OutlineColor = color
    highlight.FillTransparency = 0.5
    highlight.OutlineTransparency = 0.2
    highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
    highlight.Parent = model
    
    if isNPC then
        Cache.NPCHighlights[model] = highlight
    else
        Cache.PlayerHighlights[model] = highlight
    end
    
    return highlight
end

-- Create Health Bar with FORCED persistence
local function createHealthBar(character, isNPC, teamColor)
    if not character or not character.Parent then return end
    
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    if not humanoid then return end
    
    local existingHB = character:FindFirstChild("ESP_HealthBar")
    if existingHB then
        existingHB:Destroy()
    end
    
    local bb = Instance.new("BillboardGui")
    bb.Name = "ESP_HealthBar"
    bb.Size = UDim2.new(4, 0, 0.8, 0)
    bb.StudsOffset = Vector3.new(0, 3.5, 0)
    bb.AlwaysOnTop = true
    bb.Adornee = character:FindFirstChild("Head") or character.PrimaryPart
    bb.Parent = character
    
    local healthText = Instance.new("TextLabel")
    healthText.Size = UDim2.new(1, 0, 0.5, 0)
    healthText.BackgroundTransparency = 1
    healthText.Text = math.floor(humanoid.Health) .. "/" .. math.floor(humanoid.MaxHealth)
    healthText.TextColor3 = teamColor or Color3.fromRGB(255, 255, 255)
    healthText.TextStrokeTransparency = 0
    healthText.Font = Enum.Font.SourceSansBold
    healthText.TextSize = 14
    healthText.Parent = bb
    
    local frame = Instance.new("Frame")
    frame.Size = UDim2.new(1, 0, 0.35, 0)
    frame.Position = UDim2.new(0, 0, 0.55, 0)
    frame.BackgroundColor3 = Color3.fromRGB(50, 50, 50)
    frame.BorderSizePixel = 0
    frame.Parent = bb
    
    local bar = Instance.new("Frame")
    bar.Size = UDim2.new(math.clamp(humanoid.Health / humanoid.MaxHealth, 0, 1), 0, 1, 0)
    
    if teamColor then
        bar.BackgroundColor3 = teamColor
    else
        bar.BackgroundColor3 = isNPC and Color3.fromRGB(255, 100, 0) or Color3.fromRGB(0, 200, 0)
    end
    
    bar.BorderSizePixel = 0
    bar.Parent = frame
    
    local conn = humanoid.HealthChanged:Connect(function(health)
        pcall(function()
            if bar and bar.Parent then
                local percent = math.clamp(health / humanoid.MaxHealth, 0, 1)
                bar.Size = UDim2.new(percent, 0, 1, 0)
                healthText.Text = math.floor(health) .. "/" .. math.floor(humanoid.MaxHealth)
                
                if teamColor then
                    bar.BackgroundColor3 = teamColor
                else
                    if percent > 0.5 then
                        bar.BackgroundColor3 = isNPC and Color3.fromRGB(255, 100, 0) or Color3.fromRGB(0, 200, 0)
                    elseif percent > 0.25 then
                        bar.BackgroundColor3 = Color3.fromRGB(255, 165, 0)
                    else
                        bar.BackgroundColor3 = Color3.fromRGB(255, 0, 0)
                    end
                end
            end
        end)
    end)
    
    if isNPC then
        Cache.NPCHealthBars[character] = {Gui = bb, Connection = conn}
    else
        Cache.PlayerHealthBars[character] = {Gui = bb, Connection = conn}
    end
end

-- Create Name Tag with FORCED persistence
local function createNameTag(character, isNPC, teamColor)
    if not character or not character.Parent then return end
    
    local existingNT = character:FindFirstChild("ESP_NameTag")
    if existingNT then
        existingNT:Destroy()
    end
    
    local bb = Instance.new("BillboardGui")
    bb.Name = "ESP_NameTag"
    bb.Size = UDim2.new(0, 100, 0, 40)
    bb.StudsOffset = Vector3.new(0, 4.5, 0)
    bb.AlwaysOnTop = true
    bb.Adornee = character:FindFirstChild("Head") or character.PrimaryPart
    bb.Parent = character
    
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(1, 0, 1, 0)
    label.BackgroundTransparency = 1
    label.Text = character.Name
    
    if teamColor then
        label.TextColor3 = teamColor
    else
        label.TextColor3 = isNPC and Color3.fromRGB(255, 170, 0) or Color3.fromRGB(255, 255, 255)
    end
    
    label.TextStrokeTransparency = 0
    label.Font = Enum.Font.SourceSansBold
    label.TextSize = 14
    label.Parent = bb
    
    if isNPC then
        Cache.NPCNameTags[character] = bb
    end
end

-- Apply to player
local function applyToPlayer(player)
    if player == LocalPlayer or not player.Character then return end
    if not isEnemy(player) then return end
    
    local char = player.Character
    
    local playerTeamColor = nil
    if player.Team then
        playerTeamColor = player.Team.TeamColor.Color
    end
    
    if Settings.PlayerHeat then
        local color = playerTeamColor or Color3.fromRGB(255, 0, 0)
        createHighlight(char, color, false)
    end
    
    if Settings.PlayerHealth then
        createHealthBar(char, false, playerTeamColor)
    end
    
    if Settings.PlayerNames then
        createNameTag(char, false, playerTeamColor)
    end
end

-- Apply to NPC with tracking
local function applyToNPC(npc)
    if not npc or not npc.Parent then return end
    if not isNPC(npc) then return end
    
    Cache.TrackedNPCs[npc] = true
    
    if not Cache.NPCData[npc] then
        Cache.NPCData[npc] = {
            Connections = {},
            LastCheck = tick()
        }
    end
    
    if Settings.NPCHeat then
        createHighlight(npc, Color3.fromRGB(255, 100, 0), true)
    end
    
    if Settings.NPCHealth then
        createHealthBar(npc, true, nil)
    end
    
    if Settings.NPCNames then
        createNameTag(npc, true, nil)
    end
end

-- Remove from player
local function removeFromPlayer(player)
    if not player.Character then return end
    
    local char = player.Character
    
    if Cache.PlayerHighlights[char] then
        pcall(function() Cache.PlayerHighlights[char]:Destroy() end)
        Cache.PlayerHighlights[char] = nil
    end
    
    if Cache.PlayerHealthBars[char] then
        if Cache.PlayerHealthBars[char].Connection then
            pcall(function() Cache.PlayerHealthBars[char].Connection:Disconnect() end)
        end
        if Cache.PlayerHealthBars[char].Gui then
            pcall(function() Cache.PlayerHealthBars[char].Gui:Destroy() end)
        end
        Cache.PlayerHealthBars[char] = nil
    end
    
    pcall(function()
        local nameTag = char:FindFirstChild("ESP_NameTag")
        if nameTag then nameTag:Destroy() end
    end)
end

-- Remove from NPC
local function removeFromNPC(npc)
    if Cache.NPCHighlights[npc] then
        pcall(function() Cache.NPCHighlights[npc]:Destroy() end)
        Cache.NPCHighlights[npc] = nil
    end
    
    if Cache.NPCHealthBars[npc] then
        if Cache.NPCHealthBars[npc].Connection then
            pcall(function() Cache.NPCHealthBars[npc].Connection:Disconnect() end)
        end
        if Cache.NPCHealthBars[npc].Gui then
            pcall(function() Cache.NPCHealthBars[npc].Gui:Destroy() end)
        end
        Cache.NPCHealthBars[npc] = nil
    end
    
    if Cache.NPCNameTags[npc] then
        pcall(function() Cache.NPCNameTags[npc]:Destroy() end)
        Cache.NPCNameTags[npc] = nil
    end
    
    if Cache.NPCData[npc] then
        for _, conn in ipairs(Cache.NPCData[npc].Connections) do
            pcall(function() conn:Disconnect() end)
        end
        Cache.NPCData[npc] = nil
    end
end

-- Check if any NPC features are enabled
local function isNPCFeaturesEnabled()
    return Settings.NPCHeat or Settings.NPCHealth or Settings.NPCNames
end

-- AGGRESSIVE NPC Monitor - Checks and reapplies every frame if needed
local function startNPCMonitor()
    if npcMonitorConnection then
        npcMonitorConnection:Disconnect()
    end
    
    if not isNPCFeaturesEnabled() then return end
    
    local lastFullScan = tick()
    
    npcMonitorConnection = RunService.Heartbeat:Connect(function()
        local now = tick()
        
        -- Full scan every 3 seconds
        if now - lastFullScan > 3 then
            lastFullScan = now
            
            for _, obj in ipairs(Workspace:GetDescendants()) do
                if obj:IsA("Model") and isNPC(obj) then
                    if not Cache.TrackedNPCs[obj] then
                        applyToNPC(obj)
                    end
                end
            end
        end
        
        -- Quick check every frame on tracked NPCs
        for npc, _ in pairs(Cache.TrackedNPCs) do
            if npc and npc.Parent then
                -- Verify and reapply if missing
                if Settings.NPCHeat and not npc:FindFirstChild("ESP_Highlight") then
                    createHighlight(npc, Color3.fromRGB(255, 100, 0), true)
                end
                
                if Settings.NPCHealth and not npc:FindFirstChild("ESP_HealthBar") then
                    createHealthBar(npc, true, nil)
                end
                
                if Settings.NPCNames and not npc:FindFirstChild("ESP_NameTag") then
                    createNameTag(npc, true, nil)
                end
            else
                -- NPC removed
                Cache.TrackedNPCs[npc] = nil
                removeFromNPC(npc)
            end
        end
    end)
end

-- Stop NPC monitoring
local function stopNPCMonitor()
    if npcMonitorConnection then
        npcMonitorConnection:Disconnect()
        npcMonitorConnection = nil
    end
end

-- Refresh players
local function refreshPlayers()
    for _, player in ipairs(Players:GetPlayers()) do
        removeFromPlayer(player)
        if player ~= LocalPlayer and player.Character then
            applyToPlayer(player)
        end
    end
end

-- Refresh NPCs
local function refreshNPCs()
    for npc in pairs(Cache.TrackedNPCs) do
        removeFromNPC(npc)
    end
    Cache.TrackedNPCs = {}
    
    if isNPCFeaturesEnabled() then
        startNPCMonitor()
    else
        stopNPCMonitor()
    end
end

-- Update status
local function updateStatus()
    local active = {}
    for k, v in pairs(Settings) do
        if v == true and k ~= "GuiExpanded" then
            table.insert(active, k:gsub("([A-Z])", " %1"):sub(2))
        end
    end
    
    local statusText = #active == 0 and "All modes inactive" or table.concat(active, ", ")
    StatusLabelVision.Text = statusText
    StatusLabelHealth.Text = statusText
end

-- Bind button
local function bindButton(btn, key, color)
    btn.MouseButton1Click:Connect(function()
        Settings[key] = not Settings[key]
        local baseText = btn.Text:match("(.+):")
        btn.Text = baseText .. ": " .. (Settings[key] and "ON" or "OFF")
        btn.BackgroundColor3 = Settings[key] and color or Color3.fromRGB(80, 80, 80)
        
        if key == "NightVision" then
            if Settings[key] then 
                enableNightVision() 
            else 
                disableNightVision() 
            end
        elseif key:find("Player") or key == "TeamCheck" then
            refreshPlayers()
        elseif key:find("NPC") then
            refreshNPCs()
        end
        
        updateStatus()
    end)
end

bindButton(NightVisionToggle, "NightVision", Color3.fromRGB(0, 150, 0))
bindButton(PlayerHeatToggle, "PlayerHeat", Color3.fromRGB(150, 0, 0))
bindButton(NPCHeatToggle, "NPCHeat", Color3.fromRGB(200, 100, 0))
bindButton(PlayerHealthToggle, "PlayerHealth", Color3.fromRGB(0, 150, 0))
bindButton(NPCHealthToggle, "NPCHealth", Color3.fromRGB(200, 100, 0))
bindButton(PlayerNamesToggle, "PlayerNames", Color3.fromRGB(100, 100, 200))
bindButton(NPCNamesToggle, "NPCNames", Color3.fromRGB(200, 150, 50))
bindButton(TeamCheckToggle, "TeamCheck", Color3.fromRGB(0, 100, 200))

-- GUI Controls
ExpandButton.MouseButton1Click:Connect(function()
    Settings.GuiExpanded = not Settings.GuiExpanded
    
    if Settings.GuiExpanded then
        Title.Text = "Enhanced Vision ▲"
        ExpandButton.Text = "▲"
        
        local targetHeight = VisionFrame.Visible and 190 or 270
        ContentFrame.Size = UDim2.new(1, 0, 0, targetHeight)
        MainFrame.Size = UDim2.new(0, 180, 0, 40 + targetHeight)
    else
        Title.Text = "Enhanced Vision ▼"
        ExpandButton.Text = "▼"
        ContentFrame.Size = UDim2.new(1, 0, 0, 0)
        MainFrame.Size = UDim2.new(0, 180, 0, 40)
    end
end)

-- Tab switching
VisionTab.MouseButton1Click:Connect(function()
    VisionFrame.Visible = true
    HealthFrame.Visible = false
    VisionTab.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
    HealthTab.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
    
if Settings.GuiExpanded then
        ContentFrame.Size = UDim2.new(1, 0, 0, 190)
        MainFrame.Size = UDim2.new(0, 180, 0, 230)
    end
end)

HealthTab.MouseButton1Click:Connect(function()
    VisionFrame.Visible = false
    HealthFrame.Visible = true
    VisionTab.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
    HealthTab.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
    
    if Settings.GuiExpanded then
        ContentFrame.Size = UDim2.new(1, 0, 0, 270)
        MainFrame.Size = UDim2.new(0, 180, 0, 310)
    end
end)

-- Dragging
local dragging = false
local dragInput
local dragStart
local startPos

DragArea.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        dragging = true
        dragStart = input.Position
        startPos = MainFrame.Position
        
        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

DragArea.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
        dragInput = input
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input == dragInput and dragging then
        local delta = input.Position - dragStart
        MainFrame.Position = UDim2.new(
            startPos.X.Scale, 
            startPos.X.Offset + delta.X, 
            startPos.Y.Scale, 
            startPos.Y.Offset + delta.Y
        )
    end
end)

-- Setup player connections
local function setupPlayerConnections(player)
    if player == LocalPlayer then return end
    
    if playerConnections[player] then
        for _, conn in ipairs(playerConnections[player]) do
            conn:Disconnect()
        end
    end
    
    playerConnections[player] = {}
    
    local charAddedConn = player.CharacterAdded:Connect(function(char)
        task.wait(0.5)
        applyToPlayer(player)
    end)
    
    local charRemovingConn = player.CharacterRemoving:Connect(function()
        removeFromPlayer(player)
    end)
    
    local teamChangedConn = player:GetPropertyChangedSignal("Team"):Connect(function()
        task.wait(0.1)
        removeFromPlayer(player)
        if player.Character then
            applyToPlayer(player)
        end
    end)
    
    table.insert(playerConnections[player], charAddedConn)
    table.insert(playerConnections[player], charRemovingConn)
    table.insert(playerConnections[player], teamChangedConn)
    
    if player.Character then
        task.defer(function() applyToPlayer(player) end)
    end
end

-- Setup players
for _, player in ipairs(Players:GetPlayers()) do
    setupPlayerConnections(player)
end

Players.PlayerAdded:Connect(function(player)
    setupPlayerConnections(player)
end)

Players.PlayerRemoving:Connect(function(player)
    removeFromPlayer(player)
    
    if playerConnections[player] then
        for _, conn in ipairs(playerConnections[player]) do
            conn:Disconnect()
        end
        playerConnections[player] = nil
    end
end)

-- Workspace monitoring for new NPCs
Workspace.DescendantAdded:Connect(function(obj)
    if not isNPCFeaturesEnabled() then return end
    
    if obj:IsA("Humanoid") then
        local model = obj.Parent
        task.wait(0.2)
        if model and model.Parent and isNPC(model) and not Cache.TrackedNPCs[model] then
            applyToNPC(model)
        end
    elseif obj:IsA("Model") then
        task.wait(0.3)
        if obj.Parent and isNPC(obj) and not Cache.TrackedNPCs[obj] then
            applyToNPC(obj)
        end
    end
end)

-- Cleanup on GUI destruction
ScreenGui.Destroying:Connect(function()
    stopNPCMonitor()
    
    if Settings.NightVision then
        disableNightVision()
    end
    
    for _, player in ipairs(Players:GetPlayers()) do
        removeFromPlayer(player)
    end
    
    for npc in pairs(Cache.TrackedNPCs) do
        removeFromNPC(npc)
    end
    
    for player, connections in pairs(playerConnections) do
        for _, conn in ipairs(connections) do
            conn:Disconnect()
        end
    end
end)

Features & Information

This script features: -Night vision (Makes the game brighter and makes it green so you can see it better just like what actual night vision does) -Highlight Esp (Include Players and NPCs) -Health/Names (It will show the Player/NPCs Health, and names)
#esp#Highlight esp#Universal#Night vision

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts