BIG Paintball Classic (only works for the Classic one)
BIG Paintball! Classic ๐ซDescription
๐ UNI HUB V4 โ THE NEXT LEVEL IS HERE! ๐ฅ Welcome to Uni Hub V4! ๐ฎโจ The wait for the next level of customization is over! Uni Hub V4 brings together a clean interface, smooth animations, customizable visuals, player options, weapon settings, and much more into one convenient hub. Designed for both mobile and PC, V4 is all about making your experience feel smoother, more organized, and way more enjoyable. Forget messy menus and endless lists of settings. Everything is organized into five easy-to-navigate tabs, with interactive toggles, adjustable sliders, customizable themes, and helpful notifications to keep you in the loop. Whether you're exploring the different settings, personalizing your interface, or saving your favorite configuration, Uni Hub V4 gives you a central place to manage its supported features. One hub. Five tabs. Endless ways to customize. Welcome to V4! ๐ ๐ WHAT'S INSIDE V4? Uni Hub V4 brings its features together in a modern, easy-to-use interface designed to keep everything organized and accessible. โ๏ธ Combat โ Explore aim-related settings and available targeting options. ๐๏ธ Visuals โ Customize ESP elements and control what appears on your screen. ๐ Player โ Access movement options, Fullbright, Anti-AFK, and field-of-view settings. ๐ซ Weapons โ Adjust supported weapon parameters with convenient sliders. โ๏ธ Settings โ Change your theme, manage configurations, and customize your menu controls. Every section has its own purpose, so you can jump straight to the settings you're looking for without getting lost in a cluttered interface. ๐จ A CLEAN MENU WITH PERSONALITY A good interface should look good and feel good to use. That's why Uni Hub V4 features an interactive design with smooth visual feedback and customization options. โจ Animated toggles โ Switch supported features on and off with satisfying animations. ๐ฑ๏ธ Hover effects โ Enjoy extra visual feedback when interacting with supported menu elements. ๐๏ธ Smart sliders โ Adjust settings while seeing their current values. ๐ Pop-up notifications โ Get useful feedback about actions and unsupported features. ๐จ Five accent colors โ Choose the look that fits your style. The goal is simple: a menu that's easy to understand, comfortable to navigate, and fun to customize. ๐ฑ MOBILE + ๐ป PC SUPPORT Your hub should work with the way you play! Uni Hub V4 supports both mobile and PC controls, with a floating button that keeps the menu within easy reach. UH Floating Button: Tap or click to open and close the menu. Drag Anywhere: Move the floating UH button to a convenient spot on your screen. Quick PC Access: Press RightShift to toggle the menu open or closed. Changeable Keybind: Choose another supported menu key in Settings. Screen-Adaptive Sizing: The menu adjusts to the available screen space. Playing on a phone? Tap your way through the menu. Using a keyboard and mouse? Open it with your shortcut. Uni Hub V4 keeps access simple across supported devices. ๐๏ธ VISUALS โ MAKE IT YOUR VIEW Welcome to the Visuals tab, where you can customize the ESP elements displayed by supported features. Choose the visual information you want to see and turn individual elements on or off to create a setup that suits your preferences. Available visual options: ๐ฆ Box ESP โ Display bounding boxes around supported targets. ๐ท๏ธ Name ESP โ Show player names. โค๏ธ Health Bars โ Display health using a red-to-green gradient. ๐ Distance ESP โ Show distance information. ๐ Tracer Lines โ Add visual lines to supported targets. ๐๏ธ Maximum Distance โ Adjust the maximum range for ESP elements. ๐ข Teammate Colors โ Identify teammates using green indicators. ๐ Hide Teammates โ Hide teammate indicators when preferred. Want names without boxes? Health bars without tracers? No problem! Each visual element has its own toggle, letting you customize the combination instead of enabling everything at once. Quick heads-up: Tracer lines require Drawing support from Delta. If it's unavailable, Uni Hub V4 displays a notification explaining that the feature isn't supported. โ๏ธ COMBAT โ YOUR SETTINGS, YOUR WAY The Combat tab brings together the available aim-related settings in one organized section. ๐ฏ Aim Lock Prediction option. Always Aim option. Closest-to-cursor target selection. Closest-distance target selection. ๐ป Silent Aim Adjustable hit-chance setting. Hooks installed the first time Silent Aim is enabled rather than repeatedly installed with every toggle. These options keep the available combat settings together and make their configuration easier to navigate. Actual functionality depends on compatibility with the supported game and execution environment. ๐ PLAYER โ CUSTOMIZE YOUR EXPERIENCE The Player tab gives you quick access to several supported movement, lighting, activity, and camera options. โก CFrame Speed โ Uses a CFrame-based movement method without directly changing WalkSpeed . ๐ค Anti-AFK โ Includes an option intended to help prevent inactivity-related disconnections. ๐ก Fullbright โ Adjusts brightness-related visuals where supported. ๐ฅ Field of View โ Change the camera's viewing angle using the available FOV setting. Everything stays in one place, making it easier to find the player-related options you want to explore. ๐ซ WEAPONS โ ADJUST, APPLY, ENJOY The Weapons tab gives you convenient sliders for supported weapon parameters. ๐ฅ Damage โ Adjust the available damage-related value. โฑ๏ธ Shot Delay โ Configure the available shot-delay parameter. ๐ Bullet Velocity โ Adjust the bullet-velocity setting. ๐ญ Zoom โ Change the available zoom parameter. ๐ Sound Swap โ Toggle the available sound-changing option. IMPORTANT: HIT APPLY! After changing your preferred slider values, press Apply Current Values to apply the configured parameters. Adjust your values first, then apply them when you're ready. Simple, organized, and easy to remember! The actual effects depend on the supported game and execution environment. ๐พ CONFIGS โ SAVE YOUR SETUP Found a configuration you love? Keep your supported preferences organized with Uni Hub V4's configuration controls! ๐พ Save Config โ Save supported configuration settings for later. ๐ Load Config โ Load a previously saved configuration. ๐ Auto-Load โ Automatically attempt to load your saved configuration at startup. ๐ซ Auto-Save โ Automatically save supported configuration settings when unloading the script. These options can make returning to a familiar setup easier, without requiring you to configure every preference from scratch each time. A few things to know: File saving depends on whether Delta supports file writing in the current environment. If file writing isn't available, Uni Hub V4 displays a notification. Fly and gun modifications are not automatically restored. Your saved configuration can help preserve supported preferences, but it won't automatically restore every modification. โ๏ธ SETTINGS โ MAKE IT YOURS The Settings tab is where your Uni Hub V4 experience comes together! ๐จ Choose from five accent colors. โจ๏ธ Change the PC menu key. ๐พ Manage saved configurations. ๐ Set your automatic loading and saving preferences. Whether you want a different look or a more convenient way to access the menu, Settings keeps these options easy to find. ๐ SMART NOTIFICATIONS No more wondering why something didn't work! Uni Hub V4 uses pop-up notifications to provide feedback about supported actions and known limitations. For example, you may receive a notification when tracer functionality isn't supported or when configuration saving is unavailable because file writing isn't supported. These messages help you understand what's happening without having to guess whether a feature is available. ๐ GETTING STARTED WITH V4 New to Uni Hub? Getting started is easy! STEP 1 โ OPEN IT Tap or click the floating UH button, or press RightShift on PC. STEP 2 โ PICK A TAB Choose Combat, Visuals, Player, Weapons, or Settings. STEP 3 โ CUSTOMIZE Explore the toggles, adjust the sliders, and select your preferred theme. STEP 4 โ APPLY YOUR CHANGES If you've changed weapon parameters, press Apply Current Values . STEP 5 โ SAVE YOUR PREFERENCES Use Save Config if you want to preserve supported settings. Enable automatic loading or saving if those options suit your setup. STEP 6 โ MAKE YOURSELF AT HOME Move the floating button, choose your favorite accent color, and explore the settings at your own pace. That's it! Open, customize, apply when needed, and save your preferred setup. ๐ WHY UNI HUB V4? Here's what makes the hub convenient to use: โ Five organized menu tabs. โ Mobile and PC controls. โ A draggable floating UH button. โ A configurable PC menu shortcut. โ Five customizable accent colors. โ Animated toggles and interactive sliders. โ Individually configurable ESP elements. โ Aim-related settings in one place. โ Player and weapon configuration options. โ Save and load controls for supported settings. โ Optional automatic configuration loading and saving. โ Pop-up notifications for useful feedback. โ A menu that adjusts to your available screen space. Everything is brought together in one interface, so you can spend less time searching for options and more time customizing your setup. ๐ WELCOME TO UNI HUB V4! This is your hub, your interface, and your setup! From customizing the visuals to exploring player settings, adjusting supported weapon parameters, and choosing your favorite theme, Uni Hub V4 brings everything together in one clean, convenient menu. It's designed to be easy to navigate, enjoyable to customize, and accessible across supported mobile and PC environments. So pick your theme, explore your tabs, adjust your settings, and make Uni Hub V4 feel like your own! ๐ฅ UNI HUB V4 โ CLEANER LOOK. MORE CONTROL. YOUR OWN STYLE. ๐ฅ Compatibility notice: Feature availability and behavior depend on the supported game, Delta version, and execution environment. Some features require specific API support, and configuration saving depends on file-writing availability.
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts 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_)) endReview the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.


Your community, in one place