function editCore(core) { core = core.replace(/;if\((\w)<1\.0\){/i, ";if($1<0){"); core = core.replace( /([\w]+\s*=\s*[\w]+\s*\+\s*16\s*\|\s*0;\s*([\w=]+)\s*=\s*\+[\w\[\s*><\]]+;)/, "$1 $2*=0.75;" ); core = core.replace( /([\w$]+\(\d+,\w\[\w>>2\]\|0,(\+\w),(\+\w)\)\|0;[\w$]+\(\d+,\w\[\w>>2\]\|0,\+-(\+\w\[\w\+\d+>>3\]),\+-(\+\w\[\w\+\d+>>3\])\)\|0;)/i, "$1 window.viewScale=$2; if (window.coordOffsetFixed) { window.playerX=$4+window.offsetX; window.playerY=$5+window.offsetY;} if(window.draw){window.draw();}" ); core = core.replace( /(\w\[\w\+(\d+)>>3]=(\w);\w\[\w\+(\d+)>>3]=(\w);\w\[\w\+(\d+)>>3]=(\w);\w\[\w\+(\d+)>>3]=(\w);\w\=\w\+(\d+)\|(\d+);)/i, "$1 function setMapCoords(_0x7e8bx1, _0x7e8bx2, _0x7e8bx3, _0x7e8bx4, _0x7e8bx5, _0x7e8bx6) { if (_0x7e8bx6 - _0x7e8bx5 == 24) { if (_0x7e8bx3 - _0x7e8bx1 > 14E3) { if (_0x7e8bx4 - _0x7e8bx2 > 14E3) { window.offsetX = 7071.067811865476 - _0x7e8bx3; window.offsetY = 7071.067811865476 - _0x7e8bx4; window.minX = _0x7e8bx1;window.minY=_0x7e8bx2;window.maxX=_0x7e8bx3;window.maxY=_0x7e8bx4; window.coordOffsetFixed = true; } } } } setMapCoords($3,$5,$7,$9,$2,$8);" ); console.log("core_edited"); return core; } window.draw = () => { if (!window.minX || !window.minY || !window.maxY || !window.maxY) return; const ctx = document.getElementById("canvas").getContext("2d"); ctx.save(); ctx.strokeStyle = "#0000ff"; ctx.lineWidth = 20; ctx.lineCap = "round"; ctx.lineJoin = "round"; ctx.beginPath(); ctx.moveTo(window.minX, window.minY); ctx.lineTo(window.maxX, window.minY); ctx.lineTo(window.maxX, window.maxY); ctx.lineTo(window.minX, window.maxY); ctx.closePath(); ctx.stroke(); ctx.restore(); }; let observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (/agario\.core\.js/i.test(node.src)) { observer.disconnect(); node.parentNode.removeChild(node); let request = new XMLHttpRequest(); request.open("get", node.src, true); request.send(); request.onload = function () { let coretext = this.responseText; let newscript = document.createElement("script"); newscript.type = "text/javascript"; newscript.async = true; newscript.textContent = editCore(coretext); document.body.appendChild(newscript); setTimeout(() => { window.client = new Client(); }, 3500); }; } }); }); }); observer.observe(document, { attributes: true, characterData: true, childList: true, subtree: true, }); class Node { constructor() { this.x = 0; this.y = 0; this.size = 0; this.flags = 0; this.extendedFlags = 0; this.isVirus = false; this.isFood = false; } } class Client { constructor() { this.fetchLatest(); this.collectPellets2 = false; this.collectPellets = false; this.startedBots = false; this.authorized = false; this.bots = new Array(); this.addEventListener(); this.spawnedBots = 0; this.clientX2 = 0; this.clientY2 = 0; this.clientX = 0; this.clientY = 0; this.botID = 1; this.loadCSS(); } async fetchLatest() { const file = await fetch("https://agar.io/mc/agario.js").then((response) => response.text() ); const clientVersionString = "3.11.3" this.protocolKey = 10000 * parseInt(clientVersionString.split(".")[0]) + 100 * parseInt(clientVersionString.split(".")[1]) + parseInt(clientVersionString.split(".")[2]); } addEventListener() { document.addEventListener("keydown", (event) => { let key = String.fromCharCode(event.keyCode); if (key == "X") { this.splitBots(); } else if (key == "C") { this.ejectBots(); } else if (key == "P") { if (this.authorized) return this.send(new Uint8Array([5])); this.collectPellets = !this.collectPellets; console.log(`Collect Pellets: ${this.collectPellets}`); } }); document.addEventListener("mousemove", (event) => { this.clientX = event.clientX; this.clientY = event.clientY; }); let check = setInterval(() => { if (document.readyState == "complete") { clearInterval(check); setTimeout(() => { this.loadGUI(); }, 1500); } }, 100); } 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("agarUnlimited3UUID", token); return token; } loadCSS() { let script = document.createElement("script"); script.src = "https://cdn.jsdelivr.net/npm/sweetalert2@9"; document.getElementsByTagName("head")[0].appendChild(script); $("head").append( `` ); if (!localStorage.getItem("agarUnlimited3UUID")) localStorage.setItem("agarUnlimited3UUID", this.createUUID()); this.uuid = localStorage.getItem("agarUnlimited3UUID"); } loadGUI() { $(".agario-promo-container").replaceWith(`
`); if (!localStorage.getItem("botAmount")) localStorage.setItem("botAmount", 10); if (!localStorage.getItem("botNick")) localStorage.setItem("botNick", "Sanik"); console.log("[AgarUnlimited] Ready!"); } startBots(amount) { if (this.authorized) return this.startBots2(); amount > 200 ? (amount = 200) : (amount = amount); for (let i = 0; i < amount; i++) { this.bots.push( new Bot( this.protocolKey, window.client.botID, `wss://${window.MC.getHost()}:443?party_id=${window.MC.getPartyToken()}`, false ) ); this.botID++; } console.log( `[AgarUnlimited] Starting ${localStorage.getItem("botAmount")} bots!` ); $("#toggleButton").replaceWith( `` ); this.startedBots = true; } stopBots() { if (!this.startedBots) return; if (this.authorized) return this.stopBots2(); this.bots.forEach((bot) => { bot.ws.close(); }); this.bots.length = 0; console.log("[AgarUnlimited] Stopped bots!"); $("#toggleButton").replaceWith( `` ); this.startedBots = false; } splitBots() { if (this.authorized) return this.send(new Uint8Array([3])); if (this.bots.length == 0) return; this.bots.forEach((bot) => bot.split()); } ejectBots() { if (this.authorized) return this.send(new Uint8Array([4])); if (this.bots.length == 0) return; this.bots.forEach((bot) => bot.eject()); } Buffer(buf, msg) { if (msg) { buf = new Uint8Array(buf); let fixedbuffer = new DataView(new ArrayBuffer(buf.byteLength)); for (let i = 0; i < buf.byteLength; i++) { fixedbuffer.setUint8(i, buf[i]); } return fixedbuffer; } return new DataView(new ArrayBuffer(!buf ? 1 : buf)); } send(buf) { if (this.ws && this.ws.readyState == 1) this.ws.send(buf); } } class Bot { constructor(protocolKey, id, server, p2p) { this.protocolKey = protocolKey; this.botNick = localStorage.getItem("botNick"); this.borders = new Object(); this.protocolVersion = 22; this.nodes = new Array(); this.node = new Object(); this.encryptionKey = 0; this.decryptionKey = 0; this.serverIP = server; this.cellsIDs = []; this.offsetX = 0; this.offsetY = 0; this.p2p = p2p; this.id = id; this.connect(server); } connect(server) { this.ws = new WebSocket(server); this.ws.binaryType = "arraybuffer"; this.ws.onmessage = this.onMessage.bind(this); this.ws.onerror = this.onError.bind(this); this.ws.onclose = this.onClose.bind(this); this.ws.onopen = this.onOpen.bind(this); } onOpen() { console.log(`Bot_${this.id}: Connected`); let buf = this.Buffer(5); buf.setUint8(0, 254); buf.setUint32(1, this.protocolVersion, true); this.send(buf); buf = this.Buffer(5); buf.setUint8(0, 255); buf.setUint32(1, this.protocolKey, true); this.send(buf); } onClose() { console.log(`Bot_${this.id}: Disconnected (Closed)`); window.client.botID--; } onError() { console.log(`Bot_${this.id}: Disconnected (Error)`); } onMessage(msg) { let offset = 0; let oldMsg = msg.data; msg = this.Buffer(msg.data, true); if (this.decryptionKey) msg = this.xorBuffer(msg, this.decryptionKey ^ this.protocolKey); switch (msg.getUint8(offset++)) { case 241: this.decryptionKey = msg.getUint32(offset, true); oldMsg = Array.from(new Uint8Array(oldMsg)).splice(5, 11); this.encryptionKey = this.clientKey( this.serverIP, new Uint8Array(oldMsg) ); break; case 242: console.log(`Bot_${this.id}: Spawning`); window.agarApp.recaptcha.requestCaptchaV3("play", (token) => this.spawn(this.botNick + "x", token) ); break; case 85: console.log(`Bot_${this.id}: Captcha failed Disconnecting...`); window.client.spawnedBots--; this.ws.close(); break; case 32: this.cellsIDs.push(msg.getUint32(offset, true)); console.log(`Bot_${this.id}: Spawned`); window.client.spawnedBots++; this.isAlive = true; break; case 255: let buf = msg.getUint32(1, true); let out = new Uint8Array(buf); out = this.decompressBuffer(new Uint8Array(msg.buffer.slice(5)), out); let data = new DataView(out.buffer); switch (data.getUint8(0)) { case 16: var off = 1; let eatQueueLength = data.getUint16(off, true); off += 2; for (let i = 0; i < eatQueueLength; i++) off += 8; while (true) { let n = new Node(); n.id = data.getUint32(off, true); off += 4; if (n.id == 0) break; n.x = data.getInt32(off, true); off += 4; n.y = data.getInt32(off, true); off += 4; n.size = data.getUint16(off, true); off += 2; n.flags = data.getUint8(off++); n.extendedFlags = 0; if (n.flags & 128) n.extendedFlags = data.getUint8(off++); if (n.flags & 1) n.isVirus = true; if (n.flags & 2) off += 3; if (n.flags & 4) while (data.getInt8(off++) !== 0) {} if (n.flags & 8) while (data.getInt8(off++) !== 0) {} if (n.extendedFlags & 1) n.isFood = true; if (n.extendedFlags & 4) off += 4; this.nodes[n.id] = n; } let removeQueueLength = data.getUint16(off, true); off += 2; for (let i = 0; i < removeQueueLength; i++) { let removedEntityID = data.getUint32(off, true); off += 4; if (this.nodes.hasOwnProperty(removedEntityID)) delete this.nodes[removedEntityID]; if (this.cellsIDs.includes(removedEntityID)) this.cellsIDs = this.cellsIDs.filter( (x) => x != removedEntityID ); } if (this.isAlive && this.cellsIDs.length == 0) { window.client.spawnedBots--; this.isAlive = false; window.agarApp.recaptcha.requestCaptchaV3("play", (token) => this.spawn(this.botNick + "x", token) ); } break; case 64: off = 1; this.borders.minX = data.getFloat64(off, true); off += 8; this.borders.minY = data.getFloat64(off, true); off += 8; this.borders.maxX = data.getFloat64(off, true); off += 8; this.borders.maxY = data.getFloat64(off, true); if (this.borders.maxX - this.borders.minX > 14e3) this.offsetX = (this.borders.maxX + this.borders.minX) / 2; if (this.borders.maxY - this.borders.minY > 14e3) this.offsetY = (this.borders.maxY + this.borders.minY) / 2; if (this.isAlive && !this.p2p && !window.client.collectPellets) { this.moveTo( (window.client.clientX - window.innerWidth / 2) / window.viewScale + window.playerX, (window.client.clientY - window.innerHeight / 2) / window.viewScale + window.playerY ); } if (this.isAlive && !this.p2p && window.client.collectPellets) { let nearestFood = this.getNearestFood(); this.moveTo( nearestFood.x - this.offsetX, nearestFood.y - this.offsetY ); } if (this.isAlive && this.p2p && !window.client.collectPellets2) { this.moveTo(window.client.clientX2, window.client.clientY2); } if (this.isAlive && this.p2p && window.client.collectPellets2) { let nearestFood = this.getNearestFood(); this.moveTo( nearestFood.x - this.offsetX, nearestFood.y - this.offsetY ); } break; } break; } } getBotNodePos() { let botNode = { x: 0, y: 0, size: 0, }; for (let i = 0; i < this.cellsIDs.length; i++) { let id = this.cellsIDs[i]; const cell = this.nodes[id]; if (cell) { botNode.x += cell.x / this.cellsIDs.length; botNode.y += cell.y / this.cellsIDs.length; botNode.size += cell.size / this.cellsIDs.length; } } return botNode; } getNearestFood() { let botNode = this.getBotNodePos(); let bestDist = 10000; let nearestFood = new Object(); Object.keys(this.nodes).forEach((nodeId) => { let node = this.nodes[nodeId]; let dist = Math.hypot(node.x - botNode.x, node.y - botNode.y); if ( (dist < bestDist) & (node.size < botNode.size * 0.85 || node.isFood) ) { bestDist = dist; nearestFood = node; } }); return nearestFood; } send(buf, runEncryption) { if (this.ws && this.ws.readyState == 1) { if (runEncryption) { buf = this.xorBuffer(buf, this.encryptionKey); this.encryptionKey = this.rotateKey(this.encryptionKey); } this.ws.send(buf); } } moveTo(x, y) { let buf = this.Buffer(13); buf.setUint8(0, 16); buf.setUint32(1, x + this.offsetX, true); buf.setUint32(5, y + this.offsetY, true); buf.setUint32(9, this.decryptionKey, true); this.send(buf, true); } spawn(name, token) { let buf = this.Buffer(2 + name.length + token.length); buf.setUint8(0, 0); for (let i = 0; i < name.length; i++) buf.setUint8(i + 1, name.charCodeAt(i)); buf.setUint8(name.length, 0); for (let i = 0; i < token.length; i++) buf.setUint8(name.length + 1 + i, token.charCodeAt(i)); this.send(buf, true); } split() { let buf = this.Buffer(); buf.setUint8(0, 17); this.send(buf, true); } eject() { let buf = this.Buffer(); buf.setUint8(0, 21); this.send(buf, true); } xorBuffer(buf, key) { for (let i = 0; i < buf.byteLength; i++) { buf.setUint8(i, buf.getUint8(i) ^ ((key >> ((i % 4) * 8)) & 255)); } return buf; } rotateKey(key) { key = Math.imul(key, 1540483477) >> 0; key = (Math.imul((key >>> 24) ^ key, 1540483477) >> 0) ^ 114296087; key = Math.imul((key >>> 13) ^ key, 1540483477) >> 0; return (key >>> 15) ^ key; } Buffer(buf, msg) { if (msg) { buf = new Uint8Array(buf); let fixedbuffer = new DataView(new ArrayBuffer(buf.byteLength)); for (let i = 0; i < buf.byteLength; i++) { fixedbuffer.setUint8(i, buf[i]); } return fixedbuffer; } return new DataView(new ArrayBuffer(!buf ? 1 : buf)); } decompressBuffer(input, output) { for (let i = 0, j = 0; i < input.length; ) { const byte = input[i++]; let literalsLength = byte >> 4; if (literalsLength > 0) { let length = literalsLength + 240; while (length === 255) { length = input[i++]; literalsLength += length; } const end = i + literalsLength; while (i < end) output[j++] = input[i++]; if (i === input.length) return output; } const offset = input[i++] | (input[i++] << 8); if (offset === 0 || offset > j) return -(i - 2); let matchLength = byte & 15; let length = matchLength + 240; while (length === 255) { length = input[i++]; matchLength += length; } let pos = j - offset; const end = j + matchLength + 4; while (j < end) output[j++] = output[pos++]; } return output; } clientKey(ip, buf) { for ( var e = null, p = ip.match(/(ws+:\/\/)([^:]*)(:\d+)/)[2], s = p.length + buf.byteLength, o = new Uint8Array(s), a = 0; a < p.length; a++ ) o[a] = p.charCodeAt(a); o.set(buf, p.length); for ( var m = new DataView(o.buffer), r = s - 1, g = 0 | (4 + (-4 & (r - 4))), h = 255 ^ r, f = 0; 3 < r; ) (e = 0 | Math.imul(m.getInt32(f, !0), 1540483477)), (h = (0 | Math.imul((e >>> 24) ^ e, 1540483477)) ^ (0 | Math.imul(h, 1540483477))), (r -= 4), (f += 4); switch (r) { case 3: (h = (o[g + 2] << 16) ^ h), (h = (o[g + 1] << 8) ^ h); break; case 2: h = (o[g + 1] << 8) ^ h; break; case 1: break; default: e = h; } e != h && (e = 0 | Math.imul(o[g] ^ h, 1540483477)), (e ^= h = e >>> 13), (e = 0 | Math.imul(e, 1540483477)), (e ^= h = e >>> 15); return e; } }