local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local character = player.Character or player.CharacterAdded:Wait() local rootPart = character:WaitForChild("HumanoidRootPart") local Config = { deliveryAnchorName = "DeliveryTargetAnchor", pickupFolderName = "DeliveryPickupItems_DeliveryLocation", boxNames = {"box1", "box2", "box3", "box4"}, salePointName = "DeliveryTargetAnchor", pollInterval = 0.5, stuckTimeout = 8, nudgeWaitTime = 2, } local function teleportTo(target) local cf if target:IsA("BasePart") then cf = target.CFrame + Vector3.new(0, 3, 0) elseif target:IsA("Model") and target.PrimaryPart then cf = target.PrimaryPart.CFrame + Vector3.new(0, 3, 0) elseif target:IsA("Attachment") then cf = target.WorldCFrame + Vector3.new(0, 3, 0) else for _, v in ipairs(target:GetDescendants()) do if v:IsA("BasePart") then cf = v.CFrame + Vector3.new(0, 3, 0) break end end end if cf then rootPart.CFrame = cf end end local function getAnchor(name) return workspace:FindFirstChild(name, true) end local function folderHasBoxes(folder) for _, child in ipairs(folder:GetChildren()) do local lName = child.Name:lower() for _, boxName in ipairs(Config.boxNames) do if lName == boxName:lower() then return true end end end return false end local function nudge(anchor) local myPos = rootPart.Position local nearest = nil local nearestDist = math.huge for _, obj in ipairs(workspace:GetDescendants()) do if obj.Name:find("_Destructable") and obj:IsA("BasePart") then local d = (obj.Position - myPos).Magnitude if d < nearestDist then nearestDist = d nearest = obj end end end if nearest then rootPart.CFrame = nearest.CFrame + Vector3.new(0, 3, 0) task.wait(Config.nudgeWaitTime) else task.wait(Config.nudgeWaitTime) end if anchor then teleportTo(anchor) end task.wait(0.5) end local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "DeliveryHUD" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = player.PlayerGui local Button = Instance.new("TextButton") Button.Size = UDim2.new(0, 160, 0, 50) Button.Position = UDim2.new(0.5, -80, 0, 20) Button.BackgroundColor3 = Color3.fromRGB(40, 40, 40) Button.BorderSizePixel = 0 Button.Text = "START" Button.TextColor3 = Color3.fromRGB(100, 255, 100) Button.TextScaled = true Button.Font = Enum.Font.GothamBold Button.Parent = ScreenGui local UICorner = Instance.new("UICorner") UICorner.CornerRadius = UDim.new(0, 10) UICorner.Parent = Button local StatusLabel = Instance.new("TextLabel") StatusLabel.Size = UDim2.new(0, 200, 0, 24) StatusLabel.Position = UDim2.new(0.5, -100, 0, 76) StatusLabel.BackgroundTransparency = 1 StatusLabel.Font = Enum.Font.GothamMedium StatusLabel.TextSize = 12 StatusLabel.TextColor3 = Color3.fromRGB(180, 180, 180) StatusLabel.Text = "" StatusLabel.TextScaled = false StatusLabel.Parent = ScreenGui local running = false local botThread = nil local jumpThread = nil local jobFired = false local function fireJob() if jobFired then return end jobFired = true game:GetService("ReplicatedStorage"):WaitForChild("Remotes"):WaitForChild("RequestStartJobSession"):FireServer("Delivery", "jobPad") end local function startJumping() jumpThread = task.spawn(function() local humanoid = character:WaitForChild("Humanoid") while running do if humanoid and humanoid.FloorMaterial ~= Enum.Material.Air then humanoid.Jump = true end task.wait(0.4) end end) end local function stopJumping() if jumpThread then task.cancel(jumpThread) jumpThread = nil end end local function setStatus(txt, color) StatusLabel.Text = txt StatusLabel.TextColor3 = color or Color3.fromRGB(180, 180, 180) end local function runBot() while running do setStatus("Teleporting to pickup", Color3.fromRGB(100, 200, 255)) local pickupAnchor = getAnchor(Config.deliveryAnchorName) if not pickupAnchor then setStatus("Missing: " .. Config.deliveryAnchorName, Color3.fromRGB(255, 80, 80)) task.wait(2) nudge(nil) else teleportTo(pickupAnchor) task.wait(0.5) end local pickupFolder = workspace:FindFirstChild(Config.pickupFolderName, true) if not pickupFolder then setStatus("Missing folder: " .. Config.pickupFolderName, Color3.fromRGB(255, 80, 80)) task.wait(2) nudge(pickupAnchor) else local stuckTimer = 0 while running and folderHasBoxes(pickupFolder) do setStatus("Waiting for pickup...", Color3.fromRGB(255, 200, 60)) task.wait(Config.pollInterval) stuckTimer += Config.pollInterval if stuckTimer >= Config.stuckTimeout then setStatus("Unblocking...", Color3.fromRGB(255, 130, 40)) nudge(pickupAnchor) stuckTimer = 0 end end end if not running then break end setStatus("Teleporting to sale point", Color3.fromRGB(100, 255, 160)) local saleAnchor = getAnchor(Config.salePointName) if not saleAnchor then setStatus("Missing: " .. Config.salePointName, Color3.fromRGB(255, 80, 80)) task.wait(2) nudge(nil) else teleportTo(saleAnchor) end setStatus("Waiting for sale reset...", Color3.fromRGB(100, 255, 160)) local saleStuck = 0 local dropHeight = 50 while running do local checkFolder = workspace:FindFirstChild(Config.pickupFolderName, true) if checkFolder and folderHasBoxes(checkFolder) then break end task.wait(Config.pollInterval) saleStuck += Config.pollInterval if saleStuck >= Config.stuckTimeout then setStatus("Dropping from above...", Color3.fromRGB(255, 180, 40)) local sa = getAnchor(Config.salePointName) if sa then local basePos if sa:IsA("BasePart") then basePos = sa.Position elseif sa:IsA("Model") and sa.PrimaryPart then basePos = sa.PrimaryPart.Position else basePos = rootPart.Position end rootPart.CFrame = CFrame.new(basePos + Vector3.new(0, dropHeight, 0)) end saleStuck = 0 task.wait(1) local sa2 = getAnchor(Config.salePointName) if sa2 then teleportTo(sa2) end task.wait(0.5) end end end setStatus("Stopped", Color3.fromRGB(160, 160, 200)) end Button.MouseButton1Click:Connect(function() if running then running = false stopJumping() if botThread then task.cancel(botThread) botThread = nil end jobFired = false Button.Text = "START" Button.TextColor3 = Color3.fromRGB(100, 255, 100) Button.BackgroundColor3 = Color3.fromRGB(40, 40, 40) setStatus("") else running = true Button.Text = "STOP" Button.TextColor3 = Color3.fromRGB(255, 80, 80) Button.BackgroundColor3 = Color3.fromRGB(60, 20, 20) fireJob() startJumping() botThread = task.spawn(runBot) end end) player.CharacterAdded:Connect(function(newChar) character = newChar rootPart = newChar:WaitForChild("HumanoidRootPart") running = false stopJumping() botThread = nil jobFired = false Button.Text = "START" Button.TextColor3 = Color3.fromRGB(100, 255, 100) Button.BackgroundColor3 = Color3.fromRGB(40, 40, 40) setStatus("") end)