MeteorBoostZeroGravityClicktoFlyScript
Key RequiredUniversal

MeteorBoostZeroGravityClicktoFlyScript

Universal ScriptKiritopetKiritopet 3K views 2.5K executesUpdated Jun 29, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•575 lines (19177 chars)
-- Meteor Boost – Zero-Gravity Click-to-Fly Script

if script:GetAttribute("Running") then return end
script:SetAttribute("Running", true)

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local CoreGui = game:GetService("CoreGui")
local TweenService = game:GetService("TweenService")
local LocalizationService = game:GetService("LocalizationService")

local LocalPlayer = Players.LocalPlayer
local Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
local Humanoid = Character:WaitForChild("Humanoid")
local HRP = Character:WaitForChild("HumanoidRootPart")

local userLocale = string.lower(LocalizationService.RobloxLocaleId)
local isRussian = string.find(userLocale, "ru") ~= nil
local L = {
    title = isRussian and "Метеорит" or "Meteor Boost",
    force = isRussian and "Сила" or "Force",
    clickMode = isRussian and "Клик-режим" or "Click Mode",
    on = isRussian and "ВКЛ" or "ON",
    off = isRussian and "ВЫКЛ" or "OFF",
    start = isRussian and "СТАРТ" or "START",
}

local boostForce = 50
local clickModeEnabled = true
local isBoostActive = true
local needStart = false
local activeBlockTarget = nil
local activeAirDirection = nil
local residualSpin = Vector3.zero
local isInResidualSpin = false

local bodyVelocity
local bodyAngular
local safeDistance = 6
local savedProperties = {}

local function saveCurrentProperties()
    table.clear(savedProperties)
    if Character then
        for _, part in ipairs(Character:GetDescendants()) do
            if part:IsA("BasePart") then
                savedProperties[part] = {
                    canCollide = part.CanCollide,
                    massless = part.Massless
                }
            end
        end
    end
end

local function restoreProperties()
    if Character then
        for _, part in ipairs(Character:GetDescendants()) do
            if part:IsA("BasePart") and savedProperties[part] and part.Parent then
                local orig = savedProperties[part]
                part.CanCollide = orig.canCollide
                part.Massless = orig.massless
            end
        end
    end
    table.clear(savedProperties)
end

local function removePhysics()
    if bodyVelocity then
        bodyVelocity:Destroy()
        bodyVelocity = nil
    end
    if bodyAngular then
        bodyAngular:Destroy()
        bodyAngular = nil
    end

    if Humanoid and Humanoid.Parent then
        Humanoid.PlatformStand = false
        Humanoid.AutoRotate = true
    end

    restoreProperties()
    activeBlockTarget = nil
    activeAirDirection = nil
    residualSpin = Vector3.zero
    isInResidualSpin = false
end

local function setupPhysics()
    removePhysics()

    Character = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait()
    Humanoid = Character:WaitForChild("Humanoid")
    HRP = Character:WaitForChild("HumanoidRootPart")

    saveCurrentProperties()

    for _, part in ipairs(Character:GetDescendants()) do
        if part:IsA("BasePart") then
            part.CanCollide = false
            part.Massless = true
        end
    end

    Humanoid.PlatformStand = true
    Humanoid.AutoRotate = false

    bodyVelocity = Instance.new("BodyVelocity")
    bodyVelocity.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
    bodyVelocity.Velocity = Vector3.zero
    bodyVelocity.Parent = HRP

    bodyAngular = Instance.new("BodyAngularVelocity")
    bodyAngular.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)
    bodyAngular.AngularVelocity = Vector3.zero
    bodyAngular.Parent = HRP
end
setupPhysics()

local function boostToward(targetPos, isBlock)
    if not bodyVelocity or not bodyAngular then return end
    if not HRP or not HRP.Parent then return end

    local direction = (targetPos - HRP.Position).Unit
    if direction.Magnitude < 0.01 then direction = Vector3.new(0, 1, 0) end

    local speed = boostForce * 2
    bodyVelocity.Velocity = direction * speed

    local angularStrength = boostForce / 30
    local randAngular = Vector3.new(
        math.random(-100, 100) / 100,
        math.random(-100, 100) / 100,
        math.random(-100, 100) / 100
    ).Unit * angularStrength
    bodyAngular.AngularVelocity = randAngular

    residualSpin = randAngular * 0.3

    if isBlock then
        activeBlockTarget = targetPos
        activeAirDirection = nil
        isInResidualSpin = false
    else
        activeAirDirection = true
        activeBlockTarget = nil
        isInResidualSpin = false
    end
