Maxtri Tool

A Maxtri mod that allows you to use bots.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Tendrás que instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Tendrás que instalar una extensión como Tampermonkey antes de poder instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Tendrás que instalar una extensión como Stylus antes de poder instalar este script.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

Para poder instalar esto tendrás que instalar primero una extensión de estilos de usuario.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Maxtri Tool
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  A Maxtri mod that allows you to use bots.
// @author       Sopur
// @match        http://maxtri.glitch.me/
// @match        http://maxtri.ml/
// @grant        GM_addStyle
// ==/UserScript==



/*

 || CHANGE LOG ||

 # Fixed sometimes not connecting to the server.
 # Decreased server connecting times.
 # Improved GUI.
 # Fixed Mouse Mode: To Tank.

*/



/* SERVER HADNLER */
var loadingBar = document.createElement("div"); document.body.appendChild(loadingBar);
const serverURL = "ws://maxtritool.glitch.me/";
const server = new WebSocket(serverURL);
const token = localStorage.getItem('SopurToken');
var connecting = true;
const loading = (onoff) => {
  switch (onoff) {
    case 0: BbarText.innerHTML = "Maxtri Tool"; break;
    case 1: BbarText.innerHTML = "Connecting to servers..."; break;
    case 2: BbarText.innerHTML = "Disconnected."; break;
  };
};
const connect = () => {
  if (localStorage.getItem('SopurToken') === null) {
    let token = "";
    let letters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
    let realLength = letters.length - 1;
    for (let i = 0; i < 20; i++) token += letters[(Math.round(Math.random() * realLength))];
    localStorage.setItem('SopurToken', token);
    if (server.readyState === WebSocket.OPEN) server.send(`{"AddToken": "${token}"}`);
    location.reload();
  } else { if (server.readyState === WebSocket.OPEN) server.send(`{"ping": "${token}"}`) };
}
const resetToken = () => {
  loading(2);
  localStorage.removeItem('SopurToken');
  setTimeout(() => { location.reload(); }, 1000);
};
/* MOUSE HANDLER */
var lastmouseX = 0;
var lastmouseY = 0;
window.addEventListener('mousemove', function (event) {
  lastmouseX = event.clientX;
  lastmouseY = event.clientY;
});
const getMousePos = () => {
  let X = lastmouseX - (win_size[0] / 2);
  let Y = lastmouseY - (win_size[1] / 2);
  let newX = Math.abs(netX);
  let newY = Math.abs(netY);
  X = Math.round(newX + X);
  Y = Math.round(newY + Y);
  return { X, Y };
};
/* GLOBAL VARS */
const ver = 1.0;
var role = 1;
var fire = 0;
var clientFire = 0;
var dir = 0;
var movedir = 0;
var fireL = "Off";
var roleL = "Master";
var dirL = "To Mouse";
var movedirL = "To Mouse";
var userX = 0;
var userY = 0;
var lastUpgrade = [5, 0, 0, 0];
function uint8ify(input) { return new Uint8Array(input) };
/* UI */
var mode = 1;
const MaxtriTool = document.createElement("div"); MaxtriTool.className = "MaxtriTool"; document.body.appendChild(MaxtriTool);
const Bbar = document.createElement('div'); Bbar.className = "Bbar"; MaxtriTool.appendChild(Bbar);
const BbarText = document.createElement('div'); BbarText.className = "BbarText"; Bbar.appendChild(BbarText); BbarText.innerHTML = "Maxtri Tool";
const contents = document.createElement('div'); contents.className = "contents"; MaxtriTool.appendChild(contents);
contents.innerHTML = "[F] Role: Master<br>[G] Fire Mode: Off<br>[T] Mouse Mode: To Mouse<br>[Y] Movement Mode: To Mouse";
Bbar.onclick = () => {
        if (mode > 1) mode = 0;
        (mode === 0) ? MaxtriTool.style.top = "-300px" : MaxtriTool.style.top = "0px";
        mode++;
    }
