Mouse-Follow Auto Clicker (Smooth + Burst, Max 10k CPS, Hold M1)

Auto clicker: Smooth + Burst modes, max 10k CPS. Hold M1 to click, Q to toggle or set CPS.

// ==UserScript==
// @name         Mouse-Follow Auto Clicker (Smooth + Burst, Max 10k CPS, Hold M1)
// @namespace    http://tampermonkey.net/
// @version      10.0
// @description  Auto clicker: Smooth + Burst modes, max 10k CPS. Hold M1 to click, Q to toggle or set CPS.
// @author       TheHackerClient
// @match        *://*/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let running = false;       // Q toggled state
    let cps = 100;             // Default clicks per second
    let lastMouseX = 0, lastMouseY = 0;
    let m1Down = false;        // Track if M1 is held
    let clickTimer = null;     // Single interval for clicking

    // Track mouse
    document.addEventListener("mousemove", e => {
        lastMouseX = e.clientX;
        lastMouseY = e.clientY;
    });

    // Track M1 press
    document.addEventListener("mousedown", e => {
        if (e.button === 0) m1Down = true;
    });

    document.addEventListener("mouseup", e => {
        if (e.button === 0) m1Down = false;
    });

    // Toggle with Q
    document.addEventListener("keyup", evt => {
        if (evt.key.toLowerCase() === "q") {
            if (!running) {
                running = true;
                let inp = prompt("Enter CPS (1–10000, default 100):", cps);
                if (!isNaN(inp) && inp.trim().length > 0) {
                    inp = parseInt(inp);
                    cps = Math.min(10000, Math.max(1, inp));
                }
                alert(`Auto Clicker enabled. Hold M1 to click at ${cps} CPS. Press Q again to disable.`);
            } else {
                running = false;
                stopClicking();
                alert("Auto Clicker disabled.");
            }
        }
    });

    function startClicking() {
        if (clickTimer) return;

        let intervalMs = 1000 / cps;

        clickTimer = setInterval(() => {
            if (running && m1Down) {
                // Smooth click
                simulateClick(lastMouseX, lastMouseY);

                // Burst clicks (up to 10% of CPS)
                let burstClicks = Math.ceil(cps / 10);
                for (let i = 1; i < burstClicks; i++) {
                    simulateClick(lastMouseX, lastMouseY);
                }
            }
        }, intervalMs);
    }

    function stopClicking() {
        if (clickTimer) {
            clearInterval(clickTimer);
            clickTimer = null;
        }
    }

    // Continuously check M1 state
    setInterval(() => {
        if (running && m1Down && !clickTimer) startClicking();
        if (!m1Down && clickTimer) stopClicking();
    }, 50);

    function simulateClick(x, y) {
        let el = document.elementFromPoint(x, y);
        if (!el) return;
        el.dispatchEvent(new MouseEvent("mousedown", { bubbles: true, clientX: x, clientY: y }));
        el.dispatchEvent(new MouseEvent("mouseup", { bubbles: true, clientX: x, clientY: y }));
        el.dispatchEvent(new MouseEvent("click", { bubbles: true, clientX: x, clientY: y }));
    }

})();