M
ScriptKeyless
Money & XP Autofarm (fast tweening) (read desc)
El Paso, Texas: Border RoleplayDesktop & mobile readyWave · Codex · Delta · Synapse Z · Volt · Potassium · Seliware · OpiumWare · Real · Matcha
Description
keyless Must have 10k ingame money and thats it It will give XP when the smuggling is over and will give the breifcase full of money to launder This has been tested to perfection! customizable and open source RBLX - El Paso Tested with volt, likely works with all executors. Will instantly start when script is executed Dont worry if the 2 hotdogs dont work, its for Underboss rank and higher for the hotdog buying part, it makes extra profit tho.
GAMEEl Paso, Texas: Border Roleplay
UPDATEDOct 16, 2026
ACCESSKeyless
PLATFORMDesktop & Mobile
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts 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
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place