end

local function stopAllBoost()
    activeBlockTarget = nil
    activeAirDirection = nil
    if bodyVelocity then
        bodyVelocity.Velocity = Vector3.zero
    end
end

local function handleClick(hitPos, target, normal)
    if not isBoostActive then return end
    if not HRP or not HRP.Parent then return end
    if isDragging then return end

    if activeBlockTarget then
        if (HRP.Position - activeBlockTarget).Magnitude < safeDistance then
            return
        end
    end

    local isBlock = false
    local safeTargetPos = hitPos

    if target and target:IsA("BasePart") and not target:IsDescendantOf(Character) then
        local surfNormal = normal or (HRP.Position - hitPos).Unit
        if surfNormal.Magnitude == 0 then surfNormal = Vector3.new(0,1,0) end
        safeTargetPos = hitPos + surfNormal * safeDistance
        isBlock = true
    end

    boostToward(safeTargetPos, isBlock)
end

local mouse = LocalPlayer:GetMouse()

mouse.Button1Down:Connect(function()
    if UserInputService.TouchEnabled then return end
    if UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) then return end

    local target = mouse.Target
    local hitPos = mouse.Hit.Position
    local normal = target and target:IsA("BasePart") and Vector3.FromNormalId(mouse.TargetSurface)

    handleClick(hitPos, target, normal)
end)

local touchStartPos = nil
local touchMoved = false
local touchStartTime = 0

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if gameProcessed then return end
    if input.UserInputType == Enum.UserInputType.Touch then
        touchStartPos = input.Position
        touchMoved = false
        touchStartTime = tick()
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch and touchStartPos then
        local delta = (input.Position - touchStartPos).Magnitude
        if delta > 15 then
            touchMoved = true
        end
    end
end)

UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Touch then
        if not touchMoved and (tick() - touchStartTime) < 0.4 then
            local mousePos = UserInputService:GetMouseLocation()
            local ray = workspace.CurrentCamera:ScreenPointToRay(mousePos.X, mousePos.Y)

            local raycastParams = RaycastParams.new()
            raycastParams.FilterType = Enum.RaycastFilterType.Blacklist
            raycastParams.FilterDescendantsInstances = {Character}
            local rayResult = workspace:Raycast(ray.Origin, ray.Direction * 1000, raycastParams)

            local hitPos = rayResult and rayResult.Position or (ray.Origin + ray.Direction * 1000)
            local target = rayResult and rayResult.Instance
            local normal = rayResult and rayResult.Normal

            handleClick(hitPos, target, normal)
        end
        touchStartPos = nil
        touchMoved = false
    end
end)

RunService.Heartbeat:Connect(function(dt)
    if not HRP or not HRP.Parent then return end
    if not bodyVelocity or not bodyAngular then return end

    if activeBlockTarget then
        local dir = (activeBlockTarget - HRP.Position)
        local distance = dir.Magnitude
        if distance < 0.01 then
            stopAllBoost()
            isInResidualSpin = true
            bodyAngular.AngularVelocity = residualSpin
            return
        end
        local direction = dir.Unit
        local maxSpeed = boostForce * 2
        local speed = maxSpeed
        if distance < safeDistance + 10 then
            local t = math.clamp((distance - safeDistance) / 10, 0, 1)
            speed = maxSpeed * t
        end
        bodyVelocity.Velocity = direction * speed
        bodyAngular.AngularVelocity = bodyAngular.AngularVelocity * 0.97
        if speed < 0.5 and bodyAngular.AngularVelocity.Magnitude < 0.5 then
            stopAllBoost()
            isInResidualSpin = true
            bodyAngular.AngularVelocity = residualSpin
        end
    elseif activeAirDirection then
        bodyVelocity.Velocity = bodyVelocity.Velocity * 0.98
        bodyAngular.AngularVelocity = bodyAngular.AngularVelocity * 0.97
        if bodyVelocity.Velocity.Magnitude < 0.5 and bodyAngular.AngularVelocity.Magnitude < 0.5 then
            stopAllBoost()
            bodyAngular.AngularVelocity = Vector3.zero
        end
    elseif isInResidualSpin then
        bodyAngular.AngularVelocity = bodyAngular.AngularVelocity * 0.995
        bodyVelocity.Velocity = Vector3.zero
        if bodyAngular.AngularVelocity.Magnitude < 0.05 then
            bodyAngular.AngularVelocity = Vector3.zero
            isInResidualSpin = false
        end
    else
        bodyVelocity.Velocity = Vector3.zero
        bodyAngular.AngularVelocity = Vector3.zero
    end
end)

