nothing

noting to be honest

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         nothing
// @version      1.1
// @description  noting to be honest
// @author       THEKDT
// @match        https://https://www.modd.io/play/JukeOrDiee#
// @grant        GM_setValue
// @grant        GM_getValue
// @namespace https://greasyfork.org/en/users/844900-thekdt
// ==/UserScript==
 
window = unsafeWindow;
 
var int = window.setInterval(function() {
  if(window.input != null) {
    window.clearInterval(int);
    onready();
  }
}, 100);
 
function onready() {
  const KEY = '`';
  const scaling = 64;
  const scale = window.devicePixelRatio;
  const canvas = document.getElementById('canvas');
  const ctx = canvas.getContext('2d');
  const c = CanvasRenderingContext2D.prototype;
 
  function getRatio() {
    if(canvas.height * 16 / 9 >= canvas.width) {
      return canvas.height;
    } else {
      return canvas.width / 16 * 9;
    }
  }
 
  function getScale() {
    return getRatio() / (1080 * scale);
  }
 
  function withinMinimap(x, y) {
    const r = getRatio();
    if(x >= canvas.width - r * 0.2 && y >= canvas.height - r * 0.2) {
      return true;
    } else {
      return false;
    }
  }
 
  function dist(x1, y1, x2, y2) {
    return Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
  }
 
  var FoV = 1;
 
  var posCount = 0;
  var firstPos = [];
  var secondPos = [];
  var playerPos = [-1, 0];
  var vel = [0, 0];
  var mvel = [0, 0];
 
  var mouse = [0, 0];
  var realMouse = [0, 0];
  var afkSpot = [-1, 0];
  var picking = false;
  var afk = false;
 
  var relyKeys = true;
  var menuVisible = false;
  var menu;
  var textOverlay = 0;
 
  var multibox = false;
  var aim = 0;
  var movement = false;
  var mov;
  var aimm;
 
  var buttons = 0;
  const KEYS = {
    48  :       1,
    49  :       2,
    50  :       4,
    51  :       8,
    52  :      16,
    53  :      32,
    54  :      64,
    55  :     128,
    56  :     256,
    57  :     512,
    67  :    1024,
    69  :    2048,
    75  :    4096,
    79  :    8192,
    77  :   16384,
    85  :   32768,
    59  :   65536,
    220 :  131072,
    13  :  262144,
    0   :  524288,
    2   : 1048576,
    32  : 2097152,
    16  : 4194304
  };
  const KEYS2 = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 67, 69, 75, 79, 77, 85, 59, 220, 13, 0, 2, 32, 16];
 
  var bmov = 0;
  const MKEYS = {
    87: 1,
    83: 2,
    65: 4,
    68: 8
  };
 
  const RD = 2.5;
  const MRD = 0.1;
  const SRD = RD + MRD;
  const DRD = SRD * (Math.sqrt(2) / 2);
 
  const keybinds = localStorage.getItem("multbox_keybinds") ? JSON.parse(localStorage.getItem("multbox_keybinds")) : [0, 0, 0, 0, 0, 0];
 
  if(keybinds.length != 6) {
    for(let i = keybinds.length; i < 6; ++i) {
      keybinds[i] = 0;
    }
    localStorage.setItem("multbox_keybinds", JSON.stringify(keybinds));
  }
 
  function normalizeVel() {
    const d = dist(0, 0, vel[0], vel[1]);
    if(d > 1) {
      mvel[0] = Math.sign(vel[0]) * DRD;
      mvel[1] = Math.sign(vel[1]) * DRD;
    } else {
      mvel = [Math.sign(vel[0]) * SRD, Math.sign(vel[1]) * SRD];
    }
  }
 
  function getMousePos(e) {
    var rect = canvas.getBoundingClientRect();
    return [(e.clientX - rect.left) / (rect.right - rect.left) * canvas.width, (e.clientY - rect.top) / (rect.bottom - rect.top) * canvas.height];
  }
 
  canvas.onmousemove = new Proxy(canvas.onmousemove, {
    apply: function(to, what, args) {
      const e = args[0];
      mouse = getMousePos(e);
      realMouse = [playerPos[0] + (mouse[0] - canvas.width / 2) / getScale() / FoV / scaling,
                   playerPos[1] + (mouse[1] - canvas.height / 2) / getScale() / FoV / scaling];
      return to.apply(what, args);
    }
  });
  canvas.onmousedown = new Proxy(canvas.onmousedown, {
    apply: function(to, what, args) {
      const e = args[0];
      if(picking == true) {
        const w = canvas.width;
        const h = canvas.height;
        const r = getRatio();
        if(withinMinimap(e.clientX * scale, e.clientY * scale) == true) {
          afkSpot = [(e.clientX * scale - w + r * 0.2) / getScale(), (e.clientY * scale - h + r * 0.2) / getScale()];
          picking = false;
        } else if(e.clientX * scale > w - r * 0.3 - 1 && e.clientX * scale < w - r * 0.2 - 1 && e.clientY * scale > h - r * 0.3 - 1 && e.clientY * scale < h - r * 0.2 - 1) {
          afkSpot = [-1, 0];
          picking = false;
        }
      }
      if(KEYS[e.button] != null && (buttons & KEYS[e.button]) == 0) {
        buttons |= KEYS[e.button];
      }
      return to.apply(what, args);
    }
  });
  canvas.onmouseup = new Proxy(canvas.onmouseup, {
    apply: function(to, what, args) {
      const e = args[0];
      if(KEYS[e.button] != null && (buttons & KEYS[e.button]) != 0) {
        buttons ^= KEYS[e.button];
      }
      return to.apply(what, args);
    }
  });
  window.onkeydown = new Proxy(window.onkeydown, {
    apply: function(to, what, args) {
      const e = args[0];
      if(e.key == KEY && (textOverlay == 0 || (textOverlay != 0 && textOverlay > 6))) {
        menuVisible = !menuVisible;
        if(menuVisible == true) {
          menu.style.display = 'block';
        } else {
          menu.style.display = 'none';
        }
      }
      if(KEYS[e.keyCode] != null && (buttons & KEYS[e.keyCode]) == 0) {
        buttons |= KEYS[e.keyCode];
      }
      if(MKEYS[e.keyCode] != null && (bmov & MKEYS[e.keyCode]) == 0) {
        bmov |= MKEYS[e.keyCode];
        switch(e.keyCode) {
          case 65: {
            vel[0] -= 1;
            break;
          }
          case 68: {
            vel[0] += 1;
            break;
          }
          case 83: {
            vel[1] += 1;
            break;
          }
          case 87: {
            vel[1] -= 1;
            break;
          }
        }
        normalizeVel();
      }
      if(textOverlay == 0 || textOverlay > 6) {
        for(let i = 0; i < keybinds.length; ++i) {
          if(e.key == keybinds[i]) {
            document.getElementById('mboxb' + (i + 1)).onclick();
          }
        }
      }
      if(textOverlay != 0 && textOverlay < 7) {
        if(e.key == KEY) {
          keybinds[textOverlay - 1] = 0;
          document.getElementById('mboxk' + textOverlay).innerHTML = '-';
        } else {
          keybinds[textOverlay - 1] = e.key;
          document.getElementById('mboxk' + textOverlay).innerHTML = e.key;
        }
        localStorage.setItem("multibox_keybinds", JSON.stringify(keybinds));
        textOverlay = 0;
        e.stopPropagation();
        e.preventDefault();
        return;
      }
      return to.apply(what, args);
    }
  });
  window.onkeyup = new Proxy(window.onkeyup, {
    apply: function(to, what, args) {
      const e = args[0];
      if(KEYS[e.keyCode] != null && (buttons & KEYS[e.keyCode]) != 0) {
        buttons ^= KEYS[e.keyCode];
      }
      if(MKEYS[e.keyCode] != null && (bmov & MKEYS[e.keyCode]) != 0) {
        bmov ^= MKEYS[e.keyCode];
        switch(e.keyCode) {
          case 65: {
            vel[0] += 1;
            break;
          }
          case 68: {
            vel[0] -= 1;
            break;
          }
          case 83: {
            vel[1] -= 1;
            break;
          }
          case 87: {
            vel[1] += 1;
            break;
          }
        }
        if((bmov & MKEYS[65]) == 0 && (bmov & MKEYS[68]) == 0) {
          vel[0] = 0;
        }
        if((bmov & MKEYS[83]) == 0 && (bmov & MKEYS[87]) == 0) {
          vel[1] = 0;
        }
        normalizeVel();
      }
      return to.apply(what, args);
    }
  });
 
  c.moveTo = new Proxy(c.moveTo, {
    apply: function(to, what, args) {
      const x = args[0];
      const y = args[1];
      if(withinMinimap(x, y) == true) {
        firstPos = [x, y];
        posCount = 1;
      } else {
        posCount = 0;
      }
      return to.apply(what, args);
    }
  });
 
  c.stroke = new Proxy(c.stroke, {
    apply: function(to, what, args) {
      if(what.fillStyle == '#cdcdcd' && what.strokeStyle == '#000000') {
        FoV = what.globalAlpha / 0.05;
      }
      posCount = 0;
      return to.apply(what);
    }
  });
 
  c.lineTo = new Proxy(c.lineTo, {
    apply: function(to, what, args) {
      const x = args[0];
      const y = args[1];
      switch(posCount) {
        case 1: {
          if(withinMinimap(x, y) == true && dist(x, y, firstPos[0], firstPos[1]) < 15 * scale * getScale()) {
            secondPos = [x, y];
            ++posCount;
          } else {
            posCount = 0;
          }
          break;
        }
        case 2: {
          const d = dist(firstPos[0], firstPos[1], secondPos[0], secondPos[1]);
          if(withinMinimap(x, y) == true && d < 15 * scale * getScale()) {
            const angle = Math.atan2(secondPos[1] - y, secondPos[0] - x) - 0.3674113;
            const r = getRatio();
            const xx = (x + Math.cos(angle) * d * 0.8660111 - canvas.width + r * 0.2) / getScale();
            const yy = (y + Math.sin(angle) * d * 0.8660111 - canvas.height + r * 0.2) / getScale();
            playerPos = [xx, yy];
            realMouse = [playerPos[0] + (mouse[0] - canvas.width / 2) / getScale() / FoV / scaling,
                         playerPos[1] + (mouse[1] - canvas.height / 2) / getScale() / FoV / scaling];
          }
          posCount = 0;
          break;
        }
      }
      return to.call(what, x, y);
    }
  });
 
  function drawOverlay() {
    if(picking == true) {
      const r = getRatio();
      var draw = true;
      var angle;
      const w = canvas.width;
      const h = canvas.height;
      ctx.beginPath();
      ctx.fillStyle = '#00000077';
      ctx.fillRect(0, 0, w, (h - r * 0.2) | 0);
      ctx.fillRect(0, (h - r * 0.2) | 0, (w - r * 0.2) | 0, h);
      ctx.fillStyle = '#FF000077';
      ctx.fillRect(w - r * 0.3 - 1, h - r * 0.3 - 1, r * 0.1, r * 0.1);
      if(mouse[1] < h - r * 0.2) {
        if(mouse[0] < w - r * 0.2) {
          angle = Math.atan2(h - r * 0.2 - mouse[1], w - r * 0.2 - mouse[0]);
        } else {
          angle = Math.PI / 2;
        }
      } else {
        if(mouse[0] < w - r * 0.2) {
          angle = 0;
        } else {
          draw = false;
        }
      }
      if(mouse[0] > w - r * 0.3 - 1 && mouse[0] < w - r * 0.2 - 1 && mouse[1] > h - r * 0.3 - 1 && mouse[1] < h - r * 0.2 - 1) {
        draw = false;
      }
      if(draw == true) {
        ctx.moveTo(...mouse);
        ctx.lineTo(mouse[0] + Math.cos(angle) * 40, mouse[1] + Math.sin(angle) * 40);
        ctx.moveTo(mouse[0] + Math.cos(angle) * 40, mouse[1] + Math.sin(angle) * 40);
        ctx.lineTo(mouse[0] + Math.cos(angle - 0.4) * 25, mouse[1] + Math.sin(angle - 0.4) * 25);
        ctx.moveTo(mouse[0] + Math.cos(angle) * 40, mouse[1] + Math.sin(angle) * 40);
        ctx.lineTo(mouse[0] + Math.cos(angle + 0.4) * 25, mouse[1] + Math.sin(angle + 0.4) * 25);
        ctx.lineWidth = 5;
        ctx.strokeStyle = '#ff226699';
        ctx.stroke();
      } else {
        ctx.moveTo(mouse[0] - 15, mouse[1]);
        ctx.lineTo(mouse[0] + 15, mouse[1]);
        ctx.moveTo(mouse[0], mouse[1] - 15);
        ctx.lineTo(mouse[0], mouse[1] + 15);
        ctx.lineWidth = 2;
        ctx.strokeStyle = '#00000077';
        ctx.stroke();
      }
      ctx.fillStyle = '#FFFFFF77';
      ctx.font = `${30 * scale}px Arial`;
      ctx.textAlign = 'center';
      ctx.fillText('drag your cursor on the minimap', w / 2, h * 3.5 / 10);
      ctx.fillText('left click to select where you want to stay', w / 2, h * 4.5 / 10);
      ctx.fillText('click on the red area to reset your AFK location', w / 2, h * 5.5 / 10);
      ctx.fillText('press the button again to hide this overlay', w / 2, h * 6.5 / 10);
    } else if(textOverlay != 0) {
      const w = canvas.width / 2;
      const h = canvas.height / 2;
      ctx.beginPath();
      ctx.fillStyle = '#00000077';
      ctx.fillRect(0, 0, w * 2, h * 2);
      ctx.fillStyle = '#FFFFFF77';
      ctx.font = `${30 * scale}px Arial`;
      ctx.textAlign = 'center';
      switch(textOverlay) {
        case 1: {
          ctx.fillText('press the key you want to bind to picking AFK location', w, h - h / (10 / 3));
          break;
        }
        case 2: {
          ctx.fillText('press the key you want to bind to toggling AFK', w, h - h / (10 / 3));
          break;
        }
        case 3: {
          ctx.fillText('press the key you want to bind to toggling multibox', w, h - h / (10 / 3));
          break;
        }
        case 4: {
          ctx.fillText('press the key you want to bind to toggling aiming mode', w, h - h / (10 / 3));
          break;
        }
        case 5: {
          ctx.fillText('press the key you want to bind to toggling movement mode', w, h - h / (10 / 3));
          break;
        }
        case 6: {
          ctx.fillText('press the key you want to bind to receiving keys from the master tab', w, h - h / (10 / 3));
          break;
        }
        case 7: {
          ctx.fillText('picks the location which your tank will be going towards', w, h - h / 10);
          ctx.fillText('when you toggle AFK option to be on', w, h + h / 10);
          break;
        }
        case 8: {
          ctx.fillText('moves your tank towards the position you set previously', w, h - h / 10);
          ctx.fillText('if you did not set AFK location, it will be set to your current position', w, h + h / 10);
          break;
        }
        case 9: {
          ctx.fillText('enables / disables multibox (aim, movement, key copying)', w, h - h / 10);
          ctx.fillText('can be set for each tab individually', w, h + h / 10);
          break;
        }
        case 10: {
          ctx.fillText('toggles between different aiming styles for other tabs', w, h - h / 2.5);
          ctx.fillText('precise - tabs will aim based on mouse position on the map', w, h - h / 5);
          ctx.fillText('copy - tabs will aim based on mouse position on the screen', w, h);
          ctx.fillText('reverse - tabs will aim the opposite precise direction', w, h + h / 5);
          ctx.fillText('\'reverse\' option is mostly useful when having movement set to \'mouse\'', w, h + h / 2.5);
          break;
        }
        case 11: {
          ctx.fillText('toggles between different movement styles for other tabs', w, h - h / 5);
          ctx.fillText('player - moves tabs towards the player, uses own movement prediction', w, h);
          ctx.fillText('mouse - moves tabs towards the mouse to act like drones', w, h + h / 5);
          break;
        }
        case 12: {
          ctx.fillText('decides whether keys pressed on your master tab will affect this tab', w, h - h / 5);
          ctx.fillText('keep it on if you want all your tabs to be coordinated no matter what', w, h);
          ctx.fillText('keep it off if your tanks collide with each other - you have ol and octo', w, h + h / 5);
          break;
        }
      }
      if(textOverlay < 7) {
        ctx.fillText('pressing ' + KEY + ' will set the keybind to inactive (no key will be assigned)', w, h - h / 10);
        ctx.fillText('you can change the keybind anytime afterwards', w, h + h / 10);
        ctx.fillText('press the button again to hide this overlay', w, h + h / (10 / 3));
      }
    }
    requestAnimationFrame(drawOverlay);
  }
 
  function moveToWithRadius(x, y, r) {
    if(dist(x, y, playerPos[0], playerPos[1]) <= r) {
      window.input.keyUp(65);
      window.input.keyUp(68);
      window.input.keyUp(83);
      window.input.keyUp(87);
      return;
    }
    window.input.keyUp(65);
    window.input.keyUp(68);
    window.input.keyUp(83);
    window.input.keyUp(87);
    const angle = Math.atan2(y - playerPos[1], x - playerPos[0]);
    if(angle > -Math.PI * 2/6 && angle < Math.PI * 2/6) {
      window.input.keyDown(68);
    } else if(angle < -Math.PI * 4/6 || angle > Math.PI * 4/6) {
      window.input.keyDown(65);
    }
    if(angle > Math.PI * 1/6 && angle < Math.PI * 5/6) {
      window.input.keyDown(83);
    } else if(angle > -Math.PI * 5/6 && angle < -Math.PI * 1/6) {
      window.input.keyDown(87);
    }
  }
 
  function moveToAFKSpot() {
    if(afk == true) {
      if(afkSpot[0] == -1) {
        afkSpot = playerPos;
      }
      moveToWithRadius(afkSpot[0], afkSpot[1], -1);
    }
  }
 
  function simulateKeyPress(key, down) {
    window.dispatchEvent(new KeyboardEvent(down ? "keydown" : "keyup", {
      keyCode: key,
      shiftKey: key == 16 ? true : false
    }));
  }
 
  function simulateMousePress(button, down) {
    canvas.dispatchEvent(new MouseEvent(down ? "mousedown" : "mouseup", { "clientX": mouse[0], "clientY": mouse[1], "button": button }));
  }
 
  function ReadVarUint(packet, at) {
    var number = 0;
    var count = 0;
    do {
      number |= (packet[at] & 0x7f) << (7 * count++);
    } while((packet[at++] >> 7) == 1);
    return [number, count];
  }
 
  function WriteVarUint(number) {
    let vu = [];
    while(number > 0x7f) {
      vu[vu.length] = (number & 0x7f) | 0x80;
      number >>>= 7;
    }
    vu[vu.length] = number;
    return vu;
  }
 
  function createData() {
    var o;
    if(movement == false) {
      o = [0, ...WriteVarUint((playerPos[0] + mvel[0]) * 1000), ...WriteVarUint((playerPos[1] + mvel[1]) * 1000), (mvel[0] == 0 && mvel[1] == 0) ? 0 : 1, ...WriteVarUint((Math.atan2(mvel[1], mvel[0]) + 4) * 1000)];
    } else {
      o = [1, ...WriteVarUint(realMouse[0] * 1000), ...WriteVarUint(realMouse[1] * 1000)];
    }
    if(aim == 0) {
      o = [...o, 0, ...WriteVarUint(realMouse[0] * 1000), ...WriteVarUint(realMouse[1] * 1000)];
    } else if(aim == 1) {
      o = [...o, 1, ...WriteVarUint(32000 + (mouse[0] - canvas.width / 2) / getScale() * 10), ...WriteVarUint(32000 + (mouse[1] - canvas.height / 2) / getScale() * 10)];
    } else {
      o = [...o, 2, ...WriteVarUint(realMouse[0] * 1000), ...WriteVarUint(realMouse[1] * 1000)];
    }
    o = [...o, ...WriteVarUint(buttons)];
    return o;
  }
 
  function parseData(o) {
    if(afk == false) {
      window.clearInterval(mov);
      window.clearInterval(aimm);
      const w = canvas.width / 2;
      const h = canvas.height / 2;
      const type = o[0];
      var at = 1;
      const x = ReadVarUint(o, at);
      at += x[1];
      x[0] /= 1000;
      const y = ReadVarUint(o, at);
      at += y[1];
      y[0] /= 1000;
      if(type == 0) {
        const hasVel = ReadVarUint(o, at);
        at += hasVel[1];
        const ang = ReadVarUint(o, at);
        at += ang[1];
        ang[0] = ang[0] / 1000 - 4;
        const lmfao = function() {
          if(hasVel[0] == 1 && dist(x[0], y[0], playerPos[0], playerPos[1]) <= RD) {
            const a1 = Math.atan2(y[0] - playerPos[1], x[0] - playerPos[0]);
            if(Math.abs(a1 - ang[0]) < 0.5) {
              if(a1 < ang[0]) {
                moveToWithRadius(x[0] + Math.cos(ang[0] + Math.PI / 2) * SRD, y[0] + Math.sin(ang[0] + Math.PI / 2) * SRD, -1);
              } else {
                moveToWithRadius(x[0] + Math.cos(ang[0] - Math.PI / 2) * SRD, y[0] + Math.sin(ang[0] - Math.PI / 2) * SRD, -1);
              }
            } else {
              moveToWithRadius(x[0] - Math.cos(ang[0]) * SRD * 2, y[0] - Math.sin(ang[0]) * SRD * 2, RD);
            }
          } else {
            moveToWithRadius(x[0], y[0], RD);
          }
        };
        mov = window.setInterval(lmfao, 50);
        lmfao();
      } else {
        mov = window.setInterval(function() {
          moveToWithRadius(x[0], y[0], -1);
        }, 50);
        moveToWithRadius(x[0], y[0], -1);
      }
      const a = o[at++];
      const xx = ReadVarUint(o, at);
      at += xx[1];
      const yy = ReadVarUint(o, at);
      at += yy[1];
      if(a == 0) {
        const lmfao = function() {
          const angle = Math.atan2(yy[0] / 1000 - playerPos[1], xx[0] / 1000 - playerPos[0]);
          var distance = dist(xx[0] / 1000, yy[0] / 1000, playerPos[0], playerPos[1]) * getScale() * FoV * scaling;
          mouse = [w + Math.cos(angle) * distance, h + Math.sin(angle) * distance];
          window.input.mouse(w + Math.cos(angle) * distance, h + Math.sin(angle) * distance);
        };
        aimm = window.setInterval(lmfao, 50);
        lmfao();
      } else if(a == 1) {
        mouse = [(xx[0] - 32000) / 10 * getScale() + w, (yy[0] - 32000) / 10 * getScale() + h];
        window.input.mouse((xx[0] - 32000) / 10 * getScale() + w, (yy[0] - 32000) / 10 * getScale() + h);
      } else {
        const lmfao = function() {
          const angle = Math.atan2(playerPos[1] - yy[0] / 1000, playerPos[0] - xx[0] / 1000);
          var distance = dist(xx[0] / 1000, yy[0] / 1000, playerPos[0], playerPos[1]) * getScale() * FoV * scaling;
          mouse = [w + Math.cos(angle) * distance, h + Math.sin(angle) * distance];
          window.input.mouse(w + Math.cos(angle) * distance, h + Math.sin(angle) * distance);
        };
        aimm = window.setInterval(lmfao, 50);
        lmfao();
      }
      if(relyKeys == true) {
        const b = ReadVarUint(o, at);
        at += b[1];
        const d = b[0] ^ buttons;
        for(let i = 0; i < KEYS2.length; ++i) {
          if((d & (2 ** i)) != 0) {
            if(KEYS2[i] < 3) {
              simulateMousePress(KEYS2[i], (buttons & (2 ** i)) == 0);
            } else {
              simulateKeyPress(KEYS2[i], (buttons & (2 ** i)) == 0);
            }
          }
        }
        buttons = b[0];
      }
    }
  }
  window.goUp = true;
  function updateCycle() {
    if(document.hasFocus() == true) {
      window.clearInterval(mov);
      window.clearInterval(aimm);
      if(multibox == true) {
        GM_setValue("mbox", JSON.stringify(createData()));
      }
    } else if(multibox == true) {
      try {
        var g = JSON.parse(GM_getValue("mbox"));
        parseData(g);
      } catch(err){}
    }
    if(window.octoAFK == true) {
      window.input.keyUp(65);
      window.input.keyUp(68);
      window.input.keyUp(83);
      window.input.keyUp(87);
      if(playerPos[0] < 184) {
        window.input.keyDown(68);
      } else if(playerPos[0] > 186) {
        window.input.keyDown(65);
      }
      if(playerPos[1] < 30) {
        window.goUp = false;
      } else if(playerPos[1] > 186) {
        window.goUp = true;
      }
      if(window.goUp == true) {
        window.input.keyDown(87);
      } else {
        window.input.keyDown(83);
      }
    }
    requestAnimationFrame(updateCycle);
  }
 
  const html = `
<div id="mbox">
<button id="mboxb1" class="mboxb">Pick AFK location</button>
<button id="mboxk1" class="mboxb">${keybinds[0]==0?'-':keybinds[0]}</button>
<button id="mboxh1" class="mboxb">?</button>
<button id="mboxb2" class="mboxb">AFK: off</button>
<button id="mboxk2" class="mboxb">${keybinds[1]==0?'-':keybinds[1]}</button>
<button id="mboxh2" class="mboxb">?</button>
<button id="mboxb3" class="mboxb">Multibox: off</button>
<button id="mboxk3" class="mboxb">${keybinds[2]==0?'-':keybinds[2]}</button>
<button id="mboxh3" class="mboxb">?</button>
<button id="mboxb4" class="mboxb">Aim: precise</button>
<button id="mboxk4" class="mboxb">${keybinds[3]==0?'-':keybinds[3]}</button>
<button id="mboxh4" class="mboxb">?</button>
<button id="mboxb5" class="mboxb">Movement: player</button>
<button id="mboxk5" class="mboxb">${keybinds[4]==0?'-':keybinds[4]}</button>
<button id="mboxh5" class="mboxb">?</button>
<button id="mboxb6" class="mboxb">Receive keys: on</button>
<button id="mboxk6" class="mboxb">${keybinds[5]==0?'-':keybinds[5]}</button>
<button id="mboxh6" class="mboxb">?</button>
</div>
`;
  const css = `
<style>
.mboxb {
border: none;
text-align: center;
text-decoration: none;
font-size: max(calc(0.3em + 0.7vw), 0.8em);
width: 70%;
height: 16.66666666666666%;
display: block;
transition-duration: 0.2s;
cursor: pointer;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
#mbox {
position: absolute;
top: 30%;
width: max(7em, 15%);
background-color: #00000010;
height: max(7em, 35%);
display: none;
}
#mboxb1 {
position: absolute;
top: 0;
left: 30%;
background-color: #4CAF50;
color: #FFFFFF;
border: 0.3em solid #4CAF50;
}
#mboxb1:hover {
background-color: #4CAF5000;
}
#mboxk1 {
position: absolute;
width: 15%;
top: 0;
left: 15%;
background-color: #4CAF50;
color: #FFFFFF;
border: 0.3em solid #4CAF50;
}
#mboxk1:hover {
background-color: #4CAF5000;
}
#mboxh1 {
position: absolute;
width: 15%;
top: 0;
left: 0;
background-color: #4CAF50;
color: #FFFFFF;
border: 0.3em solid #4CAF50;
}
#mboxh1:hover {
background-color: #4CAF5000;
}
#mboxb2 {
position: absolute;
top: 16.66666666666666%;
left: 30%;
background-color: #008CBA;
color: #FFFFFF;
border: 0.3em solid #008CBA;
}
#mboxb2:hover {
background-color: #008CBA00;
}
#mboxk2 {
position: absolute;
width: 15%;
top: 16.66666666666666%;
left: 15%;
background-color: #008CBA;
color: #FFFFFF;
border: 0.3em solid #008CBA;
}
#mboxk2:hover {
background-color: #008CBA00;
}
#mboxh2 {
position: absolute;
width: 15%;
top: 16.66666666666666%;
left: 0;
background-color: #008CBA;
color: #FFFFFF;
border: 0.3em solid #008CBA;
}
#mboxh2:hover {
background-color: #008CBA00;
}
#mboxb3 {
position: absolute;
top: 33.33333333333333%;
left: 30%;
background-color: #f44336;
color: #FFFFFF;
border: 0.3em solid #f44336;
}
#mboxb3:hover {
background-color: #f4433600;
}
#mboxk3 {
position: absolute;
width: 15%;
top: 33.33333333333333%;
left: 15%;
background-color: #f44336;
color: #FFFFFF;
border: 0.3em solid #f44336;
}
#mboxk3:hover {
background-color: #f4433600;
}
#mboxh3 {
position: absolute;
width: 15%;
top: 33.33333333333333%;
left: 0;
background-color: #f44336;
color: #FFFFFF;
border: 0.3em solid #f44336;
}
#mboxh3:hover {
background-color: #f4433600;
}
#mboxb4 {
position: absolute;
top: 50%;
left: 30%;
background-color: #e7e7e7;
color: #000000;
border: 0.3em solid #e7e7e7;
}
#mboxb4:hover {
background-color: #e7e7e700;
color: #FFFFFF;
}
#mboxk4 {
position: absolute;
width: 15%;
top: 50%;
left: 15%;
background-color: #e7e7e7;
color: #000000;
border: 0.3em solid #e7e7e7;
}
#mboxk4:hover {
background-color: #e7e7e700;
color: #FFFFFF;
}
#mboxh4 {
position: absolute;
width: 15%;
top: 50%;
left: 0;
background-color: #e7e7e7;
color: #000000;
border: 0.3em solid #e7e7e7;
}
#mboxh4:hover {
background-color: #e7e7e700;
color: #FFFFFF;
}
#mboxb5 {
position: absolute;
top: 66.66666666666666%;
left: 30%;
background-color: #555555;
color: #FFFFFF;
border: 0.3em solid #555555;
}
#mboxb5:hover {
background-color: #55555500;
}
#mboxk5 {
position: absolute;
width: 15%;
top: 66.66666666666666%;
left: 15%;
background-color: #555555;
color: #FFFFFF;
border: 0.3em solid #555555;
}
#mboxk5:hover {
background-color: #55555500;
}
#mboxh5 {
position: absolute;
width: 15%;
top: 66.66666666666666%;
left: 0;
background-color: #555555;
color: #FFFFFF;
border: 0.3em solid #555555;
}
#mboxh5:hover {
background-color: #55555500;
}
#mboxb6 {
position: absolute;
top: 83.33333333333333%;
left: 30%;
background-color: #FFFF66;
color: #000000;
border: 0.3em solid #FFFF66;
}
#mboxb6:hover {
background-color: #FFFF6600;
color: #FFFFFF;
}
#mboxk6 {
position: absolute;
width: 15%;
top: 83.33333333333333%;
left: 15%;
background-color: #FFFF66;
color: #000000;
border: 0.3em solid #FFFF66;
}
#mboxk6:hover {
background-color: #FFFF6600;
color: #FFFFFF;
}
#mboxh6 {
position: absolute;
width: 15%;
top: 83.33333333333333%;
left: 0;
background-color: #FFFF66;
color: #000000;
border: 0.3em solid #FFFF66;
}
#mboxh6:hover {
background-color: #FFFF6600;
color: #FFFFFF;
}
</style>
`;
 
  requestAnimationFrame(drawOverlay);
  requestAnimationFrame(updateCycle);
  window.setInterval(moveToAFKSpot, 100);
  canvas.insertAdjacentHTML('afterend', css);
  canvas.insertAdjacentHTML('afterend', html);
  menu = document.getElementById('mbox');
  const AFKLocationButton = document.getElementById('mboxb1');
  AFKLocationButton.onclick = function(e) {
    if(document.hasFocus() == false || e == undefined) {
      return;
    }
    if(textOverlay != 0) {
      textOverlay = 0;
    }
    picking = !picking;
  };
  const AFKButton = document.getElementById('mboxb2');
  AFKButton.onclick = function(e) {
    if(document.hasFocus() == false || e == undefined) {
      return;
    }
    afk = !afk;
    if(afk == true) {
      window.clearInterval(mov);
      window.clearInterval(aimm);
      this.innerHTML = 'AFK: on';
    } else {
      this.innerHTML = 'AFK: off';
      window.input.keyUp(65);
      window.input.keyUp(68);
      window.input.keyUp(83);
      window.input.keyUp(87);
    }
  };
  const multiboxButton = document.getElementById('mboxb3');
  multiboxButton.onclick = function(e) {
    if(document.hasFocus() == false || e == undefined) {
      return;
    }
    multibox = !multibox;
    if(multibox == true) {
      this.innerHTML = 'Multibox: on';
    } else {
      this.innerHTML = 'Multibox: off';
    }
  };
  const aimButton = document.getElementById('mboxb4');
  aimButton.onclick = function(e) {
    if(document.hasFocus() == false || e == undefined) {
      return;
    }
    aim = (aim + 1) % 3;
    if(aim == 1) {
      this.innerHTML = 'Aim: copy';
    } else if(aim == 2) {
      this.innerHTML = 'Aim: reverse';
    } else {
      this.innerHTML = 'Aim: precise';
    }
  };
  const movementButton = document.getElementById('mboxb5');
  movementButton.onclick = function(e) {
    if(document.hasFocus() == false || e == undefined) {
      return;
    }
    movement = !movement;
    if(movement == true) {
      this.innerHTML = 'Movement: mouse';
    } else {
      this.innerHTML = 'Movement: player';
    }
  };
  const relykeysButton = document.getElementById('mboxb6');
  relykeysButton.onclick = function(e) {
    if(document.hasFocus() == false || e == undefined) {
      return;
    }
    relyKeys = !relyKeys;
    if(relyKeys == true) {
      this.innerHTML = 'Receive keys: on';
    } else {
      this.innerHTML = 'Receive keys: off';
    }
  };
  let i = 1;
  let k;
  for(; i < 7; ++i) {
    k = document.getElementById('mboxk' + i);
    const a = i;
    k.onclick = function() {
      picking = false;
      if(textOverlay == 0) {
        textOverlay = a;
      } else if(a == textOverlay) {
        textOverlay = 0;
      } else {
        textOverlay = a;
      }
    };
  }
}