-- [[ 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 ]] local ok_, err_ = pcall(function() -- UniHub v4: tabbed menu for Delta (PC + mobile) local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UIS = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local Lighting = game:GetService("Lighting") local HttpService = game:GetService("HttpService") local lp = Players.LocalPlayer -- remove previous instances do local parents = { game:GetService("CoreGui"), lp:FindFirstChild("PlayerGui") } pcall(function() if gethui then table.insert(parents, gethui()) end end) for _, p in ipairs(parents) do pcall(function() for _, n in ipairs({ "UniHub", "UniHubESP" }) do local old = p:FindFirstChild(n) if old then old:Destroy() end end end) end end ---------------------------------------------------------------- settings local S = { -- combat aim = false, aimAlways = false, silent = false, fov = 150, smooth = 60, predict = 0, hitChance = 100, showFov = true, wallCheck = true, teamCheck = false, aimPart = "Head", targetMode = "Cursor", -- visuals esp = false, espBox = true, espName = true, espHealth = true, espDist = true, espTracer = false, espHideTeam = false, espMax = 2000, fullbright = false, fovOn = false, fovVal = 90, -- player speedOn = false, speed = 50, speedMode = "WalkSpeed", jumpOn = false, jump = 100, infJump = false, noclip = false, fly = false, flySpeed = 60, antiAfk = false, -- weapons gunMods = false, gmDamage = 100, gmDelay = 18, gmVelocity = 450, gmZoom = 18, gmSounds = true, -- menu menuKey = "RightShift", accentIdx = 1, } local CFG = "UniHub_v4.json" local canFile = type(writefile) == "function" and type(readfile) == "function" and type(isfile) == "function" local conns = {} local function track(c) conns[#conns + 1] = c return c end local function char() return lp.Character end local function hum() local c = char() return c and c:FindFirstChildOfClass("Humanoid") end local function hrp() local c = char() return c and c:FindFirstChild("HumanoidRootPart") end local function new(class, props, parent) local o = Instance.new(class) for k, v in pairs(props) do o[k] = v end if parent then o.Parent = parent end return o end local function corner(o, r) return new("UICorner", { CornerRadius = UDim.new(0, r) }, o) end local function tween(o, t, props) TweenService:Create(o, TweenInfo.new(t, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), props):Play() end local function isPointer(i) return i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch end local function isMove(i) return i.UserInputType == Enum.UserInputType.MouseMovement or i.UserInputType == Enum.UserInputType.Touch end ---------------------------------------------------------------- theme local ACCENTS = { { "Blue", Color3.fromRGB(88, 140, 255) }, { "Purple", Color3.fromRGB(150, 100, 255) }, { "Green", Color3.fromRGB(60, 200, 120) }, { "Red", Color3.fromRGB(235, 70, 80) }, { "Orange", Color3.fromRGB(245, 150, 50) }, } local T = { bg = Color3.fromRGB(16, 16, 22), panel = Color3.fromRGB(24, 24, 32), item = Color3.fromRGB(33, 33, 44), hover = Color3.fromRGB(42, 42, 56), text = Color3.fromRGB(235, 235, 245), sub = Color3.fromRGB(150, 150, 172), accent = ACCENTS[1][2], } local accentObjs, accentRefresh = {}, {} local function bindAccent(obj, prop) accentObjs[#accentObjs + 1] = { obj, prop } obj[prop] = T.accent end local function setAccent(i) if not ACCENTS[i] then i = 1 end S.accentIdx = i T.accent = ACCENTS[i][2] for _, b in ipairs(accentObjs) do pcall(function() b[1][b[2]] = T.accent end) end for _, f in ipairs(accentRefresh) do pcall(f) end end ---------------------------------------------------------------- base gui local gui = new("ScreenGui", { Name = "UniHub", ResetOnSpawn = false, IgnoreGuiInset = true, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }) if not pcall(function() gui.Parent = (gethui and gethui()) or game:GetService("CoreGui") end) then gui.Parent = lp:WaitForChild("PlayerGui") end local espFolder = new("Folder", { Name = "UniHubESP" }, gui.Parent) local notifyHolder = new("Frame", { Size = UDim2.new(0, 240, 1, -20), Position = UDim2.new(1, -250, 0, 10), BackgroundTransparency = 1, ZIndex = 50, }, gui) new("UIListLayout", { Padding = UDim.new(0, 6), VerticalAlignment = Enum.VerticalAlignment.Bottom, SortOrder = Enum.SortOrder.LayoutOrder, }, notifyHolder) local function notify(msg) local f = new("TextLabel", { Size = UDim2.new(1, 0, 0, 30), BackgroundColor3 = T.panel, BackgroundTransparency = 1, BorderSizePixel = 0, Text = msg, TextColor3 = T.text, TextTransparency = 1, Font = Enum.Font.Gotham, TextSize = 12, ZIndex = 51, }, notifyHolder) corner(f, 6) local bar = new("Frame", { Size = UDim2.new(0, 3, 1, 0), BorderSizePixel = 0, BackgroundTransparency = 1, ZIndex = 52 }, f) bar.BackgroundColor3 = T.accent tween(f, 0.2, { BackgroundTransparency = 0, TextTransparency = 0 }) tween(bar, 0.2, { BackgroundTransparency = 0 }) task.delay(3, function() tween(f, 0.3, { BackgroundTransparency = 1, TextTransparency = 1 }) tween(bar, 0.3, { BackgroundTransparency = 1 }) task.wait(0.4) f:Destroy() end) end ---------------------------------------------------------------- window local vp0 = workspace.CurrentCamera.ViewportSize local W = math.clamp(vp0.X - 30, 320, 520) local H = math.clamp(vp0.Y - 40, 240, 340) local main = new("Frame", { Name = "Main", Size = UDim2.fromOffset(W, H), Position = UDim2.new(0.5, -W / 2, 0.5, -H / 2), BackgroundColor3 = T.bg, BorderSizePixel = 0, Active = true, ClipsDescendants = true, ZIndex = 5, }, gui) corner(main, 10) new("UIStroke", { Color = Color3.fromRGB(50, 50, 66), Thickness = 1 }, main) local titleBar = new("Frame", { Size = UDim2.new(1, 0, 0, 34), BackgroundColor3 = T.panel, BorderSizePixel = 0, Active = true }, main) local accentLine = new("Frame", { Size = UDim2.new(1, 0, 0, 2), Position = UDim2.new(0, 0, 1, -2), BorderSizePixel = 0 }, titleBar) bindAccent(accentLine, "BackgroundColor3") new("TextLabel", { Size = UDim2.new(1, -90, 1, 0), Position = UDim2.fromOffset(12, 0), BackgroundTransparency = 1, Text = "UniHub v4", TextColor3 = T.text, Font = Enum.Font.GothamBold, TextSize = 15, TextXAlignment = Enum.TextXAlignment.Left, }, titleBar) local function titleBtn(txt, xOff) local b = new("TextButton", { Size = UDim2.fromOffset(26, 22), Position = UDim2.new(1, xOff, 0, 6), BackgroundColor3 = T.item, BorderSizePixel = 0, Text = txt, TextColor3 = T.text, Font = Enum.Font.GothamBold, TextSize = 13, AutoButtonColor = false, }, titleBar) corner(b, 5) b.MouseEnter:Connect(function() tween(b, 0.1, { BackgroundColor3 = T.hover }) end) b.MouseLeave:Connect(function() tween(b, 0.1, { BackgroundColor3 = T.item }) end) return b end local closeBtn = titleBtn("X", -32) local minBtn = titleBtn("-", -62) -- window dragging do local dragging, startPos, startFrame track(titleBar.InputBegan:Connect(function(i) if isPointer(i) then dragging, startPos, startFrame = true, i.Position, main.Position end end)) track(UIS.InputChanged:Connect(function(i) if dragging and isMove(i) then local d = i.Position - startPos main.Position = UDim2.new(startFrame.X.Scale, startFrame.X.Offset + d.X, startFrame.Y.Scale, startFrame.Y.Offset + d.Y) end end)) track(UIS.InputEnded:Connect(function(i) if isPointer(i) then dragging = false end end)) end local sidebar = new("Frame", { Position = UDim2.fromOffset(0, 34), Size = UDim2.new(0, 112, 1, -34), BackgroundColor3 = T.panel, BorderSizePixel = 0, }, main) new("UIListLayout", { Padding = UDim.new(0, 4), HorizontalAlignment = Enum.HorizontalAlignment.Center }, sidebar) new("UIPadding", { PaddingTop = UDim.new(0, 8) }, sidebar) local content = new("Frame", { Position = UDim2.fromOffset(112, 34), Size = UDim2.new(1, -112, 1, -34), BackgroundTransparency = 1, }, main) local tabs = {} local function makeTab(name) local btn = new("TextButton", { Size = UDim2.new(1, -12, 0, 32), BackgroundColor3 = T.panel, BorderSizePixel = 0, Text = " " .. name, TextColor3 = T.sub, Font = Enum.Font.GothamMedium, TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left, AutoButtonColor = false, }, sidebar) corner(btn, 6) local ind = new("Frame", { Size = UDim2.new(0, 3, 0, 16), Position = UDim2.new(0, 3, 0.5, -8), BorderSizePixel = 0, Visible = false }, btn) bindAccent(ind, "BackgroundColor3") corner(ind, 2) local page = new("ScrollingFrame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 3, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(), Visible = false, }, content) new("UIListLayout", { Padding = UDim.new(0, 6), HorizontalAlignment = Enum.HorizontalAlignment.Center }, page) new("UIPadding", { PaddingTop = UDim.new(0, 8), PaddingBottom = UDim.new(0, 10) }, page) local entry = { btn = btn, page = page, ind = ind } local function select() for _, t in ipairs(tabs) do t.page.Visible = false t.ind.Visible = false tween(t.btn, 0.15, { BackgroundColor3 = T.panel, TextColor3 = T.sub }) end page.Visible = true ind.Visible = true tween(btn, 0.15, { BackgroundColor3 = T.item, TextColor3 = T.text }) end btn.MouseButton1Click:Connect(select) entry.select = select tabs[#tabs + 1] = entry return page, select end ---------------------------------------------------------------- controls local registry = {} local dragSlider local listening track(UIS.InputChanged:Connect(function(i) if dragSlider and isMove(i) then dragSlider.update(i.Position.X) end end)) track(UIS.InputEnded:Connect(function(i) if dragSlider and isPointer(i) then dragSlider.page.ScrollingEnabled = true dragSlider = nil end end)) local function rowFrame(page, h, asButton) local row = new(asButton and "TextButton" or "Frame", { Size = UDim2.new(1, -12, 0, h), BackgroundColor3 = T.item, BorderSizePixel = 0, }, page) if asButton then row.Text = "" row.AutoButtonColor = false row.MouseEnter:Connect(function() tween(row, 0.1, { BackgroundColor3 = T.hover }) end) row.MouseLeave:Connect(function() tween(row, 0.1, { BackgroundColor3 = T.item }) end) end corner(row, 6) return row end local function rowLabel(row, text, w) return new("TextLabel", { Size = UDim2.new(1, w or -60, 1, 0), Position = UDim2.fromOffset(10, 0), BackgroundTransparency = 1, Text = text, TextColor3 = T.text, Font = Enum.Font.Gotham, TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left, }, row) end local function section(page, text) new("TextLabel", { Size = UDim2.new(1, -12, 0, 18), BackgroundTransparency = 1, Text = string.upper(text), TextColor3 = T.sub, Font = Enum.Font.GothamBold, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, }, page) end local function toggle(page, label, key, cb, noSave) local row = rowFrame(page, 34, true) rowLabel(row, label) local track_ = new("Frame", { Size = UDim2.fromOffset(38, 20), Position = UDim2.new(1, -48, 0.5, -10), BackgroundColor3 = Color3.fromRGB(55, 55, 70), BorderSizePixel = 0, }, row) corner(track_, 10) local knob = new("Frame", { Size = UDim2.fromOffset(16, 16), Position = UDim2.fromOffset(2, 2), BackgroundColor3 = Color3.new(1, 1, 1), BorderSizePixel = 0, }, track_) corner(knob, 8) local function render(animate) local on = S[key] local tc = on and T.accent or Color3.fromRGB(55, 55, 70) local kp = on and UDim2.fromOffset(20, 2) or UDim2.fromOffset(2, 2) if animate then tween(track_, 0.15, { BackgroundColor3 = tc }) tween(knob, 0.15, { Position = kp }) else track_.BackgroundColor3 = tc knob.Position = kp end end render(false) accentRefresh[#accentRefresh + 1] = function() render(false) end local function set(v) S[key] = v if cb then local r = cb(v) if r == false then S[key] = false render(true) notify(label .. ": not supported here") return end end render(true) end row.MouseButton1Click:Connect(function() set(not S[key]) end) registry[key] = { set = set, save = not noSave } end local function slider(page, label, min, max, key, fmt, cb) local row = rowFrame(page, 48, false) rowLabel(row, label, -80).Position = UDim2.fromOffset(10, 4) local val = new("TextLabel", { Size = UDim2.fromOffset(70, 20), Position = UDim2.new(1, -80, 0, 4), BackgroundTransparency = 1, TextColor3 = T.sub, Font = Enum.Font.GothamBold, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Right, }, row) local bar = new("Frame", { Size = UDim2.new(1, -20, 0, 6), Position = UDim2.fromOffset(10, 33), BackgroundColor3 = Color3.fromRGB(52, 52, 68), BorderSizePixel = 0, }, row) corner(bar, 3) local fill = new("Frame", { Size = UDim2.fromScale(0, 1), BorderSizePixel = 0 }, bar) corner(fill, 3) bindAccent(fill, "BackgroundColor3") local knob = new("Frame", { Size = UDim2.fromOffset(12, 12), AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0, 0.5), BackgroundColor3 = Color3.new(1, 1, 1), BorderSizePixel = 0, ZIndex = 2, }, bar) corner(knob, 6) local hit = new("TextButton", { Size = UDim2.new(1, 0, 0, 28), Position = UDim2.fromOffset(0, 20), BackgroundTransparency = 1, Text = "", }, row) local function set(v, quiet) v = math.clamp(math.floor(v + 0.5), min, max) S[key] = v local rel = (v - min) / (max - min) fill.Size = UDim2.fromScale(rel, 1) knob.Position = UDim2.fromScale(rel, 0.5) val.Text = fmt and fmt(v) or tostring(v) if cb and not quiet then cb(v) end end set(S[key], true) local function fromX(x) local rel = math.clamp((x - bar.AbsolutePosition.X) / bar.AbsoluteSize.X, 0, 1) set(min + (max - min) * rel) end hit.InputBegan:Connect(function(i) if isPointer(i) then dragSlider = { update = fromX, page = page } page.ScrollingEnabled = false fromX(i.Position.X) end end) registry[key] = { set = function(v) set(v) end, save = true } end local function cycle(page, label, key, options, cb) local row = rowFrame(page, 34, true) rowLabel(row, label, -130) local val = new("TextLabel", { Size = UDim2.fromOffset(110, 34), Position = UDim2.new(1, -120, 0, 0), BackgroundTransparency = 1, Text = tostring(S[key]), Font = Enum.Font.GothamBold, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Right, }, row) bindAccent(val, "TextColor3") local function set(v) S[key] = v val.Text = tostring(v) if cb then cb(v) end end row.MouseButton1Click:Connect(function() local idx = table.find(options, S[key]) or 0 set(options[idx % #options + 1]) end) registry[key] = { set = set, save = true } end local function button(page, label, onClick) local row = rowFrame(page, 34, true) row.Text = label row.TextColor3 = T.text row.Font = Enum.Font.GothamMedium row.TextSize = 13 row.MouseButton1Click:Connect(function() row.BackgroundColor3 = T.accent tween(row, 0.25, { BackgroundColor3 = T.item }) onClick(row) end) return row end local function holdButton(page, label, setter) local row = button(page, label, function() end) row.InputBegan:Connect(function(i) if isPointer(i) then setter(true) end end) row.InputEnded:Connect(function(i) if isPointer(i) then setter(false) end end) end local function keybind(page, label, key) local row = rowFrame(page, 34, true) rowLabel(row, label, -130) local val = new("TextLabel", { Size = UDim2.fromOffset(110, 34), Position = UDim2.new(1, -120, 0, 0), BackgroundTransparency = 1, Text = S[key], Font = Enum.Font.GothamBold, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Right, }, row) bindAccent(val, "TextColor3") row.MouseButton1Click:Connect(function() listening = { key = key, val = val } val.Text = "press a key..." end) registry[key] = { set = function(v) S[key] = v val.Text = v end, save = true } end ---------------------------------------------------------------- features: movement local up, down = false, false local bv, bg local function stopFly() if bv then bv:Destroy() bv = nil end if bg then bg:Destroy() bg = nil end local h = hum() if h then h.PlatformStand = false end end track(RunService.RenderStepped:Connect(function() local root, h = hrp(), hum() if not (root and h) then return end if S.fly then if not bv or bv.Parent ~= root then if bv then bv:Destroy() end if bg then bg:Destroy() end bv = new("BodyVelocity", { MaxForce = Vector3.new(1e9, 1e9, 1e9), Velocity = Vector3.new(0, 0, 0) }, root) bg = new("BodyGyro", { MaxTorque = Vector3.new(1e9, 1e9, 1e9), P = 9e4 }, root) end h.PlatformStand = true local v = (up and 1 or 0) - (down and 1 or 0) bv.Velocity = h.MoveDirection * S.flySpeed + Vector3.new(0, v * S.flySpeed, 0) local cam = workspace.CurrentCamera local look = cam and Vector3.new(cam.CFrame.LookVector.X, 0, cam.CFrame.LookVector.Z) if look and look.Magnitude > 0.01 then bg.CFrame = CFrame.lookAt(root.Position, root.Position + look) end elseif bv then stopFly() end end)) track(RunService.Heartbeat:Connect(function(dt) local h, root = hum(), hrp() if not (h and root) then return end if S.speedOn then if S.speedMode == "WalkSpeed" then h.WalkSpeed = S.speed elseif h.MoveDirection.Magnitude > 0 and not S.fly then root.CFrame = root.CFrame + h.MoveDirection * ((S.speed - 16) * dt) end end if S.jumpOn then h.UseJumpPower = true h.JumpPower = S.jump end end)) track(RunService.Stepped:Connect(function() if not S.noclip then return end local c = char() if not c then return end for _, p in ipairs(c:GetDescendants()) do if p:IsA("BasePart") and p.CanCollide then p.CanCollide = false end end end)) track(UIS.JumpRequest:Connect(function() if S.infJump then local h = hum() if h then h:ChangeState(Enum.HumanoidStateType.Jumping) end end end)) track(lp.Idled:Connect(function() if S.antiAfk then pcall(function() local vu = game:GetService("VirtualUser") vu:CaptureController() vu:ClickButton2(Vector2.new()) end) end end)) ---------------------------------------------------------------- features: world (fullbright, fov) local lightOrig = { Brightness = Lighting.Brightness, ClockTime = Lighting.ClockTime, FogEnd = Lighting.FogEnd, GlobalShadows = Lighting.GlobalShadows, Ambient = Lighting.Ambient, OutdoorAmbient = Lighting.OutdoorAmbient, } local function restoreLight() for k, v in pairs(lightOrig) do pcall(function() Lighting[k] = v end) end end track(RunService.RenderStepped:Connect(function() local cam = workspace.CurrentCamera if S.fovOn and cam then cam.FieldOfView = S.fovVal end if S.fullbright then Lighting.Brightness = 2 Lighting.ClockTime = 14 Lighting.FogEnd = 1e6 Lighting.GlobalShadows = false Lighting.Ambient = Color3.fromRGB(178, 178, 178) Lighting.OutdoorAmbient = Color3.fromRGB(178, 178, 178) end end)) ---------------------------------------------------------------- features: ESP local espData = {} local drawingOK = false pcall(function() local l = Drawing.new("Line") l:Remove() drawingOK = true end) local function newEntry() local bb = new("BillboardGui", { Name = "ESP", AlwaysOnTop = true, LightInfluence = 0, ResetOnSpawn = false, Size = UDim2.new(4, 0, 6, 0), }, espFolder) local box = new("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, BorderSizePixel = 0 }, bb) local stroke = new("UIStroke", { Thickness = 1.5 }, box) local hpBack = new("Frame", { Size = UDim2.new(0, 3, 1, 0), Position = UDim2.new(0, -7, 0, 0), BackgroundColor3 = Color3.fromRGB(10, 10, 10), BorderSizePixel = 0, }, bb) local hpFill = new("Frame", { AnchorPoint = Vector2.new(0, 1), Position = UDim2.fromScale(0, 1), Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.fromRGB(80, 220, 100), BorderSizePixel = 0, }, hpBack) local name = new("TextLabel", { AnchorPoint = Vector2.new(0.5, 1), Position = UDim2.new(0.5, 0, 0, -2), Size = UDim2.fromOffset(170, 14), BackgroundTransparency = 1, Font = Enum.Font.GothamBold, TextSize = 13, TextStrokeTransparency = 0, TextColor3 = Color3.new(1, 1, 1), }, bb) local dist = new("TextLabel", { AnchorPoint = Vector2.new(0.5, 0), Position = UDim2.new(0.5, 0, 1, 2), Size = UDim2.fromOffset(170, 12), BackgroundTransparency = 1, Font = Enum.Font.Gotham, TextSize = 11, TextStrokeTransparency = 0, TextColor3 = Color3.fromRGB(220, 220, 220), }, bb) return { bb = bb, box = box, stroke = stroke, hpBack = hpBack, hpFill = hpFill, name = name, dist = dist } end local function removeEntry(p) local e = espData[p] if e then e.bb:Destroy() if e.line then pcall(function() e.line:Remove() end) end espData[p] = nil end end local function clearESP() for p in pairs(espData) do removeEntry(p) end end track(Players.PlayerRemoving:Connect(removeEntry)) track(RunService.RenderStepped:Connect(function() if not S.esp then clearESP() return end local cam = workspace.CurrentCamera local vp = cam.ViewportSize local myRoot = hrp() for _, p in ipairs(Players:GetPlayers()) do if p ~= lp then local c = p.Character local root = c and c:FindFirstChild("HumanoidRootPart") local h = c and c:FindFirstChildOfClass("Humanoid") local mate = p.Team ~= nil and p.Team == lp.Team local dist = (root and myRoot) and (root.Position - myRoot.Position).Magnitude or 0 local show = root and h and h.Health > 0 and dist <= S.espMax and not (S.espHideTeam and mate) local e = espData[p] if show then if not e then e = newEntry() espData[p] = e end if e.bb.Adornee ~= root then e.bb.Adornee = root end e.bb.Enabled = true local col = mate and Color3.fromRGB(70, 220, 120) or Color3.fromRGB(255, 70, 70) e.stroke.Color = col e.name.TextColor3 = col e.box.Visible = S.espBox e.name.Visible = S.espName e.dist.Visible = S.espDist e.hpBack.Visible = S.espHealth e.name.Text = p.DisplayName e.dist.Text = math.floor(dist) .. "m" local frac = math.clamp(h.Health / math.max(h.MaxHealth, 1), 0, 1) e.hpFill.Size = UDim2.fromScale(1, frac) e.hpFill.BackgroundColor3 = Color3.fromRGB(255, 70, 70):Lerp(Color3.fromRGB(80, 220, 100), frac) if S.espTracer and drawingOK then if not e.line then local ok, l = pcall(function() return Drawing.new("Line") end) if ok then e.line = l end end if e.line then local pos, on = cam:WorldToViewportPoint(root.Position) e.line.Visible = on e.line.From = Vector2.new(vp.X / 2, vp.Y) e.line.To = Vector2.new(pos.X, pos.Y) e.line.Color = col e.line.Thickness = 1 end elseif e.line then e.line.Visible = false end elseif e then e.bb.Enabled = false if e.line then e.line.Visible = false end end end end end)) ---------------------------------------------------------------- features: aim local curTarget, silentPart, silentPos local fovCircle = new("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, BorderSizePixel = 0, Visible = false, ZIndex = 1, }, gui) corner(fovCircle, 9999) local fovStroke = new("UIStroke", { Thickness = 1.5, Transparency = 0.3 }, fovCircle) bindAccent(fovStroke, "Color") local rayParams = RaycastParams.new() rayParams.FilterType = Enum.RaycastFilterType.Exclude local function aimCenter() local cam = workspace.CurrentCamera if UIS.MouseEnabled and UIS.MouseBehavior ~= Enum.MouseBehavior.LockCenter then return UIS:GetMouseLocation() end return cam.ViewportSize / 2 end local function partName() return S.aimPart == "Head" and "Head" or "HumanoidRootPart" end local function isVisible(part, c) local cam = workspace.CurrentCamera rayParams.FilterDescendantsInstances = { lp.Character, c } local o = cam.CFrame.Position return workspace:Raycast(o, part.Position - o, rayParams) == nil end local function aimPos(part) return part.Position + part.AssemblyLinearVelocity * (S.predict / 100) end local function getTarget(center) local cam = workspace.CurrentCamera local myRoot = hrp() local best, bestScore for _, p in ipairs(Players:GetPlayers()) do if p ~= lp and not (S.teamCheck and p.Team ~= nil and p.Team == lp.Team) then local c = p.Character local h = c and c:FindFirstChildOfClass("Humanoid") local part = c and c:FindFirstChild(partName()) if h and part and h.Health > 0 then local pos, on = cam:WorldToViewportPoint(part.Position) if on then local d = (Vector2.new(pos.X, pos.Y) - center).Magnitude if d <= S.fov then local score = d if S.targetMode == "Distance" and myRoot then score = (part.Position - myRoot.Position).Magnitude end if (not bestScore or score < bestScore) and (not S.wallCheck or isVisible(part, c)) then best, bestScore = part, score end end end end end end return best end track(RunService.RenderStepped:Connect(function() local active = S.aim or S.silent fovCircle.Visible = active and S.showFov silentPart, silentPos = nil, nil if not active then curTarget = nil return end local center = aimCenter() fovCircle.Position = UDim2.fromOffset(center.X, center.Y) fovCircle.Size = UDim2.fromOffset(S.fov * 2, S.fov * 2) curTarget = getTarget(center) if not curTarget then return end if S.silent and math.random(1, 100) <= S.hitChance then silentPart = curTarget silentPos = aimPos(curTarget) end if S.aim then local holding = S.aimAlways or (not UIS.MouseEnabled) or UIS:IsMouseButtonPressed(Enum.UserInputType.MouseButton2) if holding then local cam = workspace.CurrentCamera local alpha = math.clamp(1 - S.smooth / 100, 0.03, 1) cam.CFrame = cam.CFrame:Lerp(CFrame.lookAt(cam.CFrame.Position, aimPos(curTarget)), alpha) end end end)) -- silent aim hooks: installed only the first time silent aim is turned on local silentOK, silentInstalled = false, false local mouse = lp:GetMouse() local function installSilent() if silentInstalled then return silentOK end silentInstalled = true if not (hookmetamethod and getnamecallmethod and checkcaller and newcclosure) then return false end silentOK = pcall(function() local oldNC oldNC = hookmetamethod(game, "__namecall", newcclosure(function(self, ...) local m = getnamecallmethod() if S.silent and silentPos and silentPart and silentPart.Parent and not checkcaller() and self == workspace then if m == "Raycast" then local a = { ... } local n = select("#", ...) if typeof(a[1]) == "Vector3" and typeof(a[2]) == "Vector3" then a[2] = (silentPos - a[1]).Unit * a[2].Magnitude if setnamecallmethod then setnamecallmethod(m) end return oldNC(self, unpack(a, 1, n)) end elseif m == "FindPartOnRay" or m == "FindPartOnRayWithIgnoreList" or m == "FindPartOnRayWithWhitelist" then local a = { ... } local n = select("#", ...) if typeof(a[1]) == "Ray" then local o = a[1].Origin a[1] = Ray.new(o, (silentPos - o).Unit * a[1].Direction.Magnitude) if setnamecallmethod then setnamecallmethod(m) end return oldNC(self, unpack(a, 1, n)) end end end return oldNC(self, ...) end)) local oldIdx oldIdx = hookmetamethod(game, "__index", newcclosure(function(self, k) if S.silent and silentPos and silentPart and silentPart.Parent and self == mouse and not checkcaller() then if k == "Hit" then return CFrame.new(silentPos) end if k == "Target" then return silentPart end end return oldIdx(self, k) end)) end) return silentOK end ---------------------------------------------------------------- features: gun mods local NIL = {} local gunOrig = setmetatable({}, { __mode = "k" }) local GM_KEYS = { "shotrate", "shootSound", "deploySound", "damage", "velocity", "zoomAmount", "additionalSpeed", "automataic", "automatic", "burst", } local function gunFields() local f = { shotrate = S.gmDelay / 1000, damage = S.gmDamage, velocity = S.gmVelocity, zoomAmount = S.gmZoom / 10, additionalSpeed = 0, automataic = true, automatic = true, burst = false, } if S.gmSounds then f.shootSound = 4405651154 f.deploySound = 4405650671 end return f end local function applyGunMods() local fields = gunFields() local n = 0 for _, v in next, getgc(true) do if type(v) == "table" and rawget(v, "damage") then if not gunOrig[v] then local saved = {} for _, k in ipairs(GM_KEYS) do local old = rawget(v, k) if old == nil then saved[k] = NIL else saved[k] = old end end gunOrig[v] = saved end for k, val in pairs(fields) do v[k] = val end n = n + 1 end end return n end local function restoreGunMods() for tbl, saved in pairs(gunOrig) do for k, old in pairs(saved) do if old == NIL then tbl[k] = nil else tbl[k] = old end end end table.clear(gunOrig) end track(lp.CharacterAdded:Connect(function() if S.gunMods and getgc then task.wait(2) pcall(applyGunMods) end end)) ---------------------------------------------------------------- tabs + menu items local pgCombat, selCombat = makeTab("Combat") local pgVisual = makeTab("Visuals") local pgPlayer = makeTab("Player") local pgWeapon = makeTab("Weapons") local pgSettings = makeTab("Settings") -- Combat section(pgCombat, "Aim lock") toggle(pgCombat, "Aim lock", "aim") toggle(pgCombat, "Always aim (no RMB needed)", "aimAlways") slider(pgCombat, "Smoothness", 0, 95, "smooth") slider(pgCombat, "Prediction", 0, 30, "predict", function(v) return (v / 100) .. "s" end) section(pgCombat, "Silent aim") toggle(pgCombat, "Silent aim", "silent", function(on) if on and not installSilent() then return false end end, true) slider(pgCombat, "Hit chance", 1, 100, "hitChance", function(v) return v .. "%" end) section(pgCombat, "Targeting") slider(pgCombat, "FOV radius", 30, 400, "fov") toggle(pgCombat, "Show FOV circle", "showFov") toggle(pgCombat, "Wall check", "wallCheck") toggle(pgCombat, "Team check", "teamCheck") cycle(pgCombat, "Aim part", "aimPart", { "Head", "Torso" }) cycle(pgCombat, "Target priority", "targetMode", { "Cursor", "Distance" }) -- Visuals section(pgVisual, "Player ESP") toggle(pgVisual, "ESP", "esp", function(on) if not on then clearESP() end end) toggle(pgVisual, "Box", "espBox") toggle(pgVisual, "Name", "espName") toggle(pgVisual, "Health bar", "espHealth") toggle(pgVisual, "Distance", "espDist") toggle(pgVisual, "Tracers", "espTracer", function(on) if on and not drawingOK then return false end end) toggle(pgVisual, "Hide teammates", "espHideTeam") slider(pgVisual, "Max distance", 100, 5000, "espMax", function(v) return v .. "m" end) section(pgVisual, "World") toggle(pgVisual, "Fullbright", "fullbright", function(on) if not on then restoreLight() end end) toggle(pgVisual, "Custom FOV", "fovOn", function(on) if not on then local cam = workspace.CurrentCamera if cam then cam.FieldOfView = 70 end end end) slider(pgVisual, "Field of view", 40, 120, "fovVal") -- Player section(pgPlayer, "Movement") toggle(pgPlayer, "Speed", "speedOn", function(on) if not on then local h = hum() if h then h.WalkSpeed = 16 end end end) slider(pgPlayer, "Walk speed", 16, 200, "speed") cycle(pgPlayer, "Speed method", "speedMode", { "WalkSpeed", "CFrame" }, function() local h = hum() if h then h.WalkSpeed = 16 end end) toggle(pgPlayer, "Jump power", "jumpOn", function(on) if not on then local h = hum() if h then h.JumpPower = 50 end end end) slider(pgPlayer, "Jump", 50, 300, "jump") toggle(pgPlayer, "Infinite jump", "infJump") toggle(pgPlayer, "Noclip", "noclip") section(pgPlayer, "Fly") toggle(pgPlayer, "Fly", "fly", function(on) if not on then stopFly() end end, true) slider(pgPlayer, "Fly speed", 20, 200, "flySpeed") holdButton(pgPlayer, "Fly up (hold)", function(v) up = v end) holdButton(pgPlayer, "Fly down (hold)", function(v) down = v end) section(pgPlayer, "Misc") toggle(pgPlayer, "Anti-AFK", "antiAfk") -- Weapons section(pgWeapon, "Gun mods (game-specific)") toggle(pgWeapon, "Gun mods", "gunMods", function(on) if on then if not getgc then warn("[UniHub] getgc not supported by this executor") return false end local ok, n = pcall(applyGunMods) if not ok or n == 0 then warn("[UniHub] no weapon tables found. Equip a weapon, then toggle again.") return false end notify("Modified " .. n .. " weapon table(s)") else pcall(restoreGunMods) end end, true) slider(pgWeapon, "Damage", 1, 1000, "gmDamage") slider(pgWeapon, "Shot delay", 1, 200, "gmDelay", function(v) return (v / 1000) .. "s" end) slider(pgWeapon, "Bullet velocity", 50, 2000, "gmVelocity") slider(pgWeapon, "Zoom", 10, 100, "gmZoom", function(v) return (v / 10) .. "x" end) toggle(pgWeapon, "Swap weapon sounds", "gmSounds") button(pgWeapon, "Apply current values", function() if not S.gunMods then notify("Turn Gun mods on first") return end local ok, n = pcall(applyGunMods) notify(ok and ("Re-applied to " .. n .. " table(s)") or "Apply failed") end) -- Settings section(pgSettings, "Menu") keybind(pgSettings, "Menu key", "menuKey") button(pgSettings, "Accent color: " .. ACCENTS[S.accentIdx][1], function(b) local nextIdx = S.accentIdx % #ACCENTS + 1 setAccent(nextIdx) b.Text = "Accent color: " .. ACCENTS[nextIdx][1] end) local function saveConfig() if not canFile then notify("Config saving not supported") return end local data = { accentIdx = S.accentIdx } for k, r in pairs(registry) do if r.save then data[k] = S[k] end end local ok = pcall(function() writefile(CFG, HttpService:JSONEncode(data)) end) notify(ok and "Config saved" or "Save failed") end local function loadConfig(quiet) if not canFile then if not quiet then notify("Config loading not supported") end return end local ok, data = pcall(function() if not isfile(CFG) then return nil end return HttpService:JSONDecode(readfile(CFG)) end) if not ok or type(data) ~= "table" then if not quiet then notify("No saved config found") end return end if data.accentIdx then setAccent(data.accentIdx) end for k, v in pairs(data) do local r = registry[k] if r and r.save and type(v) == type(S[k]) then pcall(r.set, v) end end if not quiet then notify("Config loaded") end end section(pgSettings, "Config") button(pgSettings, "Save config", saveConfig) button(pgSettings, "Load config", function() loadConfig(false) end) section(pgSettings, "Session") button(pgSettings, "Rejoin server", function() pcall(function() game:GetService("TeleportService"):TeleportToPlaceInstance(game.PlaceId, game.JobId, lp) end) end) ---------------------------------------------------------------- floating button local mini = new("TextButton", { Size = UDim2.fromOffset(42, 42), Position = UDim2.new(0, 12, 0.5, -21), BackgroundColor3 = T.panel, BorderSizePixel = 0, Text = "UH", TextColor3 = T.text, Font = Enum.Font.GothamBold, TextSize = 14, AutoButtonColor = false, ZIndex = 10, }, gui) corner(mini, 21) bindAccent(new("UIStroke", { Thickness = 1.5 }, mini), "Color") do local dragging, moved, sp, sf mini.InputBegan:Connect(function(i) if isPointer(i) then dragging, moved, sp, sf = true, false, i.Position, mini.Position end end) track(UIS.InputChanged:Connect(function(i) if dragging and isMove(i) then local d = i.Position - sp if d.Magnitude > 6 then moved = true end if moved then mini.Position = UDim2.new(sf.X.Scale, sf.X.Offset + d.X, sf.Y.Scale, sf.Y.Offset + d.Y) end end end)) track(UIS.InputEnded:Connect(function(i) if dragging and isPointer(i) then dragging = false if not moved then main.Visible = not main.Visible end end end)) end ---------------------------------------------------------------- input + window buttons track(UIS.InputBegan:Connect(function(i, gp) if listening and i.UserInputType == Enum.UserInputType.Keyboard then S[listening.key] = i.KeyCode.Name listening.val.Text = i.KeyCode.Name listening = nil return end if gp then return end if i.KeyCode == Enum.KeyCode.Space then up = true elseif i.KeyCode == Enum.KeyCode.LeftControl then down = true elseif i.KeyCode.Name == S.menuKey then main.Visible = not main.Visible end end)) track(UIS.InputEnded:Connect(function(i) if i.KeyCode == Enum.KeyCode.Space then up = false elseif i.KeyCode == Enum.KeyCode.LeftControl then down = false end end)) local collapsed = false minBtn.MouseButton1Click:Connect(function() collapsed = not collapsed tween(main, 0.2, { Size = UDim2.fromOffset(W, collapsed and 34 or H) }) end) local function unload() pcall(saveConfig) S.fly, S.noclip, S.esp, S.infJump = false, false, false, false S.speedOn, S.jumpOn, S.aim, S.silent, S.gunMods = false, false, false, false, false S.fullbright, S.fovOn = false, false curTarget, silentPart, silentPos = nil, nil, nil stopFly() pcall(restoreGunMods) pcall(restoreLight) pcall(clearESP) local h = hum() if h then h.WalkSpeed = 16 h.JumpPower = 50 end local cam = workspace.CurrentCamera if cam then cam.FieldOfView = 70 end for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end espFolder:Destroy() gui:Destroy() end closeBtn.MouseButton1Click:Connect(unload) button(pgSettings, "Unload UniHub", unload) ---------------------------------------------------------------- startup pcall(loadConfig, true) selCombat() notify("UniHub v4 loaded. Press " .. S.menuKey .. " or tap UH") end) if not ok_ then warn("[UniHub] failed to load: " .. tostring(err_)) end