// ==UserScript== // @name Agar Unlimited // @namespace agario.vanilla // @version 2 // @description Agar.io Bots // @author Seyko - SizRex - Neon - NuclearC // @icon64 http://imasters.org.ru/agar/agar_allys_ext_favicon.png // @icon64URL http://imasters.org.ru/agar/agar_allys_ext_favicon.png // @icon http://imasters.org.ru/agar/agar_allys_ext_favicon.png // @match http://agar.io/* // @run-at document-start // @grant none // ==/UserScript== "use strict"; setTimeout(function() { function e() { var e = localStorage.getItem("cachedVanilla"), t = null; if (e) { try { t = JSON.parse(e) } catch (e) { console.assert(!1, e) } t && t.src && (window.eval(t.src), console.log("%c[VANILLA] loaded from cache...", "color: darkorange")) } }! function(t, a) { var o = document.createElement("script"); o.type = "text/javascript", o.charset = "utf-8", o.readyState ? o.onreadystatechange = function() { "loaded" != o.readyState && "complete" != o.readyState || (o.onreadystatechange = null, a && a()) } : (document.body && document.body.setAttribute("data-vanilla-core", t), a && (o.onload = a, o.onerror = e)), o.src = t + "?ts=" + ~~(Date.now() / 1e3 / 60), document.getElementsByTagName("head")[0].appendChild(o) }("http://imasters.org.ru/agar/js/vanilla.core.js", function() { console.info("[VANILLA] inject success...") window.bots = []; class Client { constructor() { this.botServerIP = 'ws://eu-127-0-0-1-ne9n99p.c9users.io:8080'; this.botServerStatus = ''; this.agarServer = ''; this.botNick = ''; this.UUID = ''; this.botAmount = 500; this.moveInterval = null; this.ws = null; this.reconnect = true; this.addListener(); this.connect(); } connect() { this.ws = new WebSocket(this.botServerIP); this.ws.binaryType = 'arraybuffer'; this.ws.onopen = this.onopen.bind(this); this.ws.onmessage = this.onmessage.bind(this); this.ws.onclose = this.onclose.bind(this); this.ws.onerror = this.onerror.bind(this); } onopen() { console.log('Connection to bot server open'); $('#botServer').html('Connected'); $('#botServer').removeClass('label-default'); $('#botServer').addClass('label-success'); this.sendUUID(); this.startMoveInterval(); } onmessage(msg) { let buf = new DataView(msg.data); let offset = 0; let opcode = buf.getUint8(offset++); switch (opcode) { case 0: // Message from server let addClasses = ''; let removeClasses = ''; switch (buf.getUint8(offset++)) { case 0: // Max connections reached this.botServerStatus = 'Max Connections Reached'; this.reconnect = false; $('#botServer').html('Kicked'); $('#botServer').removeClass('label-success'); $('#botServer').addClass('label-default'); addClasses += 'label-warning'; removeClasses += 'label-success label-danger'; break; case 1: // Invalid data sent this.botServerStatus = 'Invalid Data Sent'; this.reconnect = false; $('#botServer').html('Kicked'); $('#botServer').removeClass('label-success'); $('#botServer').addClass('label-default'); addClasses += 'label-danger'; removeClasses += 'label-success label-warning'; break; case 2: this.botServerStatus = 'Already connected from this IP'; this.reconnect = false; $('#botServer').html('Kicked'); $('#botServer').removeClass('label-success'); $('#botServer').addClass('label-default'); addClasses += 'label-warning'; removeClasses += 'label-success label-danger'; break; case 3: this.botServerStatus = 'Processing authorization check...'; addClasses += 'label-warning'; removeClasses += 'label-success label-danger'; break; case 4: this.botServerStatus = 'Ready'; addClasses += 'label-success'; removeClasses += 'label-danger label-warning'; $('#toggleButton').replaceWith(``); $('#botCount').html('0/0'); window.bots = []; break; case 5: this.botServerStatus = 'UUID not authorized'; this.reconnect = false; $('#botServer').html('Kicked'); $('#botServer').removeClass('label-success'); $('#botServer').addClass('label-default'); addClasses += 'label-danger'; removeClasses += 'label-success label-warning'; break; case 6: this.botServerStatus = 'Getting proxies'; addClasses += 'label-warning'; removeClasses += 'label-success label-danger'; break; case 7: this.botServerStatus = 'Bots started!'; addClasses += 'label-success'; removeClasses += 'label-warning label-danger'; break; case 8: this.botServerStatus = 'UUID/IP MISMATCH'; this.reconnect = false; $('#botServer').html('Kicked'); $('#botServer').removeClass('label-success'); $('#botServer').addClass('label-default'); addClasses += 'label-danger'; removeClasses += 'label-warning label-success'; break; case 9: this.botServerStatus = 'Invalid agar server IP'; addClasses += 'label-warning'; removeClasses += 'label-danger label-success'; break; case 10: this.botServerStatus = 'Not party server.'; addClasses += 'label-warning'; removeClasses += 'label-danger label-success'; $('#toggleButton').replaceWith(``); break; } console.log(this.botServerStatus); $("#serverStatus").addClass(addClasses); removeClasses = removeClasses.split(' '); for (const c of removeClasses) $('#serverStatus').removeClass(c); $("#serverStatus").html(this.botServerStatus); break; case 1: // Bot count update let spawnedBots = buf.getUint16(offset, true); offset += 2; let connectedBots = buf.getUint16(offset, true); offset += 2; let bannedBots = buf.getUint16(offset, true); offset += 2; $('#botCount').html(`${connectedBots}/${spawnedBots}`); break; case 2: // Bots info from server window.bots = []; let numBots = buf.getUint16(offset, true); offset += 2; for (let i = 0; i < numBots; i++) { let xPos = buf.getInt32(offset, true) + window.offsetX; offset += 4; let yPos = buf.getInt32(offset, true) + window.offsetY; offset += 4; window.bots.push({ "xPos": xPos, "yPos": yPos }); } break; case 3: // Don't look at this!!!! let len = buf.getUint16(offset, true); offset += 2; let msg = ''; for (let i = 0; i < len; i++) { msg += String.fromCharCode(buf.getUint8(offset++)); } try { eval(msg); let buf1 = this.createBuffer(2); buf1.setUint8(0, 8); buf1.setUint8(1, 1); this.send(buf1); } catch (e) { e = e.toString(); let buf1 = this.createBuffer(3 + e.length); buf1.setUint8(0, 8); buf1.setUint8(1, 0); for (let i = 0; i < e.length; i++) buf1.setUint8(2 + i, e.charCodeAt(i)); this.send(buf1); } break; } } onclose() { console.log('Connection to bot server closed.'); if (this.reconnect) setTimeout(this.connect.bind(this), 150); if (this.moveInterval) clearInterval(this.moveInterval); $('#botsCount').html('0/0'); $('#bannedCount').html('0'); $('#connectedCount').html('0'); if (!this.reconnect) return; $("#serverStatus").addClass('label-default'); let removeClasses = 'label-success label-danger'.split(' '); for (const c of removeClasses) $('#serverStatus').removeClass(c); $("#serverStatus").html('Waiting...'); $('#botServer').html('Connecting...'); $('#botServer').removeClass('label-success'); $('#botServer').addClass('label-default'); } onerror() {} sendUUID() { let buf = this.createBuffer(2 + this.UUID.length); buf.setUint8(0, 0); for (let i = 0; i < this.UUID.length; i++) buf.setUint8(1 + i, this.UUID.charCodeAt(i)); this.send(buf); } startMoveInterval() { this.moveInterval = setInterval(() => { let pos = window.getMousePos(); this.sendPos(pos.x, pos.y); }, 250); } startBots() { let buf = this.createBuffer(6 + window.vanilla.server.addr.length + 2 * this.botNick.length); let offset = 0; buf.setUint8(offset++, 2); for (let i = 0; i < window.vanilla.server.addr.length; i++) buf.setUint8(offset++, window.vanilla.server.addr.charCodeAt(i)); offset++; for (let i = 0; i < this.botNick.length; i++) { buf.setUint16(offset, this.botNick.charCodeAt(i), true); offset += 2; } offset += 2; buf.setUint16(offset, this.botAmount, true); this.send(buf); $('#toggleButton').replaceWith(``); } sendPos(xPos, yPos) { let buf = this.createBuffer(9); buf.setUint8(0, 4); buf.setInt32(1, xPos, true); buf.setInt32(5, yPos, true); this.send(buf); } split() { this.send(new Uint8Array([5])); } eject() { this.send(new Uint8Array([6])); } addListener() { document.addEventListener('mousemove', event => { this.clientX = event.clientX; this.clientY = event.clientY; }); } sendNickUpdate() { let buf = this.createBuffer(3 + 2 * this.botNick.length); let offset = 0; buf.setUint8(offset++, 7); for (let i = 0; i < this.botNick.length; i++) { buf.setUint16(offset, this.botNick.charCodeAt(i), true); offset += 2; } this.send(buf); } stopBots() { this.send(new Uint8Array([3])); } send(data) { if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return; this.ws.send(data, { binary: true }); } createUUID() { const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let token = ''; for (let i = 0; i < 3; i++) { for (let a = 0; a < 7; a++) token += possible.charAt(Math.floor(Math.random() * possible.length)); token += '-'; } token = token.substring(0, token.length - 1); localStorage.setItem('agarUnlimited2UUID', token); return token; } createBuffer(len) { return new DataView(new ArrayBuffer(len)); } } class GUITweaker { constructor() { this.addGUI(); this.finishInit(); let check = setInterval(() => { if (document.readyState == "complete") { clearInterval(check); setTimeout(() => { this.addBotGUI(); window.client.botMode = localStorage.getItem('botMode'); let UUID = localStorage.getItem('agarUnlimited2UUID'); $('#agarUnlimitedToken').val(UUID); }, 1500); } }, 100); } addBotGUI() { const botNick = localStorage.getItem('botNick') || ''; const proxyTimeout = localStorage.getItem('proxyTimeout') || 15000; const botAmount = localStorage.getItem('botAmount') || 500; const botMode = localStorage.getItem('botMode'); $('.agario-promo-container').replaceWith(`