local player = game.Players.LocalPlayer local menuVisible = false local scrapObjects = {} local collectedScrap = {} local gui = Instance.new("ScreenGui") gui.Parent = game.CoreGui local menuBtn = Instance.new("TextButton") menuBtn.Size = UDim2.new(0, 60, 0, 60) menuBtn.Position = UDim2.new(1, -65, 0.5, -30) menuBtn.BackgroundColor3 = Color3.new(1, 1, 0) menuBtn.Text = "▶" menuBtn.TextColor3 = Color3.new(0, 0, 0) menuBtn.TextScaled = true menuBtn.Font = Enum.Font.SourceSansBold menuBtn.Parent = gui local menuFrame = Instance.new("Frame") menuFrame.Size = UDim2.new(0, 110, 0, 400) menuFrame.Position = UDim2.new(1, -115, 0.5, -200) menuFrame.BackgroundColor3 = Color3.new(0.1, 0.1, 0.1) menuFrame.BackgroundTransparency = 0.1 menuFrame.BorderSizePixel = 2 menuFrame.BorderColor3 = Color3.new(1, 1, 0) menuFrame.Visible = false menuFrame.Parent = gui local title = Instance.new("TextLabel") title.Size = UDim2.new(1, 0, 0, 40) title.BackgroundColor3 = Color3.new(1, 1, 0) title.Text = "SCRAP" title.TextColor3 = Color3.new(0, 0, 0) title.TextScaled = true title.Parent = menuFrame local scroll = Instance.new("ScrollingFrame") scroll.Size = UDim2.new(1, -4, 1, -100) scroll.Position = UDim2.new(0, 2, 0, 45) scroll.BackgroundTransparency = 1 scroll.ScrollBarThickness = 3 scroll.Parent = menuFrame local layout = Instance.new("UIListLayout") layout.Padding = UDim.new(0, 2) layout.Parent = scroll local refreshBtn = Instance.new("TextButton") refreshBtn.Size = UDim2.new(1, 0, 0, 35) refreshBtn.Position = UDim2.new(0, 0, 1, -55) refreshBtn.BackgroundColor3 = Color3.new(0, 0.5, 1) refreshBtn.Text = "🔍 FIND" refreshBtn.TextColor3 = Color3.new(1, 1, 1) refreshBtn.TextScaled = true refreshBtn.Parent = menuFrame local infoLabel = Instance.new("TextLabel") infoLabel.Size = UDim2.new(1, 0, 0, 20) infoLabel.Position = UDim2.new(0, 0, 1, -20) infoLabel.BackgroundTransparency = 1 infoLabel.Text = "READY" infoLabel.TextColor3 = Color3.new(1, 1, 0) infoLabel.TextScaled = true infoLabel.Parent = menuFrame local BLACKLIST = { "turret", "gun", "weapon", "npc", "enemy", "zombie", "player", "character", "body", "head", "torso", "vehicle", "car", "building", "house", "base", "spawn", "point", "respawn", "door", "wall", "window", "floor", "ceiling", "roof", "fence", "tree", "rock", "stone", "wood", "plant" } function isStrictScrap(obj) if not obj or not obj.Parent then return false end local objName = obj.Name:lower() if objName == "scrap" then return true end if objName:find("^scrap") or objName:find(" scrap") or objName:find("%f[%a]scrap%f[%A]") then for _, banned in ipairs(BLACKLIST) do if objName:find(banned) then return false end end local parent = obj.Parent while parent do local parentName = parent.Name:lower() for _, banned in ipairs(BLACKLIST) do if parentName:find(banned) then return false end end if parent:FindFirstChild("Humanoid") then return false end parent = parent.Parent end return true end return false end function findScrap() scrapObjects = {} for _, obj in pairs(workspace:GetDescendants()) do if obj:IsA("BasePart") or obj:IsA("MeshPart") or obj:IsA("Part") or obj:IsA("Model") then if isStrictScrap(obj) then local position if obj:IsA("BasePart") or obj:IsA("Part") or obj:IsA("MeshPart") then position = obj.Position elseif obj:IsA("Model") then local primary = obj.PrimaryPart if primary then position = primary.Position else local firstPart = obj:FindFirstChildWhichIsA("BasePart") if firstPart then position = firstPart.Position else continue end end end if position then local objId = tostring(obj:GetDebugId()) if not collectedScrap[objId] then table.insert(scrapObjects, { obj = obj, name = obj.Name, pos = position, id = objId, type = obj.ClassName }) end end end end end local uniqueScrap = {} local usedPositions = {} for _, scrap in pairs(scrapObjects) do local posKey = string.format("%d_%d_%d", math.floor(scrap.pos.X / 3), math.floor(scrap.pos.Y / 3), math.floor(scrap.pos.Z / 3)) if not usedPositions[posKey] then usedPositions[posKey] = true table.insert(uniqueScrap, scrap) end end scrapObjects = uniqueScrap table.sort(scrapObjects, function(a, b) return a.pos.X < b.pos.X end) return #scrapObjects end function updateButtons() local count = findScrap() for _, child in pairs(scroll:GetChildren()) do if child:IsA("TextButton") then child:Destroy() end end local validButtons = 0 for i, scrap in ipairs(scrapObjects) do if scrap.obj and scrap.obj.Parent then validButtons = validButtons + 1 local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, 0, 0, 28) btn.BackgroundColor3 = Color3.new(1, 1, 0) btn.BackgroundTransparency = 0.2 btn.TextColor3 = Color3.new(0, 0, 0) btn.TextScaled = true btn.Font = Enum.Font.SourceSans local distance = "?" local char = player.Character if char then local root = char:FindFirstChild("HumanoidRootPart") if root then local dist = (scrap.pos - root.Position).Magnitude distance = math.floor(dist) end end btn.Text = string.format("S%d: %d", validButtons, distance) btn.Parent = scroll btn.MouseButton1Click:Connect(function() local char = player.Character if char then local root = char:FindFirstChild("HumanoidRootPart") if root then if not scrap.obj or not scrap.obj.Parent then btn.BackgroundColor3 = Color3.new(1, 0, 0) btn.Text = "TAKEN" task.wait(1) updateButtons() return end btn.BackgroundColor3 = Color3.new(0, 1, 0) btn.Text = "TP..." root.CFrame = CFrame.new(scrap.pos + Vector3.new(0, 3, 0)) task.wait(2) if not scrap.obj or not scrap.obj.Parent then collectedScrap[scrap.id] = true end updateButtons() end end end) end end scroll.CanvasSize = UDim2.new(0, 0, 0, validButtons * 30) title.Text = string.format("SCRAP [%d]", validButtons) if validButtons == 0 then infoLabel.Text = "NO SCRAP" infoLabel.TextColor3 = Color3.new(1, 0, 0) else infoLabel.Text = string.format("FOUND: %d", validButtons) infoLabel.TextColor3 = Color3.new(1, 1, 0) end return validButtons end menuBtn.MouseButton1Click:Connect(function() menuVisible = not menuVisible menuFrame.Visible = menuVisible menuBtn.Text = menuVisible and "◀" or "▶" if menuVisible then updateButtons() end end) refreshBtn.MouseButton1Click:Connect(function() refreshBtn.Text = "🔍 SCAN" local count = updateButtons() refreshBtn.Text = string.format("🔍 [%d]", count) end) spawn(function() while true do task.wait(10) if menuVisible then updateButtons() end end end) spawn(function() while true do task.wait(1) for i = #scrapObjects, 1, -1 do local scrap = scrapObjects[i] if scrap and scrap.obj and not scrap.obj.Parent then collectedScrap[scrap.id] = true table.remove(scrapObjects, i) if menuVisible then updateButtons() end end end end end) task.wait(2) updateButtons()