-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] --[[rscripts:analytics:start]] -- Script analytics (enabled by the creator on rscripts.net). -- Runs in its own thread and cannot affect the script below. task.spawn(function() pcall(function() loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6ad238bc8f432fb269fd8de7"))() end) end) --[[rscripts:analytics:end]] local Config = { Loop = true, TweenSpeed = 100, ApproachDistance = 80, ApproachSpeed = 12, ApproachLift = 4, LaundryFlightHeight = 12, LaundryExitDistance = 6, LaundryExitRadius = 35, WashClickPosition = Vector2.new(1121, 1063), WashMenuPause = 0.5, LandingSpeed = 6, AutoCamera = true, CameraBack = 8, CameraHeight = 4, MovementTestOnly = false, ChangePhysicsDuringTween = false, MovementDiagnostics = false, ArrivalMonitor = 0, BuyHold = 2, OtherHold = 3, HoldPadding = 0.15, InteractionGap = 0.7, ArrivalPause = 0.25, MenuTimeout = 15, CyclePause = 1, StopKey = Enum.KeyCode.F8, } local Shops = { {Name = "Fake Watch", Hint = "watch", Position = Vector3.new(-1858.469, 3.180, 50.399), Count = 3}, {Name = "Sarsparilla", Hint = "sarsparilla", Position = Vector3.new(-1854.349, 3.190, 50.233), Count = 4}, {Name = "Fake Designer Bag", Hint = "bag", Position = Vector3.new(-1845.591, 3.200, 50.110), Count = 3}, {Name = "Hot Dog", Hint = "hot", Position = Vector3.new(-1857.505, 3.200, 33.099), Count = 2}, } local SellPosition = Vector3.new(3501.181, 2.579, -751.040) local WashPosition = Vector3.new(-1848.233, 3.150, 76.187) local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local Input = game:GetService("UserInputService") local GuiService = game:GetService("GuiService") local Prompts = game:GetService("ProximityPromptService") local player = Players.LocalPlayer assert(player, "Run this on the Roblox client.") local shared = type(getgenv) == "function" and getgenv() or _G if shared.ElPasoFarm and not shared.ElPasoFarm.Done then warn("[El Paso] Already running or stopping. Press F8 to stop the existing run.") return end local state = {Running = true, Done = false} shared.ElPasoFarm = state local character, root, humanoid local tween, movementConnection, heldMouse local collisions = {} local connections = {} local keyHeld = false local sendKey, moveMouse, sendMouse local seatStateBackup local cameraTarget, queryParams local cameraSnapshots = {} local cameraBound = false local cameraDirection = Vector3.new(0, 0, -1) local cameraBinding = "ElPasoFarmCamera_" .. tostring(player.UserId) local function log(message) print("[El Paso] " .. message) end local function positionText(position) return string.format("(%.3f, %.3f, %.3f)", position.X, position.Y, position.Z) end local function promptPosition(prompt) local parent = prompt and prompt.Parent if not parent then return nil end if parent:IsA("Attachment") then return parent.WorldPosition end if parent:IsA("BasePart") then return parent.Position end if parent:IsA("Model") then return parent:GetPivot().Position end end local function updateCamera() if not Config.AutoCamera or not state.Running or not root or not root.Parent then return end local camera = workspace.CurrentCamera if not camera then return end local target if typeof(cameraTarget) == "Instance" then target = promptPosition(cameraTarget) elseif typeof(cameraTarget) == "Vector3" then target = cameraTarget end target = target or root.Position + cameraDirection * 8 local direction = Vector3.new(target.X - root.Position.X, 0, target.Z - root.Position.Z) if direction.Magnitude > 0.05 then cameraDirection = direction.Unit end local anchor = root.Position + Vector3.new(0, 1.5, 0) local eye = root.Position + Vector3.new(0, Config.CameraHeight, 0) - cameraDirection * Config.CameraBack if queryParams then local hit = workspace:Raycast(anchor, eye - anchor, queryParams) if hit then eye = hit.Position + hit.Normal * 0.35 end end local focus = target + Vector3.new(0, 0.5, 0) if (focus - eye).Magnitude < 0.1 then focus = eye + cameraDirection end local view = focus - eye local up = math.abs(view.Y) / view.Magnitude > 0.98 and Vector3.new(0, 0, 1) or Vector3.new(0, 1, 0) if not cameraSnapshots[camera] then cameraSnapshots[camera] = { Type = camera.CameraType, Subject = camera.CameraSubject, CFrame = camera.CFrame, Focus = camera.Focus, } end camera.CameraType = Enum.CameraType.Scriptable camera.CFrame = CFrame.lookAt(eye, focus, up) camera.Focus = CFrame.new(focus) end local function restoreCamera() if cameraBound then RunService:UnbindFromRenderStep(cameraBinding) cameraBound = false end for camera, saved in pairs(cameraSnapshots) do pcall(function() local subject = saved.Subject if subject and subject.Parent then camera.CameraSubject = subject else local currentCharacter = player.Character local currentHumanoid = currentCharacter and currentCharacter:FindFirstChildOfClass("Humanoid") if currentHumanoid then camera.CameraSubject = currentHumanoid end end camera.CFrame = saved.CFrame camera.Focus = saved.Focus camera.CameraType = saved.Type end) end cameraSnapshots = {} cameraTarget = nil end local function startCamera() if not Config.AutoCamera or cameraBound then return end cameraBound = true RunService:BindToRenderStep(cameraBinding, Enum.RenderPriority.Camera.Value + 1, function() local ok, problem = pcall(updateCamera) if not ok then state.Stop("Camera update failed: " .. tostring(problem)) end end) updateCamera() end local function movementSnapshot(label, target) local actual = root.Position local offset = actual - target local horizontal = Vector2.new(offset.X, offset.Z).Magnitude if Config.MovementDiagnostics then log(string.format("%s: position %s; target gap %.2f (horizontal %.2f, vertical %.2f)", label, positionText(actual), offset.Magnitude, horizontal, math.abs(offset.Y))) end return offset.Magnitude end local function track(connection) connections[connection] = true return connection end local function disconnect(connection) connection:Disconnect() connections[connection] = nil end local function restoreMovement() if movementConnection then movementConnection:Disconnect() movementConnection = nil end for part, original in pairs(collisions) do if part.Parent then pcall(function() part.CanCollide = original end) end end collisions = {} end local function releaseInput() if keyHeld and sendKey then pcall(sendKey, false) keyHeld = false end if heldMouse and sendMouse then pcall(sendMouse, heldMouse, false) heldMouse = nil end end local function restoreSeats() if seatStateBackup ~= nil and humanoid then pcall(function() humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, seatStateBackup) end) end seatStateBackup = nil end function state.Stop(reason) state.Running = false state.Reason = reason or "Stopped by user" if tween then tween:Cancel() tween = nil end releaseInput() restoreMovement() restoreSeats() restoreCamera() end local function check() if not state.Running then error(state.Reason or "Stopped", 0) end if character and (player.Character ~= character or not root.Parent or humanoid.Health <= 0) then error("Character died or changed. Run the script again after respawning.", 0) end end local function pause(seconds) local untilTime = os.clock() + seconds repeat check() task.wait(0.05) until os.clock() >= untilTime check() end local function standUp() check() if humanoid.Sit or humanoid.SeatPart then humanoid.Sit = false humanoid:ChangeState(Enum.HumanoidStateType.GettingUp) pause(0.15) end end local function setupInput() local modernOK, modern = pcall(function() return Input:CreateVirtualInput() end) if modernOK and modern then local usable = pcall(function() modern:SendKey(false, Enum.KeyCode.E, false) modern:SendMousePosition(Input:GetMouseLocation()) end) if usable then sendKey = function(down) modern:SendKey(down, Enum.KeyCode.E, false) end moveMouse = function(position) modern:SendMousePosition(position) end sendMouse = function(position, down) modern:SendMouseButton(position, Enum.UserInputType.MouseButton1, down, 0) end return end end local manager = game:GetService("VirtualInputManager") local usable, problem = pcall(function() manager:SendKeyEvent(false, Enum.KeyCode.E, false, game) local position = Input:GetMouseLocation() manager:SendMouseMoveEvent(position.X, position.Y, game) end) if not usable then error("Input simulation is unavailable in this executor session: " .. tostring(problem), 0) end sendKey = function(down) manager:SendKeyEvent(down, Enum.KeyCode.E, false, game) end moveMouse = function(position) manager:SendMouseMoveEvent(position.X, position.Y, game) end sendMouse = function(position, down) manager:SendMouseButtonEvent(position.X, position.Y, 0, down, game, 0) end end local function observeArrival(position, name) pause(Config.ArrivalPause) local deadline = os.clock() + Config.ArrivalMonitor local nextLog = 0 repeat check() local gap = (root.Position - position).Magnitude if gap > 5 then movementSnapshot("Arrival changed at " .. name, position) error(string.format("Could not stay at %s: position %s, target %s, gap %.2f studs. " .. "The log cannot distinguish a server correction from collision/physics displacement.", name, positionText(root.Position), positionText(position), gap), 0) end if os.clock() >= nextLog then movementSnapshot("Checking arrival at " .. name, position) nextLog = os.clock() + 1 end pause(0.1) until os.clock() >= deadline end local function tweenLeg(position, name, speed, verifyArrival, supportVertical) check() cameraTarget = position speed = speed or Config.TweenSpeed local start = root.CFrame local distance = (root.Position - position).Magnitude log(string.format("Tweening to %s: %.1fs at %.0f studs/s", name, distance / speed, speed)) if Config.MovementDiagnostics then log(string.format("Travel: start %s; target %s; %.1f studs at %.1f studs/s; about %.1f seconds", positionText(start.Position), positionText(position), distance, speed, distance / speed)) end if distance <= 1 then if verifyArrival ~= false then observeArrival(position, name) end return end local function keepMoving() for _, part in ipairs(character:GetDescendants()) do if part:IsA("BasePart") then if collisions[part] == nil then collisions[part] = part.CanCollide end part.CanCollide = false end end root.AssemblyLinearVelocity = Vector3.zero root.AssemblyAngularVelocity = Vector3.zero end if Config.ChangePhysicsDuringTween then keepMoving() movementConnection = RunService.Stepped:Connect(keepMoving) elseif supportVertical then movementConnection = RunService.Stepped:Connect(function() if not root.Parent then return end local velocity = root.AssemblyLinearVelocity root.AssemblyLinearVelocity = Vector3.new(velocity.X, 0, velocity.Z) end) end local duration = distance / speed local goal = CFrame.new(position) * start.Rotation local movingTween = TweenService:Create( root, TweenInfo.new(duration, Enum.EasingStyle.Linear), {CFrame = goal} ) tween = movingTween local started = os.clock() local divergedAt movingTween:Play() while movingTween.PlaybackState == Enum.PlaybackState.Playing do check() local alpha = math.clamp((os.clock() - started) / duration, 0, 1) local expected = start.Position:Lerp(position, alpha) if (root.Position - expected).Magnitude > 20 then divergedAt = divergedAt or os.clock() if os.clock() - divergedAt > 1 then movementSnapshot("Travel interrupted at " .. name, position) error("Movement was blocked or reset on the way to " .. name .. ".", 0) end else divergedAt = nil end pause(0.1) end check() if movingTween.PlaybackState ~= Enum.PlaybackState.Completed then error("Tween did not complete: " .. name, 0) end tween = nil movementSnapshot("Tween completed at " .. name, position) restoreMovement() movementSnapshot("Normal physics at " .. name, position) if verifyArrival ~= false then observeArrival(position, name) end end local function standingHeight() local height = humanoid.HipHeight + root.Size.Y / 2 if humanoid.RigType == Enum.HumanoidRigType.R6 then local leg = character:FindFirstChild("Left Leg") or character:FindFirstChild("Right Leg") height = height + (leg and leg.Size.Y or 2) end return height end local function floorProbe(position) local hit = workspace:Raycast(position + Vector3.new(0, 2, 0), Vector3.new(0, -12, 0), queryParams) if hit and hit.Normal.Y >= 0.5 then return hit.Position.Y + standingHeight() end end local function landingPosition(position) local floorY = floorProbe(position) if floorY and math.abs(floorY - position.Y) <= 1.5 then return Vector3.new(position.X, math.max(position.Y, floorY), position.Z) end return position end local function slowApproach(position, name, flightY) check() local landing = landingPosition(position) local startFloor = floorProbe(root.Position) local cruiseY = flightY or math.max(root.Position.Y, landing.Y, startFloor or root.Position.Y) + Config.ApproachLift cruiseY = math.max(cruiseY, landing.Y + Config.ApproachLift) local lift = Vector3.new(root.Position.X, cruiseY, root.Position.Z) local elevated = Vector3.new(landing.X, cruiseY, landing.Z) tweenLeg(lift, name .. " clearance", Config.ApproachSpeed, false, true) tweenLeg(elevated, name .. " slow approach", Config.ApproachSpeed, false, true) root.AssemblyLinearVelocity = Vector3.zero root.AssemblyAngularVelocity = Vector3.zero tweenLeg(landing, name, Config.LandingSpeed, false, true) root.AssemblyLinearVelocity = Vector3.zero root.AssemblyAngularVelocity = Vector3.zero observeArrival(landing, name) end local function travel(position, name) if name ~= "Sell Goods" and name ~= "Laundering Machine" then return tweenLeg(position, name) end check() local flightY if name == "Laundering Machine" then flightY = math.max(root.Position.Y, position.Y) + Config.LaundryFlightHeight local takeoff = Vector3.new(root.Position.X, flightY, root.Position.Z) tweenLeg(takeoff, name .. " takeoff", Config.ApproachSpeed, false, true) end local offset = position - root.Position local horizontal = Vector3.new(offset.X, 0, offset.Z) local approachDistance = Config.ApproachDistance if horizontal.Magnitude > approachDistance then local point = position - horizontal.Unit * approachDistance local approachPoint = Vector3.new(point.X, flightY or position.Y, point.Z) tweenLeg(approachPoint, name .. " approach", Config.TweenSpeed, false, flightY ~= nil) root.AssemblyLinearVelocity = Vector3.zero root.AssemblyAngularVelocity = Vector3.zero if not flightY then pause(Config.ArrivalPause) end if (root.Position - position).Magnitude > approachDistance * 2 then error("Movement was reset too far from " .. name .. " to begin the slow approach.", 0) end end for attempt = 1, 2 do local arrived, problem = pcall(slowApproach, position, name, flightY) if arrived then return end if tween then tween:Cancel(); tween = nil end restoreMovement() check() local arrivalCorrected = type(problem) == "string" and problem:find("Could not stay at " .. name .. ":", 1, true) == 1 local canRetry = attempt == 1 and arrivalCorrected and state.Running and player.Character == character and root.Parent and humanoid.Health > 0 and (root.Position - position).Magnitude <= approachDistance * 2 if not canRetry then error(problem, 0) end log("Nearby position correction at " .. name .. "; retrying the slow approach once.") pause(Config.ArrivalPause) end end local function leaveLaundryArea() check() standUp() if (root.Position - WashPosition).Magnitude > Config.LaundryExitRadius then return end local camera = workspace.CurrentCamera local right = camera and camera.CFrame.RightVector or root.CFrame.RightVector right = Vector3.new(right.X, 0, right.Z) if right.Magnitude <= 0.05 then right = Vector3.new(1, 0, 0) end local exit = landingPosition(root.Position - right.Unit * Config.LaundryExitDistance) tweenLeg(exit, "Laundromat left exit", Config.ApproachSpeed) end local function nearestPrompt(hint) local nearest, matched local nearestDistance, matchedDistance = math.huge, math.huge for _, prompt in ipairs(workspace:GetDescendants()) do if prompt:IsA("ProximityPrompt") and prompt.Enabled and prompt.KeyboardKeyCode == Enum.KeyCode.E then local position = promptPosition(prompt) if position then local distance = (root.Position - position).Magnitude if distance <= prompt.MaxActivationDistance then if distance < nearestDistance then nearest, nearestDistance = prompt, distance end local text = (prompt.ObjectText .. " " .. prompt.ActionText .. " " .. prompt.Name):lower() if hint and text:find(hint, 1, true) and distance < matchedDistance then matched, matchedDistance = prompt, distance end end end end end return matched or nearest end local function holdE(seconds, description, hint) check() if Input:GetFocusedTextBox() then error("Close the chat/text box, then run again.", 0) end log(description) local expected = nearestPrompt(hint) if not expected then error("No nearby E prompt found for: " .. description, 0) end cameraTarget = expected updateCamera() if Config.AutoCamera then pause(0.15) end local triggered = false local wrongPrompt = false local listener = track(Prompts.PromptTriggered:Connect(function(prompt, who) if who == player then if prompt == expected then triggered = true else wrongPrompt = true end end end)) keyHeld = true sendKey(true) pause(math.max(seconds, expected.HoldDuration) + Config.HoldPadding) releaseInput() pause(Config.InteractionGap) disconnect(listener) if wrongPrompt then error("Another nearby prompt fired at " .. description .. "; check the position.", 0) end if not triggered then error("No proximity prompt triggered for: " .. description .. ". Check the position or hold duration.", 0) end end local function visible(object) if not object.Parent or object.AbsoluteSize.X <= 0 or object.AbsoluteSize.Y <= 0 then return false end local ancestor = object while ancestor and ancestor ~= player.PlayerGui do if ancestor:IsA("GuiObject") and not ancestor.Visible then return false end if ancestor:IsA("ScreenGui") and not ancestor.Enabled then return false end ancestor = ancestor.Parent end return ancestor == player.PlayerGui end local function normalized(text) return (text:gsub("<[^>]*>", ""):lower():gsub("%s+", " ")) end local function findWashButton() for _, item in ipairs(player.PlayerGui:GetDescendants()) do if (item:IsA("TextButton") or item:IsA("TextLabel")) and visible(item) and normalized(item.Text):find("wash%s*express") then local button = item while button and button ~= player.PlayerGui and not button:IsA("GuiButton") do button = button.Parent end if button and button:IsA("GuiButton") and visible(button) then return button end end end end local function waitForWashMenu() local deadline = os.clock() + Config.MenuTimeout repeat check() local button = findWashButton() if button then return button end for _, item in ipairs(player.PlayerGui:GetDescendants()) do if (item:IsA("TextLabel") or item:IsA("TextButton")) and visible(item) and normalized(item.Text):find("laundromat management", 1, true) then return item end end pause(0.2) until os.clock() >= deadline error("The laundromat menu did not open.", 0) end local function clickWashExpressOnce() check() pause(Config.WashMenuPause) local position = Config.WashClickPosition log(string.format("Clicking Wash Express once at (%d, %d)", position.X, position.Y)) moveMouse(position) pause(0.1) heldMouse = position sendMouse(position, true) pause(0.1) sendMouse(position, false) heldMouse = nil pause(0.35) end local function clickButton(button, label) check() label = label or "Wash Express" if not visible(button) then error("Button disappeared before clicking.", 0) end local clicked = false local activated = track(button.Activated:Connect(function() clicked = true end)) local mouseClick = track(button.MouseButton1Click:Connect(function() clicked = true end)) local center = button.AbsolutePosition + button.AbsoluteSize / 2 local inset = GuiService:GetGuiInset() local candidates = {center, center + inset} for _, position in ipairs(candidates) do check() moveMouse(position) pause(0.1) heldMouse = position sendMouse(position, true) pause(0.1) sendMouse(position, false) heldMouse = nil pause(0.35) if clicked or not visible(button) then break end end disconnect(activated) disconnect(mouseClick) if not clicked and visible(button) then error(label .. " did not receive the click. Close any overlay covering Roblox.", 0) end end local function closeWashMenu(menuAnchor) if not visible(menuAnchor) then return end local panel = menuAnchor.Parent while panel and panel ~= player.PlayerGui do for _, item in ipairs(panel:GetDescendants()) do local closeText = (item:IsA("TextButton") or item:IsA("TextLabel")) and (normalized(item.Text):match("^%s*x%s*$") or normalized(item.Text) == "×") local closeName = item:IsA("GuiButton") and item.Name:lower():find("close", 1, true) if (closeText or closeName) and visible(item) then local close = item while close and close ~= panel and not close:IsA("GuiButton") do close = close.Parent end if close and close:IsA("GuiButton") then clickButton(close, "Close washing menu") pause(0.5) if not visible(menuAnchor) then return end error("Washing menu stayed open after clicking Close.", 0) end end end if panel:IsA("ScreenGui") then break end panel = panel.Parent end error("Could not find the washing menu's Close button.", 0) end local ok, problem = xpcall(function() assert(Config.TweenSpeed > 0, "TweenSpeed must be greater than zero.") assert(Config.ApproachDistance > 0 and Config.ApproachSpeed > 0 and Config.LandingSpeed > 0 and Config.ApproachLift >= 0 and Config.LaundryFlightHeight > 0, "Approach distance, approach speed, and landing speed must be positive; lift cannot be negative.") character = player.Character or player.CharacterAdded:Wait() root = character:WaitForChild("HumanoidRootPart", 10) humanoid = character:FindFirstChildOfClass("Humanoid") assert(root and humanoid, "Character is not ready. Run again after spawning.") seatStateBackup = humanoid:GetStateEnabled(Enum.HumanoidStateType.Seated) humanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, false) standUp() queryParams = RaycastParams.new() queryParams.ExcludeInstances = {character} queryParams.IgnoreWater = true queryParams.RespectCanCollide = true track(Input.InputBegan:Connect(function(input) if input.KeyCode == Config.StopKey then state.Stop() end end)) track(humanoid.Died:Connect(function() state.Stop("Character died. Run again after respawning.") end)) startCamera() log(string.format("Fast farm started: %.0f studs/s. F8 stops. Keep Roblox focused and close the executor overlay.", Config.TweenSpeed)) if Config.MovementTestOnly then log("Movement test only: travelling to Fake Watch without any E holds or clicks.") travel(Shops[1].Position, Shops[1].Name) log("Movement test passed at this location. No purchases were attempted.") return end setupInput() local cycle = 0 repeat cycle = cycle + 1 log("Cycle " .. cycle) leaveLaundryArea() for _, shop in ipairs(Shops) do travel(shop.Position, shop.Name) for number = 1, shop.Count do holdE(Config.BuyHold, shop.Name .. " E hold " .. number .. "/" .. shop.Count, shop.Hint) end end travel(SellPosition, "Sell Goods") holdE(Config.OtherHold, "Sell Goods: holding E", "sell") travel(WashPosition, "Laundering Machine") holdE(Config.OtherHold, "Laundering Machine: holding E", "laundr") local menuAnchor = waitForWashMenu() clickWashExpressOnce() pause(1) closeWashMenu(menuAnchor) log("Wash Express clicked; cycle " .. cycle .. " finished.") if Config.Loop then pause(Config.CyclePause) end until not Config.Loop end, function(message) return debug.traceback(tostring(message), 2) end) local cancelled = not state.Running state.Stop(state.Reason or "Finished") for connection in pairs(connections) do connection:Disconnect() end connections = {} state.Done = true if not ok and not cancelled then warn("[El Paso] Stopped because of an error:\n" .. tostring(problem)) else log(state.Reason or "Finished") end