--// ButtonsMoney Stream-Safe Auto Toucher (Client-sided, no GUI) --======================== -- CONFIG --======================== local SCRIPT_ENABLED = false -- master ON / OFF local LOOP_FOREVER = true -- true = keep cycling, false = run once local FIRE_DELAY_SECONDS = 0.25 -- delay between buttons local PRELOAD_WAIT_SECONDS = 0.25 -- wait after teleport near model local MAIN_WAIT_TIMEOUT = 1.0 -- max time to wait for Main to load local TOUCH_HOLD_SECONDS = 0.10 -- how long to stay touching Main local RETURN_TO_START = false -- return to original position after full cycle local PRELOAD_OFFSET = Vector3.new(0, 8, 0) -- teleport offset near button model local TOUCH_OFFSET = Vector3.new(0, 2.25, 0) -- offset when touching Main -- Touch order local PRIORITY_BUTTON_NAME = "Button4" -- Debug output local DEBUG = true --======================== -- SERVICES --======================== local Players = game:GetService("Players") local player = Players.LocalPlayer --======================== -- LOGGING --======================== local function log(...) if DEBUG then print("[ButtonsMoney]", ...) end end local function warnlog(...) warn("[ButtonsMoney]", ...) end --======================== -- HELPERS --======================== local function getCharacter() local character = player.Character or player.CharacterAdded:Wait() local hrp = character:WaitForChild("HumanoidRootPart", 10) return character, hrp end local function getButtonsFolder() return workspace:WaitForChild("ButtonsMoney", 10) end local function modelCFrame(model: Model): CFrame if model.PrimaryPart then return model.PrimaryPart.CFrame end return model:GetPivot() end local function findMain(model: Model): BasePart? local main = model:FindFirstChild("Main") if main and main:IsA("BasePart") then return main end main = model:FindFirstChild("main") if main and main:IsA("BasePart") then return main end for _, d in ipairs(model:GetDescendants()) do if (d.Name == "Main" or d.Name == "main") and d:IsA("BasePart") then return d end end return nil end local function waitForMain(model: Model, timeout: number): BasePart? local start = os.clock() while os.clock() - start < timeout do if not SCRIPT_ENABLED then return nil end local main = findMain(model) if main then return main end task.wait(0.05) end return nil end --======================== -- CORE ACTIONS --======================== local function touchMain(hrp: BasePart, main: BasePart) hrp.CFrame = main.CFrame + TOUCH_OFFSET task.wait(TOUCH_HOLD_SECONDS) -- ensure contact hrp.CFrame = main.CFrame task.wait(0.03) end local function streamAndTouch(model: Model) if not SCRIPT_ENABLED then return end local _, hrp = getCharacter() if not hrp then return end -- Step 1: preload/stream in by teleporting near the MODEL hrp.CFrame = modelCFrame(model) + PRELOAD_OFFSET task.wait(PRELOAD_WAIT_SECONDS) -- Step 2: wait for Main to appear, then touch it local main = waitForMain(model, MAIN_WAIT_TIMEOUT) if not main then warnlog("Main failed to load for " .. model.Name) return end touchMain(hrp, main) end --======================== -- BUTTON ORDER --======================== local function getOrderedButtons(folder: Instance): {Model} local buttons = {} for _, child in ipairs(folder:GetChildren()) do if child:IsA("Model") then table.insert(buttons, child) end end table.sort(buttons, function(a, b) if a.Name == PRIORITY_BUTTON_NAME then return true end if b.Name == PRIORITY_BUTTON_NAME then return false end return a.Name < b.Name end) return buttons end --======================== -- MAIN CYCLE --======================== local function runCycle() local folder = getButtonsFolder() if not folder then warnlog("ButtonsMoney folder not found.") return end local _, hrp = getCharacter() if not hrp then return end local originalCFrame = hrp.CFrame local buttons = getOrderedButtons(folder) log("Buttons found:", #buttons) for i, model in ipairs(buttons) do if not SCRIPT_ENABLED then break end streamAndTouch(model) -- wait ONLY between buttons (not after the last one) if i < #buttons then task.wait(FIRE_DELAY_SECONDS) end end if RETURN_TO_START and SCRIPT_ENABLED then hrp.CFrame = originalCFrame end end --======================== -- START (NO EXTRA BREAK BETWEEN CYCLES) --======================== log("Script started. Enabled =", SCRIPT_ENABLED) task.spawn(function() while true do if not LOOP_FOREVER then if SCRIPT_ENABLED then runCycle() end break end if SCRIPT_ENABLED then runCycle() -- immediately starts next cycle after this returns else task.wait(0.1) -- small idle sleep when disabled end end end)