if CoreGui:FindFirstChild("MeteorBoostUI") then CoreGui.MeteorBoostUI:Destroy() end

local screenGui = Instance.new("ScreenGui")
screenGui.Name = "MeteorBoostUI"
screenGui.ResetOnSpawn = false
screenGui.IgnoreGuiInset = true
screenGui.Parent = CoreGui

local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 240, 0, 140)
mainFrame.Position = UDim2.new(0.5, -120, 0, 50)
mainFrame.BackgroundColor3 = Color3.fromRGB(12, 12, 12)
mainFrame.BorderSizePixel = 0
mainFrame.ZIndex = 100
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui

local function addBorder(parent)
    local t = 1
    local l = Instance.new("Frame"); l.Size = UDim2.new(0, t, 1, 0); l.BackgroundColor3 = Color3.fromRGB(50,50,50); l.BorderSizePixel=0; l.ZIndex=200; l.Parent=parent
    local tp = Instance.new("Frame"); tp.Size = UDim2.new(1,0,0,t); tp.BackgroundColor3 = Color3.fromRGB(50,50,50); tp.BorderSizePixel=0; tp.ZIndex=200; tp.Parent=parent
    local r = Instance.new("Frame"); r.Size = UDim2.new(0, t, 1, 0); r.Position=UDim2.new(1,-t,0,0); r.BackgroundColor3 = Color3.fromRGB(50,50,50); r.BorderSizePixel=0; r.ZIndex=200; r.Parent=parent
    local b = Instance.new("Frame"); b.Size = UDim2.new(1,0,0,t); b.Position=UDim2.new(0,0,1,-t); b.BackgroundColor3 = Color3.fromRGB(50,50,50); b.BorderSizePixel=0; b.ZIndex=200; b.Parent=parent
end
addBorder(mainFrame)

local titleBar = Instance.new("Frame")
titleBar.Size = UDim2.new(1, -2, 0, 22)
titleBar.Position = UDim2.new(0, 1, 0, 1)
titleBar.BackgroundColor3 = Color3.fromRGB(12,12,12)
titleBar.BorderSizePixel = 0
titleBar.ZIndex = 101
titleBar.Parent = mainFrame

local titleLabel = Instance.new("TextLabel")
titleLabel.Size = UDim2.new(1, -30, 1, 0)
titleLabel.Position = UDim2.new(0, 8, 0, 0)
titleLabel.BackgroundTransparency = 1
titleLabel.Text = L.title
titleLabel.TextColor3 = Color3.fromRGB(200,200,200)
titleLabel.Font = Enum.Font.Code
titleLabel.TextSize = 12
titleLabel.TextXAlignment = Enum.TextXAlignment.Left
titleLabel.ZIndex = 102
titleLabel.Parent = titleBar

local collapseButton = Instance.new("TextButton")
collapseButton.Size = UDim2.new(0, 22, 0, 22)
collapseButton.Position = UDim2.new(1, -22, 0, 0)
collapseButton.BackgroundColor3 = Color3.fromRGB(25,25,25)
collapseButton.BorderSizePixel = 0
collapseButton.Text = "-"
collapseButton.TextColor3 = Color3.fromRGB(200,200,200)
collapseButton.Font = Enum.Font.Code
collapseButton.TextSize = 14
collapseButton.ZIndex = 102
collapseButton.Parent = titleBar
addBorder(collapseButton)

local titleDivider = Instance.new("Frame")
titleDivider.Size = UDim2.new(1, -2, 0, 1)
titleDivider.Position = UDim2.new(0, 1, 0, 23)
titleDivider.BackgroundColor3 = Color3.fromRGB(50,50,50)
titleDivider.BorderSizePixel = 0
titleDivider.ZIndex = 200
titleDivider.Parent = mainFrame

