local Players = game:GetService("Players") local RunService = game:GetService("RunService") local CollectionService = game:GetService("CollectionService") local UserInputService = game:GetService("UserInputService") local player = game:GetService("Players").LocalPlayer if not player.Character then player.CharacterAdded:Wait() end local running = false local tweenSpeed = 100 local moverConn = nil -- ── Get the REAL root (non-massless, direct child of character) ── local function getHRP() local char = player.Character if not char then return nil end for _, v in ipairs(char:GetChildren()) do if v.Name == "RootPart" and v:IsA("BasePart") and not v.Massless then return v end end return char.PrimaryPart end local function getClosestFood() local hrp = getHRP() if not hrp then return nil end local best, bestDist = nil, math.huge for _, food in CollectionService:GetTagged("Food") do if not food or not food.Parent then continue end local ok, pos = pcall(function() if food:IsA("Model") then return food:GetPivot().Position elseif food:IsA("BasePart") then return food.Position end end) if ok and pos then local d = (hrp.Position - pos).Magnitude if d < bestDist then bestDist = d best = { instance = food, position = pos } end end end return best end local function stopMover() if moverConn then moverConn:Disconnect(); moverConn = nil end end local function moveTo(targetPos) local reached = false stopMover() moverConn = RunService.Heartbeat:Connect(function(dt) local hrp = getHRP() if not hrp or not running then reached = true; stopMover(); return end local diff = targetPos - hrp.Position local dist = diff.Magnitude if dist < 2 then reached = true; stopMover(); return end local step = math.min(tweenSpeed * dt, dist) hrp.CFrame = CFrame.new(hrp.Position + diff.Unit * step) end) while not reached do task.wait(0.05) end end -- ── GUI ────────────────────────────────────────────────────────── local gui = Instance.new("ScreenGui") gui.Name = "FoodCollector" gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = player:WaitForChild("PlayerGui") local panel = Instance.new("Frame") panel.Size = UDim2.new(0, 270, 0, 215) panel.Position = UDim2.new(0.5, -135, 0.5, -107) panel.BackgroundColor3 = Color3.fromRGB(18, 18, 28) panel.BorderSizePixel = 0 panel.Active = true panel.Draggable = true panel.Parent = gui Instance.new("UICorner", panel).CornerRadius = UDim.new(0, 10) local stroke = Instance.new("UIStroke", panel) stroke.Color = Color3.fromRGB(80, 80, 130) stroke.Thickness = 1.5 local titleBar = Instance.new("Frame", panel) titleBar.Size = UDim2.new(1, 0, 0, 38) titleBar.BackgroundColor3 = Color3.fromRGB(35, 35, 58) titleBar.BorderSizePixel = 0 Instance.new("UICorner", titleBar).CornerRadius = UDim.new(0, 10) local titlePatch = Instance.new("Frame", titleBar) titlePatch.Size = UDim2.new(1, 0, 0, 10) titlePatch.Position = UDim2.new(0, 0, 1, -10) titlePatch.BackgroundColor3 = Color3.fromRGB(35, 35, 58) titlePatch.BorderSizePixel = 0 local titleLbl = Instance.new("TextLabel", titleBar) titleLbl.Size = UDim2.new(1, -50, 1, 0) titleLbl.Position = UDim2.new(0, 12, 0, 0) titleLbl.BackgroundTransparency = 1 titleLbl.Text = "🦖 Food Collector" titleLbl.TextColor3 = Color3.fromRGB(230, 230, 255) titleLbl.TextSize = 15 titleLbl.Font = Enum.Font.GothamBold titleLbl.TextXAlignment = Enum.TextXAlignment.Left local closeBtn = Instance.new("TextButton", titleBar) closeBtn.Size = UDim2.new(0, 26, 0, 26) closeBtn.Position = UDim2.new(1, -32, 0.5, -13) closeBtn.BackgroundColor3 = Color3.fromRGB(190, 50, 50) closeBtn.Text = "✕" closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255) closeBtn.TextSize = 13 closeBtn.Font = Enum.Font.GothamBold closeBtn.BorderSizePixel = 0 Instance.new("UICorner", closeBtn).CornerRadius = UDim.new(0, 6) local statusLbl = Instance.new("TextLabel", panel) statusLbl.Size = UDim2.new(1, -20, 0, 22) statusLbl.Position = UDim2.new(0, 10, 0, 46) statusLbl.BackgroundTransparency = 1 statusLbl.Text = "Status: Idle" statusLbl.TextColor3 = Color3.fromRGB(150, 150, 180) statusLbl.TextSize = 13 statusLbl.Font = Enum.Font.Gotham statusLbl.TextXAlignment = Enum.TextXAlignment.Left local countLbl = Instance.new("TextLabel", panel) countLbl.Size = UDim2.new(1, -20, 0, 18) countLbl.Position = UDim2.new(0, 10, 0, 68) countLbl.BackgroundTransparency = 1 countLbl.Text = "Food in world: 0" countLbl.TextColor3 = Color3.fromRGB(120, 120, 160) countLbl.TextSize = 12 countLbl.Font = Enum.Font.Gotham countLbl.TextXAlignment = Enum.TextXAlignment.Left local speedLbl = Instance.new("TextLabel", panel) speedLbl.Size = UDim2.new(1, -20, 0, 20) speedLbl.Position = UDim2.new(0, 10, 0, 94) speedLbl.BackgroundTransparency = 1 speedLbl.Text = "Speed: 100 studs/s" speedLbl.TextColor3 = Color3.fromRGB(150, 150, 180) speedLbl.TextSize = 13 speedLbl.Font = Enum.Font.Gotham speedLbl.TextXAlignment = Enum.TextXAlignment.Left local track = Instance.new("Frame", panel) track.Size = UDim2.new(1, -20, 0, 8) track.Position = UDim2.new(0, 10, 0, 122) track.BackgroundColor3 = Color3.fromRGB(50, 50, 75) track.BorderSizePixel = 0 Instance.new("UICorner", track).CornerRadius = UDim.new(1, 0) local fill = Instance.new("Frame", track) fill.Size = UDim2.new(tweenSpeed / 1000, 0, 1, 0) fill.BackgroundColor3 = Color3.fromRGB(90, 160, 255) fill.BorderSizePixel = 0 Instance.new("UICorner", fill).CornerRadius = UDim.new(1, 0) local knob = Instance.new("TextButton", track) knob.Size = UDim2.new(0, 20, 0, 20) knob.Position = UDim2.new(tweenSpeed / 1000, -10, 0.5, -10) knob.BackgroundColor3 = Color3.fromRGB(220, 220, 255) knob.Text = "" knob.BorderSizePixel = 0 Instance.new("UICorner", knob).CornerRadius = UDim.new(1, 0) local sliderDragging = false knob.MouseButton1Down:Connect(function() sliderDragging = true end) UserInputService.InputEnded:Connect(function(inp) if inp.UserInputType == Enum.UserInputType.MouseButton1 then sliderDragging = false end end) UserInputService.InputChanged:Connect(function(inp) if not sliderDragging then return end if inp.UserInputType ~= Enum.UserInputType.MouseMovement then return end local ratio = math.clamp((inp.Position.X - track.AbsolutePosition.X) / track.AbsoluteSize.X, 0, 1) tweenSpeed = math.max(1, math.floor(ratio * 1000)) fill.Size = UDim2.new(ratio, 0, 1, 0) knob.Position = UDim2.new(ratio, -10, 0.5, -10) speedLbl.Text = "Speed: " .. tweenSpeed .. " studs/s" end) local function makeBtn(text, color, xOffset) local btn = Instance.new("TextButton", panel) btn.Size = UDim2.new(0, 112, 0, 36) btn.Position = UDim2.new(0, xOffset, 0, 162) btn.BackgroundColor3 = color btn.Text = text btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.TextSize = 14 btn.Font = Enum.Font.GothamBold btn.BorderSizePixel = 0 Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8) return btn end local startBtn = makeBtn("▶ Start", Color3.fromRGB(40, 165, 70), 16) local stopBtn = makeBtn("■ Stop", Color3.fromRGB(185, 50, 50), 142) -- ── Loop ───────────────────────────────────────────────────────── local function setStatus(msg, color) statusLbl.Text = "Status: " .. msg statusLbl.TextColor3 = color or Color3.fromRGB(150, 150, 180) end local function collectLoop() while running do if not player.Character then player.CharacterAdded:Wait() task.wait(1) continue end local hrp = getHRP() if not hrp then setStatus("No RootPart...", Color3.fromRGB(200, 100, 100)) task.wait(1) continue end countLbl.Text = "Food in world: " .. #CollectionService:GetTagged("Food") local food = getClosestFood() if not food or not food.instance or not food.instance.Parent then setStatus("No food nearby...", Color3.fromRGB(200, 180, 80)) task.wait(0.3) continue end setStatus("Going to " .. food.instance.Name, Color3.fromRGB(90, 200, 90)) moveTo(food.position) end setStatus("Stopped") end startBtn.MouseButton1Click:Connect(function() if running then return end running = true setStatus("Running", Color3.fromRGB(90, 200, 90)) task.spawn(collectLoop) end) stopBtn.MouseButton1Click:Connect(function() running = false stopMover() setStatus("Stopped") end) closeBtn.MouseButton1Click:Connect(function() running = false stopMover() gui:Destroy() end) setStatus("Idle")