One Tap Script by Nebula Hub | Premium & Hacking V11
One Tap Keyless
One Tap Script by Nebula Hub | Premium & Hacking V11
👤 alexriderr 👁 4 views ❤️ 0 likes ⏱ Oct 16, 2026
This **keyless script** is made by **Nebula Hub** for the Roblox game **One Tap**. It includes useful features such as **Overview, Visuals, and Movement** to help you customize your settings and enhance your gameplay experience.
✨ Features
Overview Visuals Movement Combat Lab Admin Panel Scan Targets Toggle Menu Health Snowing FPS Boost Motion Blur Fly Flight Speed Walk Speed Jump Power No clip
📋 Script Code
--[[

    NEBULA // PREMIUM // HACKING V11

    Roblox Studio - LocalScript

    Install: StarterPlayer > StarterPlayerScripts

    Features:

    - Viewmodel & Camera Angle Lock (FPS Engine Compatibility)

    - Full Character Rotation

    - Team Check & Wall Check

    - Smooth hold-right-click camera aim assist for living enemy players and TrainingDummies
    - Server-side weapon hit validation recommended; weapon remote overrides and triggerbot disabled

    - ESP & Skeleton ESP
    - Movement: fly, walk/jump settings, authorized player teleport, test-point loop teleport

]]

local Players = game:GetService("Players")

local RunService = game:GetService("RunService")

local TweenService = game:GetService("TweenService")

local UserInputService = game:GetService("UserInputService")

local Lighting = game:GetService("Lighting")

local player = Players.LocalPlayer

local playerGui = player:WaitForChild("PlayerGui")

local mouse = player:GetMouse()

local PURPLE = Color3.fromRGB(160, 85, 255)
local NEBULA_BLUE = Color3.fromRGB(55, 160, 255)
local PREMIUM_GOLD = Color3.fromRGB(255, 196, 55)
local HACKING_GREEN = Color3.fromRGB(65, 235, 125)
local BRAND_RICH_TEXT = '<font color="#37A0FF">NEBULA</font> // <font color="#FFC437">PREMIUM</font> // <font color="#41EB7D">HACKING</font> <font color="#FFFFFF">V11</font>'

local BG = Color3.fromRGB(13, 10, 22)

local PANEL = Color3.fromRGB(27, 21, 41)

local WHITE = Color3.fromRGB(241, 235, 255)

local enabled = {}

local espObjects = {}

local skeletonLines = {}

local originalCollisions = {}

local originalEffects = {}

local snowEnabled = false

local snowRunning = false

local fpsBoostEnabled = false

local motionBlurEnabled = false

local noclipEnabled = false

local menuOpen = true

-- Combat settings

local AIMBOT_FOV = 600

local isRightMouseDown = false

-- Motion blur state

local lastCameraLook = nil

local currentBlur = 0

local blurEffect

local BLUR_MAX = 3

local BLUR_SENSITIVITY = 18

local BLUR_THRESHOLD = 0.015

local BLUR_RESPONSE = 12

local originalShadows = Lighting.GlobalShadows

-- Clean up existing UI

local oldGui = playerGui:FindFirstChild("NEBULA_HACKING_V2")

if oldGui then

    oldGui:Destroy()

end

-- MAIN GUI

local gui = Instance.new("ScreenGui")

gui.Name = "NEBULA_HACKING_V2"

gui.ResetOnSpawn = false

gui.IgnoreGuiInset = true

gui.DisplayOrder = 20

gui.Parent = playerGui

-- Keep one visible cursor while the menu is open: hide Roblox's default icon
-- and draw a single NEBULA cursor that follows the same mouse position.
local originalMouseIconEnabled = UserInputService.MouseIconEnabled
local originalMouseBehavior = UserInputService.MouseBehavior
local customCursor = Instance.new("Frame")
customCursor.Name = "NebulaCursor"
customCursor.Size = UDim2.fromOffset(10, 10)
customCursor.AnchorPoint = Vector2.new(0.5, 0.5)
customCursor.BackgroundColor3 = NEBULA_BLUE
customCursor.BorderSizePixel = 0
customCursor.Visible = false
customCursor.ZIndex = 1000
customCursor.Parent = gui
local cursorCorner = Instance.new("UICorner")
cursorCorner.CornerRadius = UDim.new(1, 0)
cursorCorner.Parent = customCursor
local cursorStroke = Instance.new("UIStroke")
cursorStroke.Color = PREMIUM_GOLD
cursorStroke.Thickness = 1.5
cursorStroke.Parent = customCursor

-- Run after Roblox's camera update so first-person mouse locking does not
-- immediately recapture the pointer while the panel is open.
RunService:BindToRenderStep("NebulaCursorControl", Enum.RenderPriority.Last.Value, function()
    if menuOpen and customCursor.Visible then
        -- Keep the real Roblox icon hidden and unlock the mouse for UI clicks.
        if UserInputService.MouseIconEnabled then
            UserInputService.MouseIconEnabled = false
        end
        if UserInputService.MouseBehavior ~= Enum.MouseBehavior.Default then
            UserInputService.MouseBehavior = Enum.MouseBehavior.Default
        end
        local mousePosition = UserInputService:GetMouseLocation()
        customCursor.Position = UDim2.fromOffset(mousePosition.X, mousePosition.Y)
    end
end)

local main = Instance.new("Frame")

main.Name = "Main"

main.Size = UDim2.fromOffset(650, 450)

main.Position = UDim2.new(0.5, -325, 0.5, -225)

main.BackgroundColor3 = BG

main.BorderSizePixel = 0

main.Parent = gui

Instance.new("UICorner", main).CornerRadius = UDim.new(0, 12)


local mainStroke = Instance.new("UIStroke")

mainStroke.Color = PURPLE

mainStroke.Thickness = 1.5

mainStroke.Parent = main

-- No animated overlay or outline pulse; only the panel open/close transitions remain.

local top = Instance.new("Frame")

top.Size = UDim2.new(1, 0, 0, 76)

top.BackgroundColor3 = Color3.fromRGB(32, 21, 50)

top.BorderSizePixel = 0

top.Parent = main

Instance.new("UICorner", top).CornerRadius = UDim.new(0, 12)

local title = Instance.new("TextLabel")

title.Size = UDim2.new(1, -65, 0, 44)

title.Position = UDim2.fromOffset(18, 5)

title.BackgroundTransparency = 1

title.Text = BRAND_RICH_TEXT
title.RichText = true
title.TextColor3 = WHITE

title.TextXAlignment = Enum.TextXAlignment.Left

title.Font = Enum.Font.GothamBlack

title.TextSize = 23

title.Parent = top

