-- ╔══════════════════════════════════════════════════════════════╗ -- ║ STEAL A BRAINROT | DUEL FINDER | Global Sync ║ -- ╚══════════════════════════════════════════════════════════════╝ -- UI style: Irish Finder (dark green, Gotham, sidebar nav) -- Logic: Global sync via jsonblob.com, scan plots, offer system local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local HttpService = game:GetService("HttpService") local UIS = game:GetService("UserInputService") local LP = Players.LocalPlayer local Plots = workspace:WaitForChild("Plots") -- ══════════════════ GLOBAL SYNC SETUP ══════════════════ -- 1. Go to https://jsonblob.com -- 2. Paste {} into the editor and hit Save -- 3. Copy the ID from the URL (the long number after jsonblob.com/) -- 4. Paste it below as a string local BLOB_ID = "019f62d4-809b-7549-8ca2-53f0541477d9" local BLOB_URL = "https://jsonblob.com/api/jsonBlob/" .. BLOB_ID -- ══════════════════ HTTP ══════════════════ local statusLabel = nil -- assigned after GUI builds local function dbg(msg, isErr) local prefix = isErr and "[SAB ✗] " or "[SAB] " print(prefix .. msg) if statusLabel then statusLabel.Text = msg statusLabel.TextColor3 = isErr and Color3.fromRGB(239, 68, 68) or Color3.fromRGB(34, 197, 94) end end local function httpReq(url, method, body) local fn = (syn and syn.request) or (http_request and http_request) or (request and request) or (http and http.request) if not fn then dbg("NO HTTP FUNCTION — enable HTTP in executor settings!", true) return nil, "no_http" end local opts = { Url = url, Method = method or "GET", Headers = { ["Content-Type"] = "application/json", ["Accept"] = "application/json", }, } if body then local ok, encoded = pcall(HttpService.JSONEncode, HttpService, body) if not ok then dbg("JSON encode failed: " .. tostring(encoded), true); return nil, "encode" end opts.Body = encoded end local ok, res = pcall(fn, opts) if not ok then dbg("HTTP error: " .. tostring(res), true); return nil, "pcall" end if not res then dbg("HTTP returned nil", true); return nil, "nil_res" end local code = tostring(res.StatusCode or res.StatusMessage or "?") dbg(method .. " → " .. code) if res.Body and #res.Body > 0 then return res.Body, code end return nil, code end local function fetchListings() if BLOB_ID == "YOUR_BLOB_ID_HERE" then dbg("BLOB_ID not set! Fill it in at the top of the script.", true) return {} end local raw, code = httpReq(BLOB_URL, "GET") if not raw then dbg("Fetch failed (" .. tostring(code) .. ")", true); return {} end local ok, data = pcall(HttpService.JSONDecode, HttpService, raw) if not ok or type(data) ~= "table" then dbg("JSON decode error — raw: " .. tostring(raw):sub(1, 60), true) return {} end local n = 0; for _ in pairs(data) do n = n + 1 end dbg("Fetched " .. n .. " listing(s)") return data end local function pushListings(t) if BLOB_ID == "YOUR_BLOB_ID_HERE" then return end local _, code = httpReq(BLOB_URL, "PUT", t) if tostring(code):sub(1, 1) == "2" then dbg("Push OK (" .. tostring(code) .. ")") else dbg("Push may have failed (" .. tostring(code) .. ")", true) end end local function addListing(data) dbg("Adding: " .. data.AnimalName) local all = fetchListings() all[data.AnimalName .. "_" .. data.User] = data pushListings(all) end local function removeListing(animal, user) dbg("Removing: " .. animal) local all = fetchListings() all[animal .. "_" .. user] = nil pushListings(all) end -- ══════════════════ HELPERS ══════════════════ local function findAnimator(m) return m:FindFirstChildWhichIsA("Animator", true) end local function tw(obj, props, t, style, dir) TweenService:Create(obj, TweenInfo.new( t or 0.2, style or Enum.EasingStyle.Quart, dir or Enum.EasingDirection.Out ), props):Play() end -- ══════════════════ PALETTE (Irish Finder green) ══════════════════ local C = { WIN = Color3.fromRGB(5, 8, 6), PANEL = Color3.fromRGB(8, 13, 9), CARD = Color3.fromRGB(11, 17, 13), CARD_H = Color3.fromRGB(13, 20, 15), ACCENT = Color3.fromRGB(34, 197, 94), ACCENT2 = Color3.fromRGB(21, 128, 61), BORDER = Color3.fromRGB(20, 38, 26), TEXT = Color3.fromRGB(220, 255, 230), TSUB = Color3.fromRGB(134, 180, 150), TMUTE = Color3.fromRGB(60, 90, 68), DANGER = Color3.fromRGB(239, 68, 68), WARN = Color3.fromRGB(255, 185, 55), SUCCESS = Color3.fromRGB(34, 197, 94), } -- ══════════════════ DESTROY OLD GUI ══════════════════ pcall(function() local old = game:GetService("CoreGui"):FindFirstChild("SABDuelFinder") or LP:FindFirstChild("PlayerGui") and LP.PlayerGui:FindFirstChild("SABDuelFinder") if old then old:Destroy() end end) -- ══════════════════ SCREEN GUI ══════════════════ local sg = Instance.new("ScreenGui") sg.Name = "SABDuelFinder" sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling sg.IgnoreGuiInset = true sg.ResetOnSpawn = false pcall(function() sg.Parent = game:GetService("CoreGui") end) if not sg.Parent then sg.Parent = LP.PlayerGui end -- ══════════════════ MAIN WINDOW ══════════════════ local WIN_W, WIN_H = 800, 540 local win = Instance.new("Frame", sg) win.Name = "Win" win.Size = UDim2.new(0, WIN_W, 0, WIN_H) win.Position = UDim2.new(0.5, -WIN_W/2, 0.5, -WIN_H/2) win.BackgroundColor3 = C.WIN win.ClipsDescendants = true win.Active = true win.BorderSizePixel = 0 local winCorner = Instance.new("UICorner", win) winCorner.CornerRadius = UDim.new(0, 14) local winStroke = Instance.new("UIStroke", win) winStroke.Color = Color3.fromRGB(26, 175, 58) winStroke.Thickness = 1.5 winStroke.Transparency = 0.28 -- ══════════════════ SIDEBAR ══════════════════ local SIDE_W = 56 local sidebar = Instance.new("Frame", win) sidebar.Name = "Sidebar" sidebar.Size = UDim2.new(0, SIDE_W, 1, 0) sidebar.Position = UDim2.new(0, 0, 0, 0) sidebar.BackgroundColor3 = C.PANEL sidebar.BorderSizePixel = 0 sidebar.ZIndex = 2 -- sidebar right border local sideDiv = Instance.new("Frame", sidebar) sideDiv.Size = UDim2.new(0, 1, 1, 0) sideDiv.Position = UDim2.new(1, -1, 0, 0) sideDiv.BackgroundColor3 = C.BORDER sideDiv.BorderSizePixel = 0 -- shamrock logo at top local logoLbl = Instance.new("TextLabel", sidebar) logoLbl.Size = UDim2.new(1, 0, 0, 56) logoLbl.Position = UDim2.new(0, 0, 0, 0) logoLbl.BackgroundTransparency = 1 logoLbl.Text = "☘️" logoLbl.TextSize = 22 logoLbl.TextXAlignment = Enum.TextXAlignment.Center logoLbl.TextYAlignment = Enum.TextYAlignment.Center logoLbl.Font = Enum.Font.GothamBlack logoLbl.ZIndex = 3 local sideDivider = Instance.new("Frame", sidebar) sideDivider.Size = UDim2.new(0.55, 0, 0, 1) sideDivider.Position = UDim2.new(0.225, 0, 0, 56) sideDivider.BackgroundColor3 = C.BORDER sideDivider.BorderSizePixel = 0 -- sidebar nav buttons: OFFERS (active), POST, HOST local NAVS = { { name="OFFERS", icon="⊞", yPos=68, active=true }, { name="POST", icon="⊕", yPos=124, active=false }, { name="HOST", icon="⊜", yPos=180, active=false }, } local navBtns = {} local function mkNavBtn(nav) local btn = Instance.new("TextButton", sidebar) btn.Name = nav.name btn.Size = UDim2.new(1, 0, 0, 48) btn.Position = UDim2.new(0, 0, 0, nav.yPos) btn.BackgroundTransparency = 1 btn.BorderSizePixel = 0 btn.AutoButtonColor = false btn.Text = "" btn.ZIndex = 3 -- highlight background local bh = Instance.new("Frame", btn) bh.Name = "BH" bh.Size = UDim2.new(1, 0, 1, 0) bh.BackgroundColor3 = C.ACCENT bh.BackgroundTransparency = nav.active and 0.9 or 1 bh.BorderSizePixel = 0 bh.ZIndex = 2 local bhCorner = Instance.new("UICorner", bh) bhCorner.CornerRadius = UDim.new(0, 8) -- active pill local pill = Instance.new("Frame", btn) pill.Name = "Pill" pill.Size = UDim2.new(0, 3, 0, 20) pill.Position = UDim2.new(0, 0, 0.5, -10) pill.BackgroundColor3 = C.ACCENT pill.BackgroundTransparency = nav.active and 0 or 1 pill.BorderSizePixel = 0 local pillCorner = Instance.new("UICorner", pill) pillCorner.CornerRadius = UDim.new(0, 2) -- icon local ico = Instance.new("TextLabel", btn) ico.Name = "Ico" ico.Size = UDim2.new(1, 0, 1, 0) ico.BackgroundTransparency = 1 ico.Text = nav.icon ico.TextSize = 20 ico.TextXAlignment = Enum.TextXAlignment.Center ico.TextYAlignment = Enum.TextYAlignment.Center ico.Font = Enum.Font.GothamBold ico.TextColor3 = nav.active and C.ACCENT or C.TMUTE ico.ZIndex = 4 -- tooltip label (appears to the right) local tip = Instance.new("Frame", btn) tip.Name = "Tip" tip.Size = UDim2.new(0, 72, 0, 24) tip.Position = UDim2.new(1, 6, 0.5, -12) tip.BackgroundColor3 = C.CARD tip.BackgroundTransparency = 0 tip.BorderSizePixel = 0 tip.Visible = false tip.ZIndex = 20 local tipCorner = Instance.new("UICorner", tip) tipCorner.CornerRadius = UDim.new(0, 7) local tipStroke = Instance.new("UIStroke", tip) tipStroke.Color = C.BORDER tipStroke.Thickness = 1 local tipLbl = Instance.new("TextLabel", tip) tipLbl.Size = UDim2.new(1, 0, 1, 0) tipLbl.BackgroundTransparency = 1 tipLbl.Text = nav.name tipLbl.TextSize = 10 tipLbl.TextColor3 = C.ACCENT tipLbl.Font = Enum.Font.GothamBold tipLbl.TextXAlignment = Enum.TextXAlignment.Center tipLbl.ZIndex = 21 btn.MouseEnter:Connect(function() tip.Visible = true end) btn.MouseLeave:Connect(function() tip.Visible = false end) navBtns[nav.name] = { btn=btn, bh=bh, pill=pill, ico=ico } return btn end for _, nav in ipairs(NAVS) do mkNavBtn(nav) end -- ══════════════════ HEADER ══════════════════ local header = Instance.new("Frame", win) header.Name = "Header" header.Size = UDim2.new(1, -SIDE_W, 0, 52) header.Position = UDim2.new(0, SIDE_W, 0, 0) header.BackgroundColor3 = C.PANEL header.BorderSizePixel = 0 header.ZIndex = 2 -- header bottom divider local hDiv = Instance.new("Frame", win) hDiv.Size = UDim2.new(1, -SIDE_W, 0, 2) hDiv.Position = UDim2.new(0, SIDE_W, 0, 51) hDiv.BackgroundColor3 = Color3.new(1, 1, 1) hDiv.BorderSizePixel = 0 hDiv.ZIndex = 3 local hGrad = Instance.new("UIGradient", hDiv) hGrad.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, C.ACCENT), ColorSequenceKeypoint.new(0.6, C.ACCENT2), ColorSequenceKeypoint.new(1, Color3.fromRGB(5,8,6)), }) hGrad.Rotation = 0 hGrad.Offset = Vector2.new(0.895, 0) -- title local titleLbl = Instance.new("TextLabel", header) titleLbl.Size = UDim2.new(0, 170, 0, 28) titleLbl.Position = UDim2.new(0, 14, 0, 4) titleLbl.BackgroundTransparency = 1 titleLbl.Text = "BRAINROT FINDER" titleLbl.TextColor3 = C.ACCENT titleLbl.Font = Enum.Font.GothamBlack titleLbl.TextSize = 17 titleLbl.TextXAlignment = Enum.TextXAlignment.Left titleLbl.ZIndex = 3 -- discord link local discordLbl = Instance.new("TextLabel", header) discordLbl.Size = UDim2.new(0, 200, 0, 14) discordLbl.Position = UDim2.new(0, 15, 0, 31) discordLbl.BackgroundTransparency = 1 discordLbl.Text = "discord.gg/brainrot" discordLbl.TextColor3 = C.ACCENT discordLbl.Font = Enum.Font.Gotham discordLbl.TextSize = 9 discordLbl.TextXAlignment = Enum.TextXAlignment.Left discordLbl.ZIndex = 3 -- user badge (username + green dot) local userBadge = Instance.new("Frame", header) userBadge.Size = UDim2.new(0, 136, 0, 30) userBadge.Position = UDim2.new(0, 190, 0.5, -15) userBadge.BackgroundColor3 = C.CARD userBadge.BorderSizePixel = 0 userBadge.ZIndex = 3 local ubCorner = Instance.new("UICorner", userBadge) ubCorner.CornerRadius = UDim.new(0, 8) local ubStroke = Instance.new("UIStroke", userBadge) ubStroke.Color = C.BORDER ubStroke.Thickness = 1 local ubDot = Instance.new("TextLabel", userBadge) ubDot.Size = UDim2.new(0, 24, 1, 0) ubDot.Position = UDim2.new(0, 6, 0, 0) ubDot.BackgroundTransparency = 1 ubDot.Text = "◉" ubDot.TextColor3 = C.ACCENT ubDot.TextSize = 13 ubDot.Font = Enum.Font.GothamBold ubDot.TextXAlignment = Enum.TextXAlignment.Center ubDot.ZIndex = 4 local ubName = Instance.new("TextLabel", userBadge) ubName.Size = UDim2.new(1, -30, 1, 0) ubName.Position = UDim2.new(0, 28, 0, 0) ubName.BackgroundTransparency = 1 ubName.Text = LP.Name ubName.TextColor3 = C.TEXT ubName.Font = Enum.Font.GothamBold ubName.TextSize = 11 ubName.TextXAlignment = Enum.TextXAlignment.Left ubName.ZIndex = 4 -- offer count badge local offerCountBadge = Instance.new("Frame", header) offerCountBadge.Size = UDim2.new(0, 22, 0, 22) offerCountBadge.Position = UDim2.new(1, -320, 0.5, -11) offerCountBadge.BackgroundColor3 = C.ACCENT offerCountBadge.BorderSizePixel = 0 offerCountBadge.ZIndex = 5 local ocCorner = Instance.new("UICorner", offerCountBadge) ocCorner.CornerRadius = UDim.new(1, 0) local offerCountLbl = Instance.new("TextLabel", offerCountBadge) offerCountLbl.Name = "Count" offerCountLbl.Size = UDim2.new(1, 0, 1, 0) offerCountLbl.BackgroundTransparency = 1 offerCountLbl.Text = "0" offerCountLbl.TextColor3 = Color3.fromRGB(6, 18, 10) offerCountLbl.Font = Enum.Font.GothamBold offerCountLbl.TextSize = 9 offerCountLbl.ZIndex = 6 -- accept% stepper local stepFrame = Instance.new("Frame", header) stepFrame.Size = UDim2.new(0, 84, 0, 26) stepFrame.Position = UDim2.new(1, -176, 0.5, -13) stepFrame.BackgroundColor3 = C.CARD stepFrame.BorderSizePixel = 0 stepFrame.ZIndex = 3 local sfCorner = Instance.new("UICorner", stepFrame) sfCorner.CornerRadius = UDim.new(0, 8) local sfStroke = Instance.new("UIStroke", stepFrame) sfStroke.Color = C.BORDER sfStroke.Thickness = 1 local acceptPct = 60 local minusBtn = Instance.new("TextButton", stepFrame) minusBtn.Size = UDim2.new(0, 24, 1, 0) minusBtn.Position = UDim2.new(0, 0, 0, 0) minusBtn.BackgroundTransparency = 1 minusBtn.BorderSizePixel = 0 minusBtn.AutoButtonColor = false minusBtn.Text = "−" minusBtn.TextColor3 = C.TSUB minusBtn.Font = Enum.Font.GothamBold minusBtn.TextSize = 16 minusBtn.ZIndex = 4 local pctLbl = Instance.new("TextLabel", stepFrame) pctLbl.Size = UDim2.new(1, -48, 1, 0) pctLbl.Position = UDim2.new(0, 24, 0, 0) pctLbl.BackgroundTransparency = 1 pctLbl.Text = acceptPct .. "%" pctLbl.TextColor3 = C.ACCENT pctLbl.Font = Enum.Font.GothamBold pctLbl.TextSize = 10 pctLbl.TextXAlignment = Enum.TextXAlignment.Center pctLbl.ZIndex = 4 local plusBtn = Instance.new("TextButton", stepFrame) plusBtn.Size = UDim2.new(0, 24, 1, 0) plusBtn.Position = UDim2.new(1, -24, 0, 0) plusBtn.BackgroundTransparency = 1 plusBtn.BorderSizePixel = 0 plusBtn.AutoButtonColor = false plusBtn.Text = "+" plusBtn.TextColor3 = C.TSUB plusBtn.Font = Enum.Font.GothamBold plusBtn.TextSize = 16 plusBtn.ZIndex = 4 minusBtn.MouseButton1Click:Connect(function() acceptPct = math.max(0, acceptPct - 5) pctLbl.Text = acceptPct .. "%" end) plusBtn.MouseButton1Click:Connect(function() acceptPct = math.min(100, acceptPct + 5) pctLbl.Text = acceptPct .. "%" end) -- connection status local connDot = Instance.new("Frame", header) connDot.Size = UDim2.new(0, 10, 0, 10) connDot.Position = UDim2.new(1, -101, 0.5, -5) connDot.BackgroundColor3 = C.DANGER connDot.BorderSizePixel = 0 connDot.ZIndex = 3 local cdCorner = Instance.new("UICorner", connDot) cdCorner.CornerRadius = UDim.new(1, 0) local connLbl = Instance.new("TextLabel", header) connLbl.Size = UDim2.new(0, 56, 1, 0) connLbl.Position = UDim2.new(1, -90, 0, 0) connLbl.BackgroundTransparency = 1 connLbl.Text = "OFFLINE" connLbl.TextColor3 = C.TMUTE connLbl.Font = Enum.Font.GothamBold connLbl.TextSize = 10 connLbl.TextXAlignment = Enum.TextXAlignment.Left connLbl.ZIndex = 3 -- version string local verLbl = Instance.new("TextLabel", header) verLbl.Size = UDim2.new(0, 38, 1, 0) verLbl.Position = UDim2.new(1, -44, 0, 0) verLbl.BackgroundTransparency = 1 verLbl.Text = "v2.0" verLbl.TextColor3 = C.TMUTE verLbl.Font = Enum.Font.Code verLbl.TextSize = 9 verLbl.TextXAlignment = Enum.TextXAlignment.Center verLbl.ZIndex = 3 -- close button local closeBtn = Instance.new("TextButton", header) closeBtn.Size = UDim2.new(0, 28, 0, 28) closeBtn.Position = UDim2.new(0, -26, 0.5, -14) -- this will be at far right after adjusting closeBtn.AnchorPoint = Vector2.new(1, 0) closeBtn.Position = UDim2.new(1, -10, 0.5, -14) closeBtn.BackgroundColor3 = C.CARD closeBtn.BorderSizePixel = 0 closeBtn.AutoButtonColor = false closeBtn.Text = "" closeBtn.ZIndex = 5 local closeBtnCorner = Instance.new("UICorner", closeBtn) closeBtnCorner.CornerRadius = UDim.new(1, 0) local closeBtnStroke = Instance.new("UIStroke", closeBtn) closeBtnStroke.Color = C.BORDER closeBtnStroke.Thickness = 1 local closeBtnLbl = Instance.new("TextLabel", closeBtn) closeBtnLbl.Size = UDim2.new(1, 0, 1, 0) closeBtnLbl.BackgroundTransparency = 1 closeBtnLbl.Text = "−" closeBtnLbl.TextColor3 = C.TMUTE closeBtnLbl.Font = Enum.Font.GothamBold closeBtnLbl.TextSize = 16 closeBtnLbl.ZIndex = 6 closeBtn.MouseButton1Click:Connect(function() sg:Destroy() end) closeBtn.MouseEnter:Connect(function() tw(closeBtn, {BackgroundColor3=C.DANGER}) end) closeBtn.MouseLeave:Connect(function() tw(closeBtn, {BackgroundColor3=C.CARD}) end) -- ══════════════════ STATUS BAR (bottom debug) ══════════════════ local dbgBar = Instance.new("Frame", win) dbgBar.Size = UDim2.new(1, -SIDE_W, 0, 20) dbgBar.Position = UDim2.new(0, SIDE_W, 1, -22) dbgBar.BackgroundTransparency = 1 dbgBar.ZIndex = 3 statusLabel = Instance.new("TextLabel", dbgBar) statusLabel.Size = UDim2.new(1, -12, 1, 0) statusLabel.Position = UDim2.new(0, 8, 0, 0) statusLabel.BackgroundTransparency = 1 statusLabel.Text = BLOB_ID == "YOUR_BLOB_ID_HERE" and "⚠ Set your BLOB_ID at the top of the script!" or "Ready" statusLabel.TextColor3 = BLOB_ID == "YOUR_BLOB_ID_HERE" and C.WARN or C.TMUTE statusLabel.Font = Enum.Font.Gotham statusLabel.TextSize = 10 statusLabel.TextXAlignment = Enum.TextXAlignment.Left statusLabel.ZIndex = 4 -- ══════════════════ MAIN CONTENT AREA ══════════════════ local CONTENT_X = SIDE_W local CONTENT_Y = 53 local CONTENT_W = WIN_W - SIDE_W local CONTENT_H = WIN_H - CONTENT_Y - 24 -- ══════════════════ PANELS (one per nav tab) ══════════════════ local panels = {} for _, nav in ipairs(NAVS) do local f = Instance.new("Frame", win) f.Name = nav.name f.Size = UDim2.new(0, CONTENT_W, 0, CONTENT_H) f.Position = UDim2.new(0, CONTENT_X, 0, CONTENT_Y) f.BackgroundTransparency = 1 f.Visible = false f.ZIndex = 2 panels[nav.name] = f end -- ══════════════════ TOAST ══════════════════ local toastF = Instance.new("Frame", sg) toastF.Size = UDim2.new(0, 280, 0, 44) toastF.Position = UDim2.new(0.5, -140, 1, 20) toastF.BackgroundColor3 = C.CARD toastF.BorderSizePixel = 0 toastF.ZIndex = 999 local toastCorner = Instance.new("UICorner", toastF) toastCorner.CornerRadius = UDim.new(0, 11) local toastStroke = Instance.new("UIStroke", toastF) toastStroke.Color = C.ACCENT toastStroke.Thickness = 1.5 local toastIco = Instance.new("TextLabel", toastF) toastIco.Size = UDim2.new(0, 34, 1, 0) toastIco.Position = UDim2.new(0, 8, 0, 0) toastIco.BackgroundTransparency = 1 toastIco.Text = "✓" toastIco.TextColor3 = C.SUCCESS toastIco.Font = Enum.Font.GothamBold toastIco.TextSize = 17 toastIco.TextXAlignment = Enum.TextXAlignment.Center toastIco.ZIndex = 1000 local toastMsg = Instance.new("TextLabel", toastF) toastMsg.Size = UDim2.new(1, -48, 1, 0) toastMsg.Position = UDim2.new(0, 44, 0, 0) toastMsg.BackgroundTransparency = 1 toastMsg.Text = "" toastMsg.TextColor3 = C.TEXT toastMsg.Font = Enum.Font.GothamBold toastMsg.TextSize = 12 toastMsg.TextXAlignment = Enum.TextXAlignment.Left toastMsg.ZIndex = 1000 local toastBusy = false local function toast(msg, ico, col) if toastBusy then return end toastBusy = true toastMsg.Text = msg toastIco.Text = ico or "✓" toastIco.TextColor3 = col or C.SUCCESS toastStroke.Color = col or C.ACCENT tw(toastF, { Position=UDim2.new(0.5,-140,1,-60) }, 0.35, Enum.EasingStyle.Back) task.delay(2.4, function() tw(toastF, { Position=UDim2.new(0.5,-140,1,20) }, 0.28) task.wait(0.3); toastBusy = false end) end -- ══════════════════ OFFER CARD BUILDER ══════════════════ local offerCount = 0 local function mkOfferCard(parent, cfg) -- cfg: { animalName, ownerName, itemName, valuePerSec, isMine, onOffer, onRemove, order } local card = Instance.new("Frame", parent) card.Name = cfg.animalName or "card" card.Size = UDim2.new(1, -8, 0, 58) card.BackgroundColor3 = C.CARD card.BackgroundTransparency = 0.057 card.BorderSizePixel = 0 card.LayoutOrder = cfg.order or 0 card.ZIndex = 3 local cardCorner = Instance.new("UICorner", card) cardCorner.CornerRadius = UDim.new(0, 11) local cardStroke = Instance.new("UIStroke", card) cardStroke.Color = C.BORDER cardStroke.Thickness = 1 card.MouseEnter:Connect(function() tw(card,{BackgroundColor3=C.CARD_H}) end) card.MouseLeave:Connect(function() tw(card,{BackgroundColor3=C.CARD}) end) -- left fade strip local strip = Instance.new("Frame", card) strip.Size = UDim2.new(0, 20, 1, 0) strip.Position = UDim2.new(0, 0, 0, 0) strip.BackgroundColor3 = C.ACCENT2 strip.BackgroundTransparency = 0.9 strip.BorderSizePixel = 0 strip.ZIndex = 4 local stripGrad = Instance.new("UIGradient", strip) stripGrad.Rotation = 0 -- left accent line local accentBar = Instance.new("Frame", card) accentBar.Size = UDim2.new(0, 3, 0, 24) accentBar.Position = UDim2.new(0, 0, 0.5, -12) accentBar.BackgroundColor3 = C.ACCENT accentBar.BorderSizePixel = 0 accentBar.ZIndex = 5 local abCorner = Instance.new("UICorner", accentBar) abCorner.CornerRadius = UDim.new(0, 2) -- owner name local ownerLbl = Instance.new("TextLabel", card) ownerLbl.Size = UDim2.new(0, 220, 0, 18) ownerLbl.Position = UDim2.new(0, 16, 0, 9) ownerLbl.BackgroundTransparency = 1 ownerLbl.Text = cfg.ownerName or "?" ownerLbl.TextColor3 = C.TEXT ownerLbl.Font = Enum.Font.GothamBold ownerLbl.TextSize = 13 ownerLbl.TextXAlignment = Enum.TextXAlignment.Left ownerLbl.ZIndex = 5 -- item info line local itemLbl = Instance.new("TextLabel", card) itemLbl.Name = "ItemInfo" itemLbl.Size = UDim2.new(0, 350, 0, 16) itemLbl.Position = UDim2.new(0, 16, 0, 30) itemLbl.BackgroundTransparency = 1 itemLbl.Text = (cfg.itemName or cfg.animalName or "?") .. " · " .. (cfg.valuePerSec or "$0/s") itemLbl.TextColor3 = C.ACCENT itemLbl.Font = Enum.Font.Gotham itemLbl.TextSize = 11 itemLbl.TextXAlignment = Enum.TextXAlignment.Left itemLbl.ZIndex = 5 -- copy ID button local copyBtn = Instance.new("TextButton", card) copyBtn.Size = UDim2.new(0, 20, 0, 18) copyBtn.Position = UDim2.new(0, 238, 0, 10) copyBtn.BackgroundTransparency = 1 copyBtn.BorderSizePixel = 0 copyBtn.AutoButtonColor = true copyBtn.Text = "⎘" copyBtn.TextColor3 = C.TMUTE copyBtn.Font = Enum.Font.GothamBold copyBtn.TextSize = 14 copyBtn.ZIndex = 5 copyBtn.MouseButton1Click:Connect(function() if setclipboard then setclipboard(cfg.ownerName or "") toast("Copied: " .. (cfg.ownerName or ""), "⎘", C.ACCENT) end end) -- offer / action button local actionBtn = Instance.new("TextButton", card) actionBtn.Size = UDim2.new(0, 84, 0, 30) actionBtn.Position = UDim2.new(1, -92, 0.5, -15) actionBtn.BackgroundColor3 = cfg.isMine and Color3.fromRGB(15, 40, 25) or Color3.fromRGB(20, 50, 30) actionBtn.BorderSizePixel = 0 actionBtn.AutoButtonColor = false actionBtn.Text = cfg.isMine and "✦ ACTIVE" or "OFFER ▶" actionBtn.TextColor3 = cfg.isMine and C.ACCENT or C.ACCENT actionBtn.Font = Enum.Font.GothamBold actionBtn.TextSize = 10 actionBtn.Active = not cfg.isMine actionBtn.ZIndex = 5 local abBtnCorner = Instance.new("UICorner", actionBtn) abBtnCorner.CornerRadius = UDim.new(0, 8) local abBtnStroke = Instance.new("UIStroke", actionBtn) abBtnStroke.Color = C.ACCENT2 abBtnStroke.Thickness = 1 if not cfg.isMine then actionBtn.MouseEnter:Connect(function() tw(actionBtn, {BackgroundColor3=C.ACCENT2}) end) actionBtn.MouseLeave:Connect(function() tw(actionBtn, {BackgroundColor3=Color3.fromRGB(20,50,30)}) end) if cfg.onOffer then actionBtn.MouseButton1Click:Connect(function() actionBtn.Active = false actionBtn.Text = "SENT ✓" actionBtn.TextColor3 = C.SUCCESS tw(actionBtn, {BackgroundColor3=Color3.fromRGB(10,35,18)}) cfg.onOffer() end) end end -- remove button (only for MY listings) if cfg.onRemove then local remBtn = Instance.new("TextButton", card) remBtn.Size = UDim2.new(0, 68, 0, 22) remBtn.Position = UDim2.new(1, -166, 0.5, -11) remBtn.BackgroundColor3 = Color3.fromRGB(40, 10, 10) remBtn.BorderSizePixel = 0 remBtn.AutoButtonColor = false remBtn.Text = "✕ REMOVE" remBtn.TextColor3 = C.DANGER remBtn.Font = Enum.Font.GothamBold remBtn.TextSize = 9 remBtn.ZIndex = 5 local rbCorner = Instance.new("UICorner", remBtn) rbCorner.CornerRadius = UDim.new(0, 6) remBtn.MouseEnter:Connect(function() tw(remBtn,{BackgroundColor3=Color3.fromRGB(60,15,15)}) end) remBtn.MouseLeave:Connect(function() tw(remBtn,{BackgroundColor3=Color3.fromRGB(40,10,10)}) end) remBtn.MouseButton1Click:Connect(function() tw(card, {BackgroundTransparency=1, Size=UDim2.new(1,-8,0,0)}, 0.2) task.wait(0.22); card:Destroy() if cfg.onRemove then cfg.onRemove() end end) end return card end -- ══════════════════ SCROLL LIST HELPER ══════════════════ local function mkScrollList(parent) local sf = Instance.new("ScrollingFrame", parent) sf.Size = UDim2.new(1, -8, 1, -8) sf.Position = UDim2.new(0, 4, 0, 3) sf.BackgroundTransparency = 1 sf.ScrollBarThickness = 3 sf.ScrollBarImageColor3 = C.ACCENT2 sf.CanvasSize = UDim2.new(0, 0, 0, 0) sf.BorderSizePixel = 0 sf.ZIndex = 3 local layout = Instance.new("UIListLayout", sf) layout.Padding = UDim.new(0, 5) layout.SortOrder = Enum.SortOrder.LayoutOrder local pad = Instance.new("UIPadding", sf) pad.PaddingTop = UDim.new(0, 3) layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() sf.CanvasSize = UDim2.new(0, 0, 0, layout.AbsoluteContentSize.Y + 10) end) return sf, layout end local function clearList(sf) for _, c in pairs(sf:GetChildren()) do if c:IsA("Frame") then c:Destroy() end end end local function emptyCard(parent, msg) local e = Instance.new("Frame", parent) e.Name = "Empty" e.Size = UDim2.new(1, -8, 0, 90) e.BackgroundTransparency = 1 e.ZIndex = 3 local el = Instance.new("TextLabel", e) el.Size = UDim2.new(1, 0, 1, 0) el.BackgroundTransparency = 1 el.Text = msg or "◈ Nothing here yet." el.TextColor3 = C.TMUTE el.Font = Enum.Font.GothamMedium el.TextSize = 13 el.ZIndex = 4 return e end -- ══════════════════ OFFERS PANEL (main list of global listings) ══════════════════ local offersPanel = panels["OFFERS"] -- search bar inside panel local offerSearchFrame = Instance.new("Frame", offersPanel) offerSearchFrame.Size = UDim2.new(1, -16, 0, 34) offerSearchFrame.Position = UDim2.new(0, 8, 0, 8) offerSearchFrame.BackgroundColor3 = C.CARD offerSearchFrame.BorderSizePixel = 0 offerSearchFrame.ZIndex = 4 local osfCorner = Instance.new("UICorner", offerSearchFrame) osfCorner.CornerRadius = UDim.new(0, 9) local osfStroke = Instance.new("UIStroke", offerSearchFrame) osfStroke.Color = C.BORDER osfStroke.Thickness = 1 local searchIco = Instance.new("TextLabel", offerSearchFrame) searchIco.Size = UDim2.new(0, 26, 1, 0) searchIco.Position = UDim2.new(0, 5, 0, 0) searchIco.BackgroundTransparency = 1 searchIco.Text = "⌕" searchIco.TextColor3 = C.TMUTE searchIco.Font = Enum.Font.GothamBold searchIco.TextSize = 15 searchIco.ZIndex = 5 local searchBox = Instance.new("TextBox", offerSearchFrame) searchBox.Size = UDim2.new(1, -32, 1, 0) searchBox.Position = UDim2.new(0, 28, 0, 0) searchBox.BackgroundTransparency = 1 searchBox.PlaceholderText = "Search offers..." searchBox.PlaceholderColor3 = C.TMUTE searchBox.TextColor3 = C.TEXT searchBox.Font = Enum.Font.Gotham searchBox.TextSize = 12 searchBox.ClearTextOnFocus = false searchBox.ZIndex = 5 searchBox.Focused:Connect(function() osfStroke.Color = C.ACCENT osfStroke.Thickness = 1.5 end) searchBox.FocusLost:Connect(function() osfStroke.Color = C.BORDER osfStroke.Thickness = 1 end) -- refresh button local refreshBtn = Instance.new("TextButton", offersPanel) refreshBtn.Size = UDim2.new(0, 100, 0, 34) refreshBtn.Position = UDim2.new(1, -108, 0, 8) refreshBtn.BackgroundColor3 = C.ACCENT2 refreshBtn.BorderSizePixel = 0 refreshBtn.AutoButtonColor = false refreshBtn.Text = "⟳ REFRESH" refreshBtn.TextColor3 = C.TEXT refreshBtn.Font = Enum.Font.GothamBold refreshBtn.TextSize = 11 refreshBtn.ZIndex = 4 local rbCorner2 = Instance.new("UICorner", refreshBtn) rbCorner2.CornerRadius = UDim.new(0, 9) refreshBtn.MouseEnter:Connect(function() tw(refreshBtn,{BackgroundColor3=C.ACCENT}) end) refreshBtn.MouseLeave:Connect(function() tw(refreshBtn,{BackgroundColor3=C.ACCENT2}) end) local offerListFrame = Instance.new("Frame", offersPanel) offerListFrame.Size = UDim2.new(1, 0, 1, -54) offerListFrame.Position = UDim2.new(0, 0, 0, 50) offerListFrame.BackgroundTransparency = 1 offerListFrame.ZIndex = 3 local offerScroll, offerLayout = mkScrollList(offerListFrame) local function applyOfferSearch() local txt = searchBox.Text:lower() for _, c in pairs(offerScroll:GetChildren()) do if c:IsA("Frame") and c.Name ~= "Empty" then c.Visible = (txt == "") or (c.Name:lower():find(txt, 1, true) ~= nil) end end end searchBox:GetPropertyChangedSignal("Text"):Connect(applyOfferSearch) local function refreshOffers() clearList(offerScroll) connDot.BackgroundColor3 = C.WARN connLbl.Text = "SYNCING" dbg("Fetching global listings...") task.spawn(function() local listings = fetchListings() clearList(offerScroll) local count = 0 for _, data in pairs(listings) do count = count + 1 local isMine = (data.User == LP.Name) mkOfferCard(offerScroll, { animalName = data.AnimalName, ownerName = data.User, itemName = data.AnimalName, valuePerSec = data.ValuePerSec or "$?/s", isMine = isMine, order = count, onOffer = isMine and nil or function() offerCount = offerCount + 1 offerCountLbl.Text = tostring(offerCount) toast("Offer sent on " .. data.AnimalName, "💎", C.ACCENT2) end, }) end if count == 0 then emptyCard(offerScroll, "◈ Waiting for offers...") end offerCountLbl.Text = tostring(count) applyOfferSearch() connDot.BackgroundColor3 = C.SUCCESS connLbl.Text = "ONLINE" dbg("Loaded " .. count .. " listing(s)") end) end refreshBtn.MouseButton1Click:Connect(refreshOffers) -- ══════════════════ POST PANEL (create offer / scan) ══════════════════ local postPanel = panels["POST"] -- top: preview card local previewFrame = Instance.new("Frame", postPanel) previewFrame.Size = UDim2.new(0.6, 0, 0, 60) previewFrame.Position = UDim2.new(0, 0, 0, 216) previewFrame.BackgroundColor3 = C.CARD previewFrame.BorderSizePixel = 0 previewFrame.ZIndex = 4 local pfCorner = Instance.new("UICorner", previewFrame) pfCorner.CornerRadius = UDim.new(0, 12) local pfStroke = Instance.new("UIStroke", previewFrame) pfStroke.Color = C.BORDER pfStroke.Thickness = 1 local pfAccent = Instance.new("Frame", previewFrame) pfAccent.Size = UDim2.new(0, 3, 0, 26) pfAccent.Position = UDim2.new(0, 0, 0.5, -13) pfAccent.BackgroundColor3 = C.ACCENT pfAccent.BorderSizePixel = 0 pfAccent.ZIndex = 5 local pfaCorner = Instance.new("UICorner", pfAccent) pfaCorner.CornerRadius = UDim.new(0, 2) local previewLabel = Instance.new("TextLabel", previewFrame) previewLabel.Size = UDim2.new(1, -14, 0, 14) previewLabel.Position = UDim2.new(0, 14, 0, 10) previewLabel.BackgroundTransparency = 1 previewLabel.Text = "PREVIEW" previewLabel.TextColor3 = C.TMUTE previewLabel.Font = Enum.Font.GothamBold previewLabel.TextSize = 9 previewLabel.TextXAlignment = Enum.TextXAlignment.Left previewLabel.ZIndex = 5 local previewName = Instance.new("TextLabel", previewFrame) previewName.Size = UDim2.new(1, -14, 0, 16) previewName.Position = UDim2.new(0, 14, 0, 26) previewName.BackgroundTransparency = 1 previewName.Text = LP.Name previewName.TextColor3 = C.TEXT previewName.Font = Enum.Font.GothamBold previewName.TextSize = 12 previewName.TextXAlignment = Enum.TextXAlignment.Left previewName.ZIndex = 5 local previewItem = Instance.new("TextLabel", previewFrame) previewItem.Name = "ItemLine" previewItem.Size = UDim2.new(1, -14, 0, 14) previewItem.Position = UDim2.new(0, 14, 0, 44) previewItem.BackgroundTransparency = 1 previewItem.Text = "Item · $0/s" previewItem.TextColor3 = C.ACCENT previewItem.Font = Enum.Font.Gotham previewItem.TextSize = 11 previewItem.TextXAlignment = Enum.TextXAlignment.Left previewItem.ZIndex = 5 -- input fields local function mkInputField(parent, yPos, iconTxt, placeholder) local frame = Instance.new("Frame", parent) frame.Size = UDim2.new(0.6, 0, 0, 40) frame.Position = UDim2.new(0, 0, 0, yPos) frame.BackgroundColor3 = C.CARD frame.BorderSizePixel = 0 frame.ZIndex = 4 local fCorner = Instance.new("UICorner", frame) fCorner.CornerRadius = UDim.new(0, 10) local fStroke = Instance.new("UIStroke", frame) fStroke.Color = C.BORDER fStroke.Thickness = 1 local iconBox = Instance.new("Frame", frame) iconBox.Size = UDim2.new(0, 38, 1, 0) iconBox.BackgroundColor3 = C.PANEL iconBox.BorderSizePixel = 0 iconBox.ZIndex = 5 local ibCorner = Instance.new("UICorner", iconBox) ibCorner.CornerRadius = UDim.new(0, 9) local ibFill = Instance.new("Frame", iconBox) ibFill.Size = UDim2.new(0, 8, 1, 0) ibFill.Position = UDim2.new(1, -8, 0, 0) ibFill.BackgroundColor3 = C.PANEL ibFill.BorderSizePixel = 0 ibFill.ZIndex = 5 local icoL = Instance.new("TextLabel", iconBox) icoL.Size = UDim2.new(1, 0, 1, 0) icoL.BackgroundTransparency = 1 icoL.Text = iconTxt icoL.TextColor3 = C.ACCENT icoL.Font = Enum.Font.GothamBold icoL.TextSize = 15 icoL.ZIndex = 6 local tb = Instance.new("TextBox", frame) tb.Size = UDim2.new(1, -46, 1, 0) tb.Position = UDim2.new(0, 42, 0, 0) tb.BackgroundTransparency = 1 tb.PlaceholderText = placeholder tb.PlaceholderColor3 = C.TMUTE tb.TextColor3 = C.TEXT tb.Font = Enum.Font.Gotham tb.TextSize = 13 tb.ClearTextOnFocus = false tb.ZIndex = 6 tb.Focused:Connect(function() fStroke.Color = C.ACCENT fStroke.Thickness = 1.5 end) tb.FocusLost:Connect(function() fStroke.Color = C.BORDER fStroke.Thickness = 1 end) return tb end -- section labels local function mkSectionLabel(parent, yPos, txt) local l = Instance.new("TextLabel", parent) l.Size = UDim2.new(0.6, 0, 0, 13) l.Position = UDim2.new(0, 2, 0, yPos) l.BackgroundTransparency = 1 l.Text = txt l.TextColor3 = C.TSUB l.Font = Enum.Font.GothamMedium l.TextSize = 10 l.TextXAlignment = Enum.TextXAlignment.Left l.ZIndex = 4 end mkSectionLabel(postPanel, 8, "ITEM NAME") mkSectionLabel(postPanel, 76, "VALUE (NUMBER)") mkSectionLabel(postPanel, 144, "MIN. ACCEPT VALUE") local itemNameBox = mkInputField(postPanel, 24, "📦", "Enter item name...") local valueBox = mkInputField(postPanel, 92, "💰", "e.g. 195000000") local minValueBox = mkInputField(postPanel, 160, "🔒", "e.g. 100000000") -- live preview update local function formatValue(n) if n >= 1e9 then return "$" .. string.format("%.1f", n/1e9) .. "B/s" elseif n >= 1e6 then return "$" .. string.format("%.1f", n/1e6) .. "M/s" elseif n >= 1e3 then return "$" .. string.format("%.1f", n/1e3) .. "K/s" else return "$" .. tostring(n) .. "/s" end end local function updatePreview() local nm = itemNameBox.Text ~= "" and itemNameBox.Text or "Item" local val = tonumber(valueBox.Text) or 0 previewItem.Text = nm .. " · " .. formatValue(val) end itemNameBox:GetPropertyChangedSignal("Text"):Connect(updatePreview) valueBox:GetPropertyChangedSignal("Text"):Connect(updatePreview) -- create offer button local createBtn = Instance.new("TextButton", postPanel) createBtn.Size = UDim2.new(0.6, 0, 0, 44) createBtn.Position = UDim2.new(0, 0, 0, 292) createBtn.BackgroundColor3 = C.ACCENT createBtn.BorderSizePixel = 0 createBtn.AutoButtonColor = false createBtn.Text = "◈ CREATE OFFER" createBtn.TextColor3 = Color3.fromRGB(6, 18, 10) createBtn.Font = Enum.Font.GothamBold createBtn.TextSize = 14 createBtn.ZIndex = 4 local cbCorner = Instance.new("UICorner", createBtn) cbCorner.CornerRadius = UDim.new(0, 10) createBtn.MouseEnter:Connect(function() tw(createBtn,{BackgroundColor3=C.ACCENT2}) end) createBtn.MouseLeave:Connect(function() tw(createBtn,{BackgroundColor3=C.ACCENT}) end) -- scan button (below create) local scanBtn = Instance.new("TextButton", postPanel) scanBtn.Size = UDim2.new(0.6, 0, 0, 36) scanBtn.Position = UDim2.new(0, 0, 0, 344) scanBtn.BackgroundColor3 = C.CARD scanBtn.BorderSizePixel = 0 scanBtn.AutoButtonColor = false scanBtn.Text = "⚡ SCAN MY PLOTS" scanBtn.TextColor3 = C.ACCENT scanBtn.Font = Enum.Font.GothamBold scanBtn.TextSize = 12 scanBtn.ZIndex = 4 local sbCorner2 = Instance.new("UICorner", scanBtn) sbCorner2.CornerRadius = UDim.new(0, 10) local sbStroke = Instance.new("UIStroke", scanBtn) sbStroke.Color = C.BORDER sbStroke.Thickness = 1 scanBtn.MouseEnter:Connect(function() tw(scanBtn,{BackgroundColor3=C.CARD_H}) end) scanBtn.MouseLeave:Connect(function() tw(scanBtn,{BackgroundColor3=C.CARD}) end) -- scan result list local scanListFrame = Instance.new("Frame", postPanel) scanListFrame.Size = UDim2.new(1, 0, 0, CONTENT_H - 400) scanListFrame.Position = UDim2.new(0, 0, 0, 390) scanListFrame.BackgroundTransparency = 1 scanListFrame.ZIndex = 3 local scanScroll, _ = mkScrollList(scanListFrame) local myAdsCache = {} -- [animalName] = data createBtn.MouseButton1Click:Connect(function() local name = itemNameBox.Text local val = tonumber(valueBox.Text) local minV = tonumber(minValueBox.Text) if not name or name == "" then toast("Enter an item name!", "⚠", C.WARN); return end if not val then toast("Enter a valid value!", "⚠", C.WARN); return end createBtn.Text = "LISTING..." createBtn.Active = false tw(createBtn, {BackgroundColor3=C.ACCENT2}) task.spawn(function() local data = { User = LP.Name, AnimalName = name, ValuePerSec = formatValue(val), MinValue = minV or 0, Timestamp = os.time(), } addListing(data) myAdsCache[name] = data createBtn.Text = "✓ LISTED!" tw(createBtn, {BackgroundColor3=C.SUCCESS}) task.wait(1.5) createBtn.Text = "◈ CREATE OFFER" createBtn.Active = true tw(createBtn, {BackgroundColor3=C.ACCENT}) toast(name .. " listed globally!", "☘", C.SUCCESS) end) end) local function doScan() clearList(scanScroll) scanBtn.Text = "⏳ SCANNING..." scanBtn.Active = false local found = 0 task.spawn(function() for _, plot in pairs(Plots:GetChildren()) do for _, obj in pairs(plot:GetDescendants()) do if obj:IsA("Model") and findAnimator(obj) and obj.Name ~= "Baseplate" then found = found + 1 local captured = obj mkOfferCard(scanScroll, { animalName = captured.Name, ownerName = LP.Name, itemName = captured.Name, valuePerSec = "scan", isMine = false, order = found, onOffer = function() -- auto-fill post form itemNameBox.Text = captured.Name updatePreview() toast("Filled: " .. captured.Name, "📦", C.ACCENT) -- switch to POST and scroll to top end, }) end end end scanBtn.Text = "⚡ SCAN MY PLOTS" scanBtn.Active = true if found == 0 then emptyCard(scanScroll, "◈ No animals found in plots.") toast("No animals found", "⚠", C.WARN) else toast("Found " .. found .. " animal(s)", "⚡", C.ACCENT) dbg("Scan: " .. found .. " found") end end) end scanBtn.MouseButton1Click:Connect(doScan) -- ══════════════════ HOST PANEL (my active listings) ══════════════════ local hostPanel = panels["HOST"] local myListFrame = Instance.new("Frame", hostPanel) myListFrame.Size = UDim2.new(1, 0, 1, 0) myListFrame.BackgroundTransparency = 1 myListFrame.ZIndex = 3 local myListScroll, _ = mkScrollList(myListFrame) local function buildMyListings() clearList(myListScroll) local count = 0 for animalName, data in pairs(myAdsCache) do count = count + 1 mkOfferCard(myListScroll, { animalName = animalName, ownerName = LP.Name, itemName = animalName, valuePerSec = data.ValuePerSec or "$?/s", isMine = true, order = data.Timestamp or count, onRemove = function() myAdsCache[animalName] = nil task.spawn(function() removeListing(animalName, LP.Name) toast("Removed: " .. animalName, "🗑", C.DANGER) task.wait(1) refreshOffers() end) task.wait(0.05) buildMyListings() end, }) end if count == 0 then emptyCard(myListScroll, "📭 No active listings.") end end -- ══════════════════ NAV SWITCHING ══════════════════ local function showNav(name) for n, p in pairs(panels) do p.Visible = (n == name) end for n, nb in pairs(navBtns) do local active = (n == name) tw(nb.ico, {TextColor3 = active and C.ACCENT or C.TMUTE}) tw(nb.bh, {BackgroundTransparency = active and 0.9 or 1}) tw(nb.pill,{BackgroundTransparency = active and 0 or 1}) end if name == "OFFERS" then refreshOffers() end if name == "HOST" then buildMyListings() end end for name, nb in pairs(navBtns) do nb.btn.MouseButton1Click:Connect(function() showNav(name) end) end -- ══════════════════ DRAG ══════════════════ local dragging, dragStart, winStart header.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = i.Position winStart = win.Position end end) UIS.InputChanged:Connect(function(i) if dragging and i.UserInputType == Enum.UserInputType.MouseMovement then local d = i.Position - dragStart win.Position = UDim2.new( winStart.X.Scale, winStart.X.Offset + d.X, winStart.Y.Scale, winStart.Y.Offset + d.Y ) end end) UIS.InputEnded:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end) -- ══════════════════ BOOT ══════════════════ showNav("OFFERS") tw(win, { Position = UDim2.new(0.5, -WIN_W/2, 0.5, -WIN_H/2) }, 0.45, Enum.EasingStyle.Back, Enum.EasingDirection.Out ) toast("Brainrot Finder loaded!", "☘", C.SUCCESS) dbg("SAB Duel Finder v2.0 — set your BLOB_ID if not done!")