local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local Workspace = game:GetService("Workspace") local lp = game:GetService("Players").LocalPlayer local Camera = Workspace.CurrentCamera local BulletHandler = require(ReplicatedStorage.ModuleScripts.GunModules.BulletHandler) local function getClosestToCrosshair() local closestDist = math.huge local closestPlayer = nil local mousePos = Camera.ViewportSize / 2 for _, player in pairs(game:GetService("Players"):GetPlayers()) do if player ~= lp and player.Character and player.Character:FindFirstChild("Head") and player.Character:FindFirstChild("Humanoid") then if player.Character.Humanoid.Health > 0 then local screenPos, onScreen = Camera:WorldToViewportPoint(player.Character.Head.Position) if onScreen then local dist = (Vector2.new(screenPos.X, screenPos.Y) - mousePos).Magnitude if dist < closestDist then closestDist = dist closestPlayer = player end end end end end return closestPlayer end local oldFire = BulletHandler.Fire BulletHandler.Fire = function(arg1) if not (arg1 and arg1.Misc) then return oldFire(arg1) end local target = getClosestToCrosshair() if target and target.Character and target.Character:FindFirstChild("Head") then local head = target.Character.Head local headPos = head.Position local hrp = target.Character:FindFirstChild("HumanoidRootPart") local targetVelocity = hrp and (hrp.AssemblyLinearVelocity or hrp.Velocity) or Vector3.new(0, 0, 0) local bulletSpeed = 550 local bulletGravity = 50 local distance = (headPos - arg1.Origin).Magnitude local travelTime = distance / bulletSpeed local predictedPos = headPos + (targetVelocity * travelTime) local dropCompensation = 0.5 * bulletGravity * (travelTime ^ 2) predictedPos = predictedPos + Vector3.new(0, dropCompensation, 0) arg1.Direction = (predictedPos - arg1.Origin).Unit if arg1.Misc then arg1.Misc.CamCFrame = CFrame.new(arg1.Origin, predictedPos) end end oldFire(arg1) end