Diep.io x03 Mod Menu

Loop upgrade custom builds, render aim line, render factory guide circle, and more.

目前為 2023-04-26 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Diep.io x03 Mod Menu
// @namespace    http://tampermonkey.net/
// @version      1.0
// @homepage     https://greasyfork.org/scripts/
// @description  Loop upgrade custom builds, render aim line, render factory guide circle, and more.
// @author       x03#2666 / x032205
// @match        https://diep.io/
// @grant        none
// @license      GNU GPLv3
// ==/UserScript==

;(function () {
  'use strict'

  //== Basic Elements ==//
  const main_panel = document.createElement('div')
  main_panel.id = 'main_panel'

  // Anchor
  const anchor = document.createElement('a')
  anchor.id = 'anchor'

  // Header
  const header = document.createElement('h1')
  header.textContent = 'x03 Mod Menu | Toggle: [R]'
  anchor.appendChild(header)

  // Holder panel
  const holder_panel = document.createElement('div')
  holder_panel.id = 'holder_panel'
  anchor.appendChild(holder_panel)

  // Tab side panel
  const side_panel = document.createElement('div')
  side_panel.classList.add('panel_1')
  holder_panel.appendChild(side_panel)

  // Display panel
  const display_panel = document.createElement('div')
  display_panel.classList.add('panel_1')
  holder_panel.appendChild(display_panel)
  display_panel.style.width = '100%'
  display_panel.style.marginLeft = '4px'
  display_panel.innerHTML = `<h2>select a tab</h2>`

  //== Tab Panels ==//

  //== VISUAL TAB
  const view_line = document.createElement('div')
  view_line.style.textAlign = 'left'
  view_line.style.alignItems = 'center'
  view_line.style.height = '33px'
  view_line.style.display = 'flex'

  const view_line_text = document.createElement('span')
  view_line_text.style.fontWeight = 'bold'
  view_line_text.textContent = 'View Aim Line'

  const view_line_label = document.createElement('label')
  view_line_label.classList.add('switch')

  const view_line_toggle = document.createElement('INPUT')
  view_line_toggle.setAttribute('type', 'checkbox')
  view_line_label.appendChild(view_line_toggle)

  const view_line_div = document.createElement('div')
  view_line_label.appendChild(view_line_div)
  view_line.appendChild(view_line_label)
  view_line.appendChild(view_line_text)

  // View Circle
  const view_circle = document.createElement('div')
  view_circle.style.textAlign = 'left'
  view_circle.style.alignItems = 'center'
  view_circle.style.height = '33px'
  view_circle.style.display = 'flex'

  const view_circle_text = document.createElement('span')
  view_circle_text.style.fontWeight = 'bold'
  view_circle_text.textContent = 'View Factory Cicle'

  const view_circle_label = document.createElement('label')
  view_circle_label.classList.add('switch')

  const view_circle_toggle = document.createElement('INPUT')
  view_circle_toggle.setAttribute('type', 'checkbox')
  view_circle_label.appendChild(view_circle_toggle)

  const view_circle_div = document.createElement('div')
  view_circle_label.appendChild(view_circle_div)
  view_circle.appendChild(view_circle_label)
  view_circle.appendChild(view_circle_text)

  // Tab Control
  const visual_tab = document.createElement('button')
  visual_tab.classList.add('tab_button')
  side_panel.appendChild(visual_tab)
  visual_tab.textContent = 'Visual'
  visual_tab.onclick = function () {
    display_panel.innerHTML = ``
    display_panel.appendChild(view_line)
    display_panel.appendChild(view_circle)
  }

  //== AUTO UPGRADES TAB
  const au_label = document.createElement('span')
  au_label.textContent = 'Custom Build'
  au_label.style.fontWeight = 'bold'

  const au_input = document.createElement('INPUT')
  au_input.ariaReadOnly = 'true'
  au_input.setAttribute('type', 'text')
  au_input.style.borderColor = 'rgb(20 20 20)'
  au_input.style.borderRadius = '5px'
  au_input.style.marginTop = '4px'
  au_input.style.outline = 'none'
  au_input.style.color = 'white'
  au_input.placeholder = '000000000000000000000000000000000'
  au_input.style.backgroundColor = 'rgb(25 25 25)'

  const au_set_button = document.createElement('button')
  au_set_button.classList.add('button')
  au_set_button.textContent = 'Set Build'

  au_set_button.onclick = function () {
    input.execute('game_stats_build ' + au_input.value)
  }

  // Autoset toggle
  const au_autoset = document.createElement('div')
  au_autoset.style.textAlign = 'left'
  au_autoset.style.alignItems = 'center'
  au_autoset.style.height = '33px'
  au_autoset.style.display = 'flex'

  const au_autoset_text = document.createElement('span')
  au_autoset_text.style.fontWeight = 'bold'
  au_autoset_text.textContent = 'Keep Build on Respawn'

  const au_autoset_label = document.createElement('label')
  au_autoset_label.classList.add('switch')

  const au_autoset_toggle = document.createElement('INPUT')
  au_autoset_toggle.setAttribute('type', 'checkbox')
  au_autoset_label.appendChild(au_autoset_toggle)

  const au_autoset_div = document.createElement('div')
  au_autoset_label.appendChild(au_autoset_div)
  au_autoset.appendChild(au_autoset_label)
  au_autoset.appendChild(au_autoset_text)

  // Tab Control
  const auto_upgrades_tab = document.createElement('button')
  auto_upgrades_tab.classList.add('tab_button')
  side_panel.appendChild(auto_upgrades_tab)
  auto_upgrades_tab.textContent = 'Auto Upgrades'
  auto_upgrades_tab.onclick = function () {
    display_panel.innerHTML = ``
    display_panel.style.textAlign = 'left'
    display_panel.appendChild(au_label)
    display_panel.appendChild(au_input)
    display_panel.appendChild(au_set_button)
    display_panel.appendChild(au_autoset)
  }

  //== CREDITS TAB
  const credits_tab = document.createElement('button')
  credits_tab.classList.add('tab_button')
  side_panel.appendChild(credits_tab)
  credits_tab.textContent = 'Credits'
  credits_tab.onclick = function () {
    display_panel.style.textAlign = 'center'
    display_panel.innerHTML = `
    <br>
    <h3>Mod menu made by x03</h3>
    <p>Discord: <span style="color: rgb(52 211 153)">x03#2666</span></p>
    <p>Github: <span style="color: rgb(52 211 153)">x032205</span></p>

    <style>
    br {
      margin-top: 30px;
    }
    p {
      margin: 2px;
      font-weight: bold;
    }
    </style>
    `
  }

  //== Style ==//
  const style = document.createElement('style')
  style.textContent = `
    #main_panel a {
      position: absolute;

      font-family: 'Outfit', sans-serif;
      src: url('https://fonts.googleapis.com/css2?family=Outfit&display=swap');
    }

    #anchor {
      display: inline-flex;
      flex-direction: column;

      width: 600px;
      height: 300px;

      text-align: center;

      top: 300px;
      right: 50px;
      padding: 0 7px 14px 7px;

      color: white;
      background: rgb(15 15 15);

      border-radius: 7px;
      border-style: solid;
      border-width: 2px;
      border-color: rgb(60 60 60);
    }

    #holder_panel {
      display: inline-flex;
      flex-direction: row;
      height: 100%;
    }

    h1 {
      margin-top: 10px;
      margin-bottom: 5px;
      color: rgb(52 211 153);
    }

    .switch input {
      position: absolute;
      opacity: 0;
      cursor: pointer;
    }

    .switch {
      display: inline-block;
      font-size: 20px; /* 1 */
      height: 1em;
      width: 2em;
      background: rgb(50 50 50);
      border-radius: 1em;
      margin-right: 10px;
      cursor: pointer;
    }
    
    .switch div {
      height: 1em;
      width: 1em;
      border-radius: 1em;
      background: rgb(100 100 100);
      -webkit-transition: all 100ms;
      -moz-transition: all 100ms;
      transition: all 100ms;
      cursor: pointer;
    }
    
    .switch input:checked + div {
      -webkit-transform: translate3d(100%, 0, 0);
      -moz-transform: translate3d(100%, 0, 0);
      transform: translate3d(100%, 0, 0);
      background: rgb(40 200 140)
    }

    .panel_1 {
      display: inline-flex;
      flex-direction: column;
      
      padding: 4px;
      width: fit-content;
      height: 100%;
      border-radius: 5px;

      background: rgb(30 30 30);
      white-space: nowrap;
    }

    .button {
      font-family: 'Outfit', sans-serif;
      src: url('https://fonts.googleapis.com/css2?family=Outfit&display=swap');
      font-weight: bold;
      cursor: pointer;
      font-size: 14px; 

      padding: 2px 4px 2px 4px;
      margin-top: 2px;
      margin-bottom: 2px;

      color: white;
      background: rgb(50 50 50);

      border-radius: 3px;
      border-style: solid;
      border-width: 2px;
      border-color: rgb(60 60 60);

      transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
      transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
      transition-duration: 50ms;
    }

    .tab_button {
      font-family: 'Outfit', sans-serif;
      src: url('https://fonts.googleapis.com/css2?family=Outfit&display=swap');
      font-weight: bold;
      cursor: pointer;
      font-size: 18px; 

      padding: 4px 8px 4px 8px;
      margin-bottom: 4px;

      color: white;
      background: rgb(50 50 50);

      border-radius: 3px;
      border-style: solid;
      border-width: 2px;
      border-color: rgb(60 60 60);

      transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
      transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
      transition-duration: 50ms;
    }

    .tab_button:hover {
      background: rgb(60 60 60);
      border-color: rgb(80 80 80);
    }

    .button:hover {
      background: rgb(60 60 60);
      border-color: rgb(80 80 80);
    }

    .tab_button:focus {
      background: rgb(50 60 50);
      border-color: rgb(50 100 50);
    }
  `

  //== Appends ==//
  main_panel.appendChild(anchor)
  document.body.appendChild(main_panel)
  document.head.appendChild(style)

  //== Funcs ==//
  function ToggleDisplay(element_id) {
    var element = document.getElementById(element_id)
    element.style.display = element.style.display === 'none' ? 'block' : 'none'
  }

  //== Vars ==//
  let X, Y, x, y
  let Z = false
  let radius = []

  //== Events ==//
  document.body.onkeyup = function (ctx) {
    if (ctx.keyCode === 82) {
      ToggleDisplay('main_panel')
    } else if (document.activeElement === au_input && parseInt(ctx.key) >= 1 && parseInt(ctx.key) <= 8) {
      au_input.value = au_input.value + ctx.key
    } else if (document.activeElement === au_input && ctx.keyCode === 8) {
      au_input.value = au_input.value.slice(0, -1)
    }
  }

  document.onmousemove = function () {
    x = event.clientX
    y = event.clientY
  }

  document.onmousedown = function (e) {
    if (e.button == 2) {
      Z = true
    }
  }

  document.onmouseup = function (e) {
    if (e.button == 2) {
      Z = false
    }
  }

  //== Draw Funcs ==//
  const canvas = document.createElement('canvas')

  function get_Radius() {
    X = window.innerWidth / 2
    Y = window.innerHeight / 2
    canvas.width = window.innerWidth
    canvas.height = window.innerHeight

    // thx to "Licht_denker47" for these sets
    radius[0] = window.innerWidth * 0.17681239669
    radius[1] = window.innerWidth * 0.06545454545
    radius[2] = window.innerWidth * 0.16751239669
    radius[3] = window.innerWidth * 0.36
  }
  get_Radius()
  window.addEventListener('resize', get_Radius)

  canvas.style.position = 'absolute'
  canvas.style.top = '0px'
  canvas.style.left = '0px'
  canvas.style.pointerEvents = 'none'

  document.body.appendChild(canvas)
  const ctx = canvas.getContext('2d')

  function draw() {
    ctx.clearRect(0, 0, canvas.width, canvas.height)

    // Aim Line
    if (view_line_toggle.checked) {
      ctx.beginPath()
      ctx.moveTo(X, Y)
      ctx.lineTo(x, y)
      ctx.lineWidth = 50
      ctx.strokeStyle = 'rgba(0, 0, 0, 0.05)'
      ctx.stroke()

      ctx.beginPath()
      ctx.moveTo(X, Y)
      ctx.lineTo(x, y)
      ctx.lineWidth = 2
      ctx.strokeStyle = 'rgba(0, 0, 0, 0.7)'
      ctx.stroke()
    }

    if (view_circle_toggle.checked) {
      // Large Circle
      ctx.lineWidth = 2
      ctx.beginPath()
      ctx.arc(X, Y, radius[3], 0, 2 * Math.PI)
      ctx.strokeStyle = 'rgba(0, 0, 0, 0.7)'
      ctx.stroke()

      // Inner Circle
      ctx.beginPath()
      ctx.arc(x, y, radius[1], 0, 2 * Math.PI)
      ctx.stroke()

      // Outer Circle
      ctx.beginPath()
      if (Z) {
        ctx.arc(x, y, radius[0], 0, 2 * Math.PI)
      } else {
        ctx.arc(x, y, radius[2], 0, 2 * Math.PI)
      }
      ctx.stroke()
    }

    if (au_autoset_toggle.checked) {
      input.execute('game_stats_build ' + au_input.value)
    }
    requestAnimationFrame(draw)
  }
  draw()
})()