local contentFrame = Instance.new("Frame")
contentFrame.Size = UDim2.new(1, -2, 1, -25)
contentFrame.Position = UDim2.new(0, 1, 0, 24)
contentFrame.BackgroundTransparency = 1
contentFrame.ZIndex = 101
contentFrame.Visible = true
contentFrame.Parent = mainFrame

local isDragging = false
local dragStartPos = nil
local frameStartPos = nil

local function startDrag(input)
    isDragging = true
    dragStartPos = input.Position
    frameStartPos = mainFrame.Position
end
local function stopDrag()
    isDragging = false
end

titleBar.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        startDrag(input)
    end
end)
titleBar.InputEnded:Connect(stopDrag)
titleLabel.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        startDrag(input)
    end
end)
titleLabel.InputEnded:Connect(stopDrag)

UserInputService.InputChanged:Connect(function(input)
    if isDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
        local delta = input.Position - dragStartPos
        mainFrame.Position = UDim2.new(frameStartPos.X.Scale, frameStartPos.X.Offset + delta.X, frameStartPos.Y.Scale, frameStartPos.Y.Offset + delta.Y)
    end
end)
UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then stopDrag() end
end)

local menuCollapsed = false
collapseButton.MouseButton1Click:Connect(function()
    menuCollapsed = not menuCollapsed
    if menuCollapsed then
        mainFrame:TweenSize(UDim2.new(0, 240, 0, 24), "Out", "Quad", 0.2, true)
        collapseButton.Text = "+"
        contentFrame.Visible = false
    else
        mainFrame:TweenSize(UDim2.new(0, 240, 0, 140), "Out", "Quad", 0.2, true)
        collapseButton.Text = "-"
        contentFrame.Visible = true
    end
end)

local function createButton(text, yPos, callback)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(0, 210, 0, 22)
    btn.Position = UDim2.new(0.5, -105, 0, yPos)
    btn.BackgroundColor3 = Color3.fromRGB(30,30,30)
    btn.Text = text
    btn.TextColor3 = Color3.fromRGB(200,200,200)
    btn.Font = Enum.Font.Code
    btn.TextSize = 11
    btn.BorderSizePixel = 0
    btn.ZIndex = 150
    btn.Parent = contentFrame
    addBorder(btn)
    btn.Activated:Connect(callback)
    return btn
end

local function createToggle(text, yPos, default, callback)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(0, 210, 0, 22)
    btn.Position = UDim2.new(0.5, -105, 0, yPos)
    btn.BackgroundColor3 = default and Color3.fromRGB(25,45,25) or Color3.fromRGB(30,30,30)
    btn.Text = text .. ": " .. (default and L.on or L.off)
    btn.TextColor3 = Color3.fromRGB(200,200,200)
    btn.Font = Enum.Font.Code
    btn.TextSize = 11
    btn.BorderSizePixel = 0
    btn.ZIndex = 150
    btn.Parent = contentFrame
    addBorder(btn)
    local state = default
    local debounce = false
    btn.Activated:Connect(function()
        if debounce then return end
        debounce = true
        state = not state
        btn.Text = text .. ": " .. (state and L.on or L.off)
        btn.BackgroundColor3 = state and Color3.fromRGB(25,45,25) or Color3.fromRGB(30,30,30)
        callback(state)
        task.delay(0.3, function() debounce = false end)
    end)
    return btn
end

local forceLabel = Instance.new("TextLabel")
forceLabel.Size = UDim2.new(0, 210, 0, 18)
forceLabel.Position = UDim2.new(0.5, -105, 0, 5)
forceLabel.BackgroundTransparency = 1
forceLabel.Text = L.force .. ": 50"
forceLabel.TextColor3 = Color3.fromRGB(200,200,200)
forceLabel.Font = Enum.Font.Code
forceLabel.TextSize = 11
forceLabel.ZIndex = 150
forceLabel.Parent = contentFrame