-- Animate the actual title with a brief 1011101-style binary decode.
-- This changes only the title text; it does not create another overlay.
local titleAnimationToken = 0
local function animateTitleBinary()
    titleAnimationToken += 1
    local token = titleAnimationToken

    local function binaryChunk(length)
        local digits = table.create(length)
        for i = 1, length do
            digits[i] = math.random(0, 1) == 1 and "1" or "0"
        end
        return table.concat(digits)
    end

    task.spawn(function()
        for frame = 1, 8 do
            if token ~= titleAnimationToken or not title.Parent then return end
            local nebulaBits = frame == 1 and "1011101" or binaryChunk(7)
            local premiumBits = binaryChunk(7)
            local hackingBits = binaryChunk(7)
            title.Text = '<font color="#37A0FF">' .. nebulaBits .. '</font> // '
                .. '<font color="#FFC437">' .. premiumBits .. '</font> // '
                .. '<font color="#41EB7D">' .. hackingBits .. '</font> '
                .. '<font color="#FFFFFF">V11</font>'
            task.wait(0.055)
        end
        if token == titleAnimationToken and title.Parent then
            title.Text = BRAND_RICH_TEXT
        end
    end)
end

local subtitle = Instance.new("TextLabel")

subtitle.Size = UDim2.new(1, -25, 0, 20)

subtitle.Position = UDim2.fromOffset(19, 45)

subtitle.BackgroundTransparency = 1

subtitle.Text = ""
subtitle.Visible = false

subtitle.TextColor3 = PURPLE

subtitle.TextXAlignment = Enum.TextXAlignment.Left

subtitle.Font = Enum.Font.Code

subtitle.TextSize = 12

subtitle.Parent = top

local close = Instance.new("TextButton")

close.Size = UDim2.fromOffset(36, 36)

close.Position = UDim2.new(1, -47, 0, 17)

close.BackgroundColor3 = Color3.fromRGB(78, 37, 102)

close.Text = "×"

close.TextColor3 = WHITE

close.Font = Enum.Font.GothamBold

close.TextSize = 25

close.Parent = top

Instance.new("UICorner", close).CornerRadius = UDim.new(0, 8)

local sidebar = Instance.new("Frame")

sidebar.Position = UDim2.fromOffset(12, 88)

sidebar.Size = UDim2.new(0, 165, 1, -126)

sidebar.BackgroundColor3 = PANEL

sidebar.BorderSizePixel = 0

sidebar.Parent = main

Instance.new("UICorner", sidebar).CornerRadius = UDim.new(0, 8)

local sideLayout = Instance.new("UIListLayout")

sideLayout.Padding = UDim.new(0, 7)

sideLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center

sideLayout.SortOrder = Enum.SortOrder.LayoutOrder

sideLayout.Parent = sidebar

local sidePad = Instance.new("UIPadding")

sidePad.PaddingTop = UDim.new(0, 10)

sidePad.Parent = sidebar

local content = Instance.new("ScrollingFrame")

content.Position = UDim2.fromOffset(190, 88)

content.Size = UDim2.new(1, -202, 1, -126)

content.BackgroundColor3 = PANEL

content.BorderSizePixel = 0

content.ScrollBarThickness = 3

content.ScrollBarImageColor3 = PURPLE

content.AutomaticCanvasSize = Enum.AutomaticSize.Y

content.CanvasSize = UDim2.new()

content.Parent = main

Instance.new("UICorner", content).CornerRadius = UDim.new(0, 8)

local contentLayout = Instance.new("UIListLayout")

contentLayout.Padding = UDim.new(0, 7)

contentLayout.SortOrder = Enum.SortOrder.LayoutOrder

contentLayout.Parent = content

local contentPad = Instance.new("UIPadding")

contentPad.PaddingTop = UDim.new(0, 10)

contentPad.PaddingLeft = UDim.new(0, 10)

contentPad.PaddingRight = UDim.new(0, 10)

contentPad.PaddingBottom = UDim.new(0, 10)

contentPad.Parent = content

local status = Instance.new("TextLabel")

status.Position = UDim2.new(0, 12, 1, -31)

status.Size = UDim2.new(1, -24, 0, 23)

status.BackgroundTransparency = 1

status.Text = "SYSTEM READY // NOSNIY ADMIN"

status.TextColor3 = Color3.fromRGB(190, 165, 220)

status.Font = Enum.Font.Code

status.TextSize = 10

status.TextXAlignment = Enum.TextXAlignment.Left

status.Parent = main

-- Floating reopen button

local reopen = Instance.new("TextButton")

reopen.Name = "FloatingNebulaButton"

reopen.Size = UDim2.fromOffset(54, 54)

reopen.Position = UDim2.new(0, 18, 0.5, 0)

reopen.BackgroundColor3 = BG

reopen.Text = "👨🏻💻"
reopen.RichText = false
reopen.TextColor3 = WHITE

reopen.Font = Enum.Font.GothamBold

reopen.TextSize = 28

reopen.Visible = false

reopen.Active = true

reopen.Parent = gui

Instance.new("UICorner", reopen).CornerRadius = UDim.new(0, 9)

local reopenStroke = Instance.new("UIStroke")

reopenStroke.Color = PURPLE

reopenStroke.Thickness = 1.5

reopenStroke.Parent = reopen

-- Draggable function

local function makeDraggable(handle, target, ignoreButton)

    local dragging = false

    local dragStart, startPosition, activeInput

    handle.InputBegan:Connect(function(input)

        if ignoreButton and input.UserInputType ~= Enum.UserInputType.MouseButton1 and input.UserInputType ~= Enum.UserInputType.Touch then

            return

        end

        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then

            dragging = true

            dragStart = input.Position

            startPosition = target.Position

            activeInput = input

            input.Changed:Connect(function()

                if input.UserInputState == Enum.UserInputState.End then

                    dragging = false

                end

            end)

        end

    end)

    UserInputService.InputChanged:Connect(function(input)

        if not dragging then return end

        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then

            if activeInput and activeInput.UserInputType == Enum.UserInputType.Touch and input ~= activeInput and input.UserInputType ~= Enum.UserInputType.MouseMovement then

                return

            end

            local delta = input.Position - dragStart

            target.Position = UDim2.new(

                startPosition.X.Scale,

                startPosition.X.Offset + delta.X,

                startPosition.Y.Scale,

                startPosition.Y.Offset + delta.Y

            )

        end

    end)

end

makeDraggable(top, main, false)

makeDraggable(reopen, reopen, false)

local openingAnimationToken = 0

