
KeylessUniversal

-- NPC Highlight Script
-- Toggle with [ key
-- Shows NPCs through walls with names and highlights
-- Services
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Camera = Workspace.CurrentCamera
local highlightEnabled = true
-- Colors for NPCs
local npcColor = Color3.fromRGB(255, 165, 0) -- Orange for NPCs
local enemyColor = Color3.fromRGB(255, 50, 50) -- Red for enemies
local friendlyColor = Color3.fromRGB(50, 255, 50) -- Green for friendlies
-- Store NPC highlights
local npcHighlights = {}
-- Function to check if something is an NPC
local function isNPC(model)
-- Common NPC indicators
if not model:IsA("Model") then return false end
if model:FindFirstChild("Humanoid") then
-- Check for NPC name patterns
local name = model.Name:lower()
if name:find("npc") or
name:find("bot") or
name:find("enemy") or
name:find("zombie") or
name:find("mob") or
name:find("creature") or
name:find("boss") or
name:find("guard") or
name:find("soldier") or
name:find("bandit") or
name:find("monster") or
name:find("animal") then
return true
end
-- Check if it's not a player (no Player property)
if not game:GetService("Players"):GetPlayerFromCharacter(model) then
return true
end
end
return false
end
-- Get color based on NPC type
local function getNPCColor(npcName)
local name = npcName:lower()
if name:find("enemy") or name:find("zombie") or name:find("boss") or name:find("guard") or name:find("bandit") or name:find("monster") then
return enemyColor
elseif name:find("friendly") or name:find("ally") or name:find("villager") or name:find("merchant") or name:find("trader") then
return friendlyColor
else
return npcColor -- Default orange
end
end
-- Create highlight for an NPC
local function createNPCHighlight(npcModel)
if npcHighlights[npcModel] then return end
local highlight = {
main = nil,
nameTag = nil,
nameLabel = nil
}
-- Create main highlight
highlight.main = Instance.new("Highlight")
highlight.main.Name = "NPC_Highlight"
highlight.main.Adornee = npcModel
highlight.main.FillColor = getNPCColor(npcModel.Name)
highlight.main.FillTransparency = 0.7
highlight.main.OutlineColor = getNPCColor(npcModel.Name)
highlight.main.OutlineTransparency = 0
highlight.main.Enabled = highlightEnabled
highlight.main.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
highlight.main.Parent = npcModel
-- Create name tag if NPC has a head
local head = npcModel:FindFirstChild("Head") or npcModel:FindFirstChild("UpperTorso")
if head then
local nameTag = Instance.new("BillboardGui")
nameTag.Name = "NPC_NameTag"
nameTag.Adornee = head
nameTag.AlwaysOnTop = true
nameTag.StudsOffset = Vector3.new(0, 3, 0)
nameTag.MaxDistance = 0 -- Infinite distance
-- Simple text label (no background)
local nameLabel = Instance.new("TextLabel")
nameLabel.Name = "Label"
nameLabel.Size = UDim2.new(1, 0, 1, 0)
nameLabel.BackgroundTransparency = 1
nameLabel.Text = npcModel.Name
nameLabel.TextColor3 = getNPCColor(npcModel.Name)
nameLabel.TextStrokeColor3 = Color3.new(0, 0, 0)
nameLabel.TextStrokeTransparency = 0.2
nameLabel.Font = Enum.Font.GothamBold
nameLabel.TextSize = 14
nameLabel.TextScaled = false
nameLabel.TextXAlignment = Enum.TextXAlignment.Center
nameLabel.TextYAlignment = Enum.TextYAlignment.Center
nameLabel.Parent = nameTag
nameTag.Parent = head
highlight.nameTag = nameTag
highlight.nameLabel = nameLabel
nameTag.Enabled = highlightEnabled
end
npcHighlights[npcModel] = highlight
-- Listen for NPC death/removal
local humanoid = npcModel:FindFirstChild("Humanoid")
if humanoid then
humanoid.Died:Connect(function()
if npcHighlights[npcModel] then
local h = npcHighlights[npcModel]
if h.main then h.main:Destroy() end
if h.nameTag then h.nameTag:Destroy() end
npcHighlights[npcModel] = nil
end
end)
end
end
-- Scan for NPCs in the workspace
local function scanForNPCs()
for _, model in pairs(Workspace:GetChildren()) do
if isNPC(model) and not npcHighlights[model] then
createNPCHighlight(model)
end
end
-- Also check inside folders
for _, folder in pairs(Workspace:GetDescendants()) do
if folder:IsA("Folder") or folder:IsA("Model") then
for _, model in pairs(folder:GetChildren()) do
if isNPC(model) and not npcHighlights[model] then
createNPCHighlight(model)
end
end
end
end
end
-- Update name sizes based on distance
local function updateNameSizes()
if not highlightEnabled then return end
for npcModel, highlight in pairs(npcHighlights) do
if highlight.nameTag and highlight.nameLabel then
local head = npcModel:FindFirstChild("Head") or npcModel:FindFirstChild("UpperTorso")
if head and highlight.nameTag.Enabled then
-- Calculate distance from camera to NPC
local distance = (head.Position - Camera.CFrame.Position).Magnitude
-- Scale text based on distance
local scale = math.clamp(distance / 50, 0.6, 1.8)
local textSize = math.floor(12 * scale)
textSize = math.clamp(textSize, 8, 20)
-- Update text size
highlight.nameLabel.TextSize = textSize
-- Adjust Billboard size
local tagWidth = math.clamp(textSize * 8, 80, 200)
local tagHeight = math.clamp(textSize * 1.5, 20, 40)
highlight.nameTag.Size = UDim2.new(0, tagWidth, 0, tagHeight)
end
end
end
end
-- Toggle highlights with [ key
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end
if input.KeyCode == Enum.KeyCode.LeftBracket then
highlightEnabled = not highlightEnabled
-- Update all NPC highlights
for _, highlight in pairs(npcHighlights) do
if highlight.main then
highlight.main.Enabled = highlightEnabled
end
if highlight.nameTag then
highlight.nameTag.Enabled = highlightEnabled
end
end
print("NPC Highlights: " .. (highlightEnabled and "ON" or "OFF"))
end
end)
-- Initial scan for NPCs
scanForNPCs()
-- Regular scanning for new NPCs
spawn(function()
while true do
task.wait(2) -- Scan every 2 seconds
pcall(scanForNPCs)
end
end)
-- Update name sizes in real-time
local renderConnection
renderConnection = RunService.RenderStepped:Connect(function()
pcall(updateNameSizes)
end)
-- Listen for new NPCs being added
Workspace.DescendantAdded:Connect(function(descendant)
if descendant:IsA("Model") and isNPC(descendant) then
task.wait(0.5) -- Small delay to ensure NPC is fully loaded
if not npcHighlights[descendant] then
createNPCHighlight(descendant)
end
end
end)
-- Cleanup function
local function cleanup()
if renderConnection then
renderConnection:Disconnect()
end
for _, highlight in pairs(npcHighlights) do
if highlight.main then
pcall(function() highlight.main:Destroy() end)
end
if highlight.nameTag then
pcall(function() highlight.nameTag:Destroy() end)
end
end
npcHighlights = {}
end
print("======================================")
print("NPC Highlight Script Loaded")
print("======================================")
print("Features:")
print("- Highlights all NPCs through walls")
print("- Shows NPC names with distance scaling")
print("- Color coded: Orange = NPC, Red = Enemy, Green = Friendly")
print("- Auto-detects new NPCs")
print("- Works with any executor")
print("")
print("Press [ to toggle ON/OFF")
print("======================================")No comments yet for this script.



