--[[ Heat Signature Scanner - v6.2 ]] local Players, RunSvc, StarterPack, Lighting, TweenSvc = game:GetService("Players"), game:GetService("RunService"), game:GetService("StarterPack"), game:GetService("Lighting"), game:GetService("TweenService") -- // Config \\ -- local TOOL_NAME = "Heat Signature Scanner" local TOOL_ICON = "rbxassetid://1108382932" local TOOL_TIP = "Reveals player heat signatures" local COLOR_STOPS = {{D=0,C=Color3.fromRGB(255,0,0)}, {D=50,C=Color3.fromRGB(255,150,0)}, {D=150,C=Color3.fromRGB(255,255,0)}, {D=300,C=Color3.fromRGB(0,255,100)}, {D=600,C=Color3.fromRGB(0,150,255)}, {D=1000,C=Color3.fromRGB(100,50,255)}} table.sort(COLOR_STOPS, function(a,b) return a.D < b.D end) local HL_FILL_TRANS = 0.5 local HL_OUTLINE_TRANS = 0 local UPDATE_FREQ = 0.1 local USE_BLUR = true -- Blur Enabled local BLUR_AMT = 3 local CC_TINT = Color3.fromRGB(0,10,5) local CC_SAT = -0.8 local CC_BRIGHT = -0.2 local FX_TIME = 0.3 local SCANLINE_COUNT = 160 local SCANLINE_THICK = 1 local SCANLINE_CLR = Color3.fromRGB(0,0,0) local SCANLINE_TRANS = 0.85 local VIGNETTE_SCALE = 0.3 -- How far vignette extends from edge (Scale, 0-1) local VIGNETTE_CLR = Color3.fromRGB(0,0,0) local VIGNETTE_TRANS = 0.6 -- Uniform transparency for vignette frames -- // Runtime \\ -- local plr = Players.LocalPlayer local playerGui = plr:WaitForChild("PlayerGui") local tool, isEquipped, highlights, lastUpdate, hbConn, ccFx, blurFx, crtGui, fxTweens = nil, false, {}, 0, nil, nil, nil, nil, {} -- // Functions \\ -- local function GetColor(dist) for i=1, #COLOR_STOPS-1 do local s1,s2=COLOR_STOPS[i],COLOR_STOPS[i+1]; if dist>=s1.D and dist=COLOR_STOPS[#COLOR_STOPS].D then return COLOR_STOPS[#COLOR_STOPS].C end; return COLOR_STOPS[1].C end local function StopTweens() for _,t in pairs(fxTweens) do if t then t:Cancel() end end; fxTweens={} end local function ApplyFx() StopTweens(); local tInfo=TweenInfo.new(FX_TIME,Enum.EasingStyle.Quad,Enum.EasingDirection.Out) if not ccFx or not ccFx.Parent then ccFx=Instance.new("ColorCorrectionEffect"); ccFx.Name="HeatSigCC"; ccFx.Enabled=false; ccFx.Parent=Lighting end fxTweens.CC=TweenSvc:Create(ccFx,tInfo,{Brightness=CC_BRIGHT, Saturation=CC_SAT, TintColor=CC_TINT, Enabled=true}); fxTweens.CC:Play() if USE_BLUR then if not blurFx or not blurFx.Parent then blurFx=Instance.new("BlurEffect"); blurFx.Name="HeatSigBlur"; blurFx.Enabled=false; blurFx.Size=0; blurFx.Parent=Lighting end fxTweens.Blur=TweenSvc:Create(blurFx,tInfo,{Size=BLUR_AMT,Enabled=true}); fxTweens.Blur:Play() end end local function RevertFx() StopTweens(); local tInfo=TweenInfo.new(FX_TIME,Enum.EasingStyle.Quad,Enum.EasingDirection.In) if ccFx and ccFx.Parent then local goal={Brightness=0,Saturation=0,TintColor=Color3.fromRGB(255,255,255),Enabled=true}; fxTweens.CC=TweenSvc:Create(ccFx,tInfo,goal); fxTweens.CC.Completed:Connect(function() if ccFx then ccFx:Destroy(); ccFx=nil end end); fxTweens.CC:Play() end if blurFx and blurFx.Parent then local goal={Size=0,Enabled=true}; fxTweens.Blur=TweenSvc:Create(blurFx,tInfo,goal); fxTweens.Blur.Completed:Connect(function() if blurFx then blurFx:Destroy(); blurFx=nil end end); fxTweens.Blur:Play() end end local function CreateCRTGui() if crtGui and crtGui.Parent then return end crtGui=Instance.new("ScreenGui"); crtGui.Name="HeatSigCRT"; crtGui.ZIndexBehavior=Enum.ZIndexBehavior.Sibling; crtGui.DisplayOrder=10; crtGui.IgnoreGuiInset=true; crtGui.Enabled=false local vignCont=Instance.new("Frame"); vignCont.Name="Vignette"; vignCont.BackgroundTransparency=1; vignCont.Size=UDim2.new(1,0,1,0); vignCont.ZIndex=1; vignCont.Parent=crtGui local function createVignFrame(n, sz, pos) local f=Instance.new("Frame"); f.Name=n; f.BackgroundColor3=VIGNETTE_CLR; f.BorderSizePixel=0; f.Size=sz; f.Position=pos; f.BackgroundTransparency=VIGNETTE_TRANS; f.Parent=vignCont return f end -- Left Frame (Full Height, Edge Width) createVignFrame("VL", UDim2.new(VIGNETTE_SCALE, 0, 1, 0), UDim2.new(0, 0, 0, 0)) -- Right Frame (Full Height, Edge Width) createVignFrame("VR", UDim2.new(VIGNETTE_SCALE, 0, 1, 0), UDim2.new(1 - VIGNETTE_SCALE, 0, 0, 0)) -- Top Frame (Edge Height, Middle Width) createVignFrame("VT", UDim2.new(1 - 2 * VIGNETTE_SCALE, 0, VIGNETTE_SCALE, 0), UDim2.new(VIGNETTE_SCALE, 0, 0, 0)) -- Bottom Frame (Edge Height, Middle Width) createVignFrame("VB", UDim2.new(1 - 2 * VIGNETTE_SCALE, 0, VIGNETTE_SCALE, 0), UDim2.new(VIGNETTE_SCALE, 0, 1 - VIGNETTE_SCALE, 0)) local scanCont=Instance.new("Frame"); scanCont.Name="Scanlines"; scanCont.BackgroundTransparency=1; scanCont.Size=UDim2.new(1,0,1,0); scanCont.ZIndex=2; scanCont.Parent=crtGui local lineSpacing=1/SCANLINE_COUNT; for i=0,SCANLINE_COUNT-1 do local l=Instance.new("Frame"); l.Name="SL"..i; l.BackgroundColor3=SCANLINE_CLR; l.BackgroundTransparency=SCANLINE_TRANS; l.BorderSizePixel=0; l.Size=UDim2.new(1,0,0,SCANLINE_THICK); l.Position=UDim2.new(0,0,i*lineSpacing,0); l.Parent=scanCont end crtGui.Parent=playerGui end local function EnableCRT(enable) if crtGui then crtGui.Enabled=enable end end local function UpdateHL(p, dist) local char=p.Character; if not char then return end local hl=highlights[p]; local ok, err = pcall(function() if not hl then hl=Instance.new("Highlight"); hl.Name="HeatSigHL"; hl.DepthMode=1; hl.FillTransparency=HL_FILL_TRANS; hl.OutlineTransparency=HL_OUTLINE_TRANS; hl.Adornee=char; hl.Enabled=true; hl.Parent=playerGui; highlights[p]=hl end if hl.Adornee~=char then hl.Adornee=char end; hl.Enabled=true local targetC=GetColor(dist); hl.FillColor=targetC; hl.OutlineColor=targetC:Lerp(Color3.new(),0.3) end) if not ok then warn("HL Error:",p.Name,err); if highlights[p] then highlights[p]:Destroy(); highlights[p]=nil end end end local function RemoveHL(p) local hl=highlights[p]; if hl then hl:Destroy(); highlights[p]=nil end end local function OnHeartbeat(dt) if not isEquipped then return end; local now=tick(); if now-lastUpdate0 then local dist=(lRoot.Position-root.Position).Magnitude; UpdateHL(p,dist); currentP[p]=true else RemoveHL(p) end end; for p,_ in pairs(highlights) do if not currentP[p] then RemoveHL(p) end end end local function OnEquipped() isEquipped=true; lastUpdate=0; ApplyFx(); EnableCRT(true); if not hbConn then hbConn=RunSvc.Heartbeat:Connect(OnHeartbeat) end; OnHeartbeat(0) end local function OnUnequipped() isEquipped=false; RevertFx(); EnableCRT(false); if hbConn then hbConn:Disconnect(); hbConn=nil end; for p,hl in pairs(highlights) do if hl then hl:Destroy() end end; highlights={} end local function OnPlayerRemoving(p) RemoveHL(p) end local function CreateTool() local existingCRT=playerGui:FindFirstChild("HeatSigCRT"); if existingCRT then existingCRT:Destroy() end if plr.Backpack:FindFirstChild(TOOL_NAME) or (plr.Character and plr.Character:FindFirstChild(TOOL_NAME)) then return end tool=Instance.new("Tool"); tool.Name=TOOL_NAME; tool.ToolTip=TOOL_TIP; tool.TextureId=TOOL_ICON; tool.RequiresHandle=true local h=Instance.new("Part"); h.Name="Handle"; h.Size=Vector3.new(.1,.1,.1); h.Transparency=1; h.CanCollide=false; h.Locked=true; h.Anchored=false; h.Parent=tool tool.Equipped:Connect(OnEquipped); tool.Unequipped:Connect(OnUnequipped); tool.Parent=plr:WaitForChild("Backpack"); CreateCRTGui() end -- // Init & Cleanup \\ -- Players.PlayerRemoving:Connect(OnPlayerRemoving) if not plr.Character then plr.CharacterAdded:Wait() end; task.wait(1); CreateTool() script.Destroying:Connect(function() isEquipped=false; StopTweens(); if hbConn then hbConn:Disconnect() end; if ccFx then ccFx:Destroy() end; if blurFx then blurFx:Destroy() end; for _,hl in pairs(highlights) do pcall(hl.Destroy,hl) end; highlights={}; if crtGui then crtGui:Destroy() end; if tool then pcall(tool.Destroy,tool) end end)