local function playNebulaOpenAnimation()
    openingAnimationToken += 1
    local token = openingAnimationToken

    local intro = Instance.new("Frame")
    intro.Name = "NebulaBinaryIntro"
    intro.Size = UDim2.fromScale(1, 1)
    intro.Position = UDim2.fromScale(0, 0)
    intro.BackgroundColor3 = Color3.fromRGB(3, 4, 10)
    intro.BackgroundTransparency = 1
    intro.BorderSizePixel = 0
    intro.ZIndex = 100
    intro.Parent = gui

    local left = Instance.new("Frame")
    left.Name = "BinarySide"
    left.Size = UDim2.new(0.5, 0, 1, 0)
    left.Position = UDim2.new(-0.5, 0, 0, 0)
    left.BackgroundColor3 = Color3.fromRGB(7, 5, 15)
    left.BackgroundTransparency = 0.08
    left.BorderSizePixel = 0
    left.ClipsDescendants = true
    left.ZIndex = 101
    left.Parent = intro

    local right = Instance.new("Frame")
    right.Name = "BrandSide"
    right.Position = UDim2.new(1, 0, 0, 0)
    right.Size = UDim2.new(0.5, 0, 1, 0)
    right.BackgroundColor3 = Color3.fromRGB(5, 6, 12)
    right.BackgroundTransparency = 0.08
    right.BorderSizePixel = 0
    right.ClipsDescendants = true
    right.ZIndex = 101
    right.Parent = intro

    local leftStroke = Instance.new("UIStroke")
    leftStroke.Color = PURPLE
    leftStroke.Thickness = 1.5
    leftStroke.Transparency = 0.12
    leftStroke.Parent = left

    local binaryRows = {}
    local function makeBinaryText(length)
        local chunks = table.create(length)
        for i = 1, length do
            if math.random(0, 1) == 1 then
                chunks[i] = '<font color="#A855F7">1</font>'
            else
                chunks[i] = '<font color="#FFFFFF">0</font>'
            end
        end
        return table.concat(chunks)
    end

    for row = 1, 13 do
        local binary = Instance.new("TextLabel")
        binary.Name = "BinaryRow" .. row
        binary.BackgroundTransparency = 1
        binary.Position = UDim2.new(0, 18 + ((row % 3) * 15), 0, (row - 1) * 43 - 20)
        binary.Size = UDim2.new(1, -26, 0, 34)
        binary.Font = Enum.Font.Code
        binary.TextSize = 23
        binary.TextXAlignment = Enum.TextXAlignment.Left
        binary.RichText = true
        binary.Text = makeBinaryText(25)
        binary.TextColor3 = WHITE
        binary.TextTransparency = 0.18
        binary.ZIndex = 102
        binary.Parent = left
        table.insert(binaryRows, binary)
    end

    -- Smooth, low-cost data flicker; cancel immediately if the intro is closed.
    task.spawn(function()
        while token == openingAnimationToken and intro.Parent do
            for _, binary in ipairs(binaryRows) do
                if binary.Parent and math.random() > 0.22 then
                    binary.Text = makeBinaryText(25)
                end
            end
            task.wait(0.11)
        end
    end)

    local accent = Instance.new("Frame")
    accent.Name = "AccentBar"
    accent.AnchorPoint = Vector2.new(0.5, 0.5)
    accent.Position = UDim2.new(0.5, 0, 0.365, 0)
    accent.Size = UDim2.new(0, 0, 0, 3)
    accent.BackgroundColor3 = PURPLE
    accent.BorderSizePixel = 0
    accent.ZIndex = 103
    accent.Parent = right

    local brand = Instance.new("TextLabel")
    brand.Name = "IntroBrand"
    brand.BackgroundTransparency = 1
    brand.AnchorPoint = Vector2.new(0.5, 0.5)
    brand.Position = UDim2.new(0.5, 0, 0.445, 14)
    brand.Size = UDim2.new(0.94, 0, 0, 58)
    brand.Font = Enum.Font.GothamBlack
    brand.Text = BRAND_RICH_TEXT
    brand.RichText = true
    brand.TextColor3 = WHITE
    brand.TextSize = 24
    brand.TextScaled = true
    brand.TextTransparency = 1
    brand.ZIndex = 103
    brand.Parent = right

    local brandStroke = Instance.new("UIStroke")
    brandStroke.Color = PURPLE
    brandStroke.Thickness = 1.2
    brandStroke.Transparency = 1
    brandStroke.Parent = brand

    local status = Instance.new("TextLabel")
    status.Name = "IntroStatus"
    status.BackgroundTransparency = 1
    status.AnchorPoint = Vector2.new(0.5, 0.5)
    status.Position = UDim2.new(0.5, 0, 0.535, 12)
    status.Size = UDim2.new(0.88, 0, 0, 26)
    status.Font = Enum.Font.Code
    status.Text = ""
    status.TextColor3 = PURPLE
    status.TextTransparency = 1
    status.TextSize = 14
    status.ZIndex = 103
    status.Parent = right

    TweenService:Create(intro, TweenInfo.new(0.22, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
        BackgroundTransparency = 0.04
    }):Play()
    TweenService:Create(left, TweenInfo.new(0.48, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), {
        Position = UDim2.new(0, 0, 0, 0)
    }):Play()
    TweenService:Create(right, TweenInfo.new(0.48, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), {
        Position = UDim2.new(0.5, 0, 0, 0)
    }):Play()
    TweenService:Create(accent, TweenInfo.new(0.42, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), {
        Size = UDim2.new(0.66, 0, 0, 3)
    }):Play()
    TweenService:Create(brand, TweenInfo.new(0.42, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), {
        Position = UDim2.new(0.5, 0, 0.445, 0),
        TextTransparency = 0
    }):Play()
    TweenService:Create(brandStroke, TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
        Transparency = 0.2
    }):Play()
    TweenService:Create(status, TweenInfo.new(0.32, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
        Position = UDim2.new(0.5, 0, 0.535, 0),
        TextTransparency = 0
    }):Play()

    local initializing = "[ INITIALIZING SYSTEM... ]"
    task.spawn(function()
        for i = 1, #initializing do
            if token ~= openingAnimationToken or not intro.Parent then return end
            status.Text = string.sub(initializing, 1, i)
            task.wait(0.022)
        end
    end)

    task.delay(1.12, function()
        if token ~= openingAnimationToken or not intro.Parent then
            if intro.Parent then intro:Destroy() end
            return
        end
        status.Text = "[ ACCESS GRANTED // NEBULA ONLINE ]"
        status.TextColor3 = Color3.fromRGB(120, 255, 177)
        TweenService:Create(accent, TweenInfo.new(0.18, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
            BackgroundColor3 = Color3.fromRGB(120, 255, 177)
        }):Play()
        TweenService:Create(brandStroke, TweenInfo.new(0.18), {
            Color = Color3.fromRGB(120, 255, 177),
            Transparency = 0.08
        }):Play()

        task.wait(0.36)
        if token ~= openingAnimationToken or not intro.Parent then return end

        for _, obj in ipairs(intro:GetDescendants()) do
            if obj:IsA("GuiObject") then
                local props = {BackgroundTransparency = 1}
                if obj:IsA("TextLabel") then props.TextTransparency = 1 end
                TweenService:Create(obj, TweenInfo.new(0.28, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props):Play()
            elseif obj:IsA("UIStroke") then
                TweenService:Create(obj, TweenInfo.new(0.22), {Transparency = 1}):Play()
            end
        end
        TweenService:Create(intro, TweenInfo.new(0.28, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {
            BackgroundTransparency = 1
        }):Play()

        task.delay(0.3, function()
            if intro.Parent then intro:Destroy() end
            if token == openingAnimationToken then
                main.Visible = true
                main.BackgroundTransparency = 0
                main.Position = UDim2.new(0.5, -325, 0.5, -210)
                main.Size = UDim2.fromOffset(0, 0)
                local guiOpenTween = TweenService:Create(main, TweenInfo.new(0.48, Enum.EasingStyle.Back, Enum.EasingDirection.Out), {
                    Size = UDim2.fromOffset(650, 450),
                    Position = UDim2.new(0.5, -325, 0.5, -225),
                    BackgroundTransparency = 0
                })
                guiOpenTween:Play()
            end
        end)
    end)
end

local function setMenu(open)
    menuOpen = open
    if open then
        -- Use the custom NEBULA cursor and prevent the default cursor showing twice.
        UserInputService.MouseBehavior = Enum.MouseBehavior.Default
        UserInputService.MouseIconEnabled = false
        customCursor.Visible = true
        main.Visible = false
        reopen.Visible = false
        animateTitleBinary()
        playNebulaOpenAnimation()
    else
        openingAnimationToken += 1
        local closeToken = openingAnimationToken
        local intro = gui:FindFirstChild("NebulaBinaryIntro")
        if intro then intro:Destroy() end
        reopen.Visible = true
        customCursor.Visible = false
        UserInputService.MouseIconEnabled = originalMouseIconEnabled
        UserInputService.MouseBehavior = originalMouseBehavior

        -- Smoothly shrink and lift the panel instead of abruptly hiding it.
        if main.Visible then
            TweenService:Create(main, TweenInfo.new(0.2, Enum.EasingStyle.Quint, Enum.EasingDirection.In), {
                Size = UDim2.fromOffset(610, 410),
                Position = UDim2.new(0.5, -305, 0.5, -220),
                BackgroundTransparency = 0.12
            }):Play()
            task.delay(0.21, function()
                if not menuOpen and closeToken == openingAnimationToken then
                    main.Visible = false
                    main.Size = UDim2.fromOffset(650, 450)
                    main.Position = UDim2.new(0.5, -325, 0.5, -225)
                    main.BackgroundTransparency = 0
                end
            end)
        else
            main.Visible = false
        end
    end
end

close.MouseButton1Click:Connect(function() setMenu(false) end)

reopen.MouseButton1Click:Connect(function() setMenu(true) end)

-- Apply the single-cursor setup on startup (menuOpen starts true).
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
UserInputService.MouseIconEnabled = false
customCursor.Visible = true

-- GUI HELPERS

local function clearContent()

    for _, child in ipairs(content:GetChildren()) do

        if child ~= contentLayout and child ~= contentPad and child:IsA("GuiObject") then

            child:Destroy()

        end

    end

end

local function addHeading(text)

    local label = Instance.new("TextLabel")

    label.Size = UDim2.new(1, -4, 0, 27)

    label.BackgroundTransparency = 1

    label.Text = "  " .. text

    label.TextColor3 = PURPLE

    label.Font = Enum.Font.GothamBold

    label.TextSize = 13

    label.TextXAlignment = Enum.TextXAlignment.Left

    label.Parent = content

end

local function addButton(text, callback)

    local button = Instance.new("TextButton")

    button.Size = UDim2.new(1, -4, 0, 38)

    button.BackgroundColor3 = Color3.fromRGB(38, 29, 54)

    button.Text = text

    button.TextColor3 = WHITE

    button.Font = Enum.Font.GothamMedium

    button.TextSize = 12

    button.AutoButtonColor = false

    button.Parent = content

    Instance.new("UICorner", button).CornerRadius = UDim.new(0, 6)

    local stroke = Instance.new("UIStroke")

    stroke.Color = Color3.fromRGB(69, 51, 91)

    stroke.Parent = button

    button.MouseEnter:Connect(function()

        TweenService:Create(button, TweenInfo.new(0.12), { BackgroundColor3 = Color3.fromRGB(61, 39, 82) }):Play()

    end)

    button.MouseLeave:Connect(function()

        TweenService:Create(button, TweenInfo.new(0.12), { BackgroundColor3 = Color3.fromRGB(38, 29, 54) }):Play()

    end)

    button.MouseButton1Click:Connect(callback)

    return button

end

-- TEAM CHECK HELPER

local function isSameTeam(targetModel)

    if not enabled["Team Check"] then return false end

    local targetPlayer = Players:GetPlayerFromCharacter(targetModel)

    if targetPlayer and player then

        if targetPlayer.Team ~= nil and player.Team ~= nil then

            return targetPlayer.Team == player.Team

        elseif targetPlayer.TeamColor == player.TeamColor then

            return true

        end

    end

    return false

end

-- WALL CHECK HELPER

local function isVisible(targetPart)

    if not enabled["Wall Check"] then return true end

    local camera = workspace.CurrentCamera

    if not camera or not targetPart then return false end

    local origin = camera.CFrame.Position

    local destination = targetPart.Position

    local direction = destination - origin

    local raycastParams = RaycastParams.new()

    raycastParams.FilterType = Enum.RaycastFilterType.Exclude

    local ignoreList = {}

    if player.Character then table.insert(ignoreList, player.Character) end

    if targetPart.Parent then table.insert(ignoreList, targetPart.Parent) end

    raycastParams.FilterDescendantsInstances = ignoreList

    local result = workspace:Raycast(origin, direction, raycastParams)

    return result == nil

end

-- TARGET SCANNING LOGIC
-- Only living enemy player characters and models in TrainingDummies are targetable.
local function getValidTargets()
    local targets = {}
    local seen = {}

    local function addTarget(model)
        if not model or model == player.Character or seen[model] then return end
        local humanoid = model:FindFirstChildOfClass("Humanoid")
        local head = model:FindFirstChild("Head")
        if not humanoid or humanoid.Health  0 and part and part:IsA("BasePart") then
            local screenPosition, onScreen = camera:WorldToViewportPoint(part.Position)
            if onScreen and screenPosition.Z > 0 and isVisible(part) then
                local point = Vector2.new(screenPosition.X, screenPosition.Y)
                local distance = (point - screenCenter).Magnitude
                if distance < closestDistance then
                    closestDistance = distance
                    closestPart = part
                end
            end
        end
    end

    return closestPart
end

local function processAimbot(deltaTime)
    if not enabled["Aimbot"] or not isRightMouseDown then
        currentAimTarget = nil
        return
    end
    if UserInputService:GetFocusedTextBox() then return end

    local camera = workspace.CurrentCamera
    if not camera then return end

    -- Keep the same target between frames to reduce jitter/target hopping.
    if not currentAimTarget or not currentAimTarget.Parent then
        currentAimTarget = getClosestAimTarget()
    else
        local model = currentAimTarget:FindFirstAncestorOfClass("Model")
        local humanoid = model and model:FindFirstChildOfClass("Humanoid")
        if not model or (humanoid and humanoid.Health <= 0) or not isVisible(currentAimTarget) then
            currentAimTarget = getClosestAimTarget()
        end
    end

    local target = currentAimTarget
    if not target or not target.Parent then return end

    local direction = target.Position - camera.CFrame.Position
    if direction.Magnitude  0 and p2.Z > 0 then

                    local delta = Vector2.new(p2.X - p1.X, p2.Y - p1.Y)

                    line.Position = UDim2.fromOffset((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2)

                    line.Size = UDim2.fromOffset(delta.Magnitude, 2)

                    line.Rotation = math.deg(math.atan2(delta.Y, delta.X))

                    line.Visible = true

                else

                    line.Visible = false

                end

            elseif line then

                line.Visible = false

            end

        end

        for index = #bones + 1, #lines do

            lines[index].Visible = false

        end

    end

    for model in pairs(skeletonLines) do

        if not validSet[model] then removeESP(model) end

    end

end

-- SNOW EFFECT

local snowGui = Instance.new("ScreenGui")

snowGui.Name = "NebulaSnow"

snowGui.IgnoreGuiInset = true

snowGui.ResetOnSpawn = false

snowGui.DisplayOrder = 5

snowGui.Parent = playerGui

local function setSnow(state)

    snowEnabled = state

    if not state then

        snowGui:ClearAllChildren()

        status.Text = "SNOWING DISABLED"

        return

    end

    status.Text = "SNOWING ENABLED"

    if snowRunning then return end

    snowRunning = true

    task.spawn(function()

        while snowEnabled do

            local flake = Instance.new("TextLabel")

            flake.BackgroundTransparency = 1

            flake.Text = "❄"

            flake.TextColor3 = Color3.fromRGB(238, 243, 255)

            flake.TextTransparency = math.random(0, 35) / 100

            flake.TextSize = math.random(12, 24)

            flake.Font = Enum.Font.Gotham

            flake.AnchorPoint = Vector2.new(0.5, 0.5)

            flake.Position = UDim2.fromScale(math.random(0, 100) / 100, -0.04)

            flake.Size = UDim2.fromOffset(30, 30)

            flake.Parent = snowGui

            local duration = math.random(5, 10)

            local startX = flake.Position.X.Scale

            local drift = math.random(-12, 12) / 100

            TweenService:Create(flake, TweenInfo.new(duration, Enum.EasingStyle.Linear), {

                Position = UDim2.fromScale(math.clamp(startX + drift, 0, 1), 1.05),

                Rotation = math.random(-180, 180)

            }):Play()

            task.delay(duration, function()

                if flake.Parent then flake:Destroy() end

            end)

            task.wait(0.16)

        end

        snowRunning = false

    end)

end

-- MOTION BLUR

blurEffect = Lighting:FindFirstChild("NebulaMotionBlur")

if not blurEffect or not blurEffect:IsA("BlurEffect") then

    blurEffect = Instance.new("BlurEffect")

    blurEffect.Name = "NebulaMotionBlur"

    blurEffect.Parent = Lighting

end

blurEffect.Size = 0

blurEffect.Enabled = false

local function resetMotionBlur()

    currentBlur = 0

    lastCameraLook = nil

    if blurEffect then

        blurEffect.Size = 0

        blurEffect.Enabled = false

    end

end

local function updateMotionBlur(deltaTime)

    if not motionBlurEnabled or fpsBoostEnabled then

        if currentBlur ~= 0 or blurEffect.Enabled then

            currentBlur = 0

            blurEffect.Size = 0

            blurEffect.Enabled = false

        end

        lastCameraLook = nil

        return

    end

    local camera = workspace.CurrentCamera

    if not camera then resetMotionBlur() return end

    local currentLook = camera.CFrame.LookVector

    if not lastCameraLook then

        lastCameraLook = currentLook

        blurEffect.Enabled = true

        blurEffect.Size = currentBlur

        return

    end

    local movement = (currentLook - lastCameraLook).Magnitude

    lastCameraLook = currentLook

    local targetBlur = 0

    if movement > BLUR_THRESHOLD then

        targetBlur = math.clamp(movement * BLUR_SENSITIVITY, 0, BLUR_MAX)

    end

    local dt = math.min(deltaTime, 0.1)

    local alpha = 1 - math.exp(-BLUR_RESPONSE * dt)

    currentBlur += (targetBlur - currentBlur) * alpha

    currentBlur = math.clamp(currentBlur, 0, BLUR_MAX)

    blurEffect.Size = currentBlur

    blurEffect.Enabled = currentBlur > 0.05

end

-- FPS BOOST

local function setFPSBoost(state)

    if fpsBoostEnabled == state then return end

    fpsBoostEnabled = state

    if state then

        originalShadows = Lighting.GlobalShadows

        table.clear(originalEffects)

        for _, effect in ipairs(Lighting:GetDescendants()) do

            if effect:IsA("PostEffect") then

                originalEffects[effect] = effect.Enabled

                effect.Enabled = false

            end

        end

        resetMotionBlur()

        Lighting.GlobalShadows = false

        pcall(function()

            settings().Rendering.QualityLevel = Enum.QualityLevel.Level01

        end)

        status.Text = "FPS BOOST ENABLED"

    else

        for effect, wasEnabled in pairs(originalEffects) do

            if effect.Parent and effect ~= blurEffect then

                effect.Enabled = wasEnabled

            end

        end

        table.clear(originalEffects)

        Lighting.GlobalShadows = originalShadows

        pcall(function()

            settings().Rendering.QualityLevel = Enum.QualityLevel.Automatic

        end)

        resetMotionBlur()

        status.Text = "FPS BOOST DISABLED"

    end

end

-- NOCLIP

local function setNoclip(state)

    noclipEnabled = state

    status.Text = "NOCLIP: " .. (state and "ON" or "OFF")

    if not state then

        for part, originalValue in pairs(originalCollisions) do

            if part.Parent then

                part.CanCollide = originalValue

            end

        end

        table.clear(originalCollisions)

    end

end

RunService.Stepped:Connect(function()

    if not noclipEnabled then return end

    local character = player.Character

    if not character then return end

    for _, part in ipairs(character:GetDescendants()) do

        if part:IsA("BasePart") then

            if originalCollisions[part] == nil then

                originalCollisions[part] = part.CanCollide

            end

            part.CanCollide = false

        end

    end

end)

player.CharacterAdded:Connect(function()

    table.clear(originalCollisions)

end)

-- MOVEMENT MODULE (for your own Roblox Studio test game)
-- Player teleport is a one-shot action. Loop teleport uses only designated test points.
local flyEnabled = false
local flySpeed = 60
local loopTeleportEnabled = false
local walkSpeedValue = 16
local jumpPowerValue = 50
local selectedTeleportUserId = nil
local movementLoopToken = 0
local flightVelocity = nil
local flightGyro = nil
local flightConnection = nil

local function getCharacterParts()
    local character = player.Character
    if not character then return nil, nil, nil end
    return character, character:FindFirstChildOfClass("Humanoid"), character:FindFirstChild("HumanoidRootPart")
end

local function clearFlightObjects()
    if flightConnection then
        flightConnection:Disconnect()
        flightConnection = nil
    end
    if flightVelocity then
        flightVelocity:Destroy()
        flightVelocity = nil
    end
    if flightGyro then
        flightGyro:Destroy()
        flightGyro = nil
    end
end

local function setFly(state)
    flyEnabled = state
    clearFlightObjects()
    local _, humanoid, root = getCharacterParts()

    if not state then
        if humanoid then
            humanoid.PlatformStand = false
            humanoid:ChangeState(Enum.HumanoidStateType.GettingUp)
        end
        status.Text = "FLY: OFF"
        return
    end

    if not humanoid or not root then
        flyEnabled = false
        status.Text = "FLY FAILED: CHARACTER NOT READY"
        return
    end

    flightVelocity = Instance.new("BodyVelocity")
    flightVelocity.Name = "NebulaFlightVelocity"
    flightVelocity.MaxForce = Vector3.new(1e6, 1e6, 1e6)
    flightVelocity.P = 1e4
    flightVelocity.Velocity = Vector3.zero
    flightVelocity.Parent = root

    flightGyro = Instance.new("BodyGyro")
    flightGyro.Name = "NebulaFlightGyro"
    flightGyro.MaxTorque = Vector3.new(1e6, 1e6, 1e6)
    flightGyro.P = 8e3
    flightGyro.CFrame = workspace.CurrentCamera and workspace.CurrentCamera.CFrame or root.CFrame
    flightGyro.Parent = root

    flightConnection = RunService.Heartbeat:Connect(function()
        if not flyEnabled or not root.Parent or not flightVelocity or not flightGyro then
            return
        end
        local camera = workspace.CurrentCamera
        if not camera then return end

        local direction = Vector3.zero
        if UserInputService:IsKeyDown(Enum.KeyCode.W) then direction += camera.CFrame.LookVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.S) then direction -= camera.CFrame.LookVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.D) then direction += camera.CFrame.RightVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.A) then direction -= camera.CFrame.RightVector end
        if UserInputService:IsKeyDown(Enum.KeyCode.Space) then direction += Vector3.yAxis end
        if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then direction -= Vector3.yAxis end
        if direction.Magnitude > 0 then direction = direction.Unit end

        flightVelocity.Velocity = direction * flySpeed
        flightGyro.CFrame = CFrame.lookAt(root.Position, root.Position + camera.CFrame.LookVector)
    end)

    status.Text = "FLY: ON // WASD + SPACE/CTRL // SPEED " .. flySpeed
