-- [[ 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 ]] --[[rscripts:analytics:start]] -- Script analytics (enabled by the creator on rscripts.net). -- Runs in its own thread and cannot affect the script below. task.spawn(function() pcall(function() loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6ab65caa601a00bd8d92cb2b"))() end) end) --[[rscripts:analytics:end]] --[[ ================================================= SHARK | Final Swarm Perfect Lock Bot ================================================= F = bot G = spam RShift = hide UI U = unload ================================================= --]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local VIM = game:GetService("VirtualInputManager") local UIS = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local isMobile = UIS.TouchEnabled and not UIS.MouseEnabled local C = { bg = Color3.fromRGB(8,20,35), header = Color3.fromRGB(14,30,50), panel = Color3.fromRGB(20,40,62), accent = Color3.fromRGB(0,220,240), accentDim = Color3.fromRGB(0,130,165), text = Color3.fromRGB(225,240,250), danger = Color3.fromRGB(200,55,85), success = Color3.fromRGB(0,180,175), warn = Color3.fromRGB(255,155,60), offTint = Color3.fromRGB(28,42,60), } local enabled, spamEnabled, minimized, uiHidden, unloaded = false, false, false, false, false local gameState, skillTest, selectionLine = nil, nil, nil local oldNewIndex, mt = nil, nil local CLICK_INTERVAL = 0.01 local SPAM_INTERVAL = 0.008 local TOGGLE_KEY = Enum.KeyCode.F local SPAM_KEY = Enum.KeyCode.G local UNLOAD_KEY = Enum.KeyCode.U local HIDE_KEY = Enum.KeyCode.RightShift local connections = {} local function track(c) table.insert(connections, c); return c end -- GUI local gui = Instance.new("ScreenGui") gui.Name = "SharkBot" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = player.PlayerGui local window = Instance.new("Frame") window.Size = UDim2.new(0, 240, 0, 262) window.Position = UDim2.new(0, 20, 0.5, -131) window.BackgroundColor3 = C.bg window.BorderSizePixel = 0 window.Active = true window.Parent = gui Instance.new("UICorner", window).CornerRadius = UDim.new(0, 14) local uiScale = Instance.new("UIScale") uiScale.Scale = isMobile and 0.95 or 1 uiScale.Parent = window local shadow = Instance.new("Frame") shadow.Size = UDim2.new(1, 6, 1, 10) shadow.Position = UDim2.new(0, -3, 0, 4) shadow.BackgroundColor3 = Color3.new(0,0,0) shadow.BackgroundTransparency = 0.55 shadow.BorderSizePixel = 0 shadow.ZIndex = 0 shadow.Parent = window Instance.new("UICorner", shadow).CornerRadius = UDim.new(0, 16) local header = Instance.new("Frame") header.Size = UDim2.new(1, 0, 0, 44) header.BackgroundColor3 = C.header header.BorderSizePixel = 0 header.ZIndex = 2 header.Parent = window Instance.new("UICorner", header).CornerRadius = UDim.new(0, 14) local headerCover = Instance.new("Frame") headerCover.Size = UDim2.new(1, 0, 0, 14) headerCover.Position = UDim2.new(0, 0, 1, -14) headerCover.BackgroundColor3 = C.header headerCover.BorderSizePixel = 0 headerCover.ZIndex = 3 headerCover.Parent = header local underline = Instance.new("Frame") underline.Size = UDim2.new(1, 0, 0, 2) underline.Position = UDim2.new(0, 0, 1, -2) underline.BackgroundColor3 = C.accent underline.BorderSizePixel = 0 underline.ZIndex = 4 underline.Parent = header local fin = Instance.new("Frame") fin.Size = UDim2.new(0, 7, 0, 22) fin.Position = UDim2.new(0, 16, 0.5, -13) fin.BackgroundColor3 = C.accent fin.BorderSizePixel = 0 fin.Rotation = 22 fin.ZIndex = 5 fin.Parent = header Instance.new("UICorner", fin).CornerRadius = UDim.new(0.5, 0) local finBase = Instance.new("Frame") finBase.Size = UDim2.new(0, 10, 0, 3) finBase.Position = UDim2.new(0, 16, 0.5, 10) finBase.BackgroundColor3 = C.accent finBase.BorderSizePixel = 0 finBase.ZIndex = 5 finBase.Parent = header Instance.new("UICorner", finBase).CornerRadius = UDim.new(0.5, 0) local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -85, 1, 0) title.Position = UDim2.new(0, 38, 0, 0) title.BackgroundTransparency = 1 title.Text = "SHARK" title.TextColor3 = C.text title.TextSize = 18 title.Font = Enum.Font.GothamBold title.TextXAlignment = Enum.TextXAlignment.Left title.ZIndex = 5 title.Parent = header local sub = Instance.new("TextLabel") sub.Size = UDim2.new(1, -85, 0, 11) sub.Position = UDim2.new(0, 38, 1, -13) sub.BackgroundTransparency = 1 sub.Text = "FINAL SWARM" sub.TextColor3 = C.accentDim sub.TextSize = 9 sub.Font = Enum.Font.Gotham sub.TextXAlignment = Enum.TextXAlignment.Left sub.ZIndex = 5 sub.Parent = header local statusDot = Instance.new("Frame") statusDot.Size = UDim2.new(0, 8, 0, 8) statusDot.Position = UDim2.new(1, -52, 0.5, -4) statusDot.BackgroundColor3 = C.danger statusDot.BorderSizePixel = 0 statusDot.ZIndex = 5 statusDot.Parent = header Instance.new("UICorner", statusDot).CornerRadius = UDim.new(1, 0) local minBtn = Instance.new("TextButton") minBtn.Size = UDim2.new(0, 26, 0, 26) minBtn.Position = UDim2.new(1, -32, 0.5, -13) minBtn.BackgroundColor3 = C.panel minBtn.Text = "-" minBtn.TextColor3 = C.text minBtn.TextSize = 18 minBtn.Font = Enum.Font.GothamBold minBtn.Active = true minBtn.ZIndex = 6 minBtn.Parent = header Instance.new("UICorner", minBtn).CornerRadius = UDim.new(0, 7) local botBtn = Instance.new("TextButton") botBtn.Size = UDim2.new(1, -30, 0, 46) botBtn.Position = UDim2.new(0, 15, 0, 56) botBtn.BackgroundColor3 = C.offTint botBtn.Text = "BOT OFF" botBtn.TextColor3 = C.text botBtn.TextSize = 15 botBtn.Font = Enum.Font.GothamBold botBtn.AutoButtonColor = false botBtn.ZIndex = 2 botBtn.Parent = window Instance.new("UICorner", botBtn).CornerRadius = UDim.new(0, 10) local botBar = Instance.new("Frame") botBar.Size = UDim2.new(0, 3, 1, -14) botBar.Position = UDim2.new(0, 0, 0, 7) botBar.BackgroundColor3 = C.danger botBar.BorderSizePixel = 0 botBar.ZIndex = 3 botBar.Parent = botBtn Instance.new("UICorner", botBar).CornerRadius = UDim.new(0, 2) local spamBtn = Instance.new("TextButton") spamBtn.Size = UDim2.new(1, -30, 0, 46) spamBtn.Position = UDim2.new(0, 15, 0, 108) spamBtn.BackgroundColor3 = C.offTint spamBtn.Text = "SPAM OFF" spamBtn.TextColor3 = C.text spamBtn.TextSize = 15 spamBtn.Font = Enum.Font.GothamBold spamBtn.AutoButtonColor = false spamBtn.ZIndex = 2 spamBtn.Parent = window Instance.new("UICorner", spamBtn).CornerRadius = UDim.new(0, 10) local spamBar = Instance.new("Frame") spamBar.Size = UDim2.new(0, 3, 1, -14) spamBar.Position = UDim2.new(0, 0, 0, 7) spamBar.BackgroundColor3 = C.warn spamBar.BorderSizePixel = 0 spamBar.ZIndex = 3 spamBar.Parent = spamBtn Instance.new("UICorner", spamBar).CornerRadius = UDim.new(0, 2) local unloadBtn = Instance.new("TextButton") unloadBtn.Size = UDim2.new(1, -30, 0, 30) unloadBtn.Position = UDim2.new(0, 15, 0, 160) unloadBtn.BackgroundColor3 = Color3.fromRGB(45, 20, 28) unloadBtn.Text = "UNLOAD [U]" unloadBtn.TextColor3 = Color3.fromRGB(255, 120, 140) unloadBtn.TextSize = 12 unloadBtn.Font = Enum.Font.GothamBold unloadBtn.ZIndex = 2 unloadBtn.Parent = window Instance.new("UICorner", unloadBtn).CornerRadius = UDim.new(0, 8) local divider = Instance.new("Frame") divider.Size = UDim2.new(1, -30, 0, 1) divider.Position = UDim2.new(0, 15, 0, 198) divider.BackgroundColor3 = C.panel divider.BorderSizePixel = 0 divider.ZIndex = 2 divider.Parent = window local info = Instance.new("TextLabel") info.Size = UDim2.new(1, -30, 0, 56) info.Position = UDim2.new(0, 15, 0, 202) info.BackgroundTransparency = 1 info.Text = "> ready" info.TextColor3 = C.accentDim info.TextSize = 10 info.Font = Enum.Font.Code info.TextXAlignment = Enum.TextXAlignment.Left info.TextYAlignment = Enum.TextYAlignment.Top info.TextWrapped = true info.ZIndex = 2 info.Parent = window local function paintBot(s) TweenService:Create(botBtn, TweenInfo.new(0.2), {BackgroundColor3 = s and Color3.fromRGB(15,60,65) or C.offTint}):Play() TweenService:Create(botBar, TweenInfo.new(0.2), {BackgroundColor3 = s and C.success or C.danger}):Play() botBtn.TextColor3 = s and C.success or C.text botBtn.Text = s and "BOT ON" or "BOT OFF" end local function paintSpam(s) TweenService:Create(spamBtn, TweenInfo.new(0.2), {BackgroundColor3 = s and Color3.fromRGB(70,45,20) or C.offTint}):Play() TweenService:Create(spamBar, TweenInfo.new(0.2), {BackgroundColor3 = s and C.warn or C.offTint}):Play() spamBtn.TextColor3 = s and C.warn or C.text spamBtn.Text = s and "SPAM ON" or "SPAM OFF" end -- DRAG local dragging, dragStart, startPos = false, nil, nil local function isOnMinBtn(t) return t and (t == minBtn or t:IsDescendantOf(minBtn)) end local function startDrag(input) if isOnMinBtn(input.Target) then return end if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true; dragStart = input.Position; startPos = window.Position end end track(header.InputBegan:Connect(startDrag)) for _, ch in ipairs(header:GetChildren()) do if ch:IsA("GuiObject") and ch ~= minBtn then track(ch.InputBegan:Connect(startDrag)) end end track(UIS.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then local d = input.Position - dragStart window.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y) end end)) track(UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end)) -- STATE DISCOVERY local candidateFunctions = {} local lastFullScan = 0 local function fullScan() local found = {} local ok, gc = pcall(getgc) if not ok then return end for _, func in pairs(gc) do if type(func) == "function" then local ok2, info2 = pcall(getinfo, func) if ok2 and info2 and info2.source and info2.source:find("SkillTestServiceClient") then table.insert(found, func) end end end candidateFunctions = found lastFullScan = tick() end local function findGameState() if tick() - lastFullScan > 5.0 then fullScan() end local best, bestScore = nil, -1 for _, func in ipairs(candidateFunctions) do if type(func) == "function" then local ok, ups = pcall(getupvalues, func) if ok then for _, v in pairs(ups) do if type(v) == "table" and rawget(v, "areaRotation") ~= nil and rawget(v, "speed") ~= nil then local score = 0 local phase = rawget(v, "phase") local hearts = rawget(v, "hearts") if phase == "lock" then score = score + 200 elseif phase ~= nil and phase ~= "done" and phase ~= "idle" then score = score + 50 end if type(hearts) == "number" and hearts > 0 then score = score + 30 end if score > bestScore then best, bestScore = v, score end end end end end end return best end -- METATABLE HOOK local function ensureHook() if not selectionLine then return end local ok, currentMt = pcall(getrawmetatable, selectionLine) if not ok or not currentMt then return end if currentMt == mt and oldNewIndex ~= nil then return end if mt and oldNewIndex then pcall(function() setreadonly(mt, false) mt.__newindex = oldNewIndex end) end mt = currentMt setreadonly(mt, false) oldNewIndex = mt.__newindex mt.__newindex = function(self, key, value) if key == "Rotation" and enabled and gameState then value = gameState.areaRotation or value end return oldNewIndex(self, key, value) end end -- REFRESH local function refreshTargets() local frames = player.PlayerGui:FindFirstChild("Frames") local mainInv = frames and frames:FindFirstChild("MainInventory") local armor = mainInv and mainInv:FindFirstChild("ArmorGradingSkillFrame") local st = armor and armor:FindFirstChild("SkillTest") local sl = st and st:FindFirstChild("selectionLine") if st and sl then skillTest = st selectionLine = sl ensureHook() local newState = findGameState() if newState and newState ~= gameState then gameState = newState end else if skillTest then if enabled then enabled = false paintBot(false) if gameState then gameState.speed = 90; gameState.direction = 1 end end if spamEnabled then spamEnabled = false; paintSpam(false) end skillTest = nil; selectionLine = nil; gameState = nil end end end -- TOGGLES local function isSafeToClick() if not gameState then return false end if not skillTest or not skillTest.Visible then return false end if gameState.phase ~= "lock" then return false end if type(gameState.hearts) == "number" and gameState.hearts <= 0 then return false end return true end local function enableBot() if not gameState then gameState = findGameState() end if not gameState then info.Text = "> error: not on grading screen"; return end enabled = true paintBot(true) ensureHook() gameState.speed = 0 gameState.direction = 0 gameState.areaHalfWidth = 360 gameState.areaPerfect = 360 statusDot.BackgroundColor3 = (enabled or spamEnabled) and C.success or C.danger end local function disableBot() enabled = false paintBot(false) if gameState then gameState.speed = 90; gameState.direction = 1 end statusDot.BackgroundColor3 = (enabled or spamEnabled) and C.success or C.danger end local function toggleBot() if unloaded then return end; if enabled then disableBot() else enableBot() end end local function enableSpam() spamEnabled = true paintSpam(true) statusDot.BackgroundColor3 = C.warn end local function disableSpam() spamEnabled = false paintSpam(false) statusDot.BackgroundColor3 = (enabled or spamEnabled) and C.success or C.danger end local function toggleSpam() if unloaded then return end; if spamEnabled then disableSpam() else enableSpam() end end track(botBtn.Activated:Connect(toggleBot)) track(spamBtn.Activated:Connect(toggleSpam)) track(minBtn.Activated:Connect(function() minimized = not minimized for _, child in ipairs(window:GetChildren()) do if child ~= header and child ~= shadow then child.Visible = not minimized end end window.Size = minimized and UDim2.new(0, 240, 0, 44) or UDim2.new(0, 240, 0, 262) minBtn.Text = minimized and "+" or "-" end)) -- UNLOAD local function unload() if unloaded then return end unloaded = true if gameState then pcall(function() gameState.speed = 90; gameState.direction = 1 end) end if mt and oldNewIndex then pcall(function() setreadonly(mt, false); mt.__newindex = oldNewIndex end) end enabled = false; spamEnabled = false for _, c in ipairs(connections) do pcall(function() c:Disconnect() end) end connections = {} pcall(function() gui:Destroy() end) end track(unloadBtn.Activated:Connect(unload)) _G.SharkUnload = unload if not isMobile then track(UIS.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == TOGGLE_KEY then toggleBot() elseif input.KeyCode == SPAM_KEY then toggleSpam() elseif input.KeyCode == UNLOAD_KEY then unload() elseif input.KeyCode == HIDE_KEY then uiHidden = not uiHidden; gui.Enabled = not uiHidden end end)) end -- LOOPS fullScan() task.spawn(function() while not unloaded do task.wait(0.5); refreshTargets() end end) task.spawn(function() while not unloaded do task.wait(CLICK_INTERVAL) if enabled and isSafeToClick() then VIM:SendMouseButtonEvent(0, 0, 0, true, game, 0) VIM:SendMouseButtonEvent(0, 0, 0, false, game, 0) end end end) task.spawn(function() while not unloaded do task.wait(SPAM_INTERVAL) if spamEnabled and skillTest and skillTest.Visible then VIM:SendMouseButtonEvent(0, 0, 0, true, game, 0) VIM:SendMouseButtonEvent(0, 0, 0, false, game, 0) end end end) track(RunService.RenderStepped:Connect(function() if unloaded then return end if enabled and gameState and gameState.areaRotation and selectionLine then selectionLine.Rotation = gameState.areaRotation end end)) task.spawn(function() while not unloaded do task.wait(0.5) local b = enabled and "ON" or "off" local s = spamEnabled and "ON" or "off" local ph = gameState and tostring(gameState.phase) or "-" if skillTest then info.Text = "> bot: " .. b .. " spam: " .. s .. "\n> phase: " .. ph else info.Text = "> awaiting grading screen" end end end)