// ==UserScript== // @name Diep.io Auto-leveler Ai // @namespace http://tampermonkey.net/ // @version 2024-03-24 // @description Press Q to toggle, must be in base at least once in a lifetime so the script knows what team you are in // @author Mi300 // @match https://diep.io/* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @license MIT // @grant none // @downloadURL none // ==/UserScript== /* --------HOW TO USE-------- // 1. Use in 2tdm or 4tdm only // 2. Press Q to toggle on / off // 3. Player must be in their base at least once so the script knows what team they are in // 4. If you get disconnected by the anti-cheat just refresh the page it should fix it // 5. The script is only functional if you are on the tab or if the tab is a seperate window // 6. If you see any issues tell me on discord (Mi300), but I probably won't do anything about it // // -------------------------- */ const ARENA_WIDTH = 26000; const ARENA_HEIGHT = 26000; const T4_BASE_WIDTH = 3900; const T4_BASE_HEIGHT = 3900; const T2_BASES = [ { id: 0, name: "blue", hex: "#00b2e1", x: 0, y: 0, cX: 0, cY: 0, dirX: 1, dirY: 1, }, { id: 3, name: "red", hex: "#f14e54", x: 23500, y: 0, cX: ARENA_WIDTH, cY: ARENA_HEIGHT, dirX: -1, dirY: 1, }, ] const T4_BASES = [ { id: 0, name: "blue", hex: "#00b2e1", x: 0, y: 0, cX: 0, cY: 0, dirX: 1, dirY: 1, }, { id: 1, name: "purple", hex: "#bf7ff5", x: 22100, y: 0, cX: 0, cY: ARENA_HEIGHT, dirX: -1, dirY: 1, }, { id: 2, name: "green", hex: "#00e16e", x: 0, y: 22100, cX: ARENA_WIDTH, cY: 0, dirX: 1, dirY: -1, }, { id: 3, name: "red", hex: "#f14e54", x: 22100, y: 22100, cX: ARENA_WIDTH, cY: ARENA_HEIGHT, dirX: -1, dirY: -1, }, ] alert("Auto Leveler: Press Q to toggle on / off.") setTimeout(function(){ const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); let colors = { minimapArrow: '#000000', players: '#f14e54', squares: '#ffe869', triangles: '#fc7677', pentagons: '#768dfc', alphaPentagons: '#768dfc', bullets: '#f14e54', drones: '#f14e54', crashers: '#f177dd', necromancerDrone: '#fcc376', } let enemies = []; let squares = []; let tempsquares = []; let triangles = []; let temptriangles = []; let pentagons = []; let temppentagons = []; let dead = true; let baseArea; let inBase = true; let goal; let toggled = false; let lastCheck = Date.now(); let is2T = false; let minimapArrow = [0, 0]; let minimapPos = [0, 0]; let minimapDim = [0, 0]; let playerPos = [0, 0]; document.addEventListener("keydown", function(e){ if(e.key == "q"){ toggled = !toggled; setTimeout(function(){ input.key_up(87); input.key_up(83); input.key_up(65); input.key_up(68); },200); } }); function getCentre(vertices) { let centre = [0, 0]; vertices.forEach (vertex => { centre [0] += vertex[0] centre [1] += vertex[1] }); centre[0] /= vertices.length; centre[1] /= vertices.length; return centre; } function getClosest(entities) { let acc = [[0, 0], 0] for (let i = 0; i < entities.length; i ++) { const accumulator = getDist (acc[0], [canvas.width / 2, canvas.height / 2])[0]; const current = getDist (entities[i][0], [canvas.width / 2, canvas.height / 2])[0]; if (current < accumulator) acc = entities[i]; } return acc; } function invertCoordinate(coord){ return [canvas.width - coord[0], canvas.height - coord[1]]; } function getDist(t1, t2){ const distX = t1[0] - t2[0]; const distY = t1[1] - t2[1]; return [Math.hypot(distX, distY), distX, distY]; }; function hook(target, callback){ function check(){ window.requestAnimationFrame(check) const func = CanvasRenderingContext2D.prototype[target] if(func.toString().includes(target)){ CanvasRenderingContext2D.prototype[target] = new Proxy (func, { apply (method, thisArg, args) { callback(thisArg, args) return Reflect.apply (method, thisArg, args) } }); } } window.requestAnimationFrame(check) } let calls = 0; let points = []; hook('beginPath', function(thisArg, args){ calls = 1; points = []; }); hook('moveTo', function(thisArg, args){ if (calls == 1) { calls+=1; points.push(args) } else { calls = 0; } }); hook('lineTo', function(thisArg, args){ if (calls >= 2 && calls <= 6) { calls+=1; points.push(args) } else { calls = 0; } }); const k5 = 0; hook('fill', function(thisArg, args){ if(thisArg.fillStyle == "#00e16e"){ lastCheck = Date.now(); } if(calls >= 4 && calls <= 6) { const centre = getCentre(points); const list = calls == 4 ? triangles : calls == 5 ? squares : pentagons; if(thisArg.globalAlpha < 1){ return; } if(thisArg.fillStyle == "#000000"){ if(true){ minimapArrow = centre; } return; } if(!baseArea){ return; } if((calls == 5 || calls == 4) && ["#00b2e1", "#bf7ff5", "#00e16e", "#f14e54"].includes(thisArg.fillStyle)){ if(baseArea.hex == thisArg.fillStyle){ return; } enemies.push([centre, 0, thisArg.fillStyle]) return; } if (!['#ffe869', '#fc7677', '#768dfc'].includes(thisArg.fillStyle)) { let acc = [[0, 0], 0] for (let i = 0; i < list.length; i ++) { const accumulator = getDist (acc[0], centre)[0]; const current = getDist (list[i][0], centre)[0]; if (current < accumulator) acc = list[i]; } if(getDist(acc[0], centre)[0] < 50){ if(acc[2]){ if(acc[2] == thisArg.fillStyle){ acc[1]++; }else{ acc[1] = 0; } } if(acc[1] > 2){ return; } if(calls == 4){ temptriangles.push([centre, acc[1], thisArg.fillStyle]); } if(calls == 5){ tempsquares.push([centre, acc[1], thisArg.fillStyle]); } else { temppentagons.push([centre, acc[1], thisArg.fillStyle]); } } return; } if(playerPos && baseArea){ const wcord = toWorldCoords(...centre); let distance; if(is2T){ distance = getDist([baseArea.x, playerPos[1]], wcord); } else{ distance = getDist([baseArea.x, baseArea.y], wcord); } if(distance[0] > 9000){ return; } } if(calls == 4){ temptriangles.push([centre, 0]); } if(calls == 5){ tempsquares.push([centre, 0]); } if(calls == 6){ temppentagons.push([centre, 0]); } } else { calls = 0; } }); hook('strokeRect', function(thisArg, args) { const t = thisArg.getTransform(); minimapPos = [t.e, t.f]; minimapDim = [t.a, t.d]; }); hook('arc', function(thisArg, args){ const t = thisArg.getTransform(); if(!baseArea){ return; } if(["#00b2e1", "#bf7ff5", "#00e16e", "#f14e54"].includes(thisArg.fillStyle)){ if(baseArea.hex == thisArg.fillStyle){ return; } enemies.push([[t.e, t.f], 0, thisArg.fillStyle]) } }); const q8 = {apply(r,o,a) {Error.stackTraceLimit = k5;return r.apply(o,a)}} function getBase(pos){ if(is2T){ if(pos[0] < 2500){ baseArea = T2_BASES[0]; inBase = true; return; } if(pos[0] > 23500){ baseArea = T2_BASES[1]; inBase = true; return; } inBase = false; return; } else{ for(let i = 0; i < T4_BASES.length; i++){ if(pos[0] > T4_BASES[i].x && pos[0] < T4_BASES[i].x + T4_BASE_WIDTH && pos[1] > T4_BASES[i].y && pos[1] < T4_BASES[i].y + T4_BASE_HEIGHT){ baseArea = T4_BASES[i]; inBase = true; return; } } inBase = false; return; } } function getRandomLocation(){ return [ARENA_WIDTH / 2, ARENA_HEIGHT / 2]; } function getPlayerPos(){ const dX = minimapArrow[0] - minimapPos[0]; const dY = minimapArrow[1] - minimapPos[1]; const x = (dX / minimapDim[0]) * ARENA_WIDTH; const y = (dY / minimapDim[1]) * ARENA_HEIGHT; return [x, y] } Object.freeze = new Proxy(Object.freeze, q8) function getCurrentTargets(){ let target = [0, 0]; let moveTarget = [0, 0]; let aimTarget = [0, 0]; if(enemies.length){ target = getClosest(enemies)[0]; move(target, invertCoordinate(target)); goal = null; return; } else if(pentagons.length){ target = getClosest(pentagons)[0]; } else if(triangles.length){ target = getClosest(triangles)[0]; } else if(squares.length){ target = getClosest(squares)[0]; } else{ if(baseArea){ const baseMidX = baseArea.x + T4_BASE_WIDTH / 2; const baseMidY = baseArea.y + T4_BASE_HEIGHT / 2; if(!goal){ if(is2T){ if(inBase){ goal = [baseMidX + baseArea.dirX * T4_BASE_WIDTH * Math.random() * 1.5, Math.random() * ARENA_HEIGHT]; } else{ goal = [baseMidX, Math.random() * ARENA_HEIGHT]; } } else{ if(inBase){ goal = [baseMidX + baseArea.dirX * T4_BASE_WIDTH * Math.random() * 1.5, baseMidY + baseArea.dirY * T4_BASE_HEIGHT * Math.random() * 1.5]; } else{ goal = [baseMidX, baseMidY]; } } } moveToCoord(...goal, 0); // move inside base const goalDistance = getDist(goal, playerPos); if(goalDistance[0] < 175){ goal = null; } return; } moveToCoord(...getRandomLocation(), 0); return; } const distance = getDist(target, [canvas.width / 2, canvas.height / 2]); aimTarget = target; if(distance[0] > 290){ moveTarget = target; } else{ moveTarget = invertCoordinate(target); } move(aimTarget, moveTarget); } function move(aimTarget, moveTarget){ if(!window.input || !window.input.should_prevent_unload()){ return; } window.input.mouse(...aimTarget); window.input.key_down(1); const moveTargetDistance = getDist(moveTarget, [canvas.width / 2, canvas.height / 2]); if(moveTargetDistance[1] > 0){ // x movement input.key_down(68); input.key_up(65); } else if(moveTargetDistance[1] < -0){ input.key_up(68); input.key_down(65); } else{ input.key_up(68); input.key_up(65); } if(moveTargetDistance[2] > 0){ // y movement input.key_down(83); input.key_up(87); } else if(moveTargetDistance[2] < -0){ input.key_up(83); input.key_down(87); } else{ input.key_up(83); input.key_up(87); } ctx.beginPath(); ctx.lineWidth = 6; ctx.strokeStyle = "red"; ctx.moveTo(canvas.width / 2, canvas.height / 2); ctx.lineTo(...aimTarget); ctx.stroke(); } function toScreenCoords(x, y){ const distance = getDist([x, y], playerPos); return [ canvas.width / 2 + distance[1] / 2, canvas.height / 2 + distance[2] / 2, ] } function toWorldCoords(x, y){ const distance = getDist([x, y], [canvas.width / 2, canvas.height / 2]); return [ playerPos[0] + distance[1] * 2, playerPos[1] + distance[2] * 2, ] } function moveToCoord(x, y, invert){ const distance = getDist([x, y], playerPos); if(distance[1] > 0){ // x movement input.key_down(68); input.key_up(65); } else if(distance[1] < -0){ input.key_up(68); input.key_down(65); } else{ input.key_up(68); input.key_up(65); } if(distance[2] > 0){ // y movement input.key_down(83); input.key_up(87); } else if(distance[2] < -0){ input.key_up(83); input.key_down(87); } else{ input.key_up(83); input.key_up(87); } const scrCoords = invert ? invertCoordinate(toScreenCoords(x, y)) : toScreenCoords(x, y); input.mouse(...scrCoords); ctx.beginPath(); ctx.lineWidth = 6; ctx.strokeStyle = "lime"; ctx.moveTo(canvas.width / 2, canvas.height / 2); ctx.lineTo(...scrCoords); ctx.stroke(); } function main(){ window.requestAnimationFrame(main); playerPos = getPlayerPos(); getBase(playerPos); if(Date.now() - lastCheck > 2000){ is2T = true; } else{ is2T = false; } if(toggled){ getCurrentTargets(); if(!input.should_prevent_unload()){ window.input.try_spawn(localStorage.name); } } squares = tempsquares; triangles = temptriangles; pentagons = temppentagons; tempsquares = []; temptriangles = []; temppentagons = []; enemies = []; } window.requestAnimationFrame(main); }, 2500);