├── LICENSE ├── README.md ├── au.js └── au.user.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Neonx99 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Agar.io discord bot 2 | 3 | # Agar Unlimited 4 | 5 | > Free Agar.io Bots Extension 6 | 7 | ## 8 | 9 | ### !!! OUTDATED !!! 10 | 11 | * Buy premium agar.io bots here [OP-Bots.com](http://op-bots.com/) 12 | 13 | ### How to use 14 | * install tampermonkey extension for chrome/firefox 15 | * install [userscript](https://github.com/Neonx99/agar.io-bots-extension/raw/master/au.user.js) 16 | * start the bots after spawning and have fun 17 | 18 | ### Bot controls 19 | * (X) To split 20 | * (C) To feed 21 | * (P) To enable bot ai (collect pellets) 22 | -------------------------------------------------------------------------------- /au.js: -------------------------------------------------------------------------------- 1 | function editCore(core) { 2 | core = core.replace(/;if\((\w)<1\.0\){/i, ';if($1<0){'); 3 | core = core.replace(/([\w]+\s*=\s*[\w]+\s*\+\s*16\s*\|\s*0;\s*([\w=]+)\s*=\s*\+[\w\[\s*><\]]+;)/, '$1 $2*=0.75;'); 4 | core = core.replace( 5 | /([\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, 6 | '$1 window.viewScale=$2; if (window.coordOffsetFixed) { window.playerX=$4+window.offsetX; window.playerY=$5+window.offsetY;} if(window.draw){window.draw();}' 7 | ); 8 | core = core.replace( 9 | /(\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, 10 | '$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);' 11 | ); 12 | console.log('core_edited'); 13 | return core; 14 | } 15 | 16 | window.draw = () => { 17 | if (!window.minX || !window.minY || !window.maxY || !window.maxY) return; 18 | const ctx = document.getElementById('canvas').getContext('2d'); 19 | ctx.save(); 20 | ctx.strokeStyle = '#0000ff'; 21 | ctx.lineWidth = 20; 22 | ctx.lineCap = 'round'; 23 | ctx.lineJoin = 'round'; 24 | ctx.beginPath(); 25 | ctx.moveTo(window.minX, window.minY); 26 | ctx.lineTo(window.maxX, window.minY); 27 | ctx.lineTo(window.maxX, window.maxY); 28 | ctx.lineTo(window.minX, window.maxY); 29 | ctx.closePath(); 30 | ctx.stroke(); 31 | ctx.restore(); 32 | } 33 | 34 | let observer = new MutationObserver((mutations) => { 35 | mutations.forEach((mutation) => { 36 | mutation.addedNodes.forEach((node) => { 37 | if (/agario\.core\.js/i.test(node.src)) { 38 | observer.disconnect(); 39 | node.parentNode.removeChild(node); 40 | let request = new XMLHttpRequest(); 41 | request.open('get', node.src, true); 42 | request.send(); 43 | request.onload = function() { 44 | let coretext = this.responseText; 45 | let newscript = document.createElement('script'); 46 | newscript.type = 'text/javascript'; 47 | newscript.async = true; 48 | newscript.textContent = editCore(coretext); 49 | document.body.appendChild(newscript); 50 | setTimeout(() => { 51 | window.client = new Client(); 52 | }, 3500); 53 | } 54 | } 55 | }); 56 | }); 57 | }); 58 | 59 | observer.observe(document, { 60 | attributes: true, 61 | characterData: true, 62 | childList: true, 63 | subtree: true 64 | }); 65 | 66 | class Node { 67 | constructor() { 68 | this.x = 0; 69 | this.y = 0; 70 | this.size = 0; 71 | this.flags = 0; 72 | this.extendedFlags = 0; 73 | this.isVirus = false; 74 | this.isFood = false; 75 | } 76 | } 77 | 78 | class Client { 79 | 80 | constructor() { 81 | this.fetchLatest(); 82 | this.collectPellets2 = false; 83 | this.collectPellets = false; 84 | this.startedBots = false; 85 | this.authorized = false; 86 | this.bots = new Array(); 87 | this.addEventListener(); 88 | this.spawnedBots = 0; 89 | this.clientX2 = 0; 90 | this.clientY2 = 0; 91 | this.clientX = 0; 92 | this.clientY = 0; 93 | this.botID = 1; 94 | this.loadCSS(); 95 | } 96 | 97 | async fetchLatest() { 98 | const file = await fetch("https://agar.io/mc/agario.js").then((response) => response.text()); 99 | const clientVersionString = file.match(/(?<=versionString=")[^"]+/)[0]; 100 | this.protocolKey = 10000 * 101 | parseInt(clientVersionString.split(".")[0]) + 100 * 102 | parseInt(clientVersionString.split(".")[1]) + parseInt(clientVersionString.split(".")[2]); 103 | } 104 | 105 | addEventListener() { 106 | document.addEventListener('keydown', event => { 107 | let key = String.fromCharCode(event.keyCode); 108 | if (key == 'X') { 109 | this.splitBots(); 110 | } else if (key == 'C') { 111 | this.ejectBots(); 112 | } else if (key == 'P') { 113 | if (this.authorized) return this.send(new Uint8Array([5])); 114 | this.collectPellets = !this.collectPellets 115 | console.log(`Collect Pellets: ${this.collectPellets}`); 116 | } 117 | }); 118 | 119 | document.addEventListener('mousemove', event => { 120 | this.clientX = event.clientX; 121 | this.clientY = event.clientY; 122 | }); 123 | 124 | let check = setInterval(() => { 125 | if (document.readyState == "complete") { 126 | clearInterval(check); 127 | setTimeout(() => { 128 | this.loadGUI(); 129 | }, 1500); 130 | } 131 | }, 100); 132 | } 133 | 134 | createUUID() { 135 | const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 136 | let token = ''; 137 | for (let i = 0; i < 3; i++) { 138 | for (let a = 0; a < 7; a++) token += possible.charAt(Math.floor(Math.random() * possible.length)); 139 | token += '-'; 140 | } 141 | token = token.substring(0, token.length - 1); 142 | localStorage.setItem('agarUnlimited3UUID', token); 143 | return token; 144 | } 145 | 146 | loadCSS() { 147 | let script = document.createElement('script'); 148 | script.src = 'https://cdn.jsdelivr.net/npm/sweetalert2@9'; 149 | document.getElementsByTagName("head")[0].appendChild(script); 150 | $('head').append(``); 151 | if (!localStorage.getItem('agarUnlimited3UUID')) localStorage.setItem('agarUnlimited3UUID', this.createUUID()); 152 | this.uuid = localStorage.getItem('agarUnlimited3UUID'); 153 | } 154 | 155 | loadGUI() { 156 | $('.agario-promo-container').replaceWith(` 157 | 158 | 159 |
160 | `); 161 | if (!localStorage.getItem('botAmount')) localStorage.setItem('botAmount', 10); 162 | if (!localStorage.getItem('botNick')) localStorage.setItem('botNick', 'Sanik'); 163 | console.log('[AgarUnlimited] Ready!'); 164 | } 165 | 166 | startBots(amount) { 167 | if (this.authorized) return this.startBots2(); 168 | amount > 200 ? amount = 200 : amount = amount; 169 | for (let i = 0; i < amount; i++) { 170 | this.bots.push(new Bot(this.protocolKey, window.client.botID, `wss://${window.MC.getHost()}:443?party_id=${window.MC.getPartyToken()}`, false)); 171 | this.botID++; 172 | } 173 | console.log(`[AgarUnlimited] Starting ${localStorage.getItem('botAmount')} bots!`); 174 | $('#toggleButton').replaceWith(``); 175 | this.startedBots = true; 176 | } 177 | 178 | stopBots() { 179 | if (!this.startedBots) return; 180 | if (this.authorized) return this.stopBots2(); 181 | this.bots.forEach(bot => { 182 | bot.ws.close(); 183 | }); 184 | this.bots.length = 0; 185 | console.log('[AgarUnlimited] Stopped bots!'); 186 | $('#toggleButton').replaceWith(``); 187 | this.startedBots = false; 188 | } 189 | 190 | splitBots() { 191 | if (this.authorized) return this.send(new Uint8Array([3])); 192 | if (this.bots.length == 0) return; 193 | this.bots.forEach(bot => bot.split()); 194 | } 195 | 196 | ejectBots() { 197 | if (this.authorized) return this.send(new Uint8Array([4])); 198 | if (this.bots.length == 0) return; 199 | this.bots.forEach(bot => bot.eject()); 200 | } 201 | 202 | Buffer(buf, msg) { 203 | if (msg) { 204 | buf = new Uint8Array(buf); 205 | let fixedbuffer = new DataView(new ArrayBuffer(buf.byteLength)); 206 | for (let i = 0; i < buf.byteLength; i++) { 207 | fixedbuffer.setUint8(i, buf[i]); 208 | } 209 | return fixedbuffer; 210 | } 211 | return new DataView(new ArrayBuffer(!buf ? 1 : buf)); 212 | } 213 | 214 | send(buf) { 215 | if (this.ws && this.ws.readyState == 1) this.ws.send(buf); 216 | } 217 | } 218 | 219 | class Bot { 220 | 221 | constructor(protocolKey, id, server, p2p) { 222 | this.protocolKey = protocolKey; 223 | this.botNick = localStorage.getItem('botNick'); 224 | this.borders = new Object(); 225 | this.protocolVersion = 22; 226 | this.nodes = new Array(); 227 | this.node = new Object(); 228 | this.encryptionKey = 0; 229 | this.decryptionKey = 0; 230 | this.serverIP = server; 231 | this.cellsIDs = []; 232 | this.offsetX = 0; 233 | this.offsetY = 0; 234 | this.p2p = p2p; 235 | this.id = id; 236 | this.connect(server); 237 | } 238 | 239 | connect(server) { 240 | this.ws = new WebSocket(server); 241 | this.ws.binaryType = 'arraybuffer'; 242 | this.ws.onmessage = this.onMessage.bind(this); 243 | this.ws.onerror = this.onError.bind(this); 244 | this.ws.onclose = this.onClose.bind(this); 245 | this.ws.onopen = this.onOpen.bind(this); 246 | } 247 | 248 | onOpen() { 249 | console.log(`Bot_${this.id}: Connected`); 250 | 251 | let buf = this.Buffer(5); 252 | 253 | buf.setUint8(0, 254); 254 | buf.setUint32(1, this.protocolVersion, true); 255 | 256 | this.send(buf); 257 | 258 | buf = this.Buffer(5); 259 | buf.setUint8(0, 255); 260 | buf.setUint32(1, this.protocolKey, true); 261 | 262 | this.send(buf); 263 | } 264 | 265 | onClose() { 266 | console.log(`Bot_${this.id}: Disconnected (Closed)`); 267 | window.client.botID--; 268 | } 269 | 270 | onError() { 271 | console.log(`Bot_${this.id}: Disconnected (Error)`); 272 | } 273 | 274 | onMessage(msg) { 275 | let offset = 0; 276 | let oldMsg = msg.data; 277 | msg = this.Buffer(msg.data, true); 278 | 279 | if (this.decryptionKey) msg = this.xorBuffer(msg, this.decryptionKey ^ this.protocolKey); 280 | 281 | switch (msg.getUint8(offset++)) { 282 | 283 | case 241: 284 | this.decryptionKey = msg.getUint32(offset, true); 285 | oldMsg = Array.from(new Uint8Array(oldMsg)).splice(5, 11); 286 | this.encryptionKey = this.clientKey(this.serverIP, new Uint8Array(oldMsg)); 287 | break; 288 | 289 | case 242: 290 | console.log(`Bot_${this.id}: Spawning`); 291 | window.agarApp.recaptcha.requestCaptchaV3('play', token => this.spawn(this.botNick + 'x', token)); 292 | break; 293 | 294 | case 85: 295 | console.log(`Bot_${this.id}: Captcha failed Disconnecting...`); 296 | window.client.spawnedBots--; 297 | this.ws.close(); 298 | break; 299 | 300 | case 32: 301 | this.cellsIDs.push(msg.getUint32(offset, true)); 302 | console.log(`Bot_${this.id}: Spawned`); 303 | window.client.spawnedBots++; 304 | this.isAlive = true; 305 | break; 306 | 307 | case 255: 308 | let buf = msg.getUint32(1, true); 309 | let out = new Uint8Array(buf) 310 | out = this.decompressBuffer(new Uint8Array(msg.buffer.slice(5)), out); 311 | let data = new DataView(out.buffer); 312 | 313 | switch (data.getUint8(0)) { 314 | 315 | case 16: 316 | var off = 1; 317 | 318 | let eatQueueLength = data.getUint16(off, true); 319 | off += 2; 320 | 321 | for (let i = 0; i < eatQueueLength; i++) off += 8; 322 | 323 | while (true) { 324 | let n = new Node(); 325 | n.id = data.getUint32(off, true); 326 | off += 4; 327 | 328 | if (n.id == 0) break; 329 | 330 | n.x = data.getInt32(off, true); 331 | off += 4; 332 | 333 | n.y = data.getInt32(off, true); 334 | off += 4; 335 | 336 | n.size = data.getUint16(off, true); 337 | off += 2; 338 | 339 | n.flags = data.getUint8(off++); 340 | n.extendedFlags = 0; 341 | 342 | if (n.flags & 128) n.extendedFlags = data.getUint8(off++); 343 | if (n.flags & 1) n.isVirus = true; 344 | if (n.flags & 2) off += 3; 345 | if (n.flags & 4) 346 | while (data.getInt8(off++) !== 0) {} 347 | if (n.flags & 8) 348 | while (data.getInt8(off++) !== 0) {} 349 | if (n.extendedFlags & 1) n.isFood = true; 350 | if (n.extendedFlags & 4) off += 4; 351 | 352 | this.nodes[n.id] = n; 353 | } 354 | 355 | let removeQueueLength = data.getUint16(off, true); 356 | 357 | off += 2; 358 | 359 | for (let i = 0; i < removeQueueLength; i++) { 360 | let removedEntityID = data.getUint32(off, true); 361 | off += 4; 362 | 363 | if (this.nodes.hasOwnProperty(removedEntityID)) delete this.nodes[removedEntityID]; 364 | if (this.cellsIDs.includes(removedEntityID)) this.cellsIDs = this.cellsIDs.filter(x => x != removedEntityID); 365 | } 366 | 367 | if (this.isAlive && this.cellsIDs.length == 0) { 368 | window.client.spawnedBots--; 369 | this.isAlive = false; 370 | window.agarApp.recaptcha.requestCaptchaV3('play', token => this.spawn(this.botNick + 'x', token)); 371 | } 372 | break; 373 | 374 | case 64: 375 | off = 1; 376 | this.borders.minX = data.getFloat64(off, true); 377 | off += 8; 378 | this.borders.minY = data.getFloat64(off, true); 379 | off += 8; 380 | this.borders.maxX = data.getFloat64(off, true); 381 | off += 8; 382 | this.borders.maxY = data.getFloat64(off, true); 383 | if (this.borders.maxX - this.borders.minX > 14E3) this.offsetX = (this.borders.maxX + this.borders.minX) / 2; 384 | if (this.borders.maxY - this.borders.minY > 14E3) this.offsetY = (this.borders.maxY + this.borders.minY) / 2; 385 | 386 | if (this.isAlive && !this.p2p && !window.client.collectPellets) { 387 | this.moveTo((window.client.clientX - window.innerWidth / 2) / window.viewScale + window.playerX, (window.client.clientY - window.innerHeight / 2) / window.viewScale + window.playerY); 388 | } 389 | if (this.isAlive && !this.p2p && window.client.collectPellets) { 390 | let nearestFood = this.getNearestFood(); 391 | this.moveTo(nearestFood.x - this.offsetX, nearestFood.y - this.offsetY); 392 | } 393 | 394 | if (this.isAlive && this.p2p && !window.client.collectPellets2) { 395 | this.moveTo(window.client.clientX2, window.client.clientY2); 396 | } 397 | if (this.isAlive && this.p2p && window.client.collectPellets2) { 398 | let nearestFood = this.getNearestFood(); 399 | this.moveTo(nearestFood.x - this.offsetX, nearestFood.y - this.offsetY); 400 | } 401 | break; 402 | } 403 | break; 404 | } 405 | } 406 | 407 | getBotNodePos() { 408 | let botNode = { 409 | x: 0, 410 | y: 0, 411 | size: 0 412 | }; 413 | 414 | for (let i = 0; i < this.cellsIDs.length; i++) { 415 | let id = this.cellsIDs[i]; 416 | const cell = this.nodes[id]; 417 | if (cell) { 418 | botNode.x += cell.x / this.cellsIDs.length; 419 | botNode.y += cell.y / this.cellsIDs.length; 420 | botNode.size += cell.size / this.cellsIDs.length; 421 | } 422 | }; 423 | 424 | return botNode; 425 | } 426 | 427 | getNearestFood() { 428 | let botNode = this.getBotNodePos(); 429 | let bestDist = 10000; 430 | let nearestFood = new Object(); 431 | 432 | Object.keys(this.nodes).forEach(nodeId => { 433 | let node = this.nodes[nodeId]; 434 | let dist = Math.hypot(node.x - botNode.x, node.y - botNode.y) 435 | if (dist < bestDist & (node.size < botNode.size * 0.85 || node.isFood)) { 436 | bestDist = dist; 437 | nearestFood = node; 438 | } 439 | }); 440 | 441 | return nearestFood; 442 | } 443 | 444 | send(buf, runEncryption) { 445 | if (this.ws && this.ws.readyState == 1) { 446 | if (runEncryption) { 447 | buf = this.xorBuffer(buf, this.encryptionKey); 448 | this.encryptionKey = this.rotateKey(this.encryptionKey); 449 | } 450 | this.ws.send(buf); 451 | } 452 | } 453 | 454 | moveTo(x, y) { 455 | let buf = this.Buffer(13); 456 | buf.setUint8(0, 16); 457 | buf.setUint32(1, x + this.offsetX, true); 458 | buf.setUint32(5, y + this.offsetY, true); 459 | buf.setUint32(9, this.decryptionKey, true); 460 | this.send(buf, true); 461 | } 462 | 463 | spawn(name, token) { 464 | let buf = this.Buffer(2 + name.length + token.length); 465 | buf.setUint8(0, 0); 466 | for (let i = 0; i < name.length; i++) buf.setUint8(i + 1, name.charCodeAt(i)); 467 | buf.setUint8(name.length, 0); 468 | for (let i = 0; i < token.length; i++) buf.setUint8(name.length + 1 + i, token.charCodeAt(i)); 469 | this.send(buf, true); 470 | } 471 | 472 | split() { 473 | let buf = this.Buffer(); 474 | buf.setUint8(0, 17); 475 | this.send(buf, true); 476 | } 477 | 478 | eject() { 479 | let buf = this.Buffer(); 480 | buf.setUint8(0, 21); 481 | this.send(buf, true); 482 | } 483 | 484 | xorBuffer(buf, key) { 485 | for (let i = 0; i < buf.byteLength; i++) { 486 | buf.setUint8(i, buf.getUint8(i) ^ (key >> ((i % 4) * 8)) & 255); 487 | } 488 | return buf; 489 | } 490 | 491 | rotateKey(key) { 492 | key = Math.imul(key, 1540483477) >> 0; 493 | key = (Math.imul(key >>> 24 ^ key, 1540483477) >> 0) ^ 114296087; 494 | key = Math.imul(key >>> 13 ^ key, 1540483477) >> 0; 495 | return key >>> 15 ^ key; 496 | } 497 | 498 | Buffer(buf, msg) { 499 | if (msg) { 500 | buf = new Uint8Array(buf); 501 | let fixedbuffer = new DataView(new ArrayBuffer(buf.byteLength)); 502 | for (let i = 0; i < buf.byteLength; i++) { 503 | fixedbuffer.setUint8(i, buf[i]); 504 | } 505 | return fixedbuffer; 506 | } 507 | return new DataView(new ArrayBuffer(!buf ? 1 : buf)); 508 | } 509 | 510 | decompressBuffer(input, output) { 511 | for (let i = 0, j = 0; i < input.length;) { 512 | const byte = input[i++] 513 | let literalsLength = byte >> 4 514 | if (literalsLength > 0) { 515 | let length = literalsLength + 240 516 | while (length === 255) { 517 | length = input[i++] 518 | literalsLength += length 519 | } 520 | const end = i + literalsLength 521 | while (i < end) output[j++] = input[i++] 522 | if (i === input.length) return output 523 | } 524 | const offset = input[i++] | (input[i++] << 8) 525 | if (offset === 0 || offset > j) return -(i - 2) 526 | let matchLength = byte & 15 527 | let length = matchLength + 240 528 | while (length === 255) { 529 | length = input[i++] 530 | matchLength += length 531 | } 532 | let pos = j - offset 533 | const end = j + matchLength + 4 534 | while (j < end) output[j++] = output[pos++] 535 | } 536 | return output 537 | } 538 | 539 | clientKey(ip, buf) { 540 | 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++) 541 | o[a] = p.charCodeAt(a); 542 | o.set(buf, p.length); 543 | for (var m = new DataView(o.buffer), r = s - 1, g = 0 | 4 + (-4 & r - 4), h = 255 ^ r, f = 0; 3 < r;) 544 | 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; 545 | switch (r) { 546 | case 3: 547 | h = o[g + 2] << 16 ^ h, h = o[g + 1] << 8 ^ h; 548 | break; 549 | case 2: 550 | h = o[g + 1] << 8 ^ h; 551 | break; 552 | case 1: 553 | break; 554 | default: 555 | e = h; 556 | } 557 | e != h && (e = 0 | Math.imul(o[g] ^ h, 1540483477)), e ^= h = e >>> 13, e = 0 | Math.imul(e, 1540483477), e ^= h = e >>> 15; 558 | return e; 559 | } 560 | } 561 | -------------------------------------------------------------------------------- /au.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name AgarUnlimited 3 | // @version 3.0.0 4 | // @description AgarUnlimited Revive by Neon 5 | // @author Neon - Sizrex - MrSonicMaster - NuclearC - StrikerJS - Nebula 6 | // @match *://agar.io/* 7 | // @grant none 8 | // @run-at document-start 9 | // @icon data:image/png;base64,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 10 | // @require https://github.com/Neonx99/agar.io-bots-extension/raw/master/au.js 11 | // ==/UserScript== 12 | 13 | /* 14 | Special thanks to NuclearC - MrSonicMaster i wouldn't be here without them 15 | Thanks to Sizrex for making AgarUnlimited v2.5 Possible / Famous 16 | Check OP-Bots.com For Premium Bots 17 | */ 18 | 19 | /* 20 | The MIT License (MIT) 21 | Copyright (c) 2019 Neon 22 | Permission is hereby granted, free of charge, to any person obtaining a copy 23 | of this software and associated documentation files (the "Software"), to deal 24 | in the Software without restriction, including without limitation the rights 25 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 26 | copies of the Software, and to permit persons to whom the Software is 27 | furnished to do so, subject to the following conditions: 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 31 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 32 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 33 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 34 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 35 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 36 | SOFTWARE. 37 | */ 38 | --------------------------------------------------------------------------------