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;
}
}