// ==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();
})();