--!nonstrict --[[========================================================================= Steal a Brainrot -- grab diagnostic ------------------------------------------------------------------------- Ends the guessing about why auto-grab does not steal. It measures, on YOUR executor and THIS game version, exactly: 1. what fireproximityprompt actually does -- fires the full hold (PromptButtonHoldBegan -> Triggered) or just Triggered 2. whether getconnections works on a real steal prompt, and what it returns 3. the steal prompts' real properties (Enabled, HoldDuration, distance) 4. whether a controlled test-fire actually starts a steal (Stealing flips) HOW TO USE 1. Stand right next to a stealable brainrot on SOMEONE ELSE'S base (so a grab prompt is visible/holdable). 2. Run this. 3. Do NOT touch anything for ~6 seconds -- it runs a controlled test-fire. 4. Send me the file it names (workspace / nmhub_capture / grabdiag_*.txt). Passive + one self-fire. No metatable hooks. =========================================================================]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local LP = Players.LocalPlayer local out = {} local function log(s) out[#out+1] = s ; print("[grabdiag] " .. s) end local function save(reason) local text = "grab diagnostic (" .. reason .. ")\n" .. string.rep("-", 50) .. "\n" .. table.concat(out, "\n") -- clipboard first -- no file needed, just paste it back to me if type(setclipboard) == "function" then pcall(setclipboard, text) elseif type(toclipboard) == "function" then pcall(toclipboard, text) end -- file as a bonus if the executor allows it if type(writefile) == "function" then pcall(function() if makefolder and isfolder and not isfolder("nmhub_capture") then makefolder("nmhub_capture") end writefile("nmhub_capture/grabdiag.txt", text) end) end end --========================================================================= log("== grab diagnostic ==") log("fireproximityprompt: " .. type(fireproximityprompt)) log("getconnections: " .. type(getconnections)) log("firesignal: " .. type(firesignal)) --========================================================================= -- find the steal prompts --========================================================================= local prompts = {} local plots = workspace:FindFirstChild("Plots") if not plots then log("!! workspace.Plots MISSING -- the scan target does not exist") save("no plots") ; return end log("plots: " .. #plots:GetChildren()) for _, plot in ipairs(plots:GetChildren()) do local podiums = plot:FindFirstChild("AnimalPodiums") if podiums then for _, d in ipairs(podiums:GetDescendants()) do if d:IsA("ProximityPrompt") then prompts[#prompts+1] = d end end end end log("AnimalPodiums prompts found: " .. #prompts) if #prompts == 0 then log("!! no prompts under AnimalPodiums -- scan path is wrong for this version") save("no prompts") ; return end -- sample the nearest few, with properties local root = LP.Character and LP.Character:FindFirstChild("HumanoidRootPart") local myPos = root and root.Position local ranked = {} for _, p in ipairs(prompts) do local host = p.Parent if host and host:IsA("Attachment") then host = host.Parent end local pos = host and host:IsA("BasePart") and host.Position local dist = (pos and myPos) and (pos - myPos).Magnitude or 9e9 ranked[#ranked+1] = { p = p, d = dist } end table.sort(ranked, function(a,b) return a.d < b.d end) log("") log("nearest prompts:") for i = 1, math.min(5, #ranked) do local p = ranked[i].p local okH, hold = pcall(function() return p.HoldDuration end) local okE, en = pcall(function() return p.Enabled end) local okD, md = pcall(function() return p.MaxActivationDistance end) local okA, at = pcall(function() return p.ActionText end) log(string.format(" #%d %.0f studs | Enabled=%s Hold=%s MaxDist=%s Action=%q", i, ranked[i].d, tostring(okE and en), tostring(okH and hold), tostring(okD and md), tostring(okA and at))) log(" path: " .. p:GetFullName()) end --========================================================================= -- getconnections probe on the nearest enabled prompt --========================================================================= local target for _, e in ipairs(ranked) do local okE, en = pcall(function() return e.p.Enabled end) if okE and en then target = e.p break end end target = target or ranked[1].p log("") log("probe target: " .. target:GetFullName()) if type(getconnections) == "function" then for _, sig in ipairs({"Triggered", "PromptButtonHoldBegan", "PromptButtonHoldEnded"}) do local ok, conns = pcall(function() return getconnections(target[sig]) end) if ok and type(conns) == "table" then local withFn = 0 for _, c in ipairs(conns) do if type(c.Function) == "function" then withFn = withFn + 1 end end log(string.format(" getconnections(%s): %d conns, %d with .Function", sig, #conns, withFn)) else log(" getconnections(" .. sig .. "): FAILED " .. tostring(conns)) end end else log(" getconnections unavailable -- replay method not possible") end --========================================================================= -- watch the events, then TEST-FIRE and see what actually happens --========================================================================= local saw = { hb = 0, tr = 0, he = 0 } pcall(function() target.PromptButtonHoldBegan:Connect(function() saw.hb = saw.hb + 1 end) target.Triggered:Connect(function() saw.tr = saw.tr + 1 end) target.PromptButtonHoldEnded:Connect(function() saw.he = saw.he + 1 end) end) local function stealing() return LP:GetAttribute("Stealing") == true end task.spawn(function() task.wait(1) log("") log("TEST 1: fireproximityprompt(prompt, 0) [instant]") local before = stealing() saw.hb, saw.tr, saw.he = 0, 0, 0 pcall(function() fireproximityprompt(target, 0) end) task.wait(1.5) log(string.format(" -> HoldBegan=%d Triggered=%d HoldEnded=%d | Stealing %s->%s", saw.hb, saw.tr, saw.he, tostring(before), tostring(stealing()))) task.wait(1) log("TEST 2: HoldDuration=0 then fireproximityprompt(prompt)") pcall(function() target.HoldDuration = 0 end) before = stealing() saw.hb, saw.tr, saw.he = 0, 0, 0 pcall(function() fireproximityprompt(target) end) task.wait(1.5) log(string.format(" -> HoldBegan=%d Triggered=%d HoldEnded=%d | Stealing %s->%s", saw.hb, saw.tr, saw.he, tostring(before), tostring(stealing()))) if type(firesignal) == "function" and type(getconnections) == "function" then task.wait(1) log("TEST 3: firesignal on HoldBegan then Triggered") before = stealing() saw.hb, saw.tr, saw.he = 0, 0, 0 pcall(function() firesignal(target.PromptButtonHoldBegan) end) task.wait(0.1) pcall(function() firesignal(target.Triggered) end) task.wait(1.5) log(string.format(" -> HoldBegan=%d Triggered=%d HoldEnded=%d | Stealing %s->%s", saw.hb, saw.tr, saw.he, tostring(before), tostring(stealing()))) end log("") log("VERDICT: whichever TEST flips Stealing false->true is the method that works.") log("If none do, the steal is not on this prompt's Triggered -- send me the file.") save("done") log("") log(">>> The full report is now on your CLIPBOARD. Paste it back to me. <<<") print("[grabdiag] DONE -- report copied to clipboard, just paste it here.") end) save("started")