local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") if playerGui:FindFirstChild("FlyUI") then playerGui.FlyUI:Destroy() end local speeds = {55, 95, 145} local stage = 0 local flying = false local flyConn local bv, bg local ikList = {} local poseParts = {} local windBits = {} local lookPart, lookAtt, lookIK local windSound local windLevel = 0 local windShowing = false local function getParts() local char = player.Character or player.CharacterAdded:Wait() return char, char:WaitForChild("HumanoidRootPart"), char:WaitForChild("Humanoid") end local function resetNeck(char) local upper = char and char:FindFirstChild("UpperTorso") local neck = upper and upper:FindFirstChild("Neck") local waist = upper and upper:FindFirstChild("Waist") if neck then neck.Transform = CFrame.identity end if waist then waist.Transform = CFrame.identity end end local function clearLook() if lookIK then lookIK:Destroy() lookIK = nil end if lookPart then lookPart:Destroy() lookPart = nil end lookAtt = nil end local function clearWind() for _, obj in ipairs(windBits) do if obj then obj:Destroy() end end windBits = {} if windSound then windSound:Stop() windSound:Destroy() windSound = nil end windShowing = false end local function clearPose() for _, ik in ipairs(ikList) do if ik then ik:Destroy() end end ikList = {} for _, part in ipairs(poseParts) do if part then part:Destroy() end end poseParts = {} clearLook() resetNeck(player.Character) end local function makeTarget(parent, offset) local part = Instance.new("Part") part.Name = "InvisibleFlyTarget" part.Size = Vector3.new(0.15, 0.15, 0.15) part.Transparency = 1 part.CanCollide = false part.CanTouch = false part.CanQuery = false part.Anchored = false part.Massless = true part.Parent = parent local weld = Instance.new("Weld") weld.Part0 = parent weld.Part1 = part weld.C0 = CFrame.new(offset) weld.Parent = part local attachment = Instance.new("Attachment") attachment.Parent = part table.insert(poseParts, part) return attachment end local function addIK(hum, endPart, rootPart, target, pole) if not endPart or not rootPart or not target then return end local ik = Instance.new("IKControl") ik.Type = Enum.IKControlType.Position ik.EndEffector = endPart ik.ChainRoot = rootPart ik.Target = target if pole then ik.Pole = pole end ik.Weight = 1 ik.SmoothTime = 0.05 ik.Parent = hum table.insert(ikList, ik) end local function startLookUp(char, hum) clearLook() local head = char:FindFirstChild("Head") if not head then return end lookPart = Instance.new("Part") lookPart.Name = "HeadLookTarget" lookPart.Size = Vector3.new(0.2, 0.2, 0.2) lookPart.Transparency = 1 lookPart.Anchored = true lookPart.CanCollide = false lookPart.CanQuery = false lookPart.Parent = workspace lookAtt = Instance.new("Attachment") lookAtt.Parent = lookPart lookIK = Instance.new("IKControl") lookIK.Type = Enum.IKControlType.LookAt lookIK.EndEffector = head lookIK.ChainRoot = head lookIK.Target = lookAtt lookIK.Weight = 1 lookIK.SmoothTime = 0.05 lookIK.Parent = hum end local function lockTorso(char) local upper = char:FindFirstChild("UpperTorso") local lower = char:FindFirstChild("LowerTorso") local waist = upper and upper:FindFirstChild("Waist") local root = lower and lower:FindFirstChild("Root") if waist then waist.Transform = CFrame.identity end if root then root.Transform = CFrame.identity end end local function applyHoverPose(char, hum) clearPose() local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end addIK(hum, char:FindFirstChild("LeftHand"), char:FindFirstChild("LeftUpperArm"), makeTarget(hrp, Vector3.new(0.35, 0.55, -0.55))) addIK(hum, char:FindFirstChild("RightHand"), char:FindFirstChild("RightUpperArm"), makeTarget(hrp, Vector3.new(-0.35, 0.35, -0.55))) addIK(hum, char:FindFirstChild("LeftFoot"), char:FindFirstChild("LeftUpperLeg"), makeTarget(hrp, Vector3.new(-0.55, -2.35, 0.45))) addIK(hum, char:FindFirstChild("RightFoot"), char:FindFirstChild("RightUpperLeg"), makeTarget(hrp, Vector3.new(0.55, -2.35, 0.45))) end local function applyFlightPose(char, hum) clearPose() local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end local leftHand = makeTarget(hrp, Vector3.new(-1.15, 2.8, 0.05)) local rightHand = makeTarget(hrp, Vector3.new(1.15, 2.8, 0.05)) local leftFoot = makeTarget(hrp, Vector3.new(-0.28, -2.85, 0.05)) local rightFoot = makeTarget(hrp, Vector3.new(0.28, -2.85, 0.05)) local leftPole = makeTarget(hrp, Vector3.new(-0.28, -1.2, 0.35)) local rightPole = makeTarget(hrp, Vector3.new(0.28, -1.2, 0.35)) addIK(hum, char:FindFirstChild("LeftHand"), char:FindFirstChild("LeftUpperArm"), leftHand) addIK(hum, char:FindFirstChild("RightHand"), char:FindFirstChild("RightUpperArm"), rightHand) addIK(hum, char:FindFirstChild("LeftFoot"), char:FindFirstChild("LeftUpperLeg"), leftFoot, leftPole) addIK(hum, char:FindFirstChild("RightFoot"), char:FindFirstChild("RightUpperLeg"), rightFoot, rightPole) startLookUp(char, hum) end local function addWindLine(hrp, startOffset, length, thickness) local a0 = Instance.new("Attachment") a0.Position = startOffset a0.Parent = hrp local a1 = Instance.new("Attachment") a1.Position = startOffset + Vector3.new(0, -length, 0) a1.Parent = hrp local beam = Instance.new("Beam") beam.Attachment0 = a0 beam.Attachment1 = a1 beam.Width0 = thickness beam.Width1 = 0.02 beam.Color = ColorSequence.new(Color3.fromRGB(190, 195, 205)) beam.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0.2), NumberSequenceKeypoint.new(1, 1) }) beam.FaceCamera = true beam.LightEmission = 0.25 beam.Parent = hrp table.insert(windBits, a0) table.insert(windBits, a1) table.insert(windBits, beam) end local function setWind(hrp, level) clearWind() windLevel = level if level <= 0 or not hrp then return end local lines = { {Vector3.new(-0.9, 0.2, 0.15), 3.4, 0.07}, {Vector3.new(0.9, 0.2, 0.15), 3.6, 0.07}, {Vector3.new(-1.4, -0.4, 0.1), 3.2, 0.06}, {Vector3.new(1.4, -0.4, 0.1), 3.2, 0.06}, {Vector3.new(0, -0.8, 0.2), 3.8, 0.06}, {Vector3.new(-0.4, 0.8, 0.05), 2.8, 0.05}, {Vector3.new(0.4, 0.8, 0.05), 2.8, 0.05}, } if level == 2 then table.insert(lines, {Vector3.new(-1.8, 0.6, 0.1), 4.8, 0.06}) table.insert(lines, {Vector3.new(1.8, 0.6, 0.1), 4.8, 0.06}) table.insert(lines, {Vector3.new(-2.2, -0.2, 0.05), 5.2, 0.05}) table.insert(lines, {Vector3.new(2.2, -0.2, 0.05), 5.2, 0.05}) table.insert(lines, {Vector3.new(0, 1.4, 0.05), 4.4, 0.05}) table.insert(lines, {Vector3.new(-0.7, -1.6, 0.15), 4.6, 0.05}) table.insert(lines, {Vector3.new(0.7, -1.6, 0.15), 4.6, 0.05}) table.insert(lines, {Vector3.new(-1.2, 1.3, 0.08), 4.2, 0.05}) table.insert(lines, {Vector3.new(1.2, 1.3, 0.08), 4.2, 0.05}) table.insert(lines, {Vector3.new(0, -2.1, 0.12), 5.0, 0.05}) end for _, info in ipairs(lines) do addWindLine(hrp, info[1], info[2], info[3]) end windSound = Instance.new("Sound") if level == 1 then windSound.SoundId = "rbxassetid://463114572" windSound.Volume = 1 windSound.PlaybackSpeed = 1 else windSound.SoundId = "rbxassetid://9120769456" windSound.Volume = 1.6 windSound.PlaybackSpeed = 1 end windSound.Looped = true windSound.Parent = hrp windSound:Play() table.insert(windBits, windSound) windShowing = true end local function footRing(hrp) local ring = Instance.new("Part") ring.Name = "BoostRing" ring.Shape = Enum.PartType.Cylinder ring.Size = Vector3.new(0.12, 2, 2) ring.Anchored = true ring.CanCollide = false ring.CanQuery = false ring.Material = Enum.Material.Neon ring.Color = Color3.fromRGB(190, 198, 210) ring.Transparency = 0.25 ring.CFrame = CFrame.new(hrp.Position - Vector3.new(0, 2.6, 0)) * CFrame.Angles(0, 0, math.rad(90)) ring.Parent = workspace local start = tick() local conn conn = RunService.Heartbeat:Connect(function() local t = (tick() - start) / 0.35 if t >= 1 or not ring.Parent then conn:Disconnect() if ring then ring:Destroy() end return end local s = 2 + t * 16 ring.Size = Vector3.new(0.1, s, s) ring.Transparency = 0.25 + t * 0.75 end) Debris:AddItem(ring, 0.4) end local gui = Instance.new("ScreenGui") gui.Name = "FlyUI" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.Parent = playerGui local btn = Instance.new("TextButton") btn.Size = UDim2.new(0.28, 0, 0.12, 0) btn.Position = UDim2.new(0.68, 0, 0.78, 0) btn.BackgroundColor3 = Color3.fromRGB(30, 140, 220) btn.Text = "VOAR" btn.TextColor3 = Color3.new(1, 1, 1) btn.TextScaled = true btn.Font = Enum.Font.GothamBold btn.Parent = gui Instance.new("UICorner", btn).CornerRadius = UDim.new(0.2, 0) local function stopFly() flying = false stage = 0 windLevel = 0 btn.Text = "VOAR" btn.BackgroundColor3 = Color3.fromRGB(30, 140, 220) if flyConn then flyConn:Disconnect() flyConn = nil end if bv then bv:Destroy() bv = nil end if bg then bg:Destroy() bg = nil end clearPose() clearWind() local char = player.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum.PlatformStand = false hum.AutoRotate = true end end end local function startFly() flying = true stage = 1 btn.Text = "BOOST 1" btn.BackgroundColor3 = Color3.fromRGB(40, 120, 210) local char, hrp, hum = getParts() hum.PlatformStand = true hum.AutoRotate = false bv = Instance.new("BodyVelocity") bv.MaxForce = Vector3.new(1e6, 1e6, 1e6) bv.Velocity = Vector3.zero bv.Parent = hrp bg = Instance.new("BodyGyro") bg.MaxTorque = Vector3.new(1e6, 1e6, 1e6) bg.P = 20000 bg.D = 1500 bg.Parent = hrp local hovering = false local flightPose = false flyConn = RunService.RenderStepped:Connect(function() if not hrp.Parent then stopFly() return end local camCF = workspace.CurrentCamera.CFrame local move = hum.MoveDirection local moving = move.Magnitude > 0.05 local speed = speeds[stage] or 55 if moving then if windLevel > 0 and not windShowing then setWind(hrp, windLevel) end lockTorso(char) local flatLook = Vector3.new(camCF.LookVector.X, 0, camCF.LookVector.Z) local flatRight = Vector3.new(camCF.RightVector.X, 0, camCF.RightVector.Z) if flatLook.Magnitude > 0.01 then flatLook = flatLook.Unit end if flatRight.Magnitude > 0.01 then flatRight = flatRight.Unit end local flyDir = (camCF.LookVector * move:Dot(flatLook)) + (camCF.RightVector * move:Dot(flatRight)) if flyDir.Magnitude > 0.01 then flyDir = flyDir.Unit bv.Velocity = flyDir * speed bg.CFrame = CFrame.lookAt(hrp.Position, hrp.Position + flyDir) * CFrame.Angles(math.rad(-75), 0, 0) if lookPart then lookPart.Position = hrp.Position + flyDir * 4 + Vector3.new(0, 3, 0) end end if hovering then clearPose() hovering = false end if not flightPose then applyFlightPose(char, hum) flightPose = true end else bv.Velocity = Vector3.zero bg.CFrame = camCF if windShowing then local saved = windLevel clearWind() windLevel = saved end if flightPose then clearPose() flightPose = false end if not hovering then applyHoverPose(char, hum) hovering = true end end end) end btn.MouseButton1Click:Connect(function() if stage == 0 then startFly() elseif stage == 1 then stage = 2 btn.Text = "BOOST 2" btn.BackgroundColor3 = Color3.fromRGB(80, 90, 220) local _, hrp = getParts() setWind(hrp, 1) elseif stage == 2 then stage = 3 btn.Text = "PARAR" btn.BackgroundColor3 = Color3.fromRGB(200, 50, 50) local _, hrp = getParts() setWind(hrp, 2) footRing(hrp) else stopFly() end end) player.CharacterAdded:Connect(function() if flying then stopFly() end end)