GM_addStyle(`
@import url('https://fonts.googleapis.com/css2?family=Grenze+Gotisch:wght@700&display=swap');
.MaxtriTool {
                background-color: cadetblue;
                width: 800px;
                height: 300px;
                position: fixed;
                top: -300px;
                left: 200px;
                transition-duration: 1000ms;
            } .main:hover {
                background-color: rgb(93, 134, 136);
            }
            .Bbar {
                position: absolute;
                background-color: darkcyan;
                width: 100%;
                height: 50px;
                top: 100%;

                transition-duration: 500ms;
                cursor: pointer;
            }  .Bbar:hover {
                background-color: rgb(0, 83, 83);
            }
            .BbarText {
            position: absolute;
            font-family: 'Grenze Gotisch', cursive;
            text-shadow: none;
            font-size: 50px;
            top: -15px;
            left: 270px;
            opacity: 0.5;
             }
             .contents {
            position: absolute;
            font-family: 'Grenze Gotisch', cursive;
            text-shadow: none;
            font-size: 40px;
            top: 30px;
            left: 30px;
            opacity: 0.5;
            cursor: grab;
}
`);

var saidArray = [roleL, fireL, dirL, movedirL];
const changeText = (input, num) => {
  saidArray[num] = input;
contents.innerHTML = `[F] Role: ${saidArray[0]}<br>[G] Fire Mode: ${saidArray[1]}<br>[T] Mouse Mode: ${saidArray[2]}<br>[Y] Movement Mode: ${saidArray[3]}</p></div>`;
  if (role === 0) contents.innerHTML = "Slave set.";
};
/* KEY HANDLER */
server.binaryType = "arraybuffer";
document.addEventListener('keydown', function (event) {
  let keyCode = event.keyCode || event.which;
  switch (keyCode) {
    case 70: { //F
      if (role === 0) return;
      role++;
      if (role > 1) role = 0;
      switch (role) {
        case 0: roleL = "Slave"; changeText(); break;
        case 1: roleL = "Master"; break;
      };
      changeText(roleL, 0);
      break;
    }
    case 71: { //G
      if (role === 0) return;
      fire++;
      if (fire > 2) fire = 0;
      switch (fire) {
        case 0: fireL = "Off"; break;
        case 1: fireL = "Auto"; break;
        case 2: fireL = "Matching"; break;
      };
      changeText(fireL, 1);
      break;
    }
    case 84: { //H
      if (role === 0) return;
      dir++;
      if (dir > 3) dir = 0;
      switch (dir) {
        case 0: dirL = "To Mouse"; break;
        case 1: dirL = "Away"; break;
        case 2: dirL = "Smart"; break;
        case 3: dirL = "To Tank"; break;
      };
      changeText(dirL, 2);
      break;
    }
    case 89: { //H
      if (role === 0) return;
      movedir++;
      if (movedir > 2) movedir = 0;
      switch (movedir) {
        case 0: movedirL = "To Mouse"; break;
        case 1: movedirL = "To you"; break;
        case 2: movedirL = "Away"; break;
      };
      changeText(movedirL, 3);
      break;
    }
  }
});
/* PACKET SENDING HANDELER */
var realSend = WebSocket.prototype.send;
var globalWebSocket;
WebSocket.prototype.send = function (data) {
  let message = uint8ify(data);
  let ws = this;
  if (!(ws.url.toLowerCase().includes("maxtritool")) && (this !== globalWebSocket)) globalWebSocket = this;
  if (message[0] === 5 && role === 1) lastUpgrade = message;
  if (role === 1 && message[0] === 2) clientFire = message[10];
  if (message[0] !== 0 && message[0] !== 5 && message[11] !== 1 && ws.url !== serverURL && role === 0) return;
  return realSend.call(this, data);
};
/* MAIN LOOP */
setInterval(() => {
  if (connecting) return connect();
  let newuserX = Math.abs(unsafeWindow.netX);
  let newuserY = Math.abs(unsafeWindow.netY);
  if (newuserX === NaN || newuserX === NaN) return;
  userX = newuserX; userY = newuserY;
  let content = `{"X": ${userX}, "Y": ${userY}, "role": ${role}, "mouseX": ${getMousePos().X}, "mouseY": ${getMousePos().Y}, "lastUpgrade": [${lastUpgrade}], "fireRate": ${fire}, "clientFire": ${clientFire}, "dir": ${dir}, "movedir": ${movedir}, "token": "${token}", "ver": ${ver}}`;
  if (server.readyState === WebSocket.OPEN) server.send(content);
  if (lastUpgrade.length !== 4) setTimeout(() => { lastUpgrade = [5, 0, 0, 0] }, 100);
}, 100);
/* SERVER SEND HANDLER */
server.onmessage = (event) => {
  if (connecting) {
    if (uint8ify(event.data)[0] === 10) {
      connecting = false;
      loading(0);
      changeText("loading...");
      return;
    } else { loading(2); return };
  };
  if (uint8ify(event.data)[0] === 9) resetToken();
  if (role === 0) globalWebSocket.send(event.data);
};
loading(1);