--[[ MiroHub | Murder Mystery 2 v2.1 Luau. Built for Delta / mobile, works on PC executors too. Tap the M orb to toggle the menu (RightShift on PC). ]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local UIS = game:GetService("UserInputService") local RS = game:GetService("ReplicatedStorage") local Workspace = game:GetService("Workspace") local Lighting = game:GetService("Lighting") local HttpService = game:GetService("HttpService") local LP = Players.LocalPlayer local function getParent() local ok, res = pcall(function() return (gethui and gethui()) or game:GetService("CoreGui") end) if ok and res then return res end return LP:WaitForChild("PlayerGui") end local ParentGui = getParent() if getgenv and getgenv().MiroHubUnload then pcall(getgenv().MiroHubUnload) end local old = ParentGui:FindFirstChild("MiroHub") if old then old:Destroy() end ------------------------------------------------------------ config / state local CFG = { Speed = 40, FlySpeed = 60, Jump = 70, AimFOV = 200, AimSmooth = 0.30, KillDelay = 0.1, FlingTime = 2, FlingPower = 90, AutoFlingDelay = 2, Shader = 60, SkyPreset = 1, CoinDelay = 0.4, accR = 110, accG = 100, accB = 255, bgV = 9, radius = 26, } local State = {} local Conns = {} local running = true local unload local isOpen = false local userScale = 1 local applyStreamerFn local function bind(sig, fn) local c = sig:Connect(fn) table.insert(Conns, c) return c end local function isPress(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 ------------------------------------------------------------ ui helpers / theme local C = { bg = Color3.fromRGB(9, 9, 11), side = Color3.fromRGB(5, 5, 7), card = Color3.fromRGB(19, 19, 23), card2 = Color3.fromRGB(40, 40, 47), accent = Color3.fromRGB(110, 100, 255), switch = Color3.fromRGB(48, 209, 88), text = Color3.fromRGB(244, 244, 247), sub = Color3.fromRGB(128, 128, 142), blue = Color3.fromRGB(10, 132, 255), green = Color3.fromRGB(48, 209, 88), red = Color3.fromRGB(255, 69, 58), orange = Color3.fromRGB(255, 159, 10), purple = Color3.fromRGB(191, 90, 242), pink = Color3.fromRGB(255, 55, 95), teal = Color3.fromRGB(90, 200, 250), yellow = Color3.fromRGB(255, 214, 10), white = Color3.new(1, 1, 1), } local Flags, Vals, Reg, NoSave = {}, {}, {}, {} local Themed, Switches, Corners, Refresh = {}, {}, {}, {} local Dirty = false local function new(class, props, kids) local o = Instance.new(class) for k, v in pairs(props or {}) do if k ~= "Parent" then o[k] = v end end for _, c in ipairs(kids or {}) do c.Parent = o end if props and props.Parent then o.Parent = props.Parent end return o end local function corner(r) return new("UICorner", { CornerRadius = r }) end local function pill() return corner(UDim.new(1, 0)) end local function stroke(c, t, th) return new("UIStroke", { Color = c, Transparency = t, Thickness = th or 1, ApplyStrokeMode = Enum.ApplyStrokeMode.Border }) end local function tw(o, t, p, style, dir) local tween = TweenService:Create(o, TweenInfo.new(t, style or Enum.EasingStyle.Quint, dir or Enum.EasingDirection.Out), p) tween:Play() return tween end local function themed(inst, prop, tag) table.insert(Themed, { inst, prop, tag }) inst[prop] = C[tag] return inst end local function roundedCard(inst, factor) local c = corner(UDim.new(0, math.floor(CFG.radius * factor))) c.Parent = inst table.insert(Corners, { c, factor }) return c end local function applyTheme() for _, e in ipairs(Themed) do pcall(function() e[1][e[2]] = C[e[3]] end) end for _, s in ipairs(Switches) do s.track.BackgroundColor3 = s.on() and C.switch or C.card2 end for _, f in ipairs(Refresh) do pcall(f) end for _, c in ipairs(Corners) do c[1].CornerRadius = UDim.new(0, math.floor(CFG.radius * c[2])) end end local Gui = new("ScreenGui", { Name = "MiroHub", ResetOnSpawn = false, IgnoreGuiInset = true, DisplayOrder = 999, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, }) pcall(function() if syn and syn.protect_gui then syn.protect_gui(Gui) end end) Gui.Parent = ParentGui local function toast(msg) local t = new("Frame", { Size = UDim2.fromOffset(0, 36), AutomaticSize = Enum.AutomaticSize.X, Position = UDim2.new(0.5, 0, 0, -50), AnchorPoint = Vector2.new(0.5, 0), BackgroundColor3 = Color3.fromRGB(16, 16, 20), BorderSizePixel = 0, Parent = Gui, }, { pill(), stroke(C.white, 0.88), new("UIPadding", { PaddingLeft = UDim.new(0, 18), PaddingRight = UDim.new(0, 18) }) }) new("TextLabel", { Size = UDim2.fromOffset(0, 36), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Text = msg, TextColor3 = C.text, TextSize = 13, Font = Enum.Font.GothamMedium, Parent = t, }) tw(t, 0.5, { Position = UDim2.new(0.5, 0, 0, 40) }, Enum.EasingStyle.Back) task.delay(2.2, function() tw(t, 0.35, { Position = UDim2.new(0.5, 0, 0, -50) }, Enum.EasingStyle.Quad, Enum.EasingDirection.In) task.delay(0.4, function() t:Destroy() end) end) end ------------------------------------------------------------ game helpers local function hrp(p) p = p or LP; local c = p.Character; return c and c:FindFirstChild("HumanoidRootPart") end local function hum(p) p = p or LP; local c = p.Character; return c and c:FindFirstChildOfClass("Humanoid") end local function alive(p) local h = hum(p); return h ~= nil and h.Health > 0 end local Roles = {} local function refreshRoles() local ok, data = pcall(function() return RS.Remotes.Extras.GetPlayerData:InvokeServer() end) if ok and type(data) == "table" then local r = {} for name, info in pairs(data) do if type(info) == "table" then r[name] = info.Role end end Roles = r end end local function hasTool(p, n) return (p.Backpack and p.Backpack:FindFirstChild(n)) or (p.Character and p.Character:FindFirstChild(n)) end local function roleOf(p) local r = Roles[p.Name] if r then return r end if hasTool(p, "Knife") then return "Murderer" end if hasTool(p, "Gun") then return "Sheriff" end return "Innocent" end local function roleColor(r) if r == "Murderer" then return C.red end if r == "Sheriff" or r == "Hero" then return C.blue end return C.green end local function findRole(role) for _, p in ipairs(Players:GetPlayers()) do if p ~= LP and roleOf(p) == role and alive(p) then return p end end end local function findSheriff() return findRole("Sheriff") or findRole("Hero") end local function myTool(n) local c = LP.Character return (c and c:FindFirstChild(n)) or LP.Backpack:FindFirstChild(n) end local function equip(t) local h = hum() if t and h and t.Parent ~= LP.Character then h:EquipTool(t) end end local function tpTo(cf) local r = hrp(); if r then r.CFrame = cf end end -- fire the first remote inside a tool whose name matches (names move around between game updates) local function fireRemote(tool, names, ...) local args = table.pack(...) for _, d in ipairs(tool:GetDescendants()) do if table.find(names, d.Name) then if d:IsA("RemoteEvent") then pcall(function() d:FireServer(table.unpack(args, 1, args.n)) end) return true elseif d:IsA("RemoteFunction") then task.spawn(function() pcall(function() d:InvokeServer(table.unpack(args, 1, args.n)) end) end) return true end end end return false end local function stab(target) local knife = myTool("Knife") local me, th = hrp(), hrp(target) if not (knife and me and th) then return false end equip(knife) me.CFrame = th.CFrame * CFrame.new(0, 0, 2.2) pcall(function() knife:Activate() end) fireRemote(knife, { "Stab" }, "Slash") fireRemote(knife, { "HandleTouched" }, th) local handle = knife:FindFirstChild("Handle") if handle and firetouchinterest then pcall(function() firetouchinterest(handle, th, 0); firetouchinterest(handle, th, 1) end) end return true end local function shoot(target) local gun = myTool("Gun") local me, th = hrp(), hrp(target) if not (gun and me and th) then return false end equip(gun) me.CFrame = th.CFrame * CFrame.new(0, 0, 14) pcall(function() gun:Activate() end) local kl = gun:FindFirstChild("KnifeLocal") local cb = kl and kl:FindFirstChild("CreateBeam") local rf = cb and cb:FindFirstChild("RemoteFunction") if rf then task.spawn(function() pcall(function() rf:InvokeServer(1, th.Position, "AH2") end) end) end fireRemote(gun, { "Shoot" }, CFrame.new(me.Position), CFrame.new(th.Position)) return true end -- stays on the dropped gun until it lands in the inventory (2s timeout), then returns you local grabbing = false local function grabGun() if grabbing or myTool("Gun") or State.Flinging then return end local drop = Workspace:FindFirstChild("GunDrop", true) local me = hrp() if not (drop and drop:IsA("BasePart") and me and alive(LP)) then return end grabbing = true local home = me.CFrame local t0 = tick() repeat local m = hrp() if not (m and drop.Parent) then break end m.CFrame = drop.CFrame * CFrame.new(0, 1.5, 0) m.AssemblyLinearVelocity = Vector3.zero if firetouchinterest then pcall(function() firetouchinterest(m, drop, 0); firetouchinterest(m, drop, 1) end) end RunService.Heartbeat:Wait() until myTool("Gun") or tick() - t0 > 2 local m2 = hrp() if m2 then m2.AssemblyLinearVelocity = Vector3.zero m2.CFrame = home end grabbing = false end -- auto-collect only: runs whenever the toggle is on and you don't have a knife task.spawn(function() while running do task.wait(0.6) if State.AutoGun and not myTool("Knife") then pcall(grabGun) end end end) local function needRoles() return State.ESP or State.KillMurderer or State.KillSheriff or State.Aim or State.AimMurd or State.AimSheriff or State.AutoFlingMurd or State.AutoFlingSheriff end task.spawn(function() while running do if needRoles() then pcall(refreshRoles) end task.wait(2) end end) task.spawn(function() while running do task.wait(CFG.KillDelay) pcall(function() if State.KillMurderer then if myTool("Gun") then local m = findRole("Murderer") if m then shoot(m) end else grabGun() end end if State.KillSheriff and myTool("Knife") then local s = findSheriff() if s then stab(s) end end if State.KillAll and myTool("Knife") then local me = hrp() for _, p in ipairs(Players:GetPlayers()) do if not (State.KillAll and running) then break end if p ~= LP and alive(p) and hrp(p) and me then hrp(p).CFrame = me.CFrame * CFrame.new(0, 0, -2) task.wait(0.02) stab(p) task.wait(0.03) end end end end) end end) ------------------------------------------------------------ map vote (card touch) -- The vote cards aren't confirmed by name. This finds parts that look like vote cards, -- teleports you onto one, and touches it. Run "Scan vote cards" first and check the console. local VoteCards = {} local function scanVoteCards() local found = {} for _, d in ipairs(Workspace:GetDescendants()) do if d:IsA("BasePart") then local n = string.lower(d.Name) local pn = d.Parent and string.lower(d.Parent.Name) or "" if string.find(n, "vote") or string.find(pn, "vote") then table.insert(found, d) end end end table.sort(found, function(a, b) return a:GetFullName() < b:GetFullName() end) for i, c in ipairs(found) do warn("[MiroHub] vote card " .. i .. ": " .. c:GetFullName()) end return found end local voting = false local function voteCard(index) if voting then toast("Vote in progress"); return end local card = VoteCards[index] if not card or not card.Parent then toast("Card " .. index .. " not found, scan first") return end if not hrp() then toast("No character"); return end voting = true task.spawn(function() local m = hrp() if m then m.CFrame = card.CFrame + Vector3.new(0, 3, 0) end local t0 = tick() while tick() - t0 < 1.5 and card.Parent and alive(LP) do local me = hrp() if me and firetouchinterest then pcall(function() firetouchinterest(me, card, 0); firetouchinterest(me, card, 1) end) end local prompt = card:FindFirstChildWhichIsA("ProximityPrompt", true) if prompt and fireproximityprompt then pcall(fireproximityprompt, prompt) end local click = card:FindFirstChildWhichIsA("ClickDetector", true) if click and fireclickdetector then pcall(fireclickdetector, click) end task.wait(0.1) end voting = false toast("Voted map " .. index) end) end ------------------------------------------------------------ esp local ESPHolder = new("Folder", { Name = "esp", Parent = Gui }) local esp = {} local function clearESP(p) if esp[p] then for _, o in pairs(esp[p]) do o:Destroy() end esp[p] = nil end end local function clearAllESP() for p in pairs(esp) do clearESP(p) end end local function updateESP() for _, p in ipairs(Players:GetPlayers()) do if p ~= LP then local ch = p.Character local head = ch and ch:FindFirstChild("Head") if ch and head and alive(p) then local o = esp[p] if not o or o.hl.Adornee ~= ch then clearESP(p) local hl = new("Highlight", { Adornee = ch, FillTransparency = 0.55, OutlineTransparency = 0, DepthMode = Enum.HighlightDepthMode.AlwaysOnTop, Parent = ESPHolder, }) local bb = new("BillboardGui", { Adornee = head, Size = UDim2.fromOffset(120, 34), StudsOffset = Vector3.new(0, 2.4, 0), AlwaysOnTop = true, Parent = ESPHolder, }) local tl = new("TextLabel", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, TextSize = 13, Font = Enum.Font.GothamBold, TextStrokeTransparency = 0.4, Parent = bb, }) o = { hl = hl, bb = bb, tl = tl } esp[p] = o end local role = roleOf(p) local col = roleColor(role) o.hl.FillColor = col o.hl.OutlineColor = col o.tl.TextColor3 = col o.tl.Text = p.DisplayName .. "\n" .. role else clearESP(p) end end end end task.spawn(function() while running do if State.ESP then pcall(updateESP) end task.wait(0.3) end end) bind(Players.PlayerRemoving, function(p) clearESP(p) end) ------------------------------------------------------------ shaders / sky local FX = {} local function applyShaders() if not State.Shaders then for _, o in pairs(FX) do o:Destroy() end FX = {} return end local s = CFG.Shader / 100 if not FX.cc then FX.cc = new("ColorCorrectionEffect", { Name = "MiroCC", Parent = Lighting }) end if not FX.bloom then FX.bloom = new("BloomEffect", { Name = "MiroBloom", Size = 28, Threshold = 0.9, Parent = Lighting }) end if not FX.sun then FX.sun = new("SunRaysEffect", { Name = "MiroSun", Spread = 0.7, Parent = Lighting }) end if not FX.dof then FX.dof = new("DepthOfFieldEffect", { Name = "MiroDOF", FocusDistance = 70, InFocusRadius = 45, NearIntensity = 0, Parent = Lighting }) end FX.cc.Brightness = 0.04 * s FX.cc.Contrast = 0.2 * s FX.cc.Saturation = 0.3 * s FX.cc.TintColor = Color3.new(1, 1 - 0.04 * s, 1 - 0.1 * s) FX.bloom.Intensity = 0.7 * s FX.sun.Intensity = 0.15 * s FX.dof.FarIntensity = 0.12 * s end local SkyPresets = { { name = "Day", clock = 14, atmo = Color3.fromRGB(199, 215, 235), amb = Color3.fromRGB(120, 120, 130), stars = 0 }, { name = "Sunset", clock = 17.8, atmo = Color3.fromRGB(255, 150, 90), amb = Color3.fromRGB(140, 100, 100), stars = 0 }, { name = "Night", clock = 0, atmo = Color3.fromRGB(40, 50, 90), amb = Color3.fromRGB(45, 50, 80), stars = 4000 }, { name = "Neon", clock = 22, atmo = Color3.fromRGB(190, 70, 255), amb = Color3.fromRGB(95, 55, 145), stars = 4000 }, } local skyOrig local SkyObjs = {} local function applySky() if not State.Sky then if skyOrig then Lighting.ClockTime = skyOrig.clock Lighting.Ambient = skyOrig.amb Lighting.OutdoorAmbient = skyOrig.out skyOrig = nil end for _, o in pairs(SkyObjs) do o:Destroy() end SkyObjs = {} return end if not skyOrig then skyOrig = { clock = Lighting.ClockTime, amb = Lighting.Ambient, out = Lighting.OutdoorAmbient } end local p = SkyPresets[CFG.SkyPreset] or SkyPresets[1] if not SkyObjs.sky then SkyObjs.sky = new("Sky", { Name = "MiroSky", CelestialBodiesShown = true, Parent = Lighting }) end if not SkyObjs.atmo then SkyObjs.atmo = new("Atmosphere", { Name = "MiroAtmo", Density = 0.35, Offset = 0.25, Parent = Lighting }) end SkyObjs.sky.StarCount = p.stars SkyObjs.atmo.Color = p.atmo SkyObjs.atmo.Decay = p.atmo Lighting.ClockTime = p.clock Lighting.Ambient = p.amb Lighting.OutdoorAmbient = p.amb end task.spawn(function() while running do if State.Sky then pcall(applySky) end task.wait(1) end end) ------------------------------------------------------------ fly / speed / jump / noclip local flyBV, flyBG local function stopFly() if flyBV then flyBV:Destroy(); flyBV = nil end if flyBG then flyBG:Destroy(); flyBG = nil end local h = hum() if h then h.PlatformStand = false end end local function startFly() stopFly() local r, h = hrp(), hum() if not (r and h) then return end flyBV = new("BodyVelocity", { MaxForce = Vector3.one * 9e9, Velocity = Vector3.zero, Parent = r }) flyBG = new("BodyGyro", { MaxTorque = Vector3.one * 9e9, P = 9e4, CFrame = r.CFrame, Parent = r }) h.PlatformStand = true end -- movement follows the camera: look up to climb, look down to dive local function flyDir() local cam = Workspace.CurrentCamera local h = hum() local md = h and h.MoveDirection or Vector3.zero if md.Magnitude < 0.05 then return Vector3.zero end local rel = cam.CFrame:VectorToObjectSpace(md) local v = cam.CFrame.LookVector * (-rel.Z) + cam.CFrame.RightVector * rel.X return v.Magnitude > 0 and v.Unit or Vector3.zero end bind(LP.CharacterAdded, function() task.wait(0.6) if State.Fly then startFly() end end) bind(UIS.JumpRequest, function() if State.InfJump then local h = hum() if h then h:ChangeState(Enum.HumanoidStateType.Jumping) end end end) bind(RunService.Heartbeat, function() local h = hum() if not h then return end if State.Speed then h.WalkSpeed = CFG.Speed end if State.InfJump then h.UseJumpPower = true; h.JumpPower = CFG.Jump end if State.Fly and flyBV and flyBV.Parent then local v = flyDir() if UIS:IsKeyDown(Enum.KeyCode.Space) or UIS:IsKeyDown(Enum.KeyCode.E) then v += Vector3.yAxis end if UIS:IsKeyDown(Enum.KeyCode.LeftShift) or UIS:IsKeyDown(Enum.KeyCode.Q) then v -= Vector3.yAxis end flyBV.Velocity = v * CFG.FlySpeed flyBG.CFrame = Workspace.CurrentCamera.CFrame end end) bind(RunService.Stepped, function() if State.Noclip or State.Flinging then local ch = LP.Character if ch then for _, d in ipairs(ch:GetDescendants()) do if d:IsA("BasePart") then d.CanCollide = false end end end end end) ------------------------------------------------------------ anti-fling / anti-void local safeCF, safeT = nil, 0 local function stabilize(cf) local r = hrp() if not (r and LP.Character) then return end r.Anchored = true for _, d in ipairs(LP.Character:GetChildren()) do if d:IsA("BasePart") then d.AssemblyLinearVelocity = Vector3.zero d.AssemblyAngularVelocity = Vector3.zero end end if cf then r.CFrame = cf end task.delay(0.12, function() if r.Parent then r.Anchored = false end end) end bind(RunService.Heartbeat, function() if not State.AntiFling or State.Flinging then return end local r, h = hrp(), hum() if not (r and h and h.Health > 0) then return end local v, w = r.AssemblyLinearVelocity.Magnitude, r.AssemblyAngularVelocity.Magnitude if v < 90 and w < 30 and h.FloorMaterial ~= Enum.Material.Air then if tick() - safeT > 0.25 then safeCF, safeT = r.CFrame, tick() end elseif v > 300 or w > 120 then stabilize(safeCF) elseif safeCF and r.Position.Y < safeCF.Position.Y - 200 then stabilize(safeCF) end end) bind(RunService.Stepped, function() if not State.AntiFling then return end for _, p in ipairs(Players:GetPlayers()) do if p ~= LP and p.Character then for _, d in ipairs(p.Character:GetDescendants()) do if d:IsA("BasePart") and d.CanCollide then d.CanCollide = false end end end end end) ------------------------------------------------------------ aimbot local FOVRing = new("Frame", { Size = UDim2.fromOffset(CFG.AimFOV * 2, CFG.AimFOV * 2), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Visible = false, Parent = Gui, }, { pill(), stroke(C.white, 0.6, 1.5) }) local function aimActive() return State.Aim or State.AimMurd or State.AimSheriff end local function refreshAimUI() FOVRing.Visible = aimActive() and true or false end local function aimOK(p) if State.AimMurd or State.AimSheriff then local r = roleOf(p) return (State.AimMurd and r == "Murderer") or (State.AimSheriff and (r == "Sheriff" or r == "Hero")) end return true end local function aimTarget() local cam = Workspace.CurrentCamera local center = cam.ViewportSize / 2 local best, bestD = nil, CFG.AimFOV for _, p in ipairs(Players:GetPlayers()) do if p ~= LP and alive(p) and aimOK(p) then local head = p.Character and p.Character:FindFirstChild("Head") if head then local pos, on = cam:WorldToViewportPoint(head.Position) if on then local d = (Vector2.new(pos.X, pos.Y) - center).Magnitude if d < bestD then bestD, best = d, head end end end end end return best end bind(RunService.RenderStepped, function() if not aimActive() then return end local cam = Workspace.CurrentCamera local head = aimTarget() if head then cam.CFrame = cam.CFrame:Lerp(CFrame.lookAt(cam.CFrame.Position, head.Position), CFG.AimSmooth) end end) ------------------------------------------------------------ fling -- Based on the SkidFling mechanic: sit inside the target's root part, cycle offsets with -- huge velocity + spin, then return to the spot you were standing on before the run. local origFPDH = Workspace.FallenPartsDestroyHeight local flingQueue, flingWorker, flingHome = {}, false, nil local function zeroMotion(ch) if not ch then return end for _, d in ipairs(ch:GetChildren()) do if d:IsA("BasePart") then d.AssemblyLinearVelocity = Vector3.zero d.AssemblyAngularVelocity = Vector3.zero end end end -- anchors you the instant the run ends, zeroes all motion, then releases you at the start spot local function returnHome() if not flingHome then return end local me = hrp() if me then me.Anchored = true end local t0 = tick() repeat me = hrp() if me then me.CFrame = flingHome * CFrame.new(0, 0.5, 0) zeroMotion(LP.Character) end RunService.Heartbeat:Wait() until not me or tick() - t0 > 0.35 me = hrp() if me then zeroMotion(LP.Character) me.CFrame = flingHome * CFrame.new(0, 0.5, 0) me.Anchored = false end local h = hum() if h then h:ChangeState(Enum.HumanoidStateType.GettingUp) end end local function flingCore(t, me, myHum, tch, tHum) local startPos = tHum.RootPart.Position local power = CFG.FlingPower * 1e6 local ang, t0 = 0, tick() -- always write to the live root, so a respawn mid-run doesn't leave us pushing a dead part local function pos(part, off, rot) local r = hrp() if not r then return end r.CFrame = CFrame.new(part.Position) * off * rot r.AssemblyLinearVelocity = Vector3.new(power, power * 10, power) r.AssemblyAngularVelocity = Vector3.new(power * 10, power * 10, power * 10) end while running and not State.FlingCancel and tick() - t0 < CFG.FlingTime do tHum = tch:FindFirstChildOfClass("Humanoid") local tRoot = tHum and tHum.RootPart if not (tRoot and tRoot.Parent and tHum.Health > 0 and hrp()) then break end if (tRoot.Position - startPos).Magnitude > 250 then return true end local mv = tHum.MoveDirection local spd = tRoot.AssemblyLinearVelocity.Magnitude if spd < 50 then ang += 100 for _, y in ipairs({ 1.5, -1.5, 1.5, -1.5, 1.5, -1.5 }) do pos(tRoot, CFrame.new(0, y, 0) + mv * spd / 1.25, CFrame.Angles(math.rad(ang), 0, 0)) RunService.Heartbeat:Wait() end else local ws = tHum.WalkSpeed pos(tRoot, CFrame.new(0, 1.5, ws), CFrame.Angles(math.rad(90), 0, 0)); RunService.Heartbeat:Wait() pos(tRoot, CFrame.new(0, -1.5, -ws), CFrame.Angles(0, 0, 0)); RunService.Heartbeat:Wait() pos(tRoot, CFrame.new(0, 1.5, ws), CFrame.Angles(math.rad(90), 0, 0)); RunService.Heartbeat:Wait() pos(tRoot, CFrame.new(0, -1.5, 0), CFrame.Angles(math.rad(90), 0, 0)); RunService.Heartbeat:Wait() pos(tRoot, CFrame.new(0, -1.5, 0), CFrame.Angles(0, 0, 0)); RunService.Heartbeat:Wait() end end return false end local function flingTarget(t) local ch = LP.Character local myHum = ch and ch:FindFirstChildOfClass("Humanoid") local me = myHum and myHum.RootPart local tch = t.Character local tHum = tch and tch:FindFirstChildOfClass("Humanoid") if not (ch and myHum and me and myHum.Health > 0) then return end if not (tch and tHum and tHum.RootPart and tHum.Health > 0) then return end if tHum.Sit then toast(t.DisplayName .. " is sitting"); return end local cam = Workspace.CurrentCamera cam.CameraSubject = tch:FindFirstChild("Head") or tHum pcall(function() Workspace.FallenPartsDestroyHeight = 0 / 0 end) myHum:SetStateEnabled(Enum.HumanoidStateType.Seated, false) pcall(flingCore, t, me, myHum, tch, tHum) local h2 = hum() if h2 then h2:SetStateEnabled(Enum.HumanoidStateType.Seated, true) cam.CameraSubject = h2 end returnHome() pcall(function() Workspace.FallenPartsDestroyHeight = origFPDH end) end local function runFlingQueue() if flingWorker then return end flingWorker = true State.Flinging = true task.spawn(function() local r = hrp() flingHome = r and r.CFrame while running and #flingQueue > 0 and not State.FlingCancel do local t = table.remove(flingQueue, 1) if t and t.Parent then pcall(flingTarget, t) end task.wait(0.1) end flingQueue = {} State.Flinging = false State.FlingCancel = false flingWorker = false flingHome = nil end) end -- queue a target; tapping several players lines them up and you return home after each one local function flingPlayer(t) if t == LP or not t or table.find(flingQueue, t) then return end table.insert(flingQueue, t) if flingWorker and #flingQueue > 1 then toast("Queued " .. t.DisplayName) end runFlingQueue() end local function startFlingAll() task.spawn(function() while State.FlingAll and running do if not flingWorker then for _, p in ipairs(Players:GetPlayers()) do if p ~= LP and alive(p) then table.insert(flingQueue, p) end end if #flingQueue > 0 then runFlingQueue() end end task.wait(0.3) end end) end -- keeps flinging the murderer / sheriff while their toggle is on task.spawn(function() while running do if (State.AutoFlingMurd or State.AutoFlingSheriff) and not flingWorker then local target if State.AutoFlingMurd then target = findRole("Murderer") end if not target and State.AutoFlingSheriff then target = findSheriff() end if target and target ~= LP and not table.find(flingQueue, target) then flingPlayer(target) end end task.wait(CFG.AutoFlingDelay) end end) local function spawnCF() local lobby = Workspace:FindFirstChild("Lobby") local sp = (lobby and lobby:FindFirstChildWhichIsA("SpawnLocation", true)) or Workspace:FindFirstChildWhichIsA("SpawnLocation", true) if sp then return sp.CFrame + Vector3.new(0, 4, 0) end return CFrame.new(0, 150, 0) end local function inspectTools() local found = 0 for _, n in ipairs({ "Knife", "Gun" }) do local t = myTool(n) if t then for _, d in ipairs(t:GetDescendants()) do if d:IsA("RemoteEvent") or d:IsA("RemoteFunction") then found += 1 warn("[MiroHub] " .. n .. ": " .. d:GetFullName() .. " (" .. d.ClassName .. ")") end end end end toast(found > 0 and ("Printed " .. found .. " remotes to console") or "Hold the Knife or Gun first") end ------------------------------------------------------------ coin autofarm local CoinNames = { "Coin_Server", "Coin" } local function findCoins() local out = {} for _, d in ipairs(Workspace:GetDescendants()) do if d:IsA("BasePart") and table.find(CoinNames, d.Name) then table.insert(out, d) end end return out end local function touchCoin(c) local r = hrp() if r and firetouchinterest then pcall(function() firetouchinterest(r, c, 0); firetouchinterest(r, c, 1) end) end end task.spawn(function() while running do if State.CoinFarm and alive(LP) then for _, c in ipairs(findCoins()) do if not (State.CoinFarm and running and alive(LP)) then break end if c.Parent then local r = hrp() if r then r.CFrame = c.CFrame + Vector3.new(0, 2, 0) end touchCoin(c) task.wait(CFG.CoinDelay) end end end task.wait(0.5) end end) ------------------------------------------------------------ icons (unicode glyphs) -- Glyphs depend on the font. If one shows as a box, swap it for another character. local function bar(p, w, h, x, y, rot, c) return new("Frame", { Size = UDim2.fromOffset(w, h), Position = UDim2.new(0.5, x, 0.5, y), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundColor3 = c, BorderSizePixel = 0, Rotation = rot or 0, Parent = p, }, { pill() }) end local function glyph(ch) return function(p, c) new("TextLabel", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Text = ch, TextColor3 = c, TextSize = 17, Font = Enum.Font.GothamBold, Parent = p, }) end end local Icons = { eye = glyph("◉"), fly = glyph("✈"), jump = glyph("⤒"), speed = glyph("»"), aim = glyph("⌖"), port = glyph("⟐"), fling = glyph("↯"), kill = glyph("✕"), all = glyph("⟳"), home = glyph("⌂"), person = glyph("☺"), gear = glyph("⚙"), gun = glyph("⌐"), sun = glyph("☀"), spark = glyph("✦"), ghost = glyph("◌"), palette = glyph("✎"), save = glyph("⬇"), bolt = glyph("⚡"), sliders = glyph("☰"), shield = glyph("⛨"), map = glyph("⚑"), } Icons.music = glyph("♪"); Icons.spin = glyph("⟲"); Icons.foot = glyph("⁂") Icons.head = glyph("☻"); Icons.anim = glyph("☆") local function imgIcon(id) return function(p, c) new("ImageLabel", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Image = id, ImageColor3 = c, ScaleType = Enum.ScaleType.Fit, Parent = p, }) end end -- paste your own asset IDs here, e.g. aim = "rbxassetid://1234567" local IconIds = { -- aim = "rbxassetid://0", } for name, id in pairs(IconIds) do Icons[name] = imgIcon(id) end -- tints every icon child (shapes, glyphs and images) on tab switch local function recolor(root, col, t) for _, d in ipairs(root:GetDescendants()) do if d:IsA("UIStroke") then tw(d, t or 0.25, { Color = col }) elseif d:IsA("TextLabel") then tw(d, t or 0.25, { TextColor3 = col }) elseif d:IsA("ImageLabel") then tw(d, t or 0.25, { ImageColor3 = col }) elseif d:IsA("Frame") and d.BackgroundTransparency < 1 then tw(d, t or 0.25, { BackgroundColor3 = col }) end end end local function ring(p, w, h, x, y, c, t) return new("Frame", { Size = UDim2.fromOffset(w, h), Position = UDim2.new(0.5, x, 0.5, y), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, BorderSizePixel = 0, Parent = p, }, { pill(), new("UIStroke", { Color = c, Thickness = t or 2, ApplyStrokeMode = Enum.ApplyStrokeMode.Border }) }) end ------------------------------------------------------------ avatar / fx for k, v in pairs({ CrossStyle = 1, CrossSize = 8, CrossThick = 2, SpinSpeed = 360, AuraRate = 25, PrintGap = 2.4, PrintLife = 4 }) do CFG[k] = v end local FXColors = { Color3.fromRGB(110, 100, 255), Color3.fromRGB(10, 132, 255), Color3.fromRGB(48, 209, 88), Color3.fromRGB(255, 69, 58), Color3.fromRGB(255, 159, 10), Color3.fromRGB(255, 55, 95), Color3.new(1, 1, 1), } CFG.CrossColor = FXColors[7] CFG.FXColor = FXColors[1] local NSK = NumberSequenceKeypoint.new -- custom sights ---------------------------------------------------------- local Cross = new("Frame", { Size = UDim2.fromOffset(40, 40), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Visible = false, Parent = Gui, }) local function buildCross() for _, c in ipairs(Cross:GetChildren()) do c:Destroy() end local s, th, col, style = CFG.CrossSize, CFG.CrossThick, CFG.CrossColor, CFG.CrossStyle local function rect(w, h, x, y, round) local f = new("Frame", { Size = UDim2.fromOffset(w, h), Position = UDim2.new(0.5, x, 0.5, y), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundColor3 = col, BorderSizePixel = 0, Parent = Cross, }, { stroke(Color3.new(0, 0, 0), 0.4, 1) }) if round then pill().Parent = f end return f end local gap = 4 if style == 1 or style == 4 then rect(s, th, -(gap + s / 2), 0); rect(s, th, gap + s / 2, 0) rect(th, s, 0, -(gap + s / 2)); rect(th, s, 0, gap + s / 2) end if style == 2 or style == 4 then rect(th + 2, th + 2, 0, 0, true) end if style == 3 then new("Frame", { Size = UDim2.fromOffset(s * 2, s * 2), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Parent = Cross, }, { pill(), new("UIStroke", { Color = col, Thickness = th, ApplyStrokeMode = Enum.ApplyStrokeMode.Border }) }) end end buildCross() -- spin + shift lock (one RenderStepped) ---------------------------------- bind(RunService.RenderStepped, function(dt) local shift = UIS:IsKeyDown(Enum.KeyCode.LeftShift) Cross.Visible = (State.Sights and (not State.SightsShiftOnly or shift or State.ShiftLock)) and true or false local r, h = hrp(), hum() if not (r and h) or State.Flinging then return end if State.ShiftLock then UIS.MouseBehavior = isOpen and Enum.MouseBehavior.Default or Enum.MouseBehavior.LockCenter h.AutoRotate = isOpen h.CameraOffset = Vector3.new(1.7, 0, 0) if not State.Spin then local _, yaw = Workspace.CurrentCamera.CFrame:ToOrientation() r.CFrame = CFrame.new(r.Position) * CFrame.Angles(0, yaw, 0) end end if State.Spin then r.CFrame = r.CFrame * CFrame.Angles(0, math.rad(CFG.SpinSpeed) * dt, 0) end end) local function stopShiftLock() UIS.MouseBehavior = Enum.MouseBehavior.Default local h = hum() if h then h.AutoRotate = true; h.CameraOffset = Vector3.zero end end -- fake headless + korblox (client-side) ---------------------------------- local KORB = { RightUpperLeg = "rbxassetid://902942093", RightLowerLeg = "rbxassetid://902942096", RightFoot = "rbxassetid://902942089", } local KORB_TEX = "rbxassetid://902843398" local legOrig = {} local function applyAvatar() local ch = LP.Character if not ch then return end local head = ch:FindFirstChild("Head") if head then head.Transparency = State.Headless and 1 or 0 local face = head:FindFirstChildOfClass("Decal") if face then face.Transparency = State.Headless and 1 or 0 end end for name, mesh in pairs(KORB) do local p = ch:FindFirstChild(name) if p and p:IsA("MeshPart") then if State.Korblox then if not legOrig[p] then legOrig[p] = { p.MeshId, p.TextureID } end pcall(function() p.MeshId = mesh; p.TextureID = KORB_TEX end) elseif legOrig[p] then local o = legOrig[p] pcall(function() p.MeshId = o[1]; p.TextureID = o[2] end) legOrig[p] = nil end end end end task.spawn(function() while running do if State.Headless or State.Korblox then pcall(applyAvatar) end task.wait(1) end end) -- animations (R15) ------------------------------------------------------- local AnimPacks = { { name = "Default" }, { name = "Ninja", idle1 = 656117400, idle2 = 656118341, walk = 656121766, run = 656118852, jump = 656117878, fall = 656115606, climb = 656114359 }, { name = "Zombie", idle1 = 616158929, idle2 = 616160636, walk = 616168032, run = 616163682, jump = 616161997, fall = 616157476, climb = 616156119 }, { name = "Levitation", idle1 = 616006778, idle2 = 616008087, walk = 616013216, run = 616010382, jump = 616008936, fall = 616005863, climb = 616003713 }, { name = "Robot", idle1 = 616088211, idle2 = 616089559, walk = 616095330, run = 616091570, jump = 616090535, fall = 616087089, climb = 616086039 }, { name = "Stylish", idle1 = 616136790, idle2 = 616138447, walk = 616146177, run = 616140816, jump = 616139451, fall = 616134815, climb = 616133594 }, { name = "Custom", custom = true }, } local AnimCustom = {} local animIdx, animOrig = 1, {} local SLOTS = { idle1 = { "idle", "Animation1" }, idle2 = { "idle", "Animation2" }, walk = { "walk", "WalkAnim" }, run = { "run", "RunAnim" }, jump = { "jump", "JumpAnim" }, fall = { "fall", "FallAnim" }, climb = { "climb", "ClimbAnim" }, } local function currentPack() local p = AnimPacks[animIdx] return p.custom and AnimCustom or p end local function setPack(pack) local an = LP.Character and LP.Character:FindFirstChild("Animate") if not an then toast("No Animate script (R6 or custom rig?)"); return end an.Disabled = true for key, path in pairs(SLOTS) do local f = an:FindFirstChild(path[1]) local a = f and f:FindFirstChild(path[2]) if a then animOrig[key] = animOrig[key] or a.AnimationId local id = pack and pack[key] a.AnimationId = id and ("rbxassetid://" .. id) or animOrig[key] end end local an2 = hum() and hum():FindFirstChildOfClass("Animator") if an2 then for _, t in ipairs(an2:GetPlayingAnimationTracks()) do t:Stop() end end task.wait() an.Disabled = false end local emoteTrack local function stopEmote() if emoteTrack then emoteTrack:Stop(); emoteTrack = nil end end local function playEmote(txt) local id = tostring(txt or ""):match("%d+") local h = hum() local an = h and h:FindFirstChildOfClass("Animator") if not (id and an) then toast("Enter an animation ID"); return end stopEmote() local a = Instance.new("Animation") a.AnimationId = "rbxassetid://" .. id local ok, tr = pcall(function() return an:LoadAnimation(a) end) if not (ok and tr) then toast("Couldn't load that animation"); return end tr.Priority = Enum.AnimationPriority.Action4 tr.Looped = true tr:Play() emoteTrack = tr toast("Playing " .. id) end -- aura ------------------------------------------------------------------- local auraAtt local function applyAura() if auraAtt then auraAtt:Destroy(); auraAtt = nil end local r = hrp() if not (State.Aura and r) then return end auraAtt = new("Attachment", { Name = "MiroAura", Parent = r }) local c1 = CFG.FXColor new("ParticleEmitter", { Texture = "rbxasset://textures/particles/sparkles_main.dds", Color = ColorSequence.new(c1, c1:Lerp(Color3.new(1, 1, 1), 0.5)), LightEmission = 1, Rate = CFG.AuraRate, Lifetime = NumberRange.new(0.8, 1.4), Speed = NumberRange.new(1, 3), SpreadAngle = Vector2.new(180, 180), Rotation = NumberRange.new(0, 360), RotSpeed = NumberRange.new(-60, 60), Acceleration = Vector3.new(0, 2, 0), Size = NumberSequence.new({ NSK(0, 0.5), NSK(1, 0) }), Transparency = NumberSequence.new({ NSK(0, 0), NSK(1, 1) }), Parent = auraAtt, }) new("PointLight", { Color = c1, Range = 10, Brightness = 1.5, Parent = auraAtt }) end -- footprints ------------------------------------------------------------- local PrintFolder = new("Folder", { Name = "MiroPrints", Parent = Workspace.CurrentCamera }) local lastPrint, stepSide = nil, 1 bind(RunService.Heartbeat, function() if not State.Prints then lastPrint = nil; return end local r, h = hrp(), hum() if not (r and h and h.Health > 0) or h.FloorMaterial == Enum.Material.Air then return end if lastPrint and (r.Position - lastPrint).Magnitude < CFG.PrintGap then return end lastPrint = r.Position local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude params.FilterDescendantsInstances = { LP.Character, PrintFolder } local hit = Workspace:Raycast(r.Position, Vector3.new(0, -8, 0), params) if not hit then return end stepSide = -stepSide local look = r.CFrame.LookVector * Vector3.new(1, 0, 1) if look.Magnitude < 0.01 then return end local p = hit.Position + hit.Normal * 0.04 + r.CFrame.RightVector * 0.7 * stepSide local part = new("Part", { Shape = Enum.PartType.Cylinder, Size = Vector3.new(0.06, 0.7, 1.2), Material = Enum.Material.Neon, Color = CFG.FXColor, Transparency = 0.2, Anchored = true, CanCollide = false, CanQuery = false, CanTouch = false, CFrame = CFrame.lookAt(p, p + look) * CFrame.Angles(0, 0, math.rad(90)), Parent = PrintFolder, }) tw(part, CFG.PrintLife, { Transparency = 1 }, Enum.EasingStyle.Linear) task.delay(CFG.PrintLife + 0.1, function() part:Destroy() end) end) -- local boombox ---------------------------------------------------------- local Boom = new("Sound", { Name = "MiroBoombox", Volume = 0.5, Looped = true, Parent = game:GetService("SoundService") }) local function playBoom(txt) local id = tostring(txt or ""):match("%d+") if not id then toast("Enter a sound ID"); return end Boom:Stop() Boom.SoundId = "rbxassetid://" .. id Boom:Play() task.delay(3, function() if running and Boom.SoundId == "rbxassetid://" .. id and not Boom.IsLoaded then toast("Audio didn't load (private or removed)") end end) end bind(LP.CharacterAdded, function() animOrig = {}; legOrig = {}; lastPrint = nil task.wait(1) applyAvatar(); applyAura() if animIdx > 1 then setPack(currentPack()) end end) ------------------------------------------------------------ widgets local function newCard(page, h) local row = new("CanvasGroup", { Size = UDim2.new(1, 0, 0, h), BorderSizePixel = 0, Parent = page }, { stroke(C.white, 0.94) }) themed(row, "BackgroundColor3", "card") roundedCard(row, 0.69) new("UIScale", { Parent = row }) return row end -- small uppercase label above a group of rows local function sectionLabel(page, text) new("TextLabel", { Size = UDim2.new(1, 0, 0, 16), BackgroundTransparency = 1, Text = string.upper(text), TextColor3 = C.sub, TextSize = 10, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = page, }, { new("UIPadding", { PaddingLeft = UDim.new(0, 4) }) }) end local function makeRow(page, o) local row = newCard(page, 58) local sc = row:FindFirstChildOfClass("UIScale") local bubble = new("Frame", { Size = UDim2.fromOffset(38, 38), Position = UDim2.new(0, 10, 0.5, 0), AnchorPoint = Vector2.new(0, 0.5), BackgroundColor3 = o.color, BackgroundTransparency = 0.85, BorderSizePixel = 0, Parent = row, }, { pill() }) local ic = new("Frame", { Size = UDim2.fromOffset(22, 22), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Parent = bubble, }) Icons[o.icon](ic, o.color) new("TextLabel", { Size = UDim2.new(1, -140, 0, 20), Position = UDim2.new(0, 58, 0, 10), BackgroundTransparency = 1, Text = o.name, TextColor3 = C.text, TextSize = 14, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) new("TextLabel", { Size = UDim2.new(1, -140, 0, 14), Position = UDim2.new(0, 58, 0, 31), BackgroundTransparency = 1, Text = o.sub or "", TextColor3 = C.sub, TextSize = 10, Font = Enum.Font.Gotham, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) local on = false local track = new("Frame", { Size = UDim2.fromOffset(50, 30), Position = UDim2.new(1, -12, 0.5, 0), AnchorPoint = Vector2.new(1, 0.5), BackgroundColor3 = C.card2, BorderSizePixel = 0, Parent = row, }, { pill() }) table.insert(Switches, { track = track, on = function() return on end }) local knob = new("Frame", { Size = UDim2.fromOffset(26, 26), Position = UDim2.new(0, 2, 0.5, 0), AnchorPoint = Vector2.new(0, 0.5), BackgroundColor3 = C.white, BorderSizePixel = 0, Parent = track, }, { pill() }) local function settle() tw(knob, 0.3, { Size = UDim2.fromOffset(26, 26), Position = on and UDim2.new(0, 22, 0.5, 0) or UDim2.new(0, 2, 0.5, 0), }, Enum.EasingStyle.Back) end local function set(v) on = v tw(track, 0.25, { BackgroundColor3 = v and C.switch or C.card2 }) settle() end if o.key and o.kind ~= "action" then Flags[o.key] = false if o.nosave then NoSave[o.key] = true end Reg[o.key] = function(v) set(v and true or false) Flags[o.key] = on o.callback(on) end end local btn = new("TextButton", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Text = "", AutoButtonColor = false, ZIndex = 5, Parent = row, }) local hoverCol = C.card:Lerp(C.white, 0.04) btn.MouseEnter:Connect(function() tw(row, 0.2, { BackgroundColor3 = hoverCol }) end) btn.MouseLeave:Connect(function() tw(row, 0.2, { BackgroundColor3 = C.card }) tw(sc, 0.3, { Scale = 1 }, Enum.EasingStyle.Back) settle() end) btn.MouseButton1Down:Connect(function() tw(sc, 0.12, { Scale = 0.97 }) tw(knob, 0.12, { Size = UDim2.fromOffset(32, 26), Position = on and UDim2.new(0, 16, 0.5, 0) or UDim2.new(0, 2, 0.5, 0) }) end) btn.MouseButton1Up:Connect(function() tw(sc, 0.3, { Scale = 1 }, Enum.EasingStyle.Back); settle() end) btn.Activated:Connect(function() if o.kind == "action" then if on then return end set(true) task.spawn(o.callback) task.delay(0.7, function() set(false) end) else set(not on) if o.key then Flags[o.key] = on; Dirty = true end o.callback(on) end end) return row end local function makeSlider(page, o) local row = newCard(page, 56) new("TextLabel", { Size = UDim2.new(0.6, 0, 0, 18), Position = UDim2.new(0, 16, 0, 8), BackgroundTransparency = 1, Text = o.name, TextColor3 = C.text, TextSize = 13, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) local valLbl = new("TextLabel", { Size = UDim2.new(0.35, 0, 0, 18), Position = UDim2.new(1, -16, 0, 8), AnchorPoint = Vector2.new(1, 0), BackgroundTransparency = 1, Text = "", TextColor3 = C.sub, TextSize = 12, Font = Enum.Font.GothamMedium, TextXAlignment = Enum.TextXAlignment.Right, Parent = row, }) local track = new("Frame", { Size = UDim2.new(1, -32, 0, 6), Position = UDim2.new(0, 16, 0, 38), BackgroundColor3 = C.card2, BorderSizePixel = 0, Parent = row, }, { pill() }) local fill = new("Frame", { Size = UDim2.fromScale(0, 1), BorderSizePixel = 0, Parent = track }, { pill() }) themed(fill, "BackgroundColor3", "accent") local knob = new("Frame", { Size = UDim2.fromOffset(20, 20), Position = UDim2.fromScale(0, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundColor3 = C.white, BorderSizePixel = 0, Parent = track, }, { pill(), stroke(Color3.new(0, 0, 0), 0.6, 1) }) local hit = new("TextButton", { Size = UDim2.new(1, -20, 0, 30), Position = UDim2.new(0, 10, 0, 26), BackgroundTransparency = 1, Text = "", AutoButtonColor = false, ZIndex = 5, Parent = row, }) local min, max, step = o.min, o.max, o.step or 1 local value = o.value local function render(v) local a = (v - min) / (max - min) fill.Size = UDim2.new(a, 0, 1, 0) knob.Position = UDim2.new(a, 0, 0.5, 0) valLbl.Text = o.fmt and o.fmt(v) or tostring(v) end render(value) if o.key then Vals[o.key] = value Reg[o.key] = function(v) v = math.clamp(tonumber(v) or value, min, max) value = v Vals[o.key] = v render(v) o.callback(v) end end local function setFromX(x) local a = math.clamp((x - track.AbsolutePosition.X) / math.max(track.AbsoluteSize.X, 1), 0, 1) local v = min + a * (max - min) v = math.clamp(math.floor(v / step + 0.5) * step, min, max) if v ~= value then value = v if o.key then Vals[o.key] = v end Dirty = true render(v) o.callback(v) end end local dragging = false hit.InputBegan:Connect(function(i) if isPress(i) then dragging = true page.ScrollingEnabled = false tw(knob, 0.15, { Size = UDim2.fromOffset(26, 26) }) setFromX(i.Position.X) end end) bind(UIS.InputChanged, function(i) if dragging and isMove(i) then setFromX(i.Position.X) end end) bind(UIS.InputEnded, function(i) if dragging and isPress(i) then dragging = false page.ScrollingEnabled = true tw(knob, 0.2, { Size = UDim2.fromOffset(20, 20) }) end end) return row end -- row of text pills, one selected (select config, sky preset, sight style) local function makeChoice(page, o) local row = newCard(page, 80) new("TextLabel", { Size = UDim2.new(1, -32, 0, 18), Position = UDim2.new(0, 16, 0, 8), BackgroundTransparency = 1, Text = o.name, TextColor3 = C.text, TextSize = 13, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) local scroll = new("ScrollingFrame", { Size = UDim2.new(1, -24, 0, 38), Position = UDim2.new(0, 12, 0, 34), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 0, CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.X, ScrollingDirection = Enum.ScrollingDirection.X, Parent = row, }, { new("UIListLayout", { FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 6), VerticalAlignment = Enum.VerticalAlignment.Center }) }) local sel = o.default or 1 local btns = {} local function paint() for i, b in ipairs(btns) do b.BackgroundColor3 = (i == sel) and C.accent or C.card2 end end table.insert(Refresh, paint) local function pick(i, silent) sel = i paint() if o.key then Vals[o.key] = i end if not silent then Dirty = true end o.callback(i) end for i, name in ipairs(o.options) do local b = new("TextButton", { Size = UDim2.fromOffset(0, 32), AutomaticSize = Enum.AutomaticSize.X, BackgroundColor3 = C.card2, Text = name, TextColor3 = C.white, TextSize = 12, Font = Enum.Font.GothamMedium, AutoButtonColor = false, Parent = scroll, }, { pill(), new("UIPadding", { PaddingLeft = UDim.new(0, 14), PaddingRight = UDim.new(0, 14) }) }) btns[i] = b b.Activated:Connect(function() pick(i) end) end paint() if o.key then Vals[o.key] = sel Reg[o.key] = function(v) pick(math.clamp(math.floor(tonumber(v) or 1), 1, #o.options), true) end end return row, function(i) pick(i, true) end end local function makeSwatches(page, o) local row = newCard(page, 74) new("TextLabel", { Size = UDim2.new(1, -32, 0, 18), Position = UDim2.new(0, 16, 0, 8), BackgroundTransparency = 1, Text = o.name, TextColor3 = C.text, TextSize = 13, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) local holder = new("Frame", { Size = UDim2.new(1, -32, 0, 30), Position = UDim2.new(0, 16, 0, 34), BackgroundTransparency = 1, Parent = row, }, { new("UIListLayout", { FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 10), VerticalAlignment = Enum.VerticalAlignment.Center }) }) local rings = {} local function mark(sel) for i, s in ipairs(rings) do s.Transparency = (i == sel) and 0 or 1 end end local function pick(i, silent) mark(i) if o.key then Vals[o.key] = i end if not silent then Dirty = true end o.callback(o.colors[i], i) end for i, col in ipairs(o.colors) do local b = new("TextButton", { Size = UDim2.fromOffset(26, 26), BackgroundColor3 = col, Text = "", AutoButtonColor = false, Parent = holder, }, { pill() }) rings[i] = stroke(C.white, 1, 2) rings[i].Parent = b b.Activated:Connect(function() pick(i) end) end if o.default then mark(o.default) end if o.key then Vals[o.key] = o.default or 1 Reg[o.key] = function(v) pick(math.clamp(math.floor(tonumber(v) or 1), 1, #o.colors), true) end end return row end -- text box row (animation IDs, sound ID) local function makeInput(page, o) local row = newCard(page, 58) new("TextLabel", { Size = UDim2.new(0.4, 0, 1, 0), Position = UDim2.fromOffset(16, 0), BackgroundTransparency = 1, Text = o.name, TextColor3 = C.text, TextSize = 13, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = row, }) local box = new("TextBox", { Size = UDim2.new(0.55, -12, 0, 32), Position = UDim2.new(1, -12, 0.5, 0), AnchorPoint = Vector2.new(1, 0.5), BackgroundColor3 = C.card2, Text = o.default or "", PlaceholderText = o.placeholder or "", TextColor3 = C.text, PlaceholderColor3 = C.sub, TextSize = 12, Font = Enum.Font.GothamMedium, ClearTextOnFocus = false, Parent = row, }, { pill(), new("UIPadding", { PaddingLeft = UDim.new(0, 12), PaddingRight = UDim.new(0, 12) }) }) box.FocusLost:Connect(function() if o.key then Vals[o.key] = box.Text; Dirty = true end o.callback(box.Text) end) if o.key then Vals[o.key] = box.Text Reg[o.key] = function(v) box.Text = tostring(v); o.callback(box.Text) end end return row end -- list of players with a button each (fling / teleport) local function makePlayerList(page, o) sectionLabel(page, o.title) local list = new("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = page, }, { new("UIListLayout", { Padding = UDim.new(0, 6) }) }) local function refresh() for _, c in ipairs(list:GetChildren()) do if c:IsA("Frame") then c:Destroy() end end for _, p in ipairs(Players:GetPlayers()) do if p ~= LP then local item = new("Frame", { Size = UDim2.new(1, 0, 0, 44), BorderSizePixel = 0, Parent = list }, { stroke(C.white, 0.94) }) themed(item, "BackgroundColor3", "card") roundedCard(item, 0.55) new("TextLabel", { Size = UDim2.new(1, -110, 1, 0), Position = UDim2.fromOffset(14, 0), BackgroundTransparency = 1, Text = p.DisplayName, TextColor3 = C.text, TextSize = 13, Font = Enum.Font.GothamMedium, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Parent = item, }) local b = new("TextButton", { Size = UDim2.fromOffset(76, 30), Position = UDim2.new(1, -10, 0.5, 0), AnchorPoint = Vector2.new(1, 0.5), BackgroundColor3 = o.color, Text = o.button, TextColor3 = C.white, TextSize = 12, Font = Enum.Font.GothamBold, AutoButtonColor = false, Parent = item, }, { pill() }) b.Activated:Connect(function() tw(b, 0.1, { Size = UDim2.fromOffset(70, 28) }) task.delay(0.1, function() tw(b, 0.3, { Size = UDim2.fromOffset(76, 30) }, Enum.EasingStyle.Back) end) task.spawn(o.onPress, p) end) end end end bind(Players.PlayerAdded, function() task.defer(refresh) end) bind(Players.PlayerRemoving, function() task.defer(refresh) end) refresh() end ------------------------------------------------------------ main window local W, H = 520, 340 local vp = Workspace.CurrentCamera and Workspace.CurrentCamera.ViewportSize or Vector2.new(800, 400) local base = math.clamp(vp.Y / 430, 0.55, 1) local Root = new("Frame", { Size = UDim2.fromOffset(W, H), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Visible = false, Parent = Gui, }) local Holder = new("Frame", { Size = UDim2.fromScale(1, 1), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Parent = Root, }) local RootScale = new("UIScale", { Scale = base * 0.85, Parent = Holder }) local Shadow = new("ImageLabel", { Size = UDim2.new(1, 70, 1, 70), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Image = "rbxassetid://6014261993", ImageColor3 = Color3.new(0, 0, 0), ImageTransparency = 1, ScaleType = Enum.ScaleType.Slice, SliceCenter = Rect.new(49, 49, 450, 450), Parent = Holder, }) local Main = new("CanvasGroup", { Size = UDim2.fromScale(1, 1), BorderSizePixel = 0, GroupTransparency = 1, Parent = Holder, }, { stroke(C.white, 0.9) }) themed(Main, "BackgroundColor3", "bg") roundedCard(Main, 1) local SIDE = 140 local Side = new("Frame", { Size = UDim2.fromOffset(SIDE, H), BorderSizePixel = 0, Parent = Main }) themed(Side, "BackgroundColor3", "side") new("Frame", { Size = UDim2.new(0, 1, 1, 0), Position = UDim2.new(1, -1, 0, 0), BackgroundColor3 = C.white, BackgroundTransparency = 0.93, BorderSizePixel = 0, Parent = Side, }) local Logo = new("Frame", { Size = UDim2.fromOffset(34, 34), Position = UDim2.new(0, 12, 0, 12), BorderSizePixel = 0, Parent = Side, }, { pill(), new("UIGradient", { Rotation = 135, Color = ColorSequence.new(C.accent, C.purple) }) }) new("TextLabel", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Text = "M", TextColor3 = C.white, TextSize = 19, Font = Enum.Font.GothamBlack, Parent = Logo, }) new("TextLabel", { Size = UDim2.fromOffset(80, 18), Position = UDim2.new(0, 54, 0, 12), BackgroundTransparency = 1, Text = "MiroHub", TextColor3 = C.text, TextSize = 16, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Side, }) new("TextLabel", { Size = UDim2.fromOffset(80, 14), Position = UDim2.new(0, 54, 0, 30), BackgroundTransparency = 1, Text = "MM2 - v2.1", TextColor3 = C.sub, TextSize = 10, Font = Enum.Font.Gotham, TextXAlignment = Enum.TextXAlignment.Left, Parent = Side, }) -- order matters: pages[] index follows this list local tabNames = { "Combat", "Visual", "Fling", "Teleports", "Player", "Map", "Settings", "Custom UI", "Avatar" } local tabIcons = { "aim", "eye", "bolt", "port", "person", "map", "sliders", "palette", "spark" } local tabSubs = { "Aim, auto-kill, farming and gun tools", "Highlights, sky and shaders", "Send players flying", "Jump to spawn and players", "Movement, fly and protection", "Find and vote for the next map", "Config, UI and unload", "Look and feel of the menu", "Sights, avatar, animations, FX, boombox", } local TAB_H, TAB_GAP, TAB_Y = 29, 2, 56 local Indicator = new("Frame", { Size = UDim2.fromOffset(SIDE - 20, TAB_H), Position = UDim2.fromOffset(10, TAB_Y), BorderSizePixel = 0, Parent = Side, }, { pill() }) themed(Indicator, "BackgroundColor3", "accent") local Top = new("Frame", { Size = UDim2.fromOffset(W - SIDE, 56), Position = UDim2.fromOffset(SIDE, 0), BackgroundTransparency = 1, Parent = Main, }) local PageTitle = new("TextLabel", { Size = UDim2.fromOffset(300, 26), Position = UDim2.fromOffset(14, 8), BackgroundTransparency = 1, Text = "Combat", TextColor3 = C.text, TextSize = 20, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Top, }) local PageSub = new("TextLabel", { Size = UDim2.fromOffset(300, 14), Position = UDim2.fromOffset(14, 34), BackgroundTransparency = 1, Text = tabSubs[1], TextColor3 = C.sub, TextSize = 11, Font = Enum.Font.Gotham, TextXAlignment = Enum.TextXAlignment.Left, Parent = Top, }) local CloseBtn = new("TextButton", { Size = UDim2.fromOffset(32, 32), Position = UDim2.new(1, -14, 0, 12), AnchorPoint = Vector2.new(1, 0), Text = "", AutoButtonColor = false, Parent = Top, }, { pill() }) themed(CloseBtn, "BackgroundColor3", "card2") bar(CloseBtn, 11, 2.4, 0, 0, 45, C.text); bar(CloseBtn, 11, 2.4, 0, 0, -45, C.text) CloseBtn.MouseEnter:Connect(function() tw(CloseBtn, 0.2, { BackgroundColor3 = C.red }) end) CloseBtn.MouseLeave:Connect(function() tw(CloseBtn, 0.2, { BackgroundColor3 = C.card2 }) end) local Body = new("Frame", { Size = UDim2.fromOffset(W - SIDE - 24, H - 68), Position = UDim2.fromOffset(SIDE + 12, 58), BackgroundTransparency = 1, ClipsDescendants = true, Parent = Main, }) local pages, tabBtns = {}, {} local function makePage() return new("ScrollingFrame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 0, CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.Y, Visible = false, Parent = Body, }, { new("UIListLayout", { Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder }), new("UIPadding", { PaddingTop = UDim.new(0, 2), PaddingBottom = UDim.new(0, 8) }), }) end local function animatePage(page) local i = 0 for _, r in ipairs(page:GetChildren()) do if r:IsA("CanvasGroup") then i += 1 r.GroupTransparency = 1 local s = r:FindFirstChildOfClass("UIScale") if s then s.Scale = 0.92 end task.delay(math.min(i, 8) * 0.04, function() tw(r, 0.3, { GroupTransparency = 0 }) if s then tw(s, 0.4, { Scale = 1 }, Enum.EasingStyle.Back) end end) end end end local current local function switchTab(i) if current == i then return end current = i PageTitle.Text = tabNames[i] PageSub.Text = tabSubs[i] for k, pg in ipairs(pages) do pg.Visible = (k == i) end for k, t in ipairs(tabBtns) do local col = (k == i) and C.white or C.sub tw(t.lbl, 0.25, { TextColor3 = col }) recolor(t.ih, col) end tw(Indicator, 0.4, { Position = UDim2.fromOffset(10, TAB_Y + (i - 1) * (TAB_H + TAB_GAP)) }, Enum.EasingStyle.Back) animatePage(pages[i]) end for i, name in ipairs(tabNames) do pages[i] = makePage() local y = TAB_Y + (i - 1) * (TAB_H + TAB_GAP) local b = new("TextButton", { Size = UDim2.fromOffset(SIDE - 20, TAB_H), Position = UDim2.fromOffset(10, y), BackgroundTransparency = 1, Text = "", AutoButtonColor = false, ZIndex = 3, Parent = Side, }) local ih = new("Frame", { Size = UDim2.fromOffset(20, 20), Position = UDim2.new(0, 12, 0.5, 0), AnchorPoint = Vector2.new(0, 0.5), BackgroundTransparency = 1, ZIndex = 3, Parent = b, }) Icons[tabIcons[i]](ih, C.sub) local lbl = new("TextLabel", { Size = UDim2.new(1, -46, 1, 0), Position = UDim2.fromOffset(42, 0), BackgroundTransparency = 1, Text = name, TextColor3 = C.sub, TextSize = 13, Font = Enum.Font.GothamBold, TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 3, Parent = b, }) tabBtns[i] = { lbl = lbl, ih = ih } b.Activated:Connect(function() switchTab(i) end) b.MouseEnter:Connect(function() if current ~= i then tw(lbl, 0.2, { TextColor3 = C.text }) end end) b.MouseLeave:Connect(function() if current ~= i then tw(lbl, 0.2, { TextColor3 = C.sub }) end end) end ------------------------------------------------------------ features -- 1 Combat sectionLabel(pages[1], "Aim") makeRow(pages[1], { key = "aim", name = "AimBot", sub = "Closest player inside the FOV circle", icon = "aim", color = C.blue, callback = function(v) State.Aim = v; refreshAimUI() end }) makeRow(pages[1], { key = "aimMurd", name = "AimBot Murderer", sub = "Only locks onto the murderer", icon = "aim", color = C.red, callback = function(v) State.AimMurd = v; refreshAimUI() end }) makeRow(pages[1], { key = "aimSheriff", name = "AimBot Sheriff", sub = "Only locks onto the sheriff", icon = "aim", color = C.teal, callback = function(v) State.AimSheriff = v; refreshAimUI() end }) makeSlider(pages[1], { key = "aimFov", name = "Aim FOV", min = 60, max = 400, step = 10, value = CFG.AimFOV, callback = function(v) CFG.AimFOV = v; FOVRing.Size = UDim2.fromOffset(v * 2, v * 2) end }) makeSlider(pages[1], { key = "aimSmooth", name = "Aim smoothness", min = 5, max = 100, step = 5, value = 30, fmt = function(v) return v .. "%" end, callback = function(v) CFG.AimSmooth = v / 100 end }) sectionLabel(pages[1], "Auto kill") makeRow(pages[1], { key = "killMurd", name = "Auto Kill Murderer", sub = "Needs the gun, grabs it if dropped", icon = "gun", color = C.red, callback = function(v) State.KillMurderer = v end }) makeRow(pages[1], { key = "killSheriff", name = "Auto Kill Sheriff", sub = "Needs the knife (murderer)", icon = "kill", color = C.pink, callback = function(v) State.KillSheriff = v end }) makeRow(pages[1], { key = "killAll", nosave = true, name = "Auto Kill All", sub = "Pulls everyone to you, then stabs", icon = "all", color = C.red, callback = function(v) State.KillAll = v end }) makeRow(pages[1], { key = "autoGun", name = "Auto Grab Gun", sub = "Picks up the dropped gun the moment it appears", icon = "gun", color = C.teal, callback = function(v) State.AutoGun = v end }) makeSlider(pages[1], { key = "killDelay", name = "Kill interval", min = 0.05, max = 2, step = 0.05, value = CFG.KillDelay, fmt = function(v) return string.format("%.2fs", v) end, callback = function(v) CFG.KillDelay = v end }) sectionLabel(pages[1], "Farm") makeRow(pages[1], { key = "coinFarm", name = "Coin autofarm", sub = "Walks to coins and collects them", icon = "bolt", color = C.yellow, callback = function(v) State.CoinFarm = v end }) makeSlider(pages[1], { key = "coinDelay", name = "Coin delay", min = 0.1, max = 2, step = 0.1, value = CFG.CoinDelay, fmt = function(v) return string.format("%.1fs", v) end, callback = function(v) CFG.CoinDelay = v end }) -- 2 Visual sectionLabel(pages[2], "Overlays") makeRow(pages[2], { key = "esp", name = "ESP", sub = "Role colors, names, through walls", icon = "eye", color = C.green, callback = function(v) State.ESP = v; if not v then clearAllESP() end end }) sectionLabel(pages[2], "Lighting") makeRow(pages[2], { key = "shaders", name = "Shaders", sub = "Bloom, color grade, sun rays, depth of field", icon = "sun", color = C.yellow, callback = function(v) State.Shaders = v; applyShaders() end }) makeSlider(pages[2], { key = "shaderPow", name = "Shader strength", min = 10, max = 150, step = 5, value = CFG.Shader, fmt = function(v) return v .. "%" end, callback = function(v) CFG.Shader = v; if State.Shaders then applyShaders() end end }) makeRow(pages[2], { key = "sky", name = "Sky", sub = "Custom sky, stars and atmosphere", icon = "spark", color = C.purple, callback = function(v) State.Sky = v; applySky() end }) local skyNames = {} for i, p in ipairs(SkyPresets) do skyNames[i] = p.name end makeChoice(pages[2], { key = "skyPreset", name = "Sky preset", options = skyNames, default = 1, callback = function(i) CFG.SkyPreset = i; if State.Sky then applySky() end end }) -- 3 Fling sectionLabel(pages[3], "Auto fling") makeRow(pages[3], { key = "autoFlingMurd", name = "Auto fling Murderer", sub = "Keeps flinging the murderer while on", icon = "kill", color = C.red, callback = function(v) State.AutoFlingMurd = v end }) makeRow(pages[3], { key = "autoFlingSheriff", name = "Auto fling Sheriff", sub = "Keeps flinging the sheriff while on", icon = "kill", color = C.blue, callback = function(v) State.AutoFlingSheriff = v end }) makeSlider(pages[3], { key = "autoFlingDelay", name = "Auto fling interval", min = 1, max = 10, step = 1, value = CFG.AutoFlingDelay, fmt = function(v) return v .. "s" end, callback = function(v) CFG.AutoFlingDelay = v end }) sectionLabel(pages[3], "Fling") makeRow(pages[3], { key = "flingAll", nosave = true, name = "Fling All", sub = "Goes through every player in turn", icon = "fling", color = C.purple, callback = function(v) State.FlingAll = v; if v then startFlingAll() end end }) makeRow(pages[3], { name = "Fling Murderer", sub = "One run on the murderer", icon = "kill", color = C.red, kind = "action", callback = function() pcall(refreshRoles) local m = findRole("Murderer") if m then flingPlayer(m) else toast("No murderer found") end end }) makeRow(pages[3], { name = "Fling Sheriff", sub = "One run on the sheriff", icon = "kill", color = C.blue, kind = "action", callback = function() pcall(refreshRoles) local s = findSheriff() if s then flingPlayer(s) else toast("No sheriff found") end end }) makeSlider(pages[3], { key = "flingPow", name = "Fling power", min = 10, max = 200, step = 10, value = CFG.FlingPower, callback = function(v) CFG.FlingPower = v end }) makeSlider(pages[3], { key = "flingTime", name = "Time per player", min = 0.5, max = 5, step = 0.5, value = CFG.FlingTime, fmt = function(v) return string.format("%.1fs", v) end, callback = function(v) CFG.FlingTime = v end }) makePlayerList(pages[3], { title = "PLAYERS", button = "Fling", color = C.purple, onPress = flingPlayer }) -- 4 Teleports sectionLabel(pages[4], "Quick travel") makeRow(pages[4], { name = "TP to Spawn", sub = "Back to the lobby", icon = "home", color = C.orange, kind = "action", callback = function() tpTo(spawnCF()) end }) makeRow(pages[4], { name = "TP to Murderer", sub = "Lands behind them", icon = "port", color = C.red, kind = "action", callback = function() pcall(refreshRoles) local m = findRole("Murderer") if m and hrp(m) then tpTo(hrp(m).CFrame * CFrame.new(0, 0, 4)) else toast("No murderer found") end end }) makeRow(pages[4], { name = "TP to Sheriff", sub = "Lands behind them", icon = "port", color = C.blue, kind = "action", callback = function() pcall(refreshRoles) local s = findSheriff() if s and hrp(s) then tpTo(hrp(s).CFrame * CFrame.new(0, 0, 4)) else toast("No sheriff found") end end }) makePlayerList(pages[4], { title = "TELEPORT TO PLAYER", button = "TP", color = C.teal, onPress = function(p) if hrp(p) then tpTo(hrp(p).CFrame * CFrame.new(0, 0, 3)) else toast("Player has no character") end end }) -- 5 Player sectionLabel(pages[5], "Movement") makeRow(pages[5], { key = "fly", name = "Fly", sub = "Move with your stick, look up to climb", icon = "fly", color = C.blue, callback = function(v) State.Fly = v; if v then startFly() else stopFly() end end }) makeSlider(pages[5], { key = "flySpeed", name = "Fly speed", min = 20, max = 200, step = 5, value = CFG.FlySpeed, callback = function(v) CFG.FlySpeed = v end }) makeRow(pages[5], { key = "speed", name = "SpeedHack", sub = "WalkSpeed boost", icon = "speed", color = C.yellow, callback = function(v) State.Speed = v; if not v then local h = hum(); if h then h.WalkSpeed = 16 end end end }) makeSlider(pages[5], { key = "walkSpeed", name = "Walk speed", min = 16, max = 150, step = 2, value = CFG.Speed, callback = function(v) CFG.Speed = v end }) makeRow(pages[5], { key = "jump", name = "JumpHack", sub = "Infinite jump + jump power", icon = "jump", color = C.orange, callback = function(v) State.InfJump = v; if not v then local h = hum(); if h then h.JumpPower = 50 end end end }) makeSlider(pages[5], { key = "jumpPower", name = "Jump power", min = 50, max = 200, step = 5, value = CFG.Jump, callback = function(v) CFG.Jump = v end }) sectionLabel(pages[5], "Protection") makeRow(pages[5], { key = "noclip", name = "Noclip", sub = "Walk through walls", icon = "ghost", color = C.teal, callback = function(v) State.Noclip = v end }) makeRow(pages[5], { key = "antifling", name = "Anti-Fling", sub = "Blocks flings, spin spikes and void throws", icon = "shield", color = C.green, callback = function(v) State.AntiFling = v end }) Reg.antifling(true) -- 6 Map sectionLabel(pages[6], "Scan") makeRow(pages[6], { name = "Scan vote cards", sub = "Finds card parts, prints them to console", icon = "map", color = C.teal, kind = "action", callback = function() VoteCards = scanVoteCards() toast("Found " .. #VoteCards .. " vote parts") end }) sectionLabel(pages[6], "Vote") for i = 1, 3 do makeRow(pages[6], { name = "Vote map " .. i, sub = "Stands on card " .. i .. " and touches it", icon = "map", color = C.green, kind = "action", callback = function() voteCard(i) end }) end -- 7 Settings local selSlot = 1 local FOLDER = "MiroHub" local FS = (writefile and readfile and isfile and makefolder) and true or false local function cfgPath(i) return FOLDER .. "/config" .. i .. ".json" end local function saveCfg(i, quiet) if not FS then if not quiet then toast("Executor has no file access") end; return end pcall(makefolder, FOLDER) local ok = pcall(function() writefile(cfgPath(i), HttpService:JSONEncode({ flags = Flags, vals = Vals })) end) pcall(function() writefile(FOLDER .. "/_meta.json", HttpService:JSONEncode({ slot = i })) end) Dirty = false if not quiet then toast(ok and ("Saved Config " .. i) or "Save failed") end end local function loadCfg(i, quiet) if not FS or not isfile(cfgPath(i)) then if not quiet then toast("Config " .. i .. " is empty") end; return end local ok, data = pcall(function() return HttpService:JSONDecode(readfile(cfgPath(i))) end) if not (ok and type(data) == "table") then if not quiet then toast("Config is corrupted") end; return end for k, v in pairs(data.vals or {}) do if Reg[k] then pcall(Reg[k], v) end end for k, v in pairs(data.flags or {}) do if Reg[k] and not NoSave[k] then pcall(Reg[k], v) end end Dirty = false if not quiet then toast("Loaded Config " .. i) end end sectionLabel(pages[7], "Display") makeSlider(pages[7], { key = "uiSize", name = "Size UI", min = 60, max = 130, step = 5, value = 100, fmt = function(v) return v .. "%" end, callback = function(v) userScale = v / 100 if isOpen then tw(RootScale, 0.2, { Scale = base * userScale }) end end }) sectionLabel(pages[7], "Configs") local _, selectSlot = makeChoice(pages[7], { name = "Select config", options = { "Config 1", "Config 2", "Config 3" }, default = 1, callback = function(i) selSlot = i end }) makeRow(pages[7], { name = "Save config", sub = "Writes the selected config to your executor folder", icon = "save", color = C.green, kind = "action", callback = function() saveCfg(selSlot) end }) makeRow(pages[7], { name = "Load config", sub = "Applies the selected config", icon = "save", color = C.blue, kind = "action", callback = function() loadCfg(selSlot) end }) makeRow(pages[7], { key = "autosave", name = "Auto-save config", sub = "Saves changes every few seconds", icon = "save", color = C.teal, callback = function() end }) sectionLabel(pages[7], "Tools") makeRow(pages[7], { name = "Inspect tools", sub = "Print Knife/Gun remotes to console", icon = "eye", color = C.teal, kind = "action", callback = inspectTools }) makeRow(pages[7], { name = "Unload", sub = "Remove MiroHub completely", icon = "kill", color = C.red, kind = "action", callback = function() task.wait(0.3); unload() end }) -- 8 Custom UI local function updateAccent() C.accent = Color3.fromRGB(CFG.accR, CFG.accG, CFG.accB) applyTheme() end local accentColors = { Color3.fromRGB(110, 100, 255), Color3.fromRGB(10, 132, 255), Color3.fromRGB(48, 209, 88), Color3.fromRGB(255, 69, 58), Color3.fromRGB(255, 159, 10), Color3.fromRGB(255, 55, 95), Color3.fromRGB(235, 235, 240), } sectionLabel(pages[8], "Accent") makeSwatches(pages[8], { name = "Accent color", colors = accentColors, default = 1, callback = function(col) for key, ch in pairs({ accR = col.R, accG = col.G, accB = col.B }) do if Reg[key] then Reg[key](math.floor(ch * 255 + 0.5)) end end end }) makeSlider(pages[8], { key = "accR", name = "Accent red", min = 0, max = 255, step = 1, value = CFG.accR, callback = function(v) CFG.accR = v; updateAccent() end }) makeSlider(pages[8], { key = "accG", name = "Accent green", min = 0, max = 255, step = 1, value = CFG.accG, callback = function(v) CFG.accG = v; updateAccent() end }) makeSlider(pages[8], { key = "accB", name = "Accent blue", min = 0, max = 255, step = 1, value = CFG.accB, callback = function(v) CFG.accB = v; updateAccent() end }) sectionLabel(pages[8], "Streaming") makeRow(pages[8], { key = "streamer", name = "Streamer mode", sub = "Hides the M button, RightShift still works", icon = "eye", color = C.teal, callback = function(v) State.Streamer = v; if applyStreamerFn then applyStreamerFn() end end }) sectionLabel(pages[8], "Surface") makeSwatches(pages[8], { key = "switchIdx", name = "Switch color", default = 1, colors = { Color3.fromRGB(48, 209, 88), Color3.fromRGB(10, 132, 255), Color3.fromRGB(191, 90, 242), Color3.fromRGB(255, 159, 10), Color3.fromRGB(255, 55, 95), Color3.fromRGB(235, 235, 240), }, callback = function(col) C.switch = col; applyTheme() end }) makeSlider(pages[8], { key = "bgV", name = "Background brightness", min = 0, max = 30, step = 1, value = CFG.bgV, callback = function(v) CFG.bgV = v C.bg = Color3.fromRGB(v, v, v + 2) C.side = Color3.fromRGB(math.floor(v * 0.55), math.floor(v * 0.55), math.floor(v * 0.55) + 2) C.card = Color3.fromRGB(v + 10, v + 10, v + 14) C.card2 = Color3.fromRGB(v + 31, v + 31, v + 38) applyTheme() end }) makeSlider(pages[8], { key = "radius", name = "Corner roundness", min = 4, max = 34, step = 1, value = CFG.radius, callback = function(v) CFG.radius = v; applyTheme() end }) -- 9 Avatar local boomId = "" sectionLabel(pages[9], "Sights") makeRow(pages[9], { key = "sights", name = "Custom sights", sub = "Crosshair at screen center", icon = "aim", color = C.red, callback = function(v) State.Sights = v end }) makeRow(pages[9], { key = "sightsShift", name = "Only while Shift", sub = "Shows on Shift or while shift lock is on", icon = "aim", color = C.orange, callback = function(v) State.SightsShiftOnly = v end }) makeRow(pages[9], { key = "shiftLock", name = "Shift lock", sub = "Character follows the camera, shoulder offset", icon = "aim", color = C.teal, callback = function(v) State.ShiftLock = v; if not v then stopShiftLock() end end }) makeChoice(pages[9], { key = "crossStyle", name = "Sight style", options = { "Cross", "Dot", "Circle", "Cross + dot" }, default = 1, callback = function(i) CFG.CrossStyle = i; buildCross() end }) makeSlider(pages[9], { key = "crossSize", name = "Sight size", min = 3, max = 30, step = 1, value = CFG.CrossSize, callback = function(v) CFG.CrossSize = v; buildCross() end }) makeSlider(pages[9], { key = "crossThick", name = "Sight thickness", min = 1, max = 6, step = 1, value = CFG.CrossThick, callback = function(v) CFG.CrossThick = v; buildCross() end }) makeSwatches(pages[9], { key = "crossCol", name = "Sight color", colors = FXColors, default = 7, callback = function(col) CFG.CrossColor = col; buildCross() end }) sectionLabel(pages[9], "Avatar (only you see it)") makeRow(pages[9], { key = "headless", name = "Fake Headless", sub = "Hides head and face", icon = "head", color = C.purple, callback = function(v) State.Headless = v; applyAvatar() end }) makeRow(pages[9], { key = "korblox", name = "Fake Korblox", sub = "R15 only, swaps the right leg mesh", icon = "person", color = C.red, callback = function(v) State.Korblox = v; applyAvatar() end }) sectionLabel(pages[9], "Animations") local animNames = {} for i, p in ipairs(AnimPacks) do animNames[i] = p.name end makeChoice(pages[9], { key = "animPack", name = "Walk / idle pack", options = animNames, default = 1, callback = function(i) animIdx = i; task.spawn(setPack, currentPack()) end }) makeInput(pages[9], { key = "animWalk", name = "Custom walk ID", placeholder = "catalog ID", callback = function(t) AnimCustom.walk = tonumber(t:match("%d+")); if AnimPacks[animIdx].custom then task.spawn(setPack, AnimCustom) end end }) makeInput(pages[9], { key = "animRun", name = "Custom run ID", placeholder = "catalog ID", callback = function(t) AnimCustom.run = tonumber(t:match("%d+")); if AnimPacks[animIdx].custom then task.spawn(setPack, AnimCustom) end end }) makeInput(pages[9], { key = "animIdle", name = "Custom idle ID", placeholder = "catalog ID", callback = function(t) local n = tonumber(t:match("%d+")); AnimCustom.idle1 = n; AnimCustom.idle2 = n if AnimPacks[animIdx].custom then task.spawn(setPack, AnimCustom) end end }) local emoteId = "" makeInput(pages[9], { name = "Play animation ID", placeholder = "any animation ID", callback = function(t) emoteId = t end }) makeRow(pages[9], { name = "Play animation", sub = "Loops until you stop it", icon = "anim", color = C.green, kind = "action", callback = function() playEmote(emoteId) end }) makeRow(pages[9], { name = "Stop animation", sub = "", icon = "kill", color = C.red, kind = "action", callback = stopEmote }) sectionLabel(pages[9], "Movement FX") makeRow(pages[9], { key = "spin", name = "Spin", sub = "Rotate on the spot", icon = "spin", color = C.blue, callback = function(v) State.Spin = v end }) makeSlider(pages[9], { key = "spinSpeed", name = "Spin speed", min = 30, max = 1440, step = 30, value = CFG.SpinSpeed, fmt = function(v) return v .. "°/s" end, callback = function(v) CFG.SpinSpeed = v end }) makeRow(pages[9], { key = "aura", name = "Aura", sub = "Glowing particles around you", icon = "spark", color = C.purple, callback = function(v) State.Aura = v; applyAura() end }) makeSlider(pages[9], { key = "auraRate", name = "Aura density", min = 5, max = 100, step = 5, value = CFG.AuraRate, callback = function(v) CFG.AuraRate = v; if State.Aura then applyAura() end end }) makeRow(pages[9], { key = "prints", name = "Footprints", sub = "Glowing steps that fade out", icon = "foot", color = C.teal, callback = function(v) State.Prints = v end }) makeSlider(pages[9], { key = "printLife", name = "Footprint lifetime", min = 1, max = 15, step = 1, value = CFG.PrintLife, fmt = function(v) return v .. "s" end, callback = function(v) CFG.PrintLife = v end }) makeSwatches(pages[9], { key = "fxCol", name = "Aura / footprint color", colors = FXColors, default = 1, callback = function(col) CFG.FXColor = col; if State.Aura then applyAura() end end }) sectionLabel(pages[9], "Boombox (only you hear it)") makeInput(pages[9], { key = "boomId", name = "Sound ID", placeholder = "audio asset ID", callback = function(t) boomId = t end }) makeRow(pages[9], { name = "Play", sub = "Plays the ID above", icon = "music", color = C.green, kind = "action", callback = function() playBoom(boomId) end }) makeRow(pages[9], { name = "Stop", sub = "", icon = "kill", color = C.red, kind = "action", callback = function() Boom:Stop() end }) makeRow(pages[9], { key = "boomLoop", name = "Loop", sub = "Repeat the track", icon = "music", color = C.blue, callback = function(v) Boom.Looped = v end }) Reg.boomLoop(true) makeSlider(pages[9], { key = "boomVol", name = "Volume", min = 0, max = 100, step = 5, value = 50, fmt = function(v) return v .. "%" end, callback = function(v) Boom.Volume = v / 100 * 2 end }) makeSlider(pages[9], { key = "boomSpeed", name = "Playback speed", min = 50, max = 200, step = 5, value = 100, fmt = function(v) return v .. "%" end, callback = function(v) Boom.PlaybackSpeed = v / 100 end }) ------------------------------------------------------------ open / close local function setOpen(v) isOpen = v if v then Root.Visible = true tw(RootScale, 0.5, { Scale = base * userScale }, Enum.EasingStyle.Back) tw(Main, 0.3, { GroupTransparency = 0 }) tw(Shadow, 0.4, { ImageTransparency = 0.4 }) if current then animatePage(pages[current]) end else tw(RootScale, 0.25, { Scale = base * userScale * 0.85 }, Enum.EasingStyle.Quad, Enum.EasingDirection.In) tw(Main, 0.25, { GroupTransparency = 1 }) tw(Shadow, 0.25, { ImageTransparency = 1 }) task.delay(0.28, function() if not isOpen then Root.Visible = false end end) end end CloseBtn.Activated:Connect(function() setOpen(false); toast("Tap the M orb to reopen") end) local dragging, dragStart, startPos local function makeDraggable(handle) handle.InputBegan:Connect(function(i) if isPress(i) then dragging, dragStart, startPos = true, i.Position, Root.Position end end) end makeDraggable(Top) makeDraggable(Side) bind(UIS.InputChanged, function(i) if dragging and isMove(i) then local d = i.Position - dragStart Root.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y) end end) bind(UIS.InputEnded, function(i) if dragging and isPress(i) then dragging = false end end) bind(UIS.InputBegan, function(i, gp) if not gp and i.KeyCode == Enum.KeyCode.RightShift then setOpen(not isOpen) end end) -- orb (tap = toggle, drag = move). Stays tappable while hidden in streamer mode. local Orb = new("TextButton", { Size = UDim2.fromOffset(50, 50), Position = UDim2.new(0, 14, 0.5, 0), AnchorPoint = Vector2.new(0, 0.5), Text = "M", TextColor3 = C.white, TextSize = 22, Font = Enum.Font.GothamBlack, AutoButtonColor = false, Visible = false, Parent = Gui, }, { pill(), stroke(C.white, 0.55, 1.5) }) themed(Orb, "BackgroundColor3", "bg") local Pulse = new("Frame", { Size = UDim2.fromOffset(50, 50), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundTransparency = 1, Parent = Orb, }, { pill(), stroke(C.white, 0.3, 2) }) local orbDrag, orbStart, orbPos, orbMoved = false, nil, nil, 0 Orb.InputBegan:Connect(function(i) if isPress(i) then orbDrag, orbStart, orbPos, orbMoved = true, i.Position, Orb.Position, 0 end end) bind(UIS.InputChanged, function(i) if orbDrag and isMove(i) then local d = i.Position - orbStart orbMoved = math.max(orbMoved, d.Magnitude) if orbMoved > 8 then Orb.Position = UDim2.new(orbPos.X.Scale, orbPos.X.Offset + d.X, orbPos.Y.Scale, orbPos.Y.Offset + d.Y) end end end) bind(UIS.InputEnded, function(i) if orbDrag and isPress(i) then orbDrag = false if orbMoved <= 8 then tw(Orb, 0.1, { Size = UDim2.fromOffset(44, 44) }) task.delay(0.1, function() tw(Orb, 0.35, { Size = UDim2.fromOffset(50, 50) }, Enum.EasingStyle.Back) end) setOpen(not isOpen) end end end) task.spawn(function() while running do Pulse.Size = UDim2.fromOffset(50, 50) Pulse.UIStroke.Transparency = 0.3 tw(Pulse, 1.6, { Size = UDim2.fromOffset(74, 74) }) tw(Pulse.UIStroke, 1.6, { Transparency = 1 }) task.wait(1.8) end end) -- streamer mode: the orb turns invisible but stays tappable applyStreamerFn = function() local on = State.Streamer and true or false local t = on and 1 or 0 tw(Orb, 0.3, { BackgroundTransparency = t, TextTransparency = t }) local os = Orb:FindFirstChildOfClass("UIStroke") if os then tw(os, 0.3, { Transparency = on and 1 or 0.55 }) end Pulse.Visible = not on end ------------------------------------------------------------ config autoload / autosave applyTheme() if FS then pcall(function() if isfile(FOLDER .. "/_meta.json") then local meta = HttpService:JSONDecode(readfile(FOLDER .. "/_meta.json")) if meta and meta.slot then selSlot = math.clamp(meta.slot, 1, 3); selectSlot(selSlot) end end end) loadCfg(selSlot, true) end task.spawn(function() while running do task.wait(4) if Flags.autosave and Dirty then saveCfg(selSlot, true) end end end) ------------------------------------------------------------ loader local Dim = new("Frame", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 1, BorderSizePixel = 0, Parent = Gui }) local Card = new("CanvasGroup", { Size = UDim2.fromOffset(280, 190), Position = UDim2.fromScale(0.5, 0.5), AnchorPoint = Vector2.new(0.5, 0.5), BackgroundColor3 = Color3.fromRGB(12, 12, 15), BorderSizePixel = 0, GroupTransparency = 1, Parent = Gui, }, { corner(UDim.new(0, 28)), stroke(C.white, 0.9) }) local CardScale = new("UIScale", { Scale = 0.8, Parent = Card }) local Spin = new("Frame", { Size = UDim2.fromOffset(60, 60), Position = UDim2.new(0.5, 0, 0, 22), AnchorPoint = Vector2.new(0.5, 0), BackgroundTransparency = 1, Parent = Card, }, { pill() }) local SpinStroke = new("UIStroke", { Thickness = 4, Color = C.white, ApplyStrokeMode = Enum.ApplyStrokeMode.Border, Parent = Spin }) local SpinGrad = new("UIGradient", { Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0), NumberSequenceKeypoint.new(0.55, 1), NumberSequenceKeypoint.new(1, 0) }), Parent = SpinStroke, }) new("TextLabel", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Text = "M", TextColor3 = C.text, TextSize = 26, Font = Enum.Font.GothamBlack, Parent = Spin }) new("TextLabel", { Size = UDim2.new(1, 0, 0, 26), Position = UDim2.new(0, 0, 0, 92), BackgroundTransparency = 1, Text = "MiroHub", TextColor3 = C.text, TextSize = 21, Font = Enum.Font.GothamBold, Parent = Card, }) local Status = new("TextLabel", { Size = UDim2.new(1, 0, 0, 16), Position = UDim2.new(0, 0, 0, 120), BackgroundTransparency = 1, Text = "Starting", TextColor3 = C.sub, TextSize = 12, Font = Enum.Font.Gotham, Parent = Card, }) local Track = new("Frame", { Size = UDim2.fromOffset(220, 6), Position = UDim2.new(0.5, 0, 0, 152), AnchorPoint = Vector2.new(0.5, 0), BackgroundColor3 = C.card2, BorderSizePixel = 0, Parent = Card, }, { pill() }) local Fill = new("Frame", { Size = UDim2.fromScale(0, 1), BackgroundColor3 = C.white, BorderSizePixel = 0, Parent = Track }, { pill() }) bind(RunService.RenderStepped, function(dt) SpinGrad.Rotation = (SpinGrad.Rotation + dt * 360) % 360 end) task.spawn(function() tw(Dim, 0.4, { BackgroundTransparency = 0.4 }) tw(Card, 0.4, { GroupTransparency = 0 }) tw(CardScale, 0.55, { Scale = 1 }, Enum.EasingStyle.Back) local steps = { { "Initializing core", 0.2 }, { "Loading config", 0.45 }, { "Syncing roles", 0.7 }, { "Building interface", 0.9 }, { "Ready", 1 }, } for i, s in ipairs(steps) do Status.Text = s[1] tw(Fill, 0.45, { Size = UDim2.fromScale(s[2], 1) }) if i == 3 then pcall(refreshRoles) end task.wait(0.5) end task.wait(0.2) tw(Card, 0.35, { GroupTransparency = 1 }) tw(CardScale, 0.35, { Scale = 1.1 }, Enum.EasingStyle.Quad, Enum.EasingDirection.In) tw(Dim, 0.4, { BackgroundTransparency = 1 }) task.wait(0.4) Card:Destroy(); Dim:Destroy() Orb.Visible = true switchTab(1) setOpen(true) toast("MiroHub loaded") end) ------------------------------------------------------------ unload unload = function() running = false flingQueue = {} for k in pairs(State) do State[k] = false end for _, c in ipairs(Conns) do pcall(function() c:Disconnect() end) end stopFly() State.Shaders = false; applyShaders() State.Sky = false; applySky() pcall(function() Workspace.FallenPartsDestroyHeight = origFPDH end) local r = hrp() if r then r.Anchored = false end local h = hum() if h then h.WalkSpeed = 16; h.JumpPower = 50 end pcall(function() applyAvatar(); applyAura(); stopEmote(); stopShiftLock() setPack(AnimPacks[1]) Boom:Destroy(); PrintFolder:Destroy() end) Gui:Destroy() end if getgenv then getgenv().MiroHubUnload = unload end