Maxtri Tool

A Maxtri mod that allows you to use bots.

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

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

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==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);