

Description
Use this DarkSpawner hub for Lucky Scoop Order Roblox!! Now you can get features like Remote Spy, Session Recorder, Proximity Prompt Scanner, Leaderstats Watcher and Copy or Save Logs, and More!! This one is a data tool, not the auto farm. Press SCAN in the small purple panel and it lists every remote, prompt, click detector and workspace folder in the studio map, then copies the dump and saves it as LuckyScoop_scan.txt. Turn SPY on, hit REC START and play one order by hand, and every remote you fire, prompt you hold, tool you equip and coin change gets stamped against the big clock at the top of the screen. REC STOP copies the full log for you. We use these logs to build the real Lucky Scoop Order auto farm. No key on this one, so paste the loadstring and go!!
Features
- Workspace Scanner for Remotes, Prompts and Folders
- Remote Spy for FireServer and InvokeServer
- Session Recorder with On Screen Clock
- Proximity Prompt Hold Logger
- Leaderstats and Coin Change Watcher
- Tool Equip Logger
- Plot and Studio Owner Finder
- Copy to Clipboard and Save to File
- Anti AFK

Lucky Scoop Order
Explore more scripts for this game (1)
-- Lucky Scoop Order : SCANNER + RECORDER (data collection only, not the farm)
-- DarkSpawnerScript.com
-- How to use:
-- 1) Join Lucky Scoop Order, run this, press SCAN, then COPY (or SAVE).
-- 2) Press SPY ON, then press REC START, and play one full order by hand
-- (scoop marbles, collect products, pack, deliver, get paid, buy an upgrade).
-- Keep the big clock visible in your screen recording.
-- 3) Press REC STOP, then COPY LOG (or SAVE). Send me both texts + the video.
local Players = game:GetService("Players")
local UIS = game:GetService("UserInputService")
local PPS = game:GetService("ProximityPromptService")
local RS = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local LP = Players.LocalPlayer
local GAME_TAG = "LuckyScoop"
local scanText = ""
local logLines = {}
local recording = false
local recStart = 0
local spyOn = false
local lastLine, lastCount, lastT0 = nil, 0, 0
local conns = {}
---------------------------------------------------------------- helpers
local function full(i)
local ok, n = pcall(function() return i:GetFullName() end)
return ok and n or tostring(i)
end
local function posOf(inst)
local p = inst
for _ = 1, 4 do
if not p then break end
if p:IsA("BasePart") then return p.Position end
if p:IsA("Attachment") then return p.WorldPosition end
if p:IsA("Model") then
local ok, cf = pcall(function() return p:GetPivot() end)
if ok then return cf.Position end
end
p = p.Parent
end
return nil
end
local function v3(v)
if not v then return "?" end
return string.format("(%.0f, %.0f, %.0f)", v.X, v.Y, v.Z)
end
local ser
ser = function(v, depth)
depth = depth or 0
local t = typeof(v)
if t == "string" then
if #v > 60 then v = v:sub(1, 60) .. "..." end
return string.format("%q", v)
elseif t == "number" or t == "boolean" or t == "nil" then
return tostring(v)
elseif t == "Instance" then
return "<" .. v.ClassName .. " " .. full(v) .. ">"
elseif t == "Vector3" then
return "V3" .. v3(v)
elseif t == "CFrame" then
return "CF" .. v3(v.Position)
elseif t == "buffer" then
local ok, len = pcall(function() return buffer.len(v) end)
return "buffer(" .. (ok and tostring(len) or "?") .. " bytes)"
elseif t == "table" then
if depth >= 2 then return "{...}" end
local parts, n = {}, 0
for k, val in pairs(v) do
n = n + 1
if n > 8 then parts[#parts + 1] = "..." break end
parts[#parts + 1] = tostring(k) .. "=" .. ser(val, depth + 1)
end
return "{" .. table.concat(parts, ", ") .. "}"
end
return t .. "(" .. tostring(v) .. ")"
end
local function clock()
return os.clock() - recStart
end
local function stamp(t)
return string.format("%02d:%05.2f", math.floor(t / 60), t % 60)
end
local function flushRepeat()
if lastLine and lastCount > 1 then
logLines[#logLines] = logLines[#logLines] ..
string.format(" x%d (%s to %s)", lastCount, stamp(lastT0), stamp(clock()))
end
end
local function log(kind, msg)
if not recording then return end
local line = kind .. " | " .. msg
if line == lastLine then
lastCount = lastCount + 1
return
end
flushRepeat()
lastLine, lastCount, lastT0 = line, 1, clock()
logLines[#logLines + 1] = "[" .. stamp(clock()) .. "] " .. line
end
---------------------------------------------------------------- SCAN
local function scan()
local out = {}
local function add(s) out[#out + 1] = s end
add("==== " .. GAME_TAG .. " SCAN | PlaceId " .. game.PlaceId .. " | " .. os.date("%Y-%m-%d %H:%M") .. " ====")
-- remotes
add("\n## REMOTES")
local rc = 0
for _, d in ipairs(game:GetDescendants()) do
if d:IsA("RemoteEvent") or d:IsA("RemoteFunction") or d:IsA("UnreliableRemoteEvent") then
rc = rc + 1
if rc <= 400 then add(d.ClassName .. " " .. full(d)) end
end
end
add("total remotes: " .. rc)
-- prompts / click detectors
add("\n## PROXIMITY PROMPTS")
local pc = 0
for _, d in ipairs(workspace:GetDescendants()) do
if d:IsA("ProximityPrompt") then
pc = pc + 1
if pc <= 250 then
add(string.format("[%s] [%s] hold=%.2f dist=%.0f at %s %s",
d.ObjectText, d.ActionText, d.HoldDuration, d.MaxActivationDistance,
v3(posOf(d.Parent)), full(d)))
end
end
end
add("total prompts: " .. pc)
add("\n## CLICK DETECTORS")
local cc = 0
for _, d in ipairs(workspace:GetDescendants()) do
if d:IsA("ClickDetector") then
cc = cc + 1
if cc <= 150 then add(v3(posOf(d.Parent)) .. " " .. full(d)) end
end
end
add("total click detectors: " .. cc)
-- workspace layout
add("\n## WORKSPACE TOP LEVEL (children count)")
for _, c in ipairs(workspace:GetChildren()) do
if not c:IsA("Terrain") and not c:IsA("Camera") then
add(c.ClassName .. " " .. c.Name .. " [" .. #c:GetChildren() .. "]")
if (c:IsA("Folder") or c:IsA("Model")) and #c:GetChildren() <= 40 then
for _, g in ipairs(c:GetChildren()) do
add(" " .. g.ClassName .. " " .. g.Name .. " [" .. #g:GetChildren() .. "]")
end
end
end
end
-- my plot / studio (anything tagged with my name or UserId)
add("\n## THINGS THAT MENTION ME (plot / studio owner)")
local mine = 0
for _, d in ipairs(workspace:GetDescendants()) do
local hit = false
if d:IsA("StringValue") and (d.Value == LP.Name or d.Value == tostring(LP.UserId)) then hit = true end
if d:IsA("ObjectValue") and d.Value == LP then hit = true end
if d:IsA("IntValue") and d.Value == LP.UserId then hit = true end
local ok, attrs = pcall(function() return d:GetAttributes() end)
if ok then
for k, v in pairs(attrs) do
if v == LP.Name or v == LP.UserId or v == tostring(LP.UserId) then hit = true end
end
end
if hit then
mine = mine + 1
if mine <= 40 then add(d.ClassName .. " " .. full(d)) end
end
end
-- stats
add("\n## LEADERSTATS + PLAYER ATTRIBUTES")
local ls = LP:FindFirstChild("leaderstats")
if ls then
for _, v in ipairs(ls:GetChildren()) do
add("leaderstat " .. v.Name .. " = " .. tostring(v.Value))
end
else
add("no leaderstats folder")
end
for k, v in pairs(LP:GetAttributes()) do add("attr " .. k .. " = " .. ser(v)) end
for _, c in ipairs(LP:GetChildren()) do
if c:IsA("Folder") or c:IsA("Configuration") then
add("player folder " .. c.Name .. " [" .. #c:GetChildren() .. "]")
for _, v in ipairs(c:GetChildren()) do
if v:IsA("ValueBase") then add(" " .. v.Name .. " = " .. tostring(v.Value)) end
end
end
end
-- tools
add("\n## TOOLS")
local function tools(where)
if not where then return end
for _, t in ipairs(where:GetChildren()) do
if t:IsA("Tool") then add(where.Name .. " -> " .. t.Name) end
end
end
tools(LP:FindFirstChild("Backpack"))
tools(LP.Character)
-- gui buttons
add("\n## MY GUI (visible ScreenGuis and their buttons)")
local pg = LP:FindFirstChild("PlayerGui")
if pg then
for _, sg in ipairs(pg:GetChildren()) do
if sg:IsA("ScreenGui") and sg.Name ~= "LSO_Scanner" then
add("ScreenGui " .. sg.Name .. (sg.Enabled and "" or " (disabled)"))
local b = 0
for _, d in ipairs(sg:GetDescendants()) do
if d:IsA("GuiButton") then
b = b + 1
if b <= 25 then
local txt = d:IsA("TextButton") and d.Text or ""
add(" " .. d.Name .. (txt ~= "" and (" '" .. txt:sub(1, 30) .. "'") or ""))
end
end
end
end
end
end
-- replicated storage modules (names only)
add("\n## REPLICATEDSTORAGE TOP LEVEL")
for _, c in ipairs(RS:GetChildren()) do
add(c.ClassName .. " " .. c.Name .. " [" .. #c:GetChildren() .. "]")
end
scanText = table.concat(out, "\n")
return #out
end
---------------------------------------------------------------- SPY (remote calls)
local spyInstalled = false
local function installSpy()
if spyInstalled then return true end
if not hookmetamethod or not getnamecallmethod then return false end
local old
local cc = checkcaller or function() return false end
local wrap = newcclosure or function(f) return f end
old = hookmetamethod(game, "__namecall", wrap(function(self, ...)
local m = getnamecallmethod()
if spyOn and not cc() and (m == "FireServer" or m == "InvokeServer") then
local args = { ... }
local parts = {}
for i = 1, math.min(select("#", ...), 6) do parts[#parts + 1] = ser(args[i]) end
local name = full(self)
task.defer(log, "REMOTE", m .. " " .. name .. " (" .. table.concat(parts, ", ") .. ")")
end
return old(self, ...)
end))
spyInstalled = true
return true
end
---------------------------------------------------------------- RECORD hooks
local function hookStats()
local ls = LP:FindFirstChild("leaderstats")
if ls then
for _, v in ipairs(ls:GetChildren()) do
if v:IsA("ValueBase") then
conns[#conns + 1] = v.Changed:Connect(function(nv) log("STAT", v.Name .. " = " .. tostring(nv)) end)
end
end
end
conns[#conns + 1] = LP.AttributeChanged:Connect(function(a)
log("ATTR", a .. " = " .. ser(LP:GetAttribute(a)))
end)
end
local function hookChar(char)
conns[#conns + 1] = char.ChildAdded:Connect(function(c)
if c:IsA("Tool") then log("EQUIP", c.Name) end
end)
conns[#conns + 1] = char.ChildRemoved:Connect(function(c)
if c:IsA("Tool") then log("UNEQUIP", c.Name) end
end)
end
local function startRec()
logLines, lastLine, lastCount = {}, nil, 0
recStart = os.clock()
recording = true
logLines[1] = "==== " .. GAME_TAG .. " RECORDING | started " .. os.date("%H:%M:%S") .. " ===="
hookStats()
if LP.Character then hookChar(LP.Character) end
conns[#conns + 1] = LP.CharacterAdded:Connect(hookChar)
conns[#conns + 1] = PPS.PromptTriggered:Connect(function(p)
log("PROMPT", "[" .. p.ObjectText .. "] [" .. p.ActionText .. "] " .. full(p))
end)
conns[#conns + 1] = PPS.PromptButtonHoldBegan:Connect(function(p)
log("HOLD", "[" .. p.ObjectText .. "] [" .. p.ActionText .. "]")
end)
conns[#conns + 1] = UIS.InputBegan:Connect(function(input, gpe)
local t = input.UserInputType
if t == Enum.UserInputType.MouseButton1 or t == Enum.UserInputType.Touch then
if gpe then
local pos = input.Position
local ok, objs = pcall(function()
return LP.PlayerGui:GetGuiObjectsAtPosition(pos.X, pos.Y)
end)
local hit = (ok and objs[1]) and full(objs[1]) or "gui"
log("UI CLICK", hit)
else
local m = LP:GetMouse()
log("WORLD CLICK", m.Target and full(m.Target) or "nothing")
end
elseif t == Enum.UserInputType.Keyboard and not gpe then
log("KEY", input.KeyCode.Name)
end
end)
-- things appearing / leaving under workspace folders (marbles, products, boxes, orders)
for _, f in ipairs(workspace:GetChildren()) do
if f:IsA("Folder") or f:IsA("Model") then
conns[#conns + 1] = f.ChildAdded:Connect(function(c) log("SPAWN", f.Name .. " + " .. c.Name) end)
conns[#conns + 1] = f.ChildRemoved:Connect(function(c) log("DESPAWN", f.Name .. " - " .. c.Name) end)
end
end
local pg = LP:FindFirstChild("PlayerGui")
if pg then
conns[#conns + 1] = pg.DescendantAdded:Connect(function(d)
if d:IsA("TextLabel") and d.Text ~= "" and #d.Text < 80 then
log("GUI TEXT", d.Name .. " '" .. d.Text .. "'")
end
end)
end
end
local function stopRec()
flushRepeat()
recording = false
for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end
conns = {}
logLines[#logLines + 1] = "==== stopped at " .. stamp(clock()) .. " | " .. #logLines .. " lines ===="
end
---------------------------------------------------------------- export
local function export(text, fname)
if setclipboard then
pcall(setclipboard, text)
end
if fname and writefile then
pcall(writefile, fname, text)
end
end
---------------------------------------------------------------- GUI
local parent = (gethui and gethui()) or game:GetService("CoreGui")
local old = parent:FindFirstChild("LSO_Scanner")
if old then old:Destroy() end
local sg = Instance.new("ScreenGui")
sg.Name = "LSO_Scanner"
sg.ResetOnSpawn = false
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
sg.Parent = parent
local clockLbl = Instance.new("TextLabel")
clockLbl.Size = UDim2.new(0, 240, 0, 50)
clockLbl.Position = UDim2.new(0.5, -120, 0, 6)
clockLbl.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
clockLbl.BackgroundTransparency = 0.3
clockLbl.TextColor3 = Color3.fromRGB(255, 255, 0)
clockLbl.Font = Enum.Font.Code
clockLbl.TextScaled = true
clockLbl.Text = "REC 00:00.00"
clockLbl.Parent = sg
local panel = Instance.new("Frame")
panel.Size = UDim2.new(0, 200, 0, 300)
panel.Position = UDim2.new(0, 10, 0.3, 0)
panel.BackgroundColor3 = Color3.fromRGB(25, 25, 30)
panel.Active = true
panel.Draggable = true
panel.Parent = sg
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 26)
title.BackgroundColor3 = Color3.fromRGB(120, 40, 160)
title.TextColor3 = Color3.new(1, 1, 1)
title.Font = Enum.Font.GothamBold
title.TextSize = 14
title.Text = "DarkSpawnerScript.com Scanner"
title.Parent = panel
local status = Instance.new("TextLabel")
status.Size = UDim2.new(1, -8, 0, 34)
status.Position = UDim2.new(0, 4, 1, -36)
status.BackgroundTransparency = 1
status.TextColor3 = Color3.fromRGB(200, 255, 200)
status.TextWrapped = true
status.Font = Enum.Font.Gotham
status.TextSize = 12
status.Text = "Ready"
status.Parent = panel
local list = Instance.new("ScrollingFrame")
list.Size = UDim2.new(1, -8, 1, -70)
list.Position = UDim2.new(0, 4, 0, 30)
list.BackgroundTransparency = 1
list.ScrollBarThickness = 6
list.AutomaticCanvasSize = Enum.AutomaticSize.Y
list.CanvasSize = UDim2.new(0, 0, 0, 0)
list.Parent = panel
local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 4)
layout.Parent = list
local function button(text, cb)
local b = Instance.new("TextButton")
b.Size = UDim2.new(1, -8, 0, 32)
b.BackgroundColor3 = Color3.fromRGB(50, 50, 60)
b.TextColor3 = Color3.new(1, 1, 1)
b.Font = Enum.Font.GothamBold
b.TextSize = 13
b.Text = text
b.Parent = list
b.MouseButton1Click:Connect(function()
local ok, err = pcall(cb, b)
if not ok then status.Text = "Error: " .. tostring(err):sub(1, 80) end
end)
return b
end
button("SCAN", function()
status.Text = "Scanning..."
local n = scan()
export(scanText, GAME_TAG .. "_scan.txt")
status.Text = "Scan done: " .. n .. " lines (copied + saved)"
end)
button("COPY SCAN", function()
export(scanText)
status.Text = "Scan copied (" .. #scanText .. " chars)"
end)
button("SPY: OFF", function(b)
if not installSpy() then
status.Text = "Executor has no hookmetamethod, spy not available"
return
end
spyOn = not spyOn
b.Text = spyOn and "SPY: ON" or "SPY: OFF"
status.Text = spyOn and "Spy on (logs remotes while REC runs)" or "Spy off"
end)
button("REC START", function()
if recording then return end
startRec()
status.Text = "Recording... play one full order"
end)
button("REC STOP", function()
if not recording then return end
stopRec()
local txt = table.concat(logLines, "\n")
export(txt, GAME_TAG .. "_log.txt")
status.Text = "Stopped: " .. #logLines .. " lines (copied + saved)"
end)
button("COPY LOG", function()
export(table.concat(logLines, "\n"))
status.Text = "Log copied (" .. #logLines .. " lines)"
end)
button("CLOSE", function()
if recording then stopRec() end
spyOn = false
sg:Destroy()
end)
RunService.RenderStepped:Connect(function()
if not sg.Parent then return end
if recording then
clockLbl.Text = "REC " .. stamp(clock())
clockLbl.TextColor3 = Color3.fromRGB(255, 80, 80)
else
clockLbl.TextColor3 = Color3.fromRGB(255, 255, 0)
end
end)
-- anti AFK while you test
pcall(function()
local VU = game:GetService("VirtualUser")
LP.Idled:Connect(function()
VU:Button2Down(Vector2.new(0, 0), workspace.CurrentCamera.CFrame)
task.wait(1)
VU:Button2Up(Vector2.new(0, 0), workspace.CurrentCamera.CFrame)
end)
end)