
Keyless

--// 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)
made by ChatGPT 5.2