end

local function getTestPoints()
    local folder = workspace:FindFirstChild("NebulaTestPoints")
    local points = {}
    if folder then
        for _, object in ipairs(folder:GetChildren()) do
            if object:IsA("BasePart") then table.insert(points, object) end
        end
    end
    table.sort(points, function(a, b) return a.Name < b.Name end)
    return points
end

local function teleportToPlayer()
    local targetPlayer = nil
    if selectedTeleportUserId then
        for _, candidate in ipairs(Players:GetPlayers()) do
            if candidate.UserId == selectedTeleportUserId then
                targetPlayer = candidate
                break
            end
        end
    end

    local _, humanoid, root = getCharacterParts()
    local targetCharacter = targetPlayer and targetPlayer.Character
    local targetRoot = targetCharacter and targetCharacter:FindFirstChild("HumanoidRootPart")

    if not root or not humanoid or humanoid.Health <= 0 then
        status.Text = "TELEPORT FAILED: YOUR CHARACTER NOT READY"
        return
    end
    if not targetPlayer or targetPlayer == player or not targetRoot then
        status.Text = "SELECT AN AVAILABLE PLAYER FIRST"
        return
    end

    -- Use only in your own Studio test place / authorized admin system.
    root.CFrame = targetRoot.CFrame * CFrame.new(3, 0, 0)
    status.Text = "TELEPORTED BESIDE " .. targetPlayer.Name
