├── 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 |
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 |
--------------------------------------------------------------------------------