// ==UserScript==
// @name Репликатор
// @description Репликатор твоих действий для браузерных (.io) игр
// @author https://gf.qytechs.cn/ru/users/393261-фелкис
// @version Кастомная
// @include http://*.io/*
// @include https://*.io/*
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-start
// @namespace https://gf.qytechs.cn/users/393261
// ==/UserScript==
//Установка
//1) Найдите и добавьте расширение Tampermonkey для своего браузера
// Opera: https://addons.opera.com/ru/extensions/details/tampermonkey-beta/
// Google: https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo
// Yandex: https://я-браузер.рф/tampermonkey-yandex-browser.html|
//2) По значку Tampermonkey, в верхнем правом углу, нажмите "Создать новый скрипт"
//3) Скопируйте и вставьте код в "Новый скрипт"
//4) В верхнем левом угле маленького окошка: Файл > Сохранить
//5) Откройте желаемую игры (Например, Diep.io)
//6) Дождитесь уведомления "Репликатор успешно загружен!"
//7) Повторите N раз (Наилучший вариант - не более 2-х раз!) пункт 4 и 5, при этом попытайтесь попасть на один и тот же сервер с "Репликатором" (Например, с помощью "Party Link")
//8) Разбейте образовавшиеся вкладки на несколько окон
//9) Удачи :)
//Назначение клавиш
//V (Рус. М) (Держать) - Отключить репликатор
//V (Рус. М) (Отпустить) - Включить репликатор
//Принцип действия
//Это старый добрый Multibox в новой оболочке:
// + Предположительно, работает в любой io игре
// + Меньше лагает за счет некоторых введенных ограничений, но может быть менее стабильным...
// + Репликатор можно отключать прямо во время игры, удерживая клавишу V (Рус. М), при этом все ваши клоны продолжат действовать исходя из предыдущего состояния
// Например, вы не двигались и зажали V, после чего начали движение, но ваши клоны двигаться не будут. Это дает возможность собрать в кучу всех своих персонажей
// Ну а при наличии некоторых навыков это может позволить и вовсе воевать на два фронта, дерзайте :)
//В погоне за славой
//Вас никто не заставляет этого делать, но в юлагодарность вы можете добавть в свой ник приставку "[Java]", пусть все знают, что вы "крутой" программист :)
//Пакеты контроля
var KeycodesTrick;
//KeycodesTrick = [87,65,83,68,13,32,16,69,67,49,50,51,52,53,54,55,56,77,85,72,75,79] //Полный пакет + (Все клавиши, но может лагать)
//KeycodesTrick = [87,65,83,68,13,32,16,69,67,49,50,51,52,53,54,55,56,77,85,72] //Полный пакет (Все клавиши, кроме Sandbox)
//KeycodesTrick = [87,65,83,68,13,32,16,69,67,49,50,51,52,53,54,55,56,77,85] //Универсальный (Нет клавиш режимов)
//KeycodesTrick = [87,65,83,68,13,32,16,69,67,49,50,51,52,53,54,55,56] //Достаточный (Нет клавиш U и M)
//KeycodesTrick = [87,65,83,68,13,32,16,69,67] //Уменьшенный 1 (Оключены клавиши с 1 до 8)
KeycodesTrick = [87,65,83,68,13,69,67] //Уменьшенный 2 (Оключены клавиши Shift и Emptyspace)
//KeycodesTrick = [87,65,83,68,13] //Минимальный (Только необходимое, нет клавиш C и E)
var KeycodesState = [];
var MouseState = [];
GM_setValue("Keys86",false);
//Подключение клавиатуры
document.addEventListener("keyup",function(key){
if (document.hasFocus()){
key = key.keyCode || key.which;
GM_setValue("Keys"+key,false);
KeycodesState[key] = false;
};
});
document.addEventListener("keydown",function(key){
if (document.hasFocus()){
key = key.keyCode || key.which;
GM_setValue("Keys"+key,true);
KeycodesState[key] = true;
};
});
//Подключение мыши
document.addEventListener("mouseup",function(but){
if (document.hasFocus()){
GM_setValue("Click"+but.button,false);
MouseState[but.button] = false;
};
});
document.addEventListener("mousedown",function(but){
if (document.hasFocus()){
GM_setValue("Click"+but.button,true);
MouseState[but.button] = true;
};
});
document.addEventListener("mousemove",function(mouse){
if (document.hasFocus()){
GM_setValue("GlobalX",mouse.clientX/window.innerWidth);
GM_setValue("GlobalY",mouse.clientY/window.innerHeight);
};
});
//Репликация
function Trick(){
if (!GM_getValue("Keys"+86) && !document.hasFocus()){
//Снисхронизация клавиатуры
KeycodesTrick.forEach(function(key){
var GState = GM_getValue("Keys"+key);
if (KeycodesState[key] != GState){
KeycodesState[key] = GState;
var Reply = document.createEvent("Event");
if (GState) {
Reply.initEvent("keydown",true,true);
Reply.keyCode = key;
} else {
Reply.initEvent("keyup",true,true);
Reply.keyCode = key;
};
window.dispatchEvent(Reply);
};
});
//Снисхронизация мышки
//Баг где-то тут!
if (typeof canvas != undefined){
var LocalX = GM_getValue("GlobalX")*window.innerWidth;
var LocalY = GM_getValue("GlobalY")*window.innerHeight;
if (isFinite(LocalX)&&isFinite(LocalY)){
MouseState.forEach(function(state,but){
var GMouseState = GM_getValue("Click"+but);
if (GMouseState != state){
MouseState[but] = GMouseState;
if (GMouseState){
canvas.dispatchEvent(new MouseEvent('mousedown',{'clientX':LocalX,'clientY':LocalY,'button':0,'mozPressure':1.0}));
} else {
canvas.dispatchEvent(new MouseEvent('mouseup',{'clientX':LocalX,'clientY':LocalY,'button':0,'mozPressure':1.0}));
};
};
});
canvas.dispatchEvent(new MouseEvent('mousemove',{'clientX':LocalX,'clientY':LocalY}));
};
};
};
setTimeout(Trick,10);
};
alert("Репликатор успешно загружен!")
setTimeout(Trick,10);