- // ==UserScript==
- // @name Diep.io Auto-leveler Bot
- // @namespace http://tampermonkey.net/
- // @version 2024-03-24 - 2024-04-14
- // @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 Apache License 2.0
- // @grant none
- // @run-at document-start
- // ==/UserScript==
-
-
-
- /* --------HOW TO USE--------
- // 1. Use in 2tdm or 4tdm. in any other gamemode, it breaks!
- // 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.")
-
- let OMG = setInterval(function(){
- if(!window.input){
- return;
- }
- clearInterval(OMG);
-
- 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;
- }
- });
- 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])
- }
- });
-
-
- 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]
- }
-
-
- 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);
- }, 400);
-
-
- const handler = {
- apply(r,o,args) {
- Error.stackTraceLimit = 0;
- return r.apply(o,args)
- }
- }
- Object.freeze = new Proxy(Object.freeze, handler)
-
-
-