Greasy Fork is available in English.

Maxtri Tool

A Maxtri mod that allows you to use bots.

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