local Players = game:GetService("Players") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local StarterGui = game:GetService("StarterGui") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local camera = workspace.CurrentCamera -- SETTINGS local HELI_HEIGHT = 200 local RANGE_ZONE = 500 local FOLLOW_ZONE = 495 local SWEEP_ZONE = 1000 local PATROL_SPEED = 0.8 local FOLLOW_SPEED = 4.0 local SWEEP_SPEED = 10 local TURN_SPEED = 0.08 local U_TURN_CHANCE = 0.0015 local LIFETIME = 99999 local ESP_INTERVAL = 9 local ESP_DURATION = 7 local AMBIENT_GLOW = 0.6 local FIRE_RATE = 0.05 -- lower = faster fire (machine gun) local TRACER_SPEED = 0.35 -- how long tracer lasts local TRACER_WIDTH = 0.4 local AIM_INACCURACY = 5 -- degrees of random miss local FIRE_DISTANCE_LIMIT = 900 -- max range to fire local heliActive = false local trackedPlayer = nil local lockOn = false local heliStartTime = 0 local lastESPToggle = 0 local currentESP = nil local currentGlow = nil local lastKnownPos = Vector3.new() local patrolYaw = 0 local heliYaw = 0 local sweepTime = 0 local isPatrolOnSpawn = true local isViewingHeli = false local viewRotation = Vector2.new(0, 0) local currentHeli = nil local heli = Instance.new("Model") heli.Name = "ClientHeli" heli.Parent = workspace local body = Instance.new("Part") body.Name = "HeliBody" body.Size = Vector3.new(12, 6, 24) body.Position = Vector3.new(0, HELI_HEIGHT, 0) body.Anchored = true body.CanCollide = false body.Color = Color3.fromRGB(60, 60, 60) body.Material = Enum.Material.Metal body.Parent = heli heli.PrimaryPart = body local detailParts = {} local function createDetail(name, size, relativeCFrame, color, material, transparency, shape) local part = Instance.new("Part") part.Name = name part.Size = size part.Color = color part.Material = material or Enum.Material.Metal part.Transparency = transparency or 0 part.CanCollide = false part.Anchored = true part.Parent = heli table.insert(detailParts, {part = part, offsetCFrame = relativeCFrame}) part.CFrame = body.CFrame * relativeCFrame return part end createDetail("RotorHub", Vector3.new(4, 4, 4), CFrame.new(0, 8, 0), Color3.fromRGB(40, 40, 40), nil, nil, Enum.PartType.Ball) createDetail("Cockpit", Vector3.new(10, 5, 8), CFrame.new(0, 2, -10), Color3.fromRGB(0, 170, 255), Enum.Material.ForceField, 0.3) createDetail("TailFin", Vector3.new(3, 8, 6), CFrame.new(0, 4, 14) * CFrame.Angles(0, 0, math.rad(90)), Color3.fromRGB(50, 50, 50), nil, nil, Enum.PartType.Wedge) local bladeThickness = 0.4 local bladeLength = 28 for i = 0, 3 do local degrees = i * 90 local extraTilt = (i % 2 == 0) and 4 or -3 local relativeCFrame = CFrame.new(0, 8, 0) * CFrame.Angles(0, math.rad(degrees), 0) * CFrame.Angles(math.rad(extraTilt), 0, 0) local blade = createDetail( "Blade" .. i, Vector3.new(bladeThickness, bladeThickness, bladeLength), relativeCFrame, Color3.fromRGB(210, 210, 230), Enum.Material.Neon ) blade.Transparency = 0.1 blade.Reflectance = 0.15 detailParts[#detailParts].spinOffset = degrees end for side = -1, 1, 2 do createDetail("Skid"..(side>0 and "R" or "L"), Vector3.new(2, 1, 22), CFrame.new(side * 6, -6, 0), Color3.fromRGB(30, 30, 30)) end print("Helicopter ready – main body + " .. #detailParts .. " detail parts that follow") local surfaceLight = Instance.new("SpotLight") surfaceLight.Parent = body surfaceLight.Angle = 60 surfaceLight.Range = 300 surfaceLight.Brightness = 0 surfaceLight.Face = Enum.NormalId.Bottom local attachHeli = Instance.new("Attachment") attachHeli.Position = Vector3.new(0,-body.Size.Y/2-0.1,0) attachHeli.Parent = body local attachTarget = Instance.new("Attachment") attachTarget.Parent = workspace local spotlightBeam = Instance.new("Beam") spotlightBeam.Attachment0 = attachHeli spotlightBeam.Attachment1 = attachTarget spotlightBeam.Color = ColorSequence.new(Color3.fromRGB(255,255,180)) spotlightBeam.LightEmission = 1 spotlightBeam.Width0 = 8 spotlightBeam.Width1 = 25 spotlightBeam.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0,0.3), NumberSequenceKeypoint.new(1,0.85) }) spotlightBeam.FaceCamera = true spotlightBeam.Texture = "rbxassetid://9616406359" spotlightBeam.TextureSpeed = 0 spotlightBeam.Enabled = false spotlightBeam.Parent = body local gui = Instance.new("ScreenGui") gui.Name = "HeliGUI" gui.ResetOnSpawn = false gui.Parent = player:WaitForChild("PlayerGui") local frame = Instance.new("Frame") frame.Size = UDim2.new(0,260,0,320) frame.Position = UDim2.new(0.5,-130,0.5,-160) frame.BackgroundColor3 = Color3.fromRGB(30,30,30) frame.Active = true frame.Draggable = true frame.Parent = gui local title = Instance.new("TextLabel",frame) title.Size = UDim2.new(1,0,0,30) title.Text = "🚁 HELICOPTER CONTROL" title.TextColor3 = Color3.new(1,1,1) title.TextScaled = true title.BackgroundTransparency = 1 title.Font = Enum.Font.GothamBold local activateButton = Instance.new("TextButton",frame) activateButton.Size = UDim2.new(0.45,0,0,40) activateButton.Position = UDim2.new(0.05,0,0.1,0) activateButton.Text = "Activate Heli" activateButton.TextScaled = true activateButton.BackgroundColor3 = Color3.fromRGB(0,170,0) local viewButton = Instance.new("TextButton",frame) viewButton.Size = UDim2.new(0.45,0,0,40) viewButton.Position = UDim2.new(0.5,0,0.1,0) viewButton.Text = "View Heli" viewButton.TextScaled = true viewButton.BackgroundColor3 = Color3.fromRGB(100,100,255) local switchButton = Instance.new("TextButton",frame) switchButton.Size = UDim2.new(0.9,0,0,40) switchButton.Position = UDim2.new(0.05,0,0.25,0) switchButton.Text = "Switch Target (Nearest)" switchButton.TextScaled = true switchButton.BackgroundColor3 = Color3.fromRGB(0,120,255) local lockButton = Instance.new("TextButton",frame) lockButton.Size = UDim2.new(0.9,0,0,35) lockButton.Position = UDim2.new(0.05,0,0.38,0) lockButton.Text = "Lock: OFF" lockButton.TextScaled = true lockButton.BackgroundColor3 = Color3.fromRGB(255,100,0) local targetInput = Instance.new("TextBox",frame) targetInput.Size = UDim2.new(0.9,0,0,35) targetInput.Position = UDim2.new(0.05,0,0.52,0) targetInput.PlaceholderText = "Enter username or display name..." targetInput.TextScaled = true targetInput.BackgroundColor3 = Color3.fromRGB(50,50,50) targetInput.TextColor3 = Color3.new(1,1,1) local setTargetButton = Instance.new("TextButton",frame) setTargetButton.Size = UDim2.new(0.9,0,0,35) setTargetButton.Position = UDim2.new(0.05,0,0.65,0) setTargetButton.Text = "Set Target by Name" setTargetButton.TextScaled = true setTargetButton.BackgroundColor3 = Color3.fromRGB(0,200,100) local mgButton = Instance.new("TextButton", frame) mgButton.Size = UDim2.new(0.45,0,0,40) mgButton.Position = UDim2.new(0.05,0,0.78,0) mgButton.Text = "Machine Gun Mode" mgButton.TextScaled = true mgButton.BackgroundColor3 = Color3.fromRGB(255,180,0) local disableButton = Instance.new("TextButton", frame) disableButton.Size = UDim2.new(0.9,0,0,35) disableButton.Position = UDim2.new(0.05,0,0.90,0) disableButton.Text = "Weapons: OFF" disableButton.TextScaled = true disableButton.BackgroundColor3 = Color3.fromRGB(150,50,50) local function notify(title,text) StarterGui:SetCore("SendNotification",{Title=title,Text=text,Duration=3}) end local function toggleESP(target,show) if currentESP then currentESP:Destroy() currentESP=nil end if show and target and target.Character then currentESP=Instance.new("Highlight") currentESP.FillColor=Color3.fromRGB(255,50,50) currentESP.OutlineColor=Color3.new(1,1,1) currentESP.FillTransparency=0.4 currentESP.OutlineTransparency=0 currentESP.Parent=target.Character end end local function addGlow(targetChar) if currentGlow then currentGlow:Destroy() currentGlow=nil end if targetChar and targetChar:FindFirstChild("HumanoidRootPart") then currentGlow=Instance.new("PointLight") currentGlow.Color=Color3.fromRGB(255,255,240) currentGlow.Brightness=AMBIENT_GLOW currentGlow.Range=18 currentGlow.Shadows=false currentGlow.Parent=targetChar.HumanoidRootPart end end local function removeGlow() if currentGlow then currentGlow:Destroy() currentGlow=nil end end local function getPlayerByName(name) name = name:lower() for _,p in Players:GetPlayers() do if p.Name:lower():sub(1,#name)==name or (p.DisplayName and p.DisplayName:lower():sub(1,#name)==name) then return p end end return nil end local function getNearestPlayerToCaller() local char=player.Character if not char or not char:FindFirstChild("HumanoidRootPart") then return nil end local pos=char.HumanoidRootPart.Position local closest,minDist=nil,math.huge for _,plr in Players:GetPlayers() do if plr~=player and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then local mag=(plr.Character.HumanoidRootPart.Position-pos).Magnitude if mag 0 then humanoid:TakeDamage(3) end end else hitPosition = origin + direction * FIRE_DISTANCE_LIMIT end local distance = (hitPosition - origin).Magnitude -- Create tracer local tracer = Instance.new("Part") tracer.Anchored = true tracer.CanCollide = false tracer.Material = Enum.Material.Neon tracer.Color = Color3.fromRGB(255, 230, 80) tracer.Size = Vector3.new(TRACER_WIDTH, TRACER_WIDTH, distance) tracer.CFrame = CFrame.new(origin, hitPosition) * CFrame.new(0, 0, -distance/2) tracer.Parent = workspace task.delay(TRACER_SPEED, function() if tracer then tracer:Destroy() end end) -- 🔊 Machine gun firing sound if trackedPlayer and trackedPlayer.Character and trackedPlayer.Character:FindFirstChild("HumanoidRootPart") then local targetPart = trackedPlayer.Character.HumanoidRootPart local gunSound = targetPart:FindFirstChild("GunSound") if not gunSound then gunSound = Instance.new("Sound") gunSound.Name = "GunSound" gunSound.SoundId = "rbxassetid://112920286914467" -- example automatic gun sound gunSound.Volume = 1 gunSound.RollOffMaxDistance = 200 gunSound.Parent = targetPart gunSound:LoadAsync() end gunSound:Play() end end activateButton.MouseButton1Click:Connect(function() heliActive = not heliActive activateButton.Text = heliActive and "Deactivate Heli" or "Activate Heli" activateButton.BackgroundColor3 = heliActive and Color3.fromRGB(170,0,0) or Color3.fromRGB(0,170,0) if heliActive then heliStartTime = tick() local char = player.Character if char and char:FindFirstChild("HumanoidRootPart") then local spawnPos = char.HumanoidRootPart.Position + Vector3.new(0, HELI_HEIGHT + 20, 0) body.Position = spawnPos lastKnownPos = spawnPos notify("Helicopter","Inbound above you") else notify("Helicopter","Spawn failed – no character") heliActive = false activateButton.Text = "Activate Heli" activateButton.BackgroundColor3 = Color3.fromRGB(0,170,0) return end isPatrolOnSpawn = true trackedPlayer = getNearestPlayerToCaller() if trackedPlayer then lastKnownPos = trackedPlayer.Character.HumanoidRootPart.Position notify("Helicopter","Target Spotted: "..trackedPlayer.Name) addGlow(trackedPlayer.Character) else notify("Helicopter","No target found – patrolling") end else if currentHeli then currentHeli:Destroy() currentHeli = nil end surfaceLight.Brightness = 0 spotlightBeam.Enabled = false toggleESP(trackedPlayer,false) removeGlow() trackedPlayer = nil lockOn = false lockButton.Text = "Lock: OFF" lockButton.BackgroundColor3 = Color3.fromRGB(255,100,0) notify("Helicopter","Deactivated") if isViewingHeli then isViewingHeli = false viewButton.Text = "View Heli" viewButton.BackgroundColor3 = Color3.fromRGB(100,100,255) camera.CameraType = Enum.CameraType.Custom end end end) switchButton.MouseButton1Click:Connect(function() if lockOn or not heliActive then notify("Error","Cannot switch while locked!") return end local nt = getNearestPlayerToCaller() if nt then removeGlow() trackedPlayer = nt lastKnownPos = nt.Character.HumanoidRootPart.Position notify("Helicopter","Switching Target: "..nt.Name) addGlow(nt.Character) isPatrolOnSpawn = false end end) lockButton.MouseButton1Click:Connect(function() if not heliActive then return end lockOn = not lockOn lockButton.Text = lockOn and "Lock: ON" or "Lock: OFF" lockButton.BackgroundColor3 = lockOn and Color3.fromRGB(0,255,0) or Color3.fromRGB(255,100,0) notify("Lock", lockOn and "Locked – staying on target" or "Unlocked – auto-switching enabled") end) setTargetButton.MouseButton1Click:Connect(function() if not heliActive then notify("Error","Heli not active") return end local input = targetInput.Text if input == "" then notify("Error","Enter a name") return end local target = getPlayerByName(input) if target then removeGlow() trackedPlayer = target lastKnownPos = target.Character.HumanoidRootPart.Position notify("Helicopter","Target set: "..target.Name) addGlow(target.Character) isPatrolOnSpawn = false else notify("Error","Player not found: "..input) end end) local viewOffset = Vector3.new(0, 35, 70) local viewRotation = Vector2.new(0, 0) viewButton.MouseButton1Click:Connect(function() if not heliActive or not body then notify("Error","Heli not active") return end isViewingHeli = not isViewingHeli if isViewingHeli then viewButton.Text = "Back to Me" viewButton.BackgroundColor3 = Color3.fromRGB(255,150,50) camera.CameraType = Enum.CameraType.Scriptable notify("Camera", "Following Helicopter (drag to look)") else viewButton.Text = "View Heli" viewButton.BackgroundColor3 = Color3.fromRGB(100,100,255) camera.CameraType = Enum.CameraType.Custom notify("Camera", "Back to you") end end) UserInputService.InputChanged:Connect(function(input) if not isViewingHeli then return end if input.UserInputType == Enum.UserInputType.Touch then local delta = input.Delta viewRotation = viewRotation + Vector2.new(-delta.X * 0.3, -delta.Y * 0.3) viewRotation = Vector2.new(viewRotation.X, math.clamp(viewRotation.Y, -80, 80)) end end) local heliMode = "none" mgButton.MouseButton1Click:Connect(function() heliMode = "machinegun" notify("Helicopter","Mode: Machine Gun") disableButton.Text = "Weapons: ON" end) disableButton.MouseButton1Click:Connect(function() heliMode = "none" notify("Helicopter","Weapons disabled") disableButton.Text = "Weapons: OFF" end) RunService.RenderStepped:Connect(function() if not heliActive then return end for _, data in ipairs(detailParts) do local baseCFrame = body.CFrame * data.offsetCFrame if string.find(data.part.Name, "Blade") then local spinOffset = data.spinOffset or 0 local totalRotation = (tick() * 720 + spinOffset) % 360 local spin = CFrame.Angles(0, math.rad(totalRotation), 0) data.part.CFrame = baseCFrame * spin else data.part.CFrame = baseCFrame end end if tick() - heliStartTime >= LIFETIME then heliActive = false if currentHeli then currentHeli:Destroy() currentHeli = nil end activateButton.Text = "Activate Heli" activateButton.BackgroundColor3 = Color3.fromRGB(0,170,0) surfaceLight.Brightness = 0 spotlightBeam.Enabled = false toggleESP(trackedPlayer, false) removeGlow() notify("Helicopter", "Expired") if isViewingHeli then isViewingHeli = false viewButton.Text = "View Heli" viewButton.BackgroundColor3 = Color3.fromRGB(100,100,255) camera.CameraType = Enum.CameraType.Custom end return end local targetValid = trackedPlayer and trackedPlayer.Parent and trackedPlayer.Character and trackedPlayer.Character:FindFirstChild("HumanoidRootPart") if trackedPlayer and not targetValid then removeGlow() if lockOn then surfaceLight.Brightness = 0 spotlightBeam.Enabled = false notify("Helicopter", "Target Eliminated / Left (locked) → Heli idle") return else trackedPlayer = getNearestPlayerToCaller() if trackedPlayer then lastKnownPos = trackedPlayer.Character.HumanoidRootPart.Position notify("Helicopter", "Target Eliminated / Left → New Target: " .. trackedPlayer.Name) addGlow(trackedPlayer.Character) else surfaceLight.Brightness = 0 spotlightBeam.Enabled = false notify("Helicopter", "No targets nearby") return end end end if not targetValid then surfaceLight.Brightness = 0 spotlightBeam.Enabled = false toggleESP(trackedPlayer, false) removeGlow() return end local root = trackedPlayer.Character.HumanoidRootPart local targetPos = root.Position lastKnownPos = targetPos local flatDist = getFlatDistance(trackedPlayer) local targetHeliPos, moveSpeed, isSweeping = Vector3.new(), 0, false if isPatrolOnSpawn or flatDist <= RANGE_ZONE then patrolYaw = patrolYaw + TURN_SPEED * 0.4 local offset = Vector3.new(math.cos(patrolYaw)*35, HELI_HEIGHT, math.sin(patrolYaw)*35) targetHeliPos = targetPos + offset moveSpeed = PATROL_SPEED if math.random() < U_TURN_CHANCE then patrolYaw = patrolYaw + math.pi * 1.5 end if flatDist <= RANGE_ZONE then isPatrolOnSpawn = false end elseif flatDist <= FOLLOW_ZONE then targetHeliPos = Vector3.new(targetPos.X, targetPos.Y + HELI_HEIGHT, targetPos.Z) moveSpeed = FOLLOW_SPEED else isSweeping = true sweepTime = tick() local offset = Vector3.new(math.sin(sweepTime*1.5)*70, HELI_HEIGHT, math.cos(sweepTime*1.5)*70) targetHeliPos = lastKnownPos + offset moveSpeed = SWEEP_SPEED end body.Position = body.Position:Lerp(targetHeliPos, moveSpeed * 0.018) local look = Vector3.new((targetPos - body.Position).X, 0, (targetPos - body.Position).Z).Unit local targetYaw = math.atan2(look.X, look.Z) heliYaw = heliYaw + (targetYaw - heliYaw) * TURN_SPEED body.CFrame = CFrame.new(body.Position) * CFrame.Angles(0, heliYaw, 0) * CFrame.Angles(math.rad(-8), 0, 0) surfaceLight.Brightness = 8 spotlightBeam.Enabled = true surfaceLight.Brightness = 8 local beamTarget if isSweeping then local angle = sweepTime * 4 beamTarget = lastKnownPos + Vector3.new(math.cos(angle)*90, -20, math.sin(angle)*90) else beamTarget = Vector3.new(targetPos.X, targetPos.Y - 3, targetPos.Z) end attachTarget.WorldPosition = beamTarget spotlightBeam.Enabled = true local bDist = (targetPos - body.Position).Magnitude spotlightBeam.Width1 = math.clamp(15 + bDist * 0.12, 15, 50) if isViewingHeli then local baseOffset = Vector3.new(0, 35, 70) local yawRad = math.rad(viewRotation.X) local pitchRad = math.rad(viewRotation.Y) local rotatedX = math.cos(yawRad) * baseOffset.Z local rotatedZ = math.sin(yawRad) * baseOffset.Z local finalOffset = Vector3.new(rotatedX, baseOffset.Y + math.sin(pitchRad) * 30, rotatedZ * math.cos(pitchRad)) local targetCFrame = CFrame.new(body.Position + finalOffset, body.Position) camera.CFrame = camera.CFrame:Lerp(targetCFrame, 0.12) end local now = tick() -- MACHINE GUN FIRE if trackedPlayer and flatDist <= FIRE_DISTANCE_LIMIT then if heliMode == "machinegun" and heliActive and trackedPlayer and flatDist <= FIRE_DISTANCE_LIMIT then if now - lastShotTime >= FIRE_RATE then lastShotTime = now local aimPos = trackedPlayer.Character.HumanoidRootPart.Position if math.random() < 0.2 then aimPos = aimPos + Vector3.new(math.random(-20,20), math.random(-5,5), math.random(-20,20)) end fireTracer(aimPos) end end end if now - lastESPToggle >= ESP_INTERVAL then lastESPToggle = now toggleESP(trackedPlayer, true) task.delay(ESP_DURATION, function() toggleESP(trackedPlayer, false) end) end end)