-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] -- Final Roblox Skill Bot with Always-On-Top Draggable Window local Players = game:GetService("Players") local RunService = game:GetService("RunService") local VirtualInputManager = game:GetService("VirtualInputManager") local player = Players.LocalPlayer -- Wait for UI local skillTest = player.PlayerGui:WaitForChild("Frames"):WaitForChild("MainInventory"):WaitForChild("ArmorGradingSkillFrame"):WaitForChild("SkillTest") local selectionLine = skillTest:WaitForChild("selectionLine") local perfectArea = skillTest:WaitForChild("PerfectArea") local zones = { Large = perfectArea:WaitForChild("Large"), Medium = perfectArea:WaitForChild("Medium"), Mini = perfectArea:WaitForChild("Mini"), Small = perfectArea:WaitForChild("Small") } -- ADVANCED SETTINGS local BASE_TOLERANCE = 2.5 -- Tighter base tolerance for small zones local VELOCITY_MULTIPLIER = 0.15 -- Adaptive tolerance based on speed local COOLDOWN = 0 -- Slightly reduced cooldown for faster clicks local PREDICTION_FACTOR = 0 -- Predict future position for high-speed movement local SMOOTHING_FACTOR = 0.3 -- Velocity smoothing to reduce jitter local MIN_VELOCITY = 0.1 -- Minimum movement speed to trigger clicks -- State local enabled = false local lastClick = 0 local lastRot = selectionLine.AbsoluteRotation local velocity = 0 local connection = nil local zoneWidths = {} -- Precompute zone widths for adaptive tolerance for name, zone in pairs(zones) do zoneWidths[name] = zone.AbsoluteSize.X end -- Angle difference calculation with proper wrap-around local function angleDiff(a, b) local diff = math.abs(a - b) % 360 return math.min(diff, 360 - diff) end -- Click function with proper input simulation local function click() VirtualInputManager:SendMouseButtonEvent(0, 0, 0, true, game, 0) VirtualInputManager:SendMouseButtonEvent(0, 0, 0, false, game, 0) lastClick = tick() end -- Get active zone with visibility check local function getActiveZone() if zones.Small.Visible then return zones.Small, "Small" end if zones.Mini.Visible then return zones.Mini, "Mini" end if zones.Medium.Visible then return zones.Medium, "Medium" end if zones.Large.Visible then return zones.Large, "Large" end return nil, nil end -- Create always-on-top draggable window local gui = Instance.new("ScreenGui") gui.Name = "AutoGradeBot" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true -- Ignore top bar inset gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = player.PlayerGui -- Main window frame local window = Instance.new("Frame") window.Name = "MainWindow" window.Size = UDim2.new(0, 180, 0, 80) window.Position = UDim2.new(0, 20, 0, 200) window.BackgroundColor3 = Color3.fromRGB(30, 30, 30) window.BorderColor3 = Color3.fromRGB(60, 60, 60) window.BorderSizePixel = 2 window.ZIndex = 10000 -- Ultra high ZIndex to ensure it's always on top window.Parent = gui -- Window corner rounding local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 10) corner.Parent = window -- Window title bar (draggable area) local titleBar = Instance.new("Frame") titleBar.Name = "TitleBar" titleBar.Size = UDim2.new(1, 0, 0, 30) titleBar.BackgroundColor3 = Color3.fromRGB(45, 45, 45) titleBar.ZIndex = 10001 titleBar.Parent = window -- Title text local titleText = Instance.new("TextLabel") titleText.Name = "TitleText" titleText.Size = UDim2.new(1, 0, 1, 0) titleText.BackgroundTransparency = 1 titleText.Text = "Auto Grade" titleText.TextColor3 = Color3.new(1, 1, 1) titleText.TextSize = 16 titleText.Font = Enum.Font.GothamBold titleText.ZIndex = 10002 titleText.Parent = titleBar -- Toggle button (separate clickable area) local toggleButton = Instance.new("TextButton") toggleButton.Name = "ToggleButton" toggleButton.Size = UDim2.new(0, 140, 0, 30) toggleButton.Position = UDim2.new(0.5, -70, 1, -35) toggleButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50) toggleButton.TextColor3 = Color3.new(1, 1, 1) toggleButton.TextSize = 18 toggleButton.Font = Enum.Font.GothamBold toggleButton.Text = "BOT: OFF" toggleButton.ZIndex = 10001 toggleButton.Parent = window -- Button corner rounding local buttonCorner = Instance.new("UICorner") buttonCorner.CornerRadius = UDim.new(0, 6) buttonCorner.Parent = toggleButton -- Drag functionality (only works on title bar, not button) local dragging = false local dragStart = nil local startPos = nil titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPos = window.Position end end) game:GetService("UserInputService").InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then local delta = input.Position - dragStart window.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end) game:GetService("UserInputService").InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) -- Toggle function local function toggle() enabled = not enabled if enabled then toggleButton.Text = "BOT: ON" toggleButton.BackgroundColor3 = Color3.fromRGB(50, 200, 50) else toggleButton.Text = "BOT: OFF" toggleButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50) end end toggleButton.MouseButton1Click:Connect(toggle) -- Main loop with predictive clicking and safety checks connection = RunService.Heartbeat:Connect(function() if not enabled then return end local now = tick() if now - lastClick < COOLDOWN then return end -- Safety Check 1: Verify selection line exists and is valid if not selectionLine or not selectionLine:IsDescendantOf(game) then return end -- Safety Check 2: Verify at least one perfect area is visible local anyZoneVisible = false for _, zone in pairs(zones) do if zone.Visible then anyZoneVisible = true break end end if not anyZoneVisible then return end local currentRot = selectionLine.AbsoluteRotation -- Velocity calculation with smoothing to reduce jitter local delta = currentRot - lastRot if delta > 180 then delta = delta - 360 end if delta < -180 then delta = delta + 360 end velocity = velocity * (1 - SMOOTHING_FACTOR) + delta * SMOOTHING_FACTOR lastRot = currentRot -- Safety Check 3: Only proceed if line is actually moving if math.abs(velocity) < MIN_VELOCITY then return end -- Find target zone local zone, name = getActiveZone() if not zone then return end local targetRot = zone.AbsoluteRotation local diff = angleDiff(currentRot, targetRot) -- Adaptive tolerance based on zone size and movement speed local zoneSizeFactor = zoneWidths[name] / zoneWidths["Large"] -- Normalize to largest zone local speedFactor = math.abs(velocity) * VELOCITY_MULTIPLIER local dynamicTolerance = BASE_TOLERANCE * zoneSizeFactor + speedFactor -- Predict future position for high-speed movements local predictedRot = currentRot + velocity * PREDICTION_FACTOR local predictedDiff = angleDiff(predictedRot, targetRot) -- Click when either current position is within tolerance OR predicted position will be within tolerance if diff <= dynamicTolerance or predictedDiff <= dynamicTolerance then click() end end) -- Cleanup function getgenv().StopBot = function() enabled = false if connection then connection:Disconnect() connection = nil end if gui then gui:Destroy() end print("[FINAL BOT] Stopped") end print("[FINAL BOT] Loaded - Drag the title bar to move the window")