end

local function teleportToNextTestPoint()
    local _, humanoid, root = getCharacterParts()
    if not root or not humanoid or humanoid.Health  0 then
                root.CFrame = currentPoints[index].CFrame + Vector3.new(0, 3, 0)
                status.Text = "LOOP TELEPORT: " .. currentPoints[index].Name
            end
            task.wait(2)
        end
    end)
end

local function setMovementStats()
    local _, humanoid = getCharacterParts()
    if not humanoid then
        status.Text = "MOVEMENT SETTINGS APPLY AFTER RESPAWN"
        return
    end
    humanoid.WalkSpeed = walkSpeedValue
    humanoid.UseJumpPower = true
    humanoid.JumpPower = jumpPowerValue
    status.Text = string.format("WALK SPEED: %d // JUMP POWER: %d", walkSpeedValue, jumpPowerValue)
end

player.CharacterAdded:Connect(function()
    task.wait(0.5)
    if flyEnabled then setFly(true) end
    setMovementStats()
    table.clear(originalCollisions)
end)

-- PAGES & NAVIGATION

local pages = {}

local function showPage(name)

    clearContent()

    status.Text = "MODULE: " .. name

    if pages[name] then

        pages[name]()

    end

end

pages["OVERVIEW"] = function()

    addHeading("SYSTEM OVERVIEW")

    addButton("NEBULA // ADMIN PANEL", function()

        status.Text = "NEBULA SYSTEMS ONLINE"

    end)

    addButton("Scan Targets (Players & Dummies)", function()

        local targets = getValidTargets()

        status.Text = "TARGETS DETECTED: " .. #targets

    end)

    addButton("Toggle menu  [RightShift]", function()

        setMenu(false)

    end)

    addHeading("MODULE INFORMATION")

    addButton("Combat modules: active", function()

        status.Text = "COMBAT MODULES OPERATIONAL"

    end)

end

pages["VISUALS"] = function()

    addHeading("TARGET VISUALS")

    addButton(

        "Health / Name / Distance ESP: " .. (enabled["Health / Name / Distance ESP"] and "ON" or "OFF"),

        function()

            enabled["Health / Name / Distance ESP"] = not enabled["Health / Name / Distance ESP"]

            if not enabled["Health / Name / Distance ESP"] then

                for model in pairs(espObjects) do removeESP(model) end

            end

            status.Text = "TARGET ESP: " .. (enabled["Health / Name / Distance ESP"] and "ON" or "OFF")

            showPage("VISUALS")

        end

    )

    addButton(

        "Skeleton ESP: " .. (enabled["Skeleton ESP"] and "ON" or "OFF"),

        function()

            enabled["Skeleton ESP"] = not enabled["Skeleton ESP"]

            status.Text = "SKELETON ESP: " .. (enabled["Skeleton ESP"] and "ON" or "OFF")

            showPage("VISUALS")

        end

    )

    addHeading("ENVIRONMENT EFFECTS")

    addButton("Snowing: " .. (snowEnabled and "ON" or "OFF"), function()

        setSnow(not snowEnabled)

        showPage("VISUALS")

    end)

    addButton("FPS Boost: " .. (fpsBoostEnabled and "ON" or "OFF"), function()

        setFPSBoost(not fpsBoostEnabled)

        showPage("VISUALS")

    end)

    addButton("Motion Blur: " .. (motionBlurEnabled and "ON" or "OFF"), function()

        motionBlurEnabled = not motionBlurEnabled

        resetMotionBlur()

        status.Text = "MOTION BLUR: " .. (motionBlurEnabled and "ON" or "OFF")

        showPage("VISUALS")

    end)

    addButton("Refresh target visuals", function()

        updateESP()

        updateSkeletons()

        status.Text = "VISUALS REFRESHED"

    end)

end

pages["MOVEMENT"] = function()
    addHeading("CHARACTER MOVEMENT")

    addButton("Fly: " .. (flyEnabled and "ON" or "OFF"), function()
        setFly(not flyEnabled)
        showPage("MOVEMENT")
    end)

    addButton("Flight Speed: " .. flySpeed .. " (click to cycle)", function()
        local speeds = {30, 60, 90, 120}
        local index = table.find(speeds, flySpeed) or 1
        flySpeed = speeds[(index % #speeds) + 1]
        if flyEnabled then setFly(true) end
        status.Text = "FLIGHT SPEED: " .. flySpeed
        showPage("MOVEMENT")
    end)

    addButton("Walk Speed: " .. walkSpeedValue .. " (click to cycle)", function()
        local speeds = {16, 24, 32, 40}
        local index = table.find(speeds, walkSpeedValue) or 1
        walkSpeedValue = speeds[(index % #speeds) + 1]
        setMovementStats()
        showPage("MOVEMENT")
    end)

    addButton("Jump Power: " .. jumpPowerValue .. " (click to cycle)", function()
        local powers = {50, 65, 80, 100}
        local index = table.find(powers, jumpPowerValue) or 1
        jumpPowerValue = powers[(index % #powers) + 1]
        setMovementStats()
        showPage("MOVEMENT")
    end)

    addButton("Noclip / Phase: " .. (noclipEnabled and "ON" or "OFF"), function()
        setNoclip(not noclipEnabled)
        showPage("MOVEMENT")
    end)

    addButton("Restore character collisions", function()
        setNoclip(false)
        status.Text = "COLLISIONS RESTORED"
        showPage("MOVEMENT")
    end)

    addHeading("TELEPORT")
    addButton("Cycle player target", function()
        local choices = {}
        for _, candidate in ipairs(Players:GetPlayers()) do
            if candidate ~= player and candidate.Character
                and candidate.Character:FindFirstChild("HumanoidRootPart") then
                table.insert(choices, candidate)
            end
        end
        table.sort(choices, function(a, b) return a.Name < b.Name end)
        if #choices == 0 then
            selectedTeleportUserId = nil
            status.Text = "NO OTHER PLAYERS AVAILABLE"
        else
            local currentIndex = 0
            for index, candidate in ipairs(choices) do
                if candidate.UserId == selectedTeleportUserId then currentIndex = index break end
            end
            local nextPlayer = choices[(currentIndex % #choices) + 1]
            selectedTeleportUserId = nextPlayer.UserId
            status.Text = "TELEPORT TARGET: " .. nextPlayer.Name
        end
    end)

    addButton("Teleport to selected player", function()
        teleportToPlayer()
    end)

    addButton("Teleport to next test point", function()
        teleportToNextTestPoint()
    end)

    addButton("Loop Teleport: " .. (loopTeleportEnabled and "ON" or "OFF"), function()
        setLoopTeleport(not loopTeleportEnabled)
        showPage("MOVEMENT")
    end)

    addButton("STOP Loop Teleport", function()
        setLoopTeleport(false)
        showPage("MOVEMENT")
    end)

    addButton("Reset movement settings", function()
        setFly(false)
        setLoopTeleport(false)
        walkSpeedValue = 16
        jumpPowerValue = 50
        flySpeed = 60
        setMovementStats()
        status.Text = "MOVEMENT SETTINGS RESET"
        showPage("MOVEMENT")
    end)

    addHeading("TEST POINT SETUP")
    addButton("Test point setup instructions", function()
        status.Text = "CREATE Workspace.NebulaTestPoints AND ADD PARTS"
    end)

    addHeading("SERVER FEATURES")
    addButton("God Mode", function()
        status.Text = "GOD MODE REQUIRES SERVER-SIDE LOGIC"
    end)
    addButton("Hitbox Expansion", function()
        status.Text = "USE SERVER-CONTROLLED HITBOXES"
    end)
end

pages["COMBAT LAB"] = function()

    addHeading("COMBAT MODULES")

    -- Clickable smoothness slider (0 = fast, 100 = smooth/slow).
    local smoothLabel = Instance.new("TextLabel")
    smoothLabel.Size = UDim2.new(1, -4, 0, 24)
    smoothLabel.BackgroundTransparency = 1
    smoothLabel.Text = "Aim Smoothness: " .. AIM_SMOOTHNESS .. " / 100"
    smoothLabel.TextColor3 = WHITE
    smoothLabel.Font = Enum.Font.GothamMedium
    smoothLabel.TextSize = 12
    smoothLabel.TextXAlignment = Enum.TextXAlignment.Left
    smoothLabel.Parent = content

    local slider = Instance.new("TextButton")
    slider.Size = UDim2.new(1, -12, 0, 20)
    slider.BackgroundColor3 = Color3.fromRGB(38, 29, 54)
    slider.Text = ""
    slider.AutoButtonColor = false
    slider.Parent = content
    Instance.new("UICorner", slider).CornerRadius = UDim.new(0, 8)

    local fill = Instance.new("Frame")
    fill.Size = UDim2.new(AIM_SMOOTHNESS / 100, 0, 1, 0)
    fill.BackgroundColor3 = PURPLE
    fill.BorderSizePixel = 0
    fill.Parent = slider
    Instance.new("UICorner", fill).CornerRadius = UDim.new(0, 8)

    local function setAimSmoothnessFromX(x)
        local width = math.max(slider.AbsoluteSize.X, 1)
        local fraction = math.clamp((x - slider.AbsolutePosition.X) / width, 0, 1)
        AIM_SMOOTHNESS = math.clamp(math.floor(fraction * 100 + 0.5), 0, 100)
        smoothLabel.Text = "Aim Smoothness: " .. AIM_SMOOTHNESS .. " / 100"
        fill.Size = UDim2.new(AIM_SMOOTHNESS / 100, 0, 1, 0)
    end

    local draggingSmoothness = false

    slider.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            draggingSmoothness = true
            local pointerX = input.Position.X
            setAimSmoothnessFromX(pointerX)
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if draggingSmoothness and (input.UserInputType == Enum.UserInputType.MouseMovement
            or input.UserInputType == Enum.UserInputType.Touch) then
            setAimSmoothnessFromX(input.Position.X)
        end
    end)

    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
            or input.UserInputType == Enum.UserInputType.Touch then
            draggingSmoothness = false
        end
    end)

    addButton("Reset Smoothness to 50", function()
        AIM_SMOOTHNESS = 50
        smoothLabel.Text = "Aim Smoothness: " .. AIM_SMOOTHNESS .. " / 100"
        fill.Size = UDim2.new(AIM_SMOOTHNESS / 100, 0, 1, 0)
        status.Text = "AIM SMOOTHNESS RESET TO 50"
    end)

    for _, name in ipairs({"Aimbot", "Aimbot Auto-Fire", "Silent Aim", "Trigger Bot", "Team Check", "Wall Check"}) do

        addButton(

            name .. ": " .. (enabled[name] and "ON" or "OFF"),

            function()

                enabled[name] = not enabled[name]

                status.Text = name .. ": " .. (enabled[name] and "ACTIVE" or "OFF")

                showPage("COMBAT LAB")

            end

        )

    end

    addHeading("INSTRUCTIONS")

    addButton("Aimbot: Hold Right-Click to lock on", function()

        status.Text = "AIMBOT USES HOLD RIGHT-CLICK"

    end)

end

for _, pageName in ipairs({"OVERVIEW", "VISUALS", "MOVEMENT", "COMBAT LAB"}) do

    local button = Instance.new("TextButton")

    button.Size = UDim2.new(1, -12, 0, 36)

    button.BackgroundColor3 = Color3.fromRGB(39, 29, 55)

    button.Text = pageName

    button.TextColor3 = WHITE

    button.Font = Enum.Font.GothamBold

    button.TextSize = 11

    button.AutoButtonColor = false

    button.Parent = sidebar

    Instance.new("UICorner", button).CornerRadius = UDim.new(0, 6)

    button.MouseButton1Click:Connect(function()

        showPage(pageName)

    end)

end

-- KEYBIND AND MOUSE INPUT HANDLERS

UserInputService.InputBegan:Connect(function(input, processed)

    -- B toggles the panel unless the player is typing into a text box.
    if input.KeyCode == Enum.KeyCode.B then
        if UserInputService:GetFocusedTextBox() then return end
        setMenu(not menuOpen)
        return
    end

    if processed then return end

    -- Keep RightShift as an alternate toggle shortcut.
    if input.KeyCode == Enum.KeyCode.RightShift then
        if UserInputService:GetFocusedTextBox() then return end
        setMenu(not menuOpen)
    elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
        isRightMouseDown = true
    end

end)

UserInputService.InputEnded:Connect(function(input)

    if input.UserInputType == Enum.UserInputType.MouseButton2 then

        isRightMouseDown = false

    end

end)

-- Run after the Roblox camera update so the smooth practice aim is not overwritten.
RunService:BindToRenderStep("NebulaAimbotStep", Enum.RenderPriority.Camera.Value + 1, function(deltaTime)
    processAimbot(deltaTime)
end)

-- MAIN RENDER LOOP

RunService.RenderStepped:Connect(function(deltaTime)

    updateESP()

    updateSkeletons()

    updateMotionBlur(deltaTime)

    processTriggerbot()

    forceWeaponAim()

end)

showPage("OVERVIEW")

-- Play the binary hacker-style intro on initial launch too.
setMenu(true)

print("NEBULA // PREMIUM // HACKING V11 loaded")
🎮 Similar Scripts
💬 Comments (0)
Login to post a comment
No comments yet. Be the first!
Script Info
Game One Tap
TypeKeyless
Authoralexriderr
Views4
Likes0
PublishedOct 16, 2026
🎮 Play Game on Roblox
🕐 Recent Scripts
NexusHub -The BEST AUTO BOUNTY – by Tgferr
NexusHub -The BEST AUTO BOUNTY – by Tgferr
Blox Fruits • 👁 0
Keyless
Sniper Arena Keyless Script | Elite Scripts, Aim & Weapons
Sniper Arena Keyless Script | Elite Scripts, Aim & Weapons
Sniper Arena • 👁 2
Keyless
Serenity Hub Break and Steal an Egg script keyless
Serenity Hub Break and Steal an Egg script keyless
Break and Steal an Egg • 👁 3
Keyless
Sell Fries Half Auto Farm
Sell Fries Half Auto Farm
Sell Fries! • 👁 3
Keyless
Xyneria hub – Bloxfruits [FREE UPDATED 2026]
Xyneria hub – Bloxfruits [FREE UPDATED 2026]
Blox Fruits • 👁 3
Keyless