local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local BulletHandler = require(ReplicatedStorage.ModuleScripts.GunModules:WaitForChild("BulletHandler")) local SignalManager = require(ReplicatedStorage:WaitForChild("SignalManager")) local oldFire = BulletHandler.Fire local maxDistance = 500 local espMaxDistance = 1000 local isThirdPerson = false local isSpinning = false local isAiming = false local savedRotation = CFrame.new() local highlights = {} local function updateESP() for _, v in ipairs(Players:GetPlayers()) do if v ~= LocalPlayer then local char = v.Character if char and char:FindFirstChild("Humanoid") and char.Humanoid.Health > 0 then local root = char:FindFirstChild("HumanoidRootPart") if root then local dist = (root.Position - workspace.CurrentCamera.CFrame.Position).Magnitude local hl = highlights[v] if dist <= espMaxDistance then if not hl then hl = Instance.new("Highlight") hl.Parent = char hl.FillTransparency = 0.5 hl.OutlineTransparency = 0 highlights[v] = hl end hl.Adornee = char hl.FillColor = v.TeamColor and v.TeamColor.Color or Color3.new(1, 1, 1) hl.OutlineColor = v.TeamColor and v.TeamColor.Color or Color3.new(1, 1, 1) hl.Enabled = true else if hl then hl.Enabled = false end end end else local hl = highlights[v] if hl then hl:Destroy() highlights[v] = nil end end end end end Players.PlayerRemoving:Connect(function(v) if highlights[v] then highlights[v]:Destroy() highlights[v] = nil end end) local function getTarget() local target = nil local dist = maxDistance local cam = workspace.CurrentCamera local rayParams = RaycastParams.new() rayParams.FilterType = Enum.RaycastFilterType.Exclude if LocalPlayer.Character then rayParams.FilterDescendantsInstances = {LocalPlayer.Character} end for _, v in ipairs(Players:GetPlayers()) do if v ~= LocalPlayer and v.Character and v.Character:FindFirstChild("Humanoid") and v.Character.Humanoid.Health > 0 then local head = v.Character:FindFirstChild("Head") if head then local d = (head.Position - cam.CFrame.Position).Magnitude if d < dist then local dir = (head.Position - cam.CFrame.Position).Unit * d local hit = workspace:Raycast(cam.CFrame.Position, dir, rayParams) if not hit or hit.Instance:IsDescendantOf(v.Character) then dist = d target = head end end end end end return target end BulletHandler.Fire = function(data) local head = getTarget() if head and data and data.Origin and data.Misc then data.Direction = (head.Position - data.Origin).Unit data.Misc.CamCFrame = CFrame.new(data.Misc.CamCFrame.Position, head.Position) end return oldFire(data) end local function updateCameraState(state) isThirdPerson = state if isThirdPerson then LocalPlayer.CameraMode = Enum.CameraMode.Classic LocalPlayer.CameraMinZoomDistance = 8 LocalPlayer.CameraMaxZoomDistance = 400 UserInputService.MouseBehavior = Enum.MouseBehavior.Default SignalManager.Fire("ViewModelVisable", false) if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Head") then LocalPlayer.Character.Head.Anchored = false end UserInputService.MouseIconEnabled = true else LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson LocalPlayer.CameraMinZoomDistance = 0.5 LocalPlayer.CameraMaxZoomDistance = 0.5 SignalManager.Fire("ViewModelVisable", true) UserInputService.MouseIconEnabled = false end end UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == Enum.KeyCode.C then updateCameraState(not isThirdPerson) elseif input.KeyCode == Enum.KeyCode.X then isSpinning = not isSpinning end end) LocalPlayer.CharacterAdded:Connect(function() updateCameraState(false) isSpinning = false isAiming = false end) RunService.RenderStepped:Connect(function() updateESP() if isThirdPerson then LocalPlayer.CameraMode = Enum.CameraMode.Classic LocalPlayer.CameraMinZoomDistance = 8 LocalPlayer.CameraMaxZoomDistance = 400 else LocalPlayer.CameraMode = Enum.CameraMode.LockFirstPerson LocalPlayer.CameraMinZoomDistance = 0.5 LocalPlayer.CameraMaxZoomDistance = 0.5 UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter end local head = getTarget() local char = LocalPlayer.Character if char and char:FindFirstChild("HumanoidRootPart") and char:FindFirstChild("Humanoid") then local hrp = char.HumanoidRootPart local hum = char.Humanoid if head then if not isAiming then isAiming = true savedRotation = hrp.CFrame.Rotation hum.AutoRotate = false end local targetPos = Vector3.new(head.Position.X, hrp.Position.Y, head.Position.Z) hrp.CFrame = hrp.CFrame:Lerp(CFrame.new(hrp.Position, targetPos), 0.25) else if isAiming then hum.AutoRotate = false local targetCFrame = CFrame.new(hrp.Position) * savedRotation hrp.CFrame = hrp.CFrame:Lerp(targetCFrame, 0.2) if hrp.CFrame.LookVector:Dot(targetCFrame.LookVector) > 0.9 then isAiming = false end elseif isSpinning then hum.AutoRotate = false hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(35), 0) else hum.AutoRotate = true end end end end) task.spawn(function() while task.wait(0.05) do if getTarget() then SignalManager.Fire("FireWeapon", Enum.UserInputState.Begin) task.wait(0.05) SignalManager.Fire("FireWeapon", Enum.UserInputState.End) end end end)