local forceInput = Instance.new("TextBox")
forceInput.Size = UDim2.new(0, 100, 0, 20)
forceInput.Position = UDim2.new(0.5, -50, 0, 24)
forceInput.BackgroundColor3 = Color3.fromRGB(30,30,30)
forceInput.TextColor3 = Color3.fromRGB(200,200,200)
forceInput.PlaceholderText = "1 / 500"
forceInput.PlaceholderColor3 = Color3.fromRGB(100,100,100)
forceInput.Text = ""
forceInput.Font = Enum.Font.Code
forceInput.TextSize = 11
forceInput.BorderSizePixel = 0
forceInput.ZIndex = 150
forceInput.Parent = contentFrame
addBorder(forceInput)

forceInput.FocusLost:Connect(function()
    local num = tonumber(forceInput.Text)
    if num and num >= 1 and num <= 500 then
        boostForce = num
        forceLabel.Text = L.force .. ": " .. num
        forceInput.Text = ""
    else
        forceInput.Text = ""
    end
end)

createToggle(L.clickMode, 52, true, function(state)
    clickModeEnabled = state
    if not needStart then
        isBoostActive = state
    end
end)

local startBtn = Instance.new("TextButton")
startBtn.Size = UDim2.new(0, 210, 0, 30)
startBtn.Position = UDim2.new(0.5, -105, 0, 80)
startBtn.BackgroundColor3 = Color3.fromRGB(46, 204, 113)
startBtn.Text = L.start
startBtn.TextColor3 = Color3.fromRGB(255,255,255)
startBtn.Font = Enum.Font.Code
startBtn.TextSize = 14
startBtn.BorderSizePixel = 0
startBtn.ZIndex = 160
startBtn.Visible = false
startBtn.Parent = contentFrame
addBorder(startBtn)

startBtn.MouseButton1Click:Connect(function()
    Character = LocalPlayer.Character
    if Character then
        Humanoid = Character:WaitForChild("Humanoid")
        HRP = Character:WaitForChild("HumanoidRootPart")
        setupPhysics()
    end

    local tweenInfo = TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
    local goals = { BackgroundTransparency = 1, TextTransparency = 1, Size = UDim2.new(0, 0, 0, 0) }
    local tween = TweenService:Create(startBtn, tweenInfo, goals)
    tween:Play()
    tween.Completed:Connect(function()
        startBtn.Visible = false
        startBtn.BackgroundTransparency = 0
        startBtn.TextTransparency = 0
        startBtn.Size = UDim2.new(0, 210, 0, 30)
    end)

    needStart = false
    isBoostActive = clickModeEnabled
end)

Humanoid.Died:Connect(function()
    needStart = true
    isBoostActive = false
    removePhysics()
    if startBtn then
        startBtn.Visible = true
    end
end)

LocalPlayer.CharacterAdded:Connect(function(newChar)
    Character = newChar
    Humanoid = newChar:WaitForChild("Humanoid")
    HRP = newChar:WaitForChild("HumanoidRootPart")
    removePhysics()
    isInResidualSpin = false
    needStart = true
    isBoostActive = false
    if startBtn then
        startBtn.Visible = true
    end

    Humanoid.Died:Connect(function()
        needStart = true
        isBoostActive = false
        removePhysics()
        if startBtn then
            startBtn.Visible = true
        end
    end)
end)

script.Destroying:Connect(function()
    script:SetAttribute("Running", false)
    if screenGui then screenGui:Destroy() end
    removePhysics()
end)

Features & Information

Turn your character into a weightless meteor with realistic physics. Click anywhere to send yourself flying through the air, or click on a part to gracefully land at a safe distance without touching the surface. Features: • Zero-gravity meteor physics – your entire body floats and spins like in space • Click-to-boost – tap anywhere to fly in that direction with random realistic spinning • Smart surface landing – clicking on a block makes you fly to it and stop at a safe distance (6 studs), never clipping through or touching the surface • Residual spin – when stopping near a surface, your character keeps spinning slightly for a realistic effect • Adjustable force (1-500) – type your desired boost strength • Click Mode toggle – enable or disable click flying anytime • Collapsible draggable GUI – clean Nova-style menu you can collapse and move anywhere • Death support – after dying, press the START button (with smooth fade-out animation) to resume flying • Mobile support – touch detection distinguishes taps from camera rotation, no accidental flying • R6 and R15 compatible Tested on mobile, fully supports PC as well.
#No key

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts