--[[
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")