Fly Script V1
Key RequiredUniversal

Fly Script V1

Universal ScriptMoggerKentMoggerKent 473 views 7.7K executesUpdated Oct 3, 2026
Unrated
00
Lua Script•418 lines (11925 chars)
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)

Features & Information

Just Fly With 3 Stages. Leave Suggestions In The Comments.

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts