Snay.io Split/Feed Macro

Adjustable key macro for split/feed with customizable keys that save & load automatically, including Big Split Macro.

目前為 2025-03-06 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Snay.io Split/Feed Macro
// @namespace    http://tampermonkey.net/
// @version      3.1
// @description  Adjustable key macro for split/feed with customizable keys that save & load automatically, including Big Split Macro.
// @author       GravityG
// @match        https://www.snay.io/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    let gameKeys = {};
    let intervalId = null;
    let inputFocused = false;

    // Load saved settings or set defaults
    let macroSpeed = localStorage.getItem('macroSpeed') ? parseInt(localStorage.getItem('macroSpeed')) : 1000;
    let macroKey = localStorage.getItem('macroKey') || "F";
    let macroActionKey = localStorage.getItem('macroActionKey') || "E";
    let quadSplitKey = localStorage.getItem('quadSplitKey') || "R";
    let secondaryMacroKey = localStorage.getItem('secondaryMacroKey') || "G";
    let bigSplitKey = localStorage.getItem('bigSplitKey') || "S"; // New Big Split Macro Key
    let macroDelay = localStorage.getItem('macroDelay') ? parseInt(localStorage.getItem('macroDelay')) : 20;

    function triggerMacro() {
        if (inputFocused) return;

        let macroEventDown = new KeyboardEvent('keydown', { key: macroActionKey, code: `Key${macroActionKey}` });
        let quadEventDown = new KeyboardEvent('keydown', { key: quadSplitKey, code: `Key${quadSplitKey}` });

        let macroEventUp = new KeyboardEvent('keyup', { key: macroActionKey, code: `Key${macroActionKey}` });
        let quadEventUp = new KeyboardEvent('keyup', { key: quadSplitKey, code: `Key${quadSplitKey}` });

        window.dispatchEvent(macroEventDown);
        window.dispatchEvent(quadEventDown);

        setTimeout(() => {
            window.dispatchEvent(macroEventUp);
            window.dispatchEvent(quadEventUp);
        }, 50);
    }

    function triggerSecondaryMacro() {
        if (inputFocused) return;

        let spaceDown = new KeyboardEvent('keydown', { key: " ", code: "Space" });
        let spaceUp = new KeyboardEvent('keyup', { key: " ", code: "Space" });

        window.dispatchEvent(spaceDown);
        setTimeout(() => {
            window.dispatchEvent(spaceUp);
            setTimeout(triggerMacro, macroDelay);
        }, 20);
    }

    function triggerBigSplitMacro() {
        if (inputFocused) return;

        let quadDown = new KeyboardEvent('keydown', { key: quadSplitKey, code: `Key${quadSplitKey}` });
        let quadUp = new KeyboardEvent('keyup', { key: quadSplitKey, code: `Key${quadSplitKey}` });

        let spaceDown = new KeyboardEvent('keydown', { key: " ", code: "Space" });
        let spaceUp = new KeyboardEvent('keyup', { key: " ", code: "Space" });

        window.dispatchEvent(quadDown);
        setTimeout(() => {
            window.dispatchEvent(quadUp);
            setTimeout(() => {
                window.dispatchEvent(spaceDown);
                setTimeout(() => window.dispatchEvent(spaceUp), 50);
            }, 40); // 20ms delay between quad split and space bar
        }, 50);
    }

    window.addEventListener('keydown', function(event) {
        if (inputFocused) return;

        if (event.key.toUpperCase() === macroKey && !gameKeys[macroKey]) {
            gameKeys[macroKey] = true;
            event.preventDefault();

            triggerMacro();
            intervalId = setInterval(triggerMacro, macroSpeed);
        }

        if (event.key.toUpperCase() === secondaryMacroKey) {
            event.preventDefault();
            triggerSecondaryMacro();
        }

        if (event.key.toUpperCase() === bigSplitKey) {
            event.preventDefault();
            triggerBigSplitMacro();
        }
    });

    window.addEventListener('keyup', function(event) {
        if (event.key.toUpperCase() === macroKey) {
            gameKeys[macroKey] = false;
            clearInterval(intervalId);
            intervalId = null;
        }
    });

    function waitForModMenu() {
        const modMenu = document.getElementById('modmenu');
        if (modMenu) {
            createQuickSettings(modMenu);
        } else {
            setTimeout(waitForModMenu, 500);
        }
    }

    function createQuickSettings(modMenu) {
        let settingsContainer = document.createElement('div');
        settingsContainer.style.border = "0.1vw solid yellowgreen";
        settingsContainer.style.width = "100%";
        settingsContainer.innerHTML = `
            <li style="display: flex; align-items: center;">
                <img src="/assets/img/Splitx4_Macro.png" style="width: 3vw; height: 3vw;">
                <span style="font-size: 1.5vw; color: white;">Split Macro</span>
            </li>
            <li style="display: flex; align-items: center; width: 90%;">
                <input type="range" min="0" max="600" value="${macroSpeed}" class="slider" id="feedsplitmacro">
                <output id="feedsplitmacroValue" class="modmenuvalue">${macroSpeed}</output>
            </li>
            <li style="display: flex; align-items: center; margin-top: 10px;">
                <span style="font-size: 1.5vw; color: white;">In Split Macro</span>
            </li>
            <li style="display: flex; align-items: center; width: 90%;">
                <input type="range" min="0" max="300" value="${macroDelay}" class="slider" id="macroDelaySlider">
                <output id="macroDelaySliderValue" class="modmenuvalue">${macroDelay}</output>
            </li>
            ${createKeyButton("Split/Macro Key:", "macroKeyButton", macroKey)}
            ${createKeyButton("In Split Key:", "secondaryMacroKeyButton", secondaryMacroKey)}
            ${createKeyButton("Big Split Key:", "bigSplitKeyButton", bigSplitKey)}
            ${createKeyButton("Macro Action Key:", "macroActionKeyButton", macroActionKey)}
            ${createKeyButton("Quad Action Key:", "quadSplitKeyButton", quadSplitKey)}
        `;

        modMenu.appendChild(settingsContainer);

        document.getElementById('feedsplitmacro').addEventListener('input', function() {
            macroSpeed = parseInt(this.value);
            document.getElementById('feedsplitmacroValue').textContent = macroSpeed;
            localStorage.setItem('macroSpeed', macroSpeed);
        });

        document.getElementById('macroDelaySlider').addEventListener('input', function() {
            macroDelay = parseInt(this.value);
            document.getElementById('macroDelaySliderValue').textContent = macroDelay;
            localStorage.setItem('macroDelay', macroDelay);
        });

        setupKeybinds();
    }

    function createKeyButton(label, id, key) {
        return `
            <li style="display: flex; align-items: center; width: 90%; margin-top: 10px;">
                <span style="font-size: 1.2vw; color: white;">${label}</span>
                <button id="${id}" style="margin-left: 0.5vw; padding: 0.8vw; font-size: 1.2vw; background: limegreen; color: white; border: none; cursor: pointer; border-radius: 5px;">${key}</button>
            </li>
        `;
    }

    function setupKeybinds() {
        setupKeyChange('macroKeyButton', 'macroKey');
        setupKeyChange('macroActionKeyButton', 'macroActionKey');
        setupKeyChange('quadSplitKeyButton', 'quadSplitKey');
        setupKeyChange('secondaryMacroKeyButton', 'secondaryMacroKey');
        setupKeyChange('bigSplitKeyButton', 'bigSplitKey');
    }

    function setupKeyChange(buttonId, storageKey) {
        document.getElementById(buttonId).addEventListener('click', function() {
            this.textContent = "Press a key...";
            document.addEventListener('keydown', function setKey(event) {
                let newKey = event.key.toUpperCase();
                localStorage.setItem(storageKey, newKey);
                document.getElementById(buttonId).textContent = newKey;
                document.removeEventListener('keydown', setKey);
            });
        });
    }

    waitForModMenu();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址