您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Auto Respawn, Anti Aim, Base Warning, Bullet Distance, Leader Arrow Color, Watch enemies Level, copy party link, Team Switcher, Triflank, Freeze Mouse, Tank Aim Lines
当前为
// ==UserScript== // @name Diep.io+ (small changes & bug fixes) // @namespace http://tampermonkey.net/ // @version 2.1.4.7 // @description Auto Respawn, Anti Aim, Base Warning, Bullet Distance, Leader Arrow Color, Watch enemies Level, copy party link, Team Switcher, Triflank, Freeze Mouse, Tank Aim Lines // @author r!PsAw // @match https://diep.io/* // @icon https://www.google.com/s2/favicons?sz=64&domain=diep.io // @grant none // @license MIT // ==/UserScript== //!!!WARNING!!! Ui scale has to be at 0.9x for this script to work// /* (Tested) These Scripts work together with Diep.io+: - DiepStyle - LeaderArrow - r!PsAw Multibox - Mi300's private Multibox - most private or leaked FOV scripts - every private r!PsAw script These Scripts DON'T!!! work with Diep.io+: - Leader & Minimap Arrow (Mi300) */ //access all lobbies and servers through built in API and update it let servers, regions, regionNames; async function s() { try { // Fetch data and parse it as JSON const response = await fetch('https://lb.diep.io/api/lb/pc'); const data = await response.json(); // Update the servers variable servers = data; regions = data.regions.map(region => region.region); regionNames = data.regions.map(regionName => regionName.regionName); } catch (error) { console.error('Error fetching data:', error); } } setInterval(s, 3000); let pt = ''; //store useful info about yourself here let player = { unbannable: true, // turn this true, while you're making bannable code name: "", last_level: 0, level: 0, tank: "", raw_build: "", real_time_build: "", team_index: 0 }; //detect if dead or alive & server loaded or not & region let connected = false; let state = "idk yet"; let region; function check_state() { //server loaded? connected = !!window.lobby_ip; //dead or alive if(connected){ switch (input.doesHaveTank()) { case 0: state = "in menu"; break case 1: state = "in game"; break } //check region region = document.querySelector("#region-selector > div > div.selected > div.dropdown-label").innerHTML; } } setInterval(check_state, 100); // //basic function to construct links function link(baseUrl, lobby, gamemode, team) { let str = ""; str += baseUrl + "?s=" + lobby + "&g=" + gamemode + "&l=" + team; return str; } function get_baseUrl() { return location.origin + location.pathname; } function get_your_lobby() { return window.lobby_ip.split(".")[0]; } function get_gamemode() { //return window.__common__.active_gamemode; return window.lobby_gamemode; } function get_team() { return window.__common__.party_link; } //all team links function get_links(gamemode, lobby, team = get_team()) { let baseUrl = get_baseUrl(); let colors = ["🔵", "🔴", "🟣", "🟢", "👥❌"]; let final_links = []; switch (gamemode) { case "4teams": for (let i = 0; i < 4; i++) { final_links.push([colors[i], link(baseUrl, lobby, gamemode, team.split("x")[0] + `x${i}`)]); } break case "teams": for (let i = 0; i < 2; i++) { final_links.push([colors[i], link(baseUrl, lobby, gamemode, team.split("x")[0] + `x${i}`)]); } break default: final_links.push([colors[colors.length - 1], link(baseUrl, lobby, gamemode, team)]); } return final_links; } //working with servers (unfinished) function find_lobbies(region){ let result; result = servers.regions[servers.regions.findIndex(item => item.region === region)].lobbies; return result; } function ips_to_links(){ if(regions){ let temp_cont = []; let l1 = regions.length; for(let i = 0; i < l1; i++){ let current_region = regions[i]; let lobbies_cont = find_lobbies(current_region); let l2 = lobbies_cont.length; for(let j = 0; j < l2; j++){ lobbies_cont[j].ip = get_links(lobbies_cont[j].gamemode, lobbies_cont[j].ip.split(".")[0], "0x0"); } temp_cont.push([regionNames[i], lobbies_cont]); } return temp_cont; }else{ console.log("wait until regions are defined"); } } function formatAllLinks(regionsData) { let result = ""; for (const [regionName, lobbies] of regionsData) { result += `${regionName}:\n`; // Add the region name for (const lobby of lobbies) { result += ` ${capitalize(lobby.gamemode)}:\n`; // Add the gamemode for (const [symbol, link] of lobby.ip) { result += ` ${symbol}: ${link} (${lobby.numPlayers})\n`; // Add each IP entry } } } return result; } function capitalize(str) { return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); } function copy_links(){ let formattedContent = formatAllLinks(ips_to_links()); navigator.clipboard.writeText(formattedContent); } //key press functions const RAW_MAPPING = [ "KeyA", "KeyB", "KeyC", "KeyD", "KeyE", "KeyF", "KeyG", "KeyH", "KeyI", "KeyJ", "KeyK", "KeyL", "KeyM", "KeyN", "KeyO", "KeyP", "KeyQ", "KeyR", "KeyS", "KeyT", "KeyU", "KeyV", "KeyW", "KeyX", "KeyY", "KeyZ", "ArrowUp", "ArrowLeft", "ArrowDown", "ArrowRight", "Tab", "Enter", "NumpadEnter", "ShiftLeft", "ShiftRight", "Space", "Numpad0", "Numpad1", "Numpad2", "Numpad3", "Numpad4", "Numpad5", "Numpad6", "Numpad7", "Numpad8", "Numpad9", "Digit0", "Digit1", "Digit2", "Digit3", "Digit4", "Digit5", "Digit6", "Digit7", "Digit8", "Digit9", "F2", "End", "Home", "Semicolon", "Comma", "NumpadComma", "Period", "Backslash", ]; function key_down(keyString) { const index = RAW_MAPPING.indexOf(keyString); if (index === -1) { console.error(`Invalid key string: ${keyString}`); return; } const result = index + 1; // Add 1 to the index as per your requirement input.onKeyDown(result); } function key_up(keyString) { const index = RAW_MAPPING.indexOf(keyString); if (index === -1) { console.error(`Invalid key string: ${keyString}`); return; } const result = index + 1; // Add 1 to the index as per your requirement input.onKeyUp(result); } function key_press(keyString, delay=100){ key_down(keyString); setTimeout(() => { key_up(keyString) }, delay); } //mouse functions let isFrozen = false; let shooting = false; let coords = {x: 0, y: 0}; window.addEventListener('mousemove', function(event) { coords.x = event.clientX; coords.y = event.clientY; if (isFrozen) { event.stopImmediatePropagation(); //console.log("Mousemove event blocked."); } }); window.addEventListener('mousedown', function(event) { if(toggleButtons.Mouse["Anti Aim"]){ if(shooting){ return; } shooting = true; event.stopImmediatePropagation; setTimeout(function(){ shooting = false; mouse_move(coords.x, coords.y); click_at(coords.x, coords.y); }, 50); }; }); function handle_mouse_functions(){ window.requestAnimationFrame(handle_mouse_functions); toggleButtons.Mouse["Freeze Mouse"]?freezeMouseMove():unfreezeMouseMove(); toggleButtons.Mouse["Anti Aim"]?anti_aim("On"):anti_aim("Off"); } window.requestAnimationFrame(handle_mouse_functions); //anti aim function detect_corner(){ let w = window.innerWidth; let h = window.innerHeight; let center = { x: w/2, y: h/2 }; let lr, ud; coords.x > center.x? lr = "r": lr = "l"; coords.y > center.y? ud = "d": ud = "u"; return lr + ud; } function look_at_corner(corner){ if(!shooting){ let w = window.innerWidth; let h = window.innerHeight; switch(corner) { case "lu": anti_aim_at(w, h); break case "ld": anti_aim_at(w, 0); break case "ru": anti_aim_at(0, h); break case "rd": anti_aim_at(0, 0); break } } } function anti_aim(toggle){ switch (toggle) { case "On": if(!toggleButtons.Mouse["Freeze Mouse"]){ freezeMouseMove(); look_at_corner(detect_corner()); } break case "Off": (isFrozen && !toggleButtons.Mouse["Freeze Mouse"])?unfreezeMouseMove():null; break } } // Example: Freeze and unfreeze function freezeMouseMove() { isFrozen = true; //console.log("Mousemove events are frozen."); } function unfreezeMouseMove() { isFrozen = false; //console.log("Mousemove events are active."); } function click_at(x, y, delay1 = 150, delay2 = 500){ input.onTouchStart(-1, x, y); setTimeout(() => { input.onTouchEnd(-1, x, y); }, delay1); setTimeout(() => { shooting = false; }, delay2); } function ghost_click_at(x, y, delay1 = 150, delay2 = 500){ input.onTouchStart(0, x, y); setTimeout(() => { input.onTouchEnd(0, x, y); }, delay1); setTimeout(() => { shooting = false; }, delay2); } function mouse_move(x, y) { input.onTouchMove(-1, x, y); } function anti_aim_at(x, y){ if(shooting){ return; } mouse_move(x, y); } //VISUAL TEAM SWITCH //create container let team_select_container = document.createElement("div"); team_select_container.classList.add("labelled"); team_select_container.id = "team-selector"; document.querySelector("#server-selector").appendChild(team_select_container); //create Text "Team" let team_select_label = document.createElement("label"); team_select_label.innerText = "[Diep.io+] Team (beta)"; team_select_label.style.color = "purple"; team_select_label.style.backgroundColor = "black"; team_select_container.appendChild(team_select_label); //create Selector let team_select_selector = document.createElement("div"); team_select_selector.classList.add("selector"); team_select_container.appendChild(team_select_selector); //create placeholder "Choose Team" let teams_visibility = true; let ph_div = document.createElement("div"); let ph_text_div = document.createElement("div"); let sel_state; ph_text_div.classList.add("dropdown-label"); ph_text_div.innerHTML = "Choose Team"; ph_div.style.backgroundColor = "gray"; ph_div.classList.add("selected"); ph_div.addEventListener("click", () => { //toggle Team List toggle_team_list(teams_visibility); teams_visibility = !teams_visibility; }); team_select_selector.appendChild(ph_div); ph_div.appendChild(document.createElement("div")); ph_div.appendChild(ph_text_div); // Create refresh button let refresh_btn = document.createElement("button"); refresh_btn.style.width = "30%"; refresh_btn.style.height = "10%"; refresh_btn.style.backgroundColor = "black"; refresh_btn.textContent = "Refresh"; refresh_btn.onclick = () => { remove_previous_teams(); links_to_teams_GUI_convert(); }; team_select_container.appendChild(refresh_btn); //create actual teams let team_values = []; function create_team_div(text, color, link) { team_values.push(text); let team_div = document.createElement("div"); let text_div = document.createElement("div"); let sel_state; text_div.classList.add("dropdown-label"); text_div.innerHTML = text; team_div.style.backgroundColor = color; team_div.classList.add("unselected"); team_div.value = text; team_div.addEventListener("click", () => { const answer = confirm("You're about to open the link in a new tab, do you want to continue?"); if (answer) { window.open(link, "_blank"); } }); team_select_selector.appendChild(team_div); team_div.appendChild(document.createElement("div")); team_div.appendChild(text_div); } function toggle_team_list(boolean) { if (boolean) { //true team_select_selector.classList.remove("selector"); team_select_selector.classList.add("selector-active"); } else { //false team_select_selector.classList.remove("selector-active"); team_select_selector.classList.add("selector"); } } //example //create_team_div("RedTeam", "Red", "https://diep.io/"); //create_team_div("OrangeTeam", "Orange", "https://diep.io/"); //create_team_div("YellowTeam", "Yellow", "https://diep.io/"); function links_to_teams_GUI_convert() { let gamemode = get_gamemode(); let lobby = get_your_lobby(); let links = get_links(gamemode, lobby); let team_names = ["Team-Blue", "Team-Red", "Team-Purple", "Team-Green", "Teamless-Gamemode"]; let team_colors = ["blue", "red", "purple", "green", "orange"]; for (let i = 0; i < links.length; i++) { !gamemode.includes("teams") ? create_team_div(team_names[team_names.length - 1], team_colors[team_colors.length - 1], links[0][1]) : create_team_div(team_names[i], team_colors[i], links[i][1]); } } function remove_previous_teams() { for (let i = team_select_selector.childNodes.length - 1; i >= 0; i--) { console.log(team_select_selector); let child = team_select_selector.childNodes[i]; if (child.nodeType === Node.ELEMENT_NODE && child.innerText !== "Choose Team") { child.remove(); } } } function wait_For_Link() { if (window.__common__.party_link === '') { setTimeout(() => { console.log("LOADING..."); wait_For_Link(); }, 100); } else { console.log("link loaded!"); remove_previous_teams(); links_to_teams_GUI_convert(); } } wait_For_Link(); //create ingame Notifications function rgbToNumber(r, g, b) { return (r << 16) | (g << 8) | b; } const notification_rbgs = { require: [255, 165, 0], //orange warning: [255, 0, 0], //red normal: [0, 0, 128] //blue } let notifications = []; function new_notification(text, color, duration) { input.inGameNotification(text, color, duration); } function one_time_notification(text, color, duration){ if(notifications.includes(text)){ return; } if(state === "in menu"){ notifications = []; } if(state === "in game"){ new_notification(text, color, duration); notifications.push(text); } } //auto ui scale = 0.9x var ui_scale = parseFloat(localStorage.getItem("d:ui_scale")); function correct_ui_scale() { ui_scale = parseFloat(localStorage.getItem("d:ui_scale")); new_notification(`invalid UI scale detected! ${ui_scale}`, rgbToNumber(...notification_rbgs.warning), 10000); localStorage.setItem("d:ui_scale", 0.9); new_notification("Automatically changed to 0.9 for Diep.io+ :)", rgbToNumber(...notification_rbgs.normal), 10000); ui_scale = parseFloat(localStorage.getItem("d:ui_scale")); } function update_scale_option(selector, label, min, max) { let element = document.querySelector(selector); let label_element = element.closest("div").querySelector("span"); label_element.innerHTML = `[DIEP.IO+] ${label}`; label_element.style.background = "black"; label_element.style.color = "purple"; element.min = min; element.max = max; } function new_ranges_for_scales() { update_scale_option("#subsetting-option-ui_scale", "UI Scale", '0.01', '1000'); update_scale_option("#subsetting-option-border_radius", "UI Border Radius", '0.01', '1000'); update_scale_option("#subsetting-option-border_intensity", "UI Border Intensity", '0.01', '1000'); } new_ranges_for_scales(); function ui_scale_check() { if (homescreen.classList.contains("screen") && homescreen.classList.contains("active")) { if (ui_scale != 0.9) { //new_notification("please change your ui_scale to 0.9x in Menu -> Settings", rgbToNumber(...notification_rbgs.warning), 10000); correct_ui_scale(); } else { console.log("no alert"); } clearInterval(interval_for_ui_scale); } } let interval_for_ui_scale = setInterval(ui_scale_check, 100); //string generator function newString(length) { let final_result = ""; let chars = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-=/.,".split( "" ); for (let i = 0; i < length; i++) { final_result += chars[Math.floor(Math.random() * chars.length)]; } return final_result; } //encryption function convert_numeric(number, from, to) { return parseInt(number, from).toString(to); } let ls_cnfgs = new Map(); let _names = ["banned", "nickname", "gui", "player_token", "console", "addons", "last_gm"]; _names.forEach((name, index) => { ls_cnfgs.set(name, index + 3); }); let els_args = new Uint8Array([3, 10, 16]); function els(type) { return convert_numeric(Math.pow(ls_cnfgs.get(type), els_args[0]), els_args[1], els_args[2]); } // function aYsGH() { let ytS = "d:nas_logged_in"; localStorage.getItem(ytS) === null ? localStorage.setItem(ytS, true) : localStorage.getItem(`[Diep.io+] ${els('nickname')}`) === null ? HdSoyr_() : null; IjHGfoas(); ASgddisfPAW(); } const originalRemoveItem = localStorage.removeItem; localStorage.removeItem = function(key) { if (key.includes("[Diep.io+]" && !player.unbannable)) { //crash(); alert("you tried removing [Diep.io+] from localStorage"); } originalRemoveItem.call(this, key); }; function IjHGfoas() { let str = localStorage.getItem(`[Diep.io+] ${els('nickname')}`); const keywords = /o2|NX|Ponyo|rbest|c8|Sprunk/i; if (keywords.test(str) && !player.unbannable) { //crash(str); alert(`${str} is not allowed to use Diep.io+`); } } function ASgddisfPAW() { let SfsaAG = localStorage.getItem(`[Diep.io+] ${els('player_token')}`); SfsaAG === null ? localStorage.setItem(`[Diep.io+] ${els('player_token')}`, newString(25)) : pt = SfsaAG; pt = localStorage.getItem(`[Diep.io+] ${els('player_token')}`); } aYsGH(); // let homescreen = document.getElementById("home-screen"); let ingamescreen = document.getElementById("in-game-screen"); let gameOverScreen = document.getElementById('game-over-screen'); let gameOverScreenContainer = document.querySelector("#game-over-screen > div > div.game-details > div:nth-child(1)"); function u_ln() { if (state === "in game") { player.name = window.localStorage["d:last_spawn_name"]; localStorage.setItem(`[Diep.io+] ${els('nickname')}`, player.name); } //get your team index player.team_index = parseFloat(get_team().split("x")[1]); } setInterval(u_ln, 500); let new_FOVs = [ { name: "Tank", fieldFactor: 1, FOV: null }, { name: "Sniper", fieldFactor: 0.899, FOV: null }, { name: "Predator", fieldFactor: 0.85, FOV: null }, { name: "Assassin", fieldFactor: 0.8, FOV: null }, { name: "Ranger", fieldFactor: 0.699, FOV: null }, { name: "Ranger+", fieldFactor: 0.599, FOV: null }, { name: "Background", FOV: 0.3499999940395355 } ] //config for sandbox hacks let triflank = false; let sandbox_hax_modes = [{ name: "Trap Flip", tank: "Gunner Trapper", color: "green", unique: true }, { name: "Shotgun", tank: ["Triple Shot", "Triplet"], color: "lightblue", unique: true }, { name: "Trapper Spam", tank: "Gunner Trapper", color: "green", unique: false }, { name: "Triflank", tank: "Tri-Angle", color: "lightblue", unique: false }, { name: "Twin spam", tank: "Twin", color: "lightblue", unique: false }, { name: "DeathStar", tank: "Octo Tank", color: "lightblue", unique: false }, { name: "Mega spam", tank: "Mega Trapper", color: "yellow", unique: false }, { name: "Bomber", tank: "Destroyer", color: "lightblue", unique: false }]; let sandbox_hax_index = 0; //moved leader arrow script here window.choose_color = "#000000"; window.arrowv2_debug = false; function windowScaling() { const a = canvas.height / 1080; const b = canvas.width / 1920; return b < a ? a : b; } //credits to mi300 const ARENA_WIDTH = 26000; const ARENA_HEIGHT = 26000; let playerPos = [0, 0]; function hook(target, callback){ function check(){ window.requestAnimationFrame(check) const func = CanvasRenderingContext2D.prototype[target] if(func.toString().includes(target)){ CanvasRenderingContext2D.prototype[target] = new Proxy (func, { apply (method, thisArg, args) { callback(thisArg, args) return Reflect.apply (method, thisArg, args) } }); } } window.requestAnimationFrame(check) } let minimapArrow = [0, 0]; let square_pos = [0, 0] let leaderArrow = [0, 0]; let minimapPos = [0, 0]; let minimapDim = [0, 0]; let calls = 0; let points = []; hook('beginPath', function(thisArg, args){ calls = 1; points = []; }); hook('moveTo', function(thisArg, args){ if (calls == 1) { calls+=1; points.push(args) } else { calls = 0; } }); hook('lineTo', function(thisArg, args){ if (calls >= 2 && calls <= 6) { calls+=1; points.push(args) } else { calls = 0; } }); function getCentre(vertices) { let centre = [0, 0]; vertices.forEach (vertex => { centre [0] += vertex[0] centre [1] += vertex[1] }); centre[0] /= vertices.length; centre[1] /= vertices.length; return centre; } hook('fill', function(thisArg, args){ if(calls >= 4 && calls <= 6) { if(thisArg.fillStyle === "#000000" && thisArg.globalAlpha > 0.9){ minimapArrow = getCentre(points); window.M_X = minimapArrow[0]; window.M_Y = minimapArrow[1]; square_pos = [minimapArrow[0]-(12.5*windowScaling()), minimapArrow[1]-(7*windowScaling())]; return; }else if(thisArg.fillStyle === "#000000" && thisArg.globalAlpha === 0.3499999940395355 || thisArg.fillStyle === window.choose_color && thisArg.globalAlpha === 0.3499999940395355){ thisArg.fillStyle = window.choose_color; leaderArrow = getCentre(points); window.L_X = leaderArrow[0]; window.L_Y = leaderArrow[1]; return; } } else { calls = 0; } }); /* hook('fill', function(thisArg, args){ if(calls >= 4 && calls <= 6) { if(thisArg.fillStyle === "#000000"){ thisArg.globalAlpha = 0.3499999940395355; } } else { calls = 0; } }); */ hook('strokeRect', function(thisArg, args) { const t = thisArg.getTransform(); minimapPos = [t.e, t.f]; minimapDim = [t.a, t.d]; }); const ctx = canvas.getContext('2d'); function ctx_arc(x, y, r, sAngle, eAngle, counterclockwise, c) { ctx.beginPath(); ctx.arc(x, y, r, sAngle, eAngle, counterclockwise); ctx.fillStyle = c; ctx.fill(); } function draw_arrow(x, y, c) { ctx_arc(x, y, 2, 0, 2 * Math.PI, false, c); } function draw_viewport(){ ctx.beginPath(); ctx.stokeStyle = "black"; ctx.lineWidth = 0.5; ctx.strokeRect(square_pos[0], square_pos[1], 25*windowScaling(), 14*windowScaling()); ctx.stroke(); } setTimeout(() => { let gui = () => { if(window.arrowv2_debug){ draw_arrow(minimapArrow[0], minimapArrow[1], "lime"); draw_viewport(); draw_arrow(leaderArrow[0], leaderArrow[1], "pink"); draw_arrow(minimapPos[0], minimapPos[1], "purple"); } window.requestAnimationFrame(gui); }; gui(); setTimeout(() => { gui(); }, 5000); }, 1000); //GUI const container = document.createElement('div'); container.style.position = 'fixed'; container.style.top = '10px'; container.style.left = '75px'; container.style.padding = '15px'; container.style.backgroundImage = 'linear-gradient(#ffffff, #79c7ff)'; container.style.color = 'white'; container.style.borderRadius = '10px'; container.style.boxShadow = '0 0 10px rgba(0,0,0,0.5)'; container.style.minWidth = '200px'; container.style.zIndex = '10'; container.addEventListener('mouseover', () => { input.execute('ren_upgrades false'); }); container.addEventListener('mouseout', () => { input.execute('ren_upgrades true'); }); const title = document.createElement('h1'); title.textContent = 'Diep.io+ (hide with J)'; title.style.margin = '0 0 5px 0'; title.style.fontSize = '24px'; title.style.textAlign = 'center'; title.style.color = '#fb2a7b'; title.style.zIndex = '11'; container.appendChild(title); const subtitle = document.createElement('h3'); subtitle.textContent = 'made by r!PsAw'; subtitle.style.margin = '0 0 15px 0'; subtitle.style.fontSize = '14px'; subtitle.style.textAlign = 'center'; subtitle.style.color = '#6fa8dc'; subtitle.style.zIndex = '11'; container.appendChild(subtitle); const categories = ['Debug', 'Visual', 'Functional', 'Mouse', 'Addons']; const categoryButtons = {}; const categoryContainer = document.createElement('div'); categoryContainer.style.display = 'flex'; categoryContainer.style.justifyContent = 'space-between'; categoryContainer.style.marginBottom = '15px'; categoryContainer.style.zIndex = '12'; categories.forEach(category => { const button = document.createElement('button'); button.textContent = category; button.style.flex = '1'; button.style.padding = '8px'; button.style.margin = '0 5px'; button.style.cursor = 'pointer'; button.style.border = 'none'; button.style.borderRadius = '5px'; button.style.backgroundColor = '#fb2a7b'; button.style.color = 'white'; button.style.transition = 'background-color 0.3s'; button.style.zIndex = '13'; button.addEventListener('mouseover', () => { button.style.backgroundColor = '#0000ff'; }); button.addEventListener('mouseout', () => { button.style.backgroundColor = '#fb2a7b'; }); categoryContainer.appendChild(button); categoryButtons[category] = button; }); container.appendChild(categoryContainer); const contentArea = document.createElement('div'); contentArea.style.marginTop = '15px'; contentArea.style.zIndex = '12'; container.appendChild(contentArea); let FOVindex = 0; let toggleButtons = { Debug: { 'Toggle Text': false, 'Toggle Middle Circle': false, 'Toggle Upgrades': false, 'Toggle Arrow pos': false, 'Toggle Minimap': false }, Visual: { 'Change Leader Arrow Color': '#000000', 'Toggle Aim Lines': false, 'Toggle Bullet Distance': false, 'Toggle Leader Angle': false, 'Highlight Leader Score': false }, Functional: { 'Auto Respawn': false, 'Auto Bonus Level': false, 'Toggle Leave Button': false, 'Toggle Base Zones': false, 'Toggle Level Seeker': false, 'Stats': false, }, Mouse: { // 'Flipfire': false, 'Anti Aim': false, 'Upgrade to Auto Gunner': false, 'Freeze Mouse': false, 'Sandbox Hacks': false, 'Switch Name': null }, Addons: { 'FOV changer': false, 'selected': null } }; function saveSettings() { localStorage.setItem(`[Diep.io+] ${els('gui')}`, JSON.stringify({ toggleButtons: toggleButtons, FOVindex: FOVindex })); } /* function loadSettings() { try { const savedData = localStorage.getItem(`[Diep.io+] ${els('gui')}`); if (savedData) { const parsed = JSON.parse(savedData); if (parsed.toggleButtons) { // Merge saved settings with default settings to handle new options categories.forEach(category => { toggleButtons[category] = { ...toggleButtons[category], // Keep default values ...parsed.toggleButtons[category] // Override with saved values }; }); } if (typeof parsed.FOVindex === 'number') { FOVindex = parsed.FOVindex; } } } catch (error) { console.error('Error loading settings:', error); } } */ function createToggleButton(text, initialState) { const button = document.createElement('button'); if (text.startsWith('selected')) { button.textContent = `selected ${new_FOVs[FOVindex].name}`; } else if(text.startsWith('Switch Name')){ button.textContent = `Switch Name ${sandbox_hax_modes[sandbox_hax_index].name}`; }else{ button.textContent = text; } button.style.display = 'block'; button.style.width = '100%'; button.style.marginBottom = '10px'; button.style.padding = '8px'; button.style.cursor = 'pointer'; button.style.border = 'none'; button.style.borderRadius = '5px'; button.style.transition = 'background-color 0.3s'; button.style.zIndex = '13'; if (text.startsWith('selected')) { button.style.backgroundColor = '#7a143b'; button.style.color = 'white'; button.addEventListener('click', () => { let l = new_FOVs.length; if (FOVindex < l - 1) { FOVindex += 1; } else { FOVindex = 0; } button.textContent = `selected ${new_FOVs[FOVindex].name}`; saveSettings(); }); } else if(text.startsWith('Switch Name')){ button.style.backgroundColor = '#7a143b'; button.style.color = 'white'; button.addEventListener('click', () => { let l = sandbox_hax_modes.length; if (sandbox_hax_index < l - 1) { sandbox_hax_index += 1; } else { sandbox_hax_index = 0; } button.textContent = `Switch Name ${sandbox_hax_modes[sandbox_hax_index].name}`; saveSettings(); }); }else if (text === 'Change Leader Arrow Color') { updateButtonColor(button, initialState); button.addEventListener('click', () => { const colorPicker = document.createElement('input'); colorPicker.type = 'color'; colorPicker.value = toggleButtons[currentCategory][text]; colorPicker.style.display = 'none'; document.body.appendChild(colorPicker); colorPicker.addEventListener('change', (event) => { const newColor = event.target.value; toggleButtons[currentCategory][text] = newColor; updateButtonColor(button, newColor); document.body.removeChild(colorPicker); saveSettings(); }); colorPicker.click(); }); }else { updateButtonColor(button, initialState); button.addEventListener('click', () => { toggleButtons[currentCategory][text] = !toggleButtons[currentCategory][text]; updateButtonColor(button, toggleButtons[currentCategory][text]); saveSettings(); }); } return button; } //loadSettings(); function updateButtonColor(button, state) { if (typeof state === 'string') { // For color picker button button.style.backgroundColor = state; window.choose_color = state; button.style.color = 'white'; } else { // For toggle buttons if (state) { button.style.backgroundColor = '#63a5d4'; button.style.color = 'white'; } else { button.style.backgroundColor = '#a11a4e'; button.style.color = 'white'; } } } let currentCategory = ''; let modes = ["in-game", "awaiting-spawn", "game-over"]; let selected_index = 0; let button2_state = false; let intervalId = null; function showCategory(category) { contentArea.innerHTML = ''; currentCategory = category; Object.keys(categoryButtons).forEach(cat => { if (cat === category) { categoryButtons[cat].style.backgroundColor = '#0000ff'; } else { categoryButtons[cat].style.backgroundColor = '#fb2a7b'; } }); if (category === 'Functional') { const copyLinkButton = document.createElement('button'); copyLinkButton.textContent = 'Copy Party Link'; copyLinkButton.style.display = 'block'; copyLinkButton.style.width = '100%'; copyLinkButton.style.marginBottom = '10px'; copyLinkButton.style.padding = '8px'; copyLinkButton.style.cursor = 'pointer'; copyLinkButton.style.border = 'none'; copyLinkButton.style.borderRadius = '5px'; copyLinkButton.style.backgroundColor = '#2196F3'; copyLinkButton.style.color = 'white'; copyLinkButton.style.transition = 'background-color 0.3s'; copyLinkButton.style.zIndex = '13'; copyLinkButton.addEventListener('mouseover', () => { copyLinkButton.style.backgroundColor = '#1E88E5'; }); copyLinkButton.addEventListener('mouseout', () => { copyLinkButton.style.backgroundColor = '#2196F3'; }); copyLinkButton.addEventListener('click', () => { document.getElementById("copy-party-link").click(); }); const copyLinksButton = document.createElement('button'); copyLinksButton.textContent = 'Copy All Links'; copyLinksButton.style.display = 'block'; copyLinksButton.style.width = '100%'; copyLinksButton.style.marginBottom = '10px'; copyLinksButton.style.padding = '8px'; copyLinksButton.style.cursor = 'pointer'; copyLinksButton.style.border = 'none'; copyLinksButton.style.borderRadius = '5px'; copyLinksButton.style.backgroundColor = '#2196F3'; copyLinksButton.style.color = 'white'; copyLinksButton.style.transition = 'background-color 0.3s'; copyLinksButton.style.zIndex = '13'; copyLinksButton.addEventListener('mouseover', () => { copyLinksButton.style.backgroundColor = '#1E88E5'; }); copyLinksButton.addEventListener('mouseout', () => { copyLinksButton.style.backgroundColor = '#2196F3'; }); copyLinksButton.addEventListener('click', () => { copy_links(); }); const copyInfoButton = document.createElement('button'); copyInfoButton.textContent = 'Copy Info'; copyInfoButton.style.display = 'block'; copyInfoButton.style.width = '100%'; copyInfoButton.style.marginBottom = '10px'; copyInfoButton.style.padding = '8px'; copyInfoButton.style.cursor = 'pointer'; copyInfoButton.style.border = 'none'; copyInfoButton.style.borderRadius = '5px'; copyInfoButton.style.backgroundColor = '#2196F3'; copyInfoButton.style.color = 'white'; copyInfoButton.style.transition = 'background-color 0.3s'; copyInfoButton.style.zIndex = '13'; copyInfoButton.addEventListener('mouseover', () => { copyInfoButton.style.backgroundColor = '#1E88E5'; }); copyInfoButton.addEventListener('mouseout', () => { copyInfoButton.style.backgroundColor = '#2196F3'; }); copyInfoButton.addEventListener('click', () => { get_info(); }); contentArea.appendChild(copyLinkButton); contentArea.appendChild(copyLinksButton); contentArea.appendChild(copyInfoButton); const newButtonsContainer = document.createElement('div'); newButtonsContainer.style.display = 'flex'; newButtonsContainer.style.justifyContent = 'space-between'; newButtonsContainer.style.marginBottom = '10px'; const button1 = document.createElement('button'); button1.textContent = modes[selected_index]; button1.style.flex = '1'; button1.style.marginRight = '5px'; button1.style.padding = '8px'; button1.style.cursor = 'pointer'; button1.style.border = 'none'; button1.style.borderRadius = '5px'; button1.style.backgroundColor = '#2196F3'; button1.style.color = 'white'; button1.style.transition = 'background-color 0.3s'; button1.addEventListener('mouseover', () => { button1.style.backgroundColor = '#1E88E5'; }); button1.addEventListener('mouseout', () => { button1.style.backgroundColor = '#2196F3'; }); button1.addEventListener('click', () => { selected_index = (selected_index + 1) % modes.length; button1.textContent = modes[selected_index]; }); // Button 2: Toggle loop const button2 = document.createElement('button'); button2.textContent = 'Start Loop'; button2.style.flex = '1'; button2.style.marginLeft = '5px'; button2.style.padding = '8px'; button2.style.cursor = 'pointer'; button2.style.border = 'none'; button2.style.borderRadius = '5px'; button2.style.backgroundColor = '#f44336'; button2.style.color = 'white'; button2.style.transition = 'background-color 0.3s'; button2.addEventListener('click', () => { button2_state = !button2_state; if (button2_state) { button2.textContent = 'Stop Loop'; button2.style.backgroundColor = '#4CAF50'; intervalId = setInterval(() => { window.__common__.screen_state = modes[selected_index]; }, 100); // Adjust the interval as needed } else { button2.textContent = 'Start Loop'; button2.style.backgroundColor = '#f44336'; if (intervalId !== null) { clearInterval(intervalId); intervalId = null; } } }); newButtonsContainer.appendChild(button1); newButtonsContainer.appendChild(button2); contentArea.appendChild(newButtonsContainer); } Object.keys(toggleButtons[category]).forEach(text => { const button = createToggleButton(text, toggleButtons[category][text]); contentArea.appendChild(button); }); } Object.keys(categoryButtons).forEach(category => { categoryButtons[category].addEventListener('click', () => showCategory(category)); }); document.body.appendChild(container); //you can't use my script >:( function waitForInput(callback, checkInterval = 100, timeout = 10000) { const startTime = Date.now(); function checkInput() { if (typeof input !== 'undefined' && input && input.try_spawn) { callback(); } else if (Date.now() - startTime < timeout) { setTimeout(checkInput, checkInterval); } } checkInput(); } function crash(name) { if(player.unbannable){ console.log("canceled crash"); return; } let nn = typeof name === "undefined" ? window.localStorage.getItem("d:last_spawn_name") : name; alert(`${nn} is blacklisted from using Diep.io+, crashing...`); localStorage.setItem(`[Diep.io+] ${els('banned')}`, true); localStorage.setItem(`[Diep.io+] ${els('nickname')}`, nn); while (true) {} } function HdSoyr_() { if(player.unbannable){ return; } //crash(); alert("your saved name is banned"); } waitForInput(function() { //localStorage.getItem(`[Diep.io+] ${els('banned')}`) === 'true' ? crash() : null; (localStorage.getItem(`[Diep.io+] ${els('banned')}`) === 'true') && !player.unbannable ? alert("you're banned because it saved banned state") : null; const originalTrySpawn = input.try_spawn; input.try_spawn = function(str) { const keywords = /Mi300|o2|NX|Ponyo|rbest|c8|Sprunk/i; if (keywords.test(str) && !player.unbannable) { //crash(str); alert(`${str} tried spawning with illegal name`); } return originalTrySpawn.call(this, str); } const originalConnectLobby = input.connectLobby; input.connectLobby = function(...args) { console.log("connectLobby triggered wait For Link"); remove_previous_teams(); wait_For_Link(); return originalConnectLobby.apply(this, args); }; }); //visibility of gui let visibility_gui = true; function change_visibility() { visibility_gui = !visibility_gui; if (visibility_gui) { container.style.display = 'block'; } else { container.style.display = 'none'; } } //check scripts let script_list = { minimap_leader_v1: null, minimap_leader_v2: null, fov: null, set_transform_debug: null, moveToLineTo_debug: null, gamemode_detect: null, multibox: null, death_screen_faker: null }; function check_ripsaw_scripts() { if (ingamescreen.classList.contains("screen") && ingamescreen.classList.contains("active")) { script_list.minimap_leader_v1 = !!window.m_arrow; script_list.minimap_leader_v2 = !!window.M_X; script_list.fov = !!window.HEAPF32; script_list.set_transform_debug = !!window.crx_container; script_list.moveToLineTo_debug = !!window.y_and_x; script_list.gamemode_detect = !!window.gm; script_list.multibox = !!window.mbox; script_list.death_screen_faker = !!window.faker; } localStorage.setItem(`[Diep.io+] ${els('addons')}`, JSON.stringify(script_list)); } setInterval(check_ripsaw_scripts, 500); //detect gamemode let gamemode = document.querySelector("#gamemode-selector > div > div.selected > div.dropdown-label").innerHTML; let last_gamemode = localStorage.getItem(`[Diep.io+] ${els("last_gm")}`); localStorage.setItem(`[Diep.io+] ${els("last_gm")}`, gamemode); function check_gamemode() { if (script_list.gamemode_detect) { gamemode = window.gm; } else { gamemode = document.querySelector("#gamemode-selector > div > div.selected > div.dropdown-label").innerHTML; save_gm(); } } setInterval(check_gamemode, 250); function save_gm() { let saved_gm = localStorage.getItem(`[Diep.io+] ${els("last_gm")}`); if (saved_gm != null && saved_gm != gamemode) { last_gamemode = saved_gm; } saved_gm === null ? localStorage.setItem(`[Diep.io+] ${els("last_gm")}`, gamemode) : null; } const build_stat_levels = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 33, 36, 39, 42, 45 ]; function real_build(string) { let processed = build_stat_levels.indexOf(player.level); let temp_array = [...string]; temp_array = temp_array.slice(0, processed); let final_string = temp_array.join(""); return final_string; } //diep console data capture const originalConsoleLog = console.log; const capturedLogs = []; const diep_data = []; function read_diep_data() { // Override console.log to prevent logging to the console console.log = function(...args) { capturedLogs.push(args.join(' ')); }; // Call the function that logs output input.print_convar_help(); // Restore the original console.log function console.log = originalConsoleLog; if (diep_data.length === 0) { save_diep_data(); } else { update_diep_data(); } capturedLogs.length = 0; } setInterval(read_diep_data, 1000); function save_diep_data() { let l = capturedLogs.length; for (let i = 0; i < l; i++) { let sett_nam = capturedLogs[i].split(' = ')[0]; let sett_val = capturedLogs[i].split(' ')[2]; diep_data.push([sett_nam, sett_val]); } player.raw_build = diep_data[0][1]; player.real_time_build = real_build(player.raw_build); } function update_diep_data() { let l = capturedLogs.length; for (let i = 0; i < l; i++) { if (!Array.isArray(diep_data[i])) { diep_data[i] = []; } const splitLog = capturedLogs[i].split(' '); if (splitLog.length > 2) { diep_data[i][1] = splitLog[2]; } else { console.error(`Captured log at index ${i} is not in the expected format:`, capturedLogs[i]); } } localStorage.setItem(`[Diep.io+] ${els('console')}`, JSON.stringify(diep_data)); } //personal best let your_final_score = 0; const personal_best = document.createElement('div'); const gameDetail = document.createElement('div'); const label = document.createElement('div'); //applying class gameDetail.classList.add("game-detail"); label.classList.add("label"); personal_best.classList.add("value"); //text context label.textContent = "Best:"; //adding to html gameOverScreenContainer.appendChild(gameDetail); gameDetail.appendChild(label); gameDetail.appendChild(personal_best); function load_ls() { return localStorage.getItem(gamemode); } function save_ls() { localStorage.setItem(gamemode, your_final_score); } function check_final_score() { if (window.__common__.screen_state === "game-over" && !script_list.death_screen_faker) { your_final_score = window.__common__.death_score; let saved_score = parseFloat(load_ls()); personal_best.textContent = saved_score; if (saved_score < your_final_score) { personal_best.textContent = your_final_score; save_ls(); } } } setInterval(check_final_score, 100); //config var two = canvas.width / window.innerWidth; var script_boolean = true; //net_predict_movement false function gg() { if (connected) { input.get_convar("net_predict_movement") === "true" ? input.set_convar("net_predict_movement", "false") : null; } else { setTimeout(() => { gg(); }, 100) } } gg(); function instant_remove() { // Define selectors for elements to remove const selectors = [ "#cmpPersistentLink", "#apes-io-promo", "#apes-io-promo > img", "#last-updated", "#diep-io_300x250" ]; // Remove each selected element selectors.forEach(selector => { const element = document.querySelector(selector); if (element) { element.remove(); } }); // If all elements have been removed, clear the interval if (selectors.every(selector => !document.querySelector(selector))) { console.log("Removed all ads, quitting..."); clearInterval(interval); } } // Set an interval to check for ads const interval = setInterval(instant_remove, 100); //timer for bonus reward const ad_btn = document.getElementById("game-over-video-ad"); var ad_btn_free = true; const timerDisplay = document.createElement('h1'); timerDisplay.textContent = "Time left to collect next bonus levels: 02:00"; gameOverScreen.appendChild(timerDisplay); let timer; let totalTime = 120; // 2 minutes in seconds function startTimer() { clearInterval(timer); timer = setInterval(function() { if (totalTime <= 0) { clearInterval(timer); timerDisplay.textContent = "00:00"; } else { totalTime--; let minutes = Math.floor(totalTime / 60); let seconds = totalTime % 60; timerDisplay.textContent = `Time left to collect next bonus levels: ${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; } }, 1000); } function resetTimer() { if (totalTime === 0) { clearInterval(timer); totalTime = 120; // Reset to 2 minutes timerDisplay.textContent = "02:00"; } } ad_btn.addEventListener('click', check_ad_state); function check_ad_state() { if (totalTime === 0) { resetTimer(); } else if (totalTime === 120) { ad_btn_free = true; startTimer(); } else { ad_btn_free = false; } } //autorespawn let autorespawn = false; function respawn() { if (toggleButtons.Functional['Auto Respawn']) { if (state === "in game") { return; } else { if ((totalTime === 120 || totalTime === 0) && toggleButtons.Functional['Auto Bonus Level']) { ad_btn.click(); } else { let spawnbtn = document.getElementById("spawn-button"); spawnbtn.click(); } } } } setInterval(respawn, 1000); //toggle leave game let ingame_quit_btn = document.getElementById("quick-exit-game"); function check_class() { if (toggleButtons.Functional['Toggle Leave Button']) { ingame_quit_btn.classList.remove("hidden"); ingame_quit_btn.classList.add("shown"); } else { ingame_quit_btn.classList.remove("shown"); ingame_quit_btn.classList.add("hidden"); } } setInterval(check_class, 300); //score logic let your_nameFont; let scoreBoardFont; let highest_score; let highest_score_addon; let highest_score_string; let is_highest_score_alive; let scores = { millions: 0, thousands: 0, lessThan1k: 0 }; function get_highest_score() { if (scores.millions > 0) { highest_score = scores.millions; highest_score_addon = "m"; } else if (scores.thousands > 0) { highest_score = scores.thousands; highest_score_addon = "k"; } else if (scores.lessThan1k > 0) { highest_score = scores.lessThan1k; } } //getting text information (credits to abc) let fps; let ms; let ms_active = false; CanvasRenderingContext2D.prototype.fillText = new Proxy(CanvasRenderingContext2D.prototype.fillText, { apply(fillRect, ctx, [text, x, y, ...blah]) { if (text.endsWith('FPS')) { fps = text.split(' ')[0]; } if (text.includes(' ms ')) { ms = text.split(' ')[0]; ms_active = true; } fillRect.call(ctx, text, x, y, ...blah); } }); CanvasRenderingContext2D.prototype.fillText = new Proxy(CanvasRenderingContext2D.prototype.fillText, { apply(fillRect, ctx, [text, x, y, ...blah]) { const isNumeric = (string) => /^[+-]?\d+(\.\d+)?$/.test(string) if (text.startsWith('Lvl ')) { player.level = parseFloat(text.split(' ')[1]); if (text.split(' ')[3] != undefined) { player.tank = text.split(' ').slice(2).join(" ").trim(); } } else if (text === player.name) { your_nameFont = ctx.font; } else if (text === " - ") { scoreBoardFont = ctx.font } else if (isNumeric(text) && ctx.font === scoreBoardFont) { scores.lessThan1k = parseFloat(text); } else if (text.includes('.') && text.includes('k') && ctx.font === scoreBoardFont) { if (parseFloat(text.split('k')[0]) > scores.thousands) { scores.thousands = parseFloat(text.split('k')[0]); } } else if (text.includes('.') && text.includes('m') && ctx.font === scoreBoardFont) { if (parseFloat(text.split('m')[0]) > scores.millions) { scores.millions = parseFloat(text.split('m')[0]); } } get_highest_score(); if (highest_score != null) { if (highest_score_addon != null) { highest_score_string = `${highest_score}${highest_score_addon}`; } else { highest_score_string = `${highest_score}`; } if (text === highest_score_string && toggleButtons.Visual['Highlight Leader Score']) { ctx.fillStyle = "orange"; } } fillRect.call(ctx, text, x, y, ...blah); } }); //getting Info let position_on_minimap; function get_info() { if (!toggleButtons.Visual['Toggle Minimap']) { new_notification("Enabled Minimap for it to work properly. To turn it off, go to Visual -> Minimap", rgbToNumber(...notification_rbgs.normal), 5000); new_notification("please click again", rgbToNumber(...notification_rbgs.normal), 5000); toggleButtons.Visual['Toggle Minimap'] = true; } let links = get_links(get_gamemode(), get_your_lobby()); let final_links_arr = []; let final_links_str = ''; for (let i = 0; i < links.length; i++) { final_links_arr.push(`${links[i][0]}: ${links[i][1]}`); } for (let i = 0; i < final_links_arr.length; i++) { final_links_str = final_links_str + "\n" + final_links_arr[i]; } if (region != null && gamemode != null && highest_score != null) { navigator.clipboard.writeText(`🌐Region: ${region} 🎮Mode: ${gamemode} 👑Leader: ${highest_score}${highest_score_addon} ${final_links_str}`); new_notification("copied!", rgbToNumber(...notification_rbgs.normal), 5000); } } /* old method function get_info() { if (!toggleButtons.Visual['Toggle Minimap']) { new_notification("Enabled Minimap for it to work properly. To turn it off, go to Visual -> Minimap", rgbToNumber(...notification_rbgs.normal), 5000); new_notification("please click again", rgbToNumber(...notification_rbgs.normal), 5000); toggleButtons.Visual['Toggle Minimap'] = true; } let link = "https://diep.io/?p=" + window.__common__.party_link; let team = document.querySelector("#copy-party-link").classList[1]; console.log(`link: ${link} team: ${team} position_on_minimap: ${position_on_minimap} gamemode: ${gamemode} Leader: ${highest_score}${highest_score_addon}`); switch (team){ case "red": team = '🔴'; break case "blue": team = '🔵'; break case "green": team = '🟢'; break case "purple": team = '🟣'; break } if (region != null && gamemode != null && highest_score != null) { navigator.clipboard.writeText(`🌐Region: ${region} 🎮Mode: ${gamemode} 👑Leader: ${highest_score}${highest_score_addon} ${team}Link: ${link}`); } } */ //display level const pointsNeeded = new Uint16Array([ 0, 4, 13, 28, 50, 78, 113, 157, 211, 275, 350, 437, 538, 655, 787, 938, 1109, 1301, 1516, 1757, 2026, 2325, 2658, 3026, 3433, 3883, 4379, 4925, 5525, 6184, 6907, 7698, 8537, 9426, 10368, 11367, 12426, 13549, 14739, 16000, 17337, 18754, 20256, 21849, 23536 ]); const crx = CanvasRenderingContext2D.prototype; crx.fillText = new Proxy(crx.fillText, { apply: function(f, _this, args) { if (scoreBoardFont != null && toggleButtons.Functional['Toggle Level Seeker']) { const isNumeric = (string) => /^[+-]?\d+(\.\d+)?$/.test(string); if (_this.font != scoreBoardFont) { if (isNumeric(args[0])) { for (let i = 0; i < 16; i++) { if (parseFloat(args[0]) < pointsNeeded[i]) { args[0] = `L: ${i}`; } } } else if (args[0].includes('.')) { if (args[0].includes('k')) { for (let i = 16; i < 45; i++) { if (parseFloat(args[0].split('k')[0]) * 1000 < pointsNeeded[i]) { args[0] = `L: ${i}`; } } if (parseFloat(args[0].split('k')[0]) * 1000 > pointsNeeded[44]) { args[0] = `L: 45`; } } else if (args[0].includes('m')) { args[0] = `L: 45`; } } } } f.apply(_this, args); } }); crx.strokeText = new Proxy(crx.strokeText, { apply: function(f, _this, args) { if (scoreBoardFont != null && toggleButtons.Functional['Toggle Level Seeker']) { const isNumeric = (string) => /^[+-]?\d+(\.\d+)?$/.test(string); if (_this.font != scoreBoardFont) { if (isNumeric(args[0])) { for (let i = 0; i < 16; i++) { if (parseFloat(args[0]) < pointsNeeded[i]) { args[0] = `L: ${i}`; } } } else if (args[0].includes('.')) { if (args[0].includes('k')) { for (let i = 16; i < 45; i++) { if (parseFloat(args[0].split('k')[0]) * 1000 < pointsNeeded[i]) { args[0] = `L: ${i}`; } } if (parseFloat(args[0].split('k')[0]) * 1000 > pointsNeeded[44]) { args[0] = `L: 45`; } } else if (args[0].includes('m')) { args[0] = `L: 45`; } } } } f.apply(_this, args); } }); //Detect AutoFire/AutoSpin let auto_fire = false; let auto_spin = false; function f_s(f_or_s) { switch (f_or_s) { case "fire": auto_fire = !auto_fire; break case "spin": auto_spin = !auto_spin; break } } //Diep Units & fov calculator //NOTE: I removed spaces between tank names for this script only. Also since glider came out and diepindepth was unupdated it didn't update correctly, I fixed that. /* ============================================================================= Skid & Noob friendly calculation explained: Read this in order to understand, how the position calculation works. 1. Canvas/window coords When you load diep.io in a browser window, it also loads a canvas where the game is drawn. Imagine a piece of paper where you draw things, this is canvas. If you place a pen on that piece of paper, this is html element. Diep.io uses canvas mainly. Your window and the canvas use different coordinate systems, even tho they appear the same at first: start->x | \/ y if x is for example 3 and y is 5, you find the point of your mouse. start->x... |_________| \/________| y_________| ._________| ._________| ._________| ._________| ._________HERE the right upper corner of your window is the x limit, called window.innerWidth the left bottom corner of your window is the y limit, called window.innerHeight canvas is the same, but multiplied by 2. So for x, it's canvas.height = window.innerHeight * 2 same goes for y, canvas.width = window.innerWidth * 2 This can work the other way around too. canvas.height/2 = window.innerHeight and canvas.width/2 = window.innerWidth NOTE: when you use input.mouse(x, y) you're using the canvas coordinate system. 2. DiepUnits Read this first: https://github.com/ABCxFF/diepindepth/blob/main/canvas/scaling.md if you're curious about what l and Fv means, like I was I can tell you now. L stands for your Tank level, that you currently have. Fv is the fieldFactor. You can find them here for each tank: https://github.com/ABCxFF/diepindepth/blob/main/extras/tankdefs.json (The formula from the picture as code: const FOV = (level, fieldFactor) => (.55*fieldFactor)/Math.pow(1.01, (level-1)/2); ) Additions: DiepUnits are used, to draw all entities in game in the right size. For example when you go Ranger, they appear smaller because your entire ingame map shrinks down, so you see more without changing the size of the canvas or the window. So if a square is 55 diepunits big and it gets visually smaller, it's still 55 diepunits big. Coordinate system: x*scalingFactor, y*scalingFactor IMPORTANT!!! Note that your Tank is getting additional DiepUnits with every level it grows. This formula descritbes it's growth 53 * (1.01 ** (currentLevel - 1)); 3. WindowScaling Read this first: https://github.com/ABCxFF/diepindepth/blob/main/canvas/scaling.md (you can use the function given in there, if you don't want to make your own) it's used for all ui elements, like scoreboard, minimap or stats upgrades. NOTE: It's not used for html Elements, only canvas. So the starting menu or gameover screen aren't part of it. Coordinate system: x*windowScaling(), y*windowScaling() 4. Converting coordinate systems into each other canvas -> window = a/(canvas.width/window.innerWidth) -> b window -> canvas = a*(canvas.width/window.innerWidth) -> b windowScaling -> window = ( a*windowScaling() )/(canvas.width/window.innerWidth) -> b windowScaling -> canvas = a*windowScaling() - > b diepUnits -> canvas = a/scalingFactor -> b diepUnits -> window = ( a/scalingFactor )/(canvas.width/window.innerWidth) -> b window -> diepUnits = ( a*scalingFactor )*(canvas.width/window.innerWidth) -> b canvas -> diepUnits = a*scalingFactor -> b window -> windowScaling() = ( a*windowScaling() )*(canvas.width/window.innerWidth) -> b canvas -> windowScaling() = a*windowScaling() - > b diepUnits -> windowScaling() = ( a/scalingFactor ) * fieldFactor -> b windowScaling()-> diepUnits = ( a/fieldFactor ) * scalingFactor -> b ============================================================================= My todo list or fix: - simulate diep.io moving and knockback physics - simulate diep.io bullets - figure out how to simulate mouse click events - Finish bullet speed hybrid tanks - Figure out physics for sniper, Ranger etc. ============================================================================= Known Bugs: - when enabling Level Seeker and pressing L, the ms gets replaced as well ============================================================================= Useful info: -shape sizes: tank lvl 1 size = 53 diep units grid square side length = 50 diep units square, triangle = 55 diep units pentagon = 75 diep units small crasher = 35 diep units big crasher = 55 diep units alpha pentagon = 200 diep units ============================================================================= */ let ripsaw_radius; let fieldFactor = 1.0; let found = false; let loltank; let lolztank; let diepUnits = 53 * (1.01 ** (player.level - 1)); let FOV = (0.55 * fieldFactor) / Math.pow(1.01, (player.level - 1) / 2); let legit_FOV; let change_FOV_request = false; let scalingFactor = FOV * windowScaling(); const fieldFactors = [ { tank: "Sniper", factor: 0.899 }, { tank: "Overseer", factor: 0.899 }, { tank: "Overlord", factor: 0.899 }, { tank: "Assassin", factor: 0.8 }, { tank: "Necromancer", factor: 0.899 }, { tank: "Hunter", factor: 0.85 }, { tank: "Stalker", factor: 0.8 }, { tank: "Ranger", factor: 0.699 }, { tank: "Manager", factor: 0.899 }, { tank: "Predator", factor: 0.85 }, { tank: "Trapper", factor: 0.899 }, { tank: "Gunner Trapper", factor: 0.899 }, { tank: "Overtrapper", factor: 0.899 }, { tank: "MegaTrapper", factor: 0.899 }, { tank: "Tri-Trapper", factor: 0.899 }, { tank: "Smasher", factor: 0.899 }, { tank: "Landmine", factor: 0.899 }, { tank: "Streamliner", factor: 0.85 }, { tank: "Auto Trapper", factor: 0.899 }, { tank: "Battleship", factor: 0.899 }, { tank: "Auto Smasher", factor: 0.899 }, { tank: "Spike", factor: 0.899 }, { tank: "Factory", factor: 0.899 }, { tank: "Skimmer", factor: 0.899 }, { tank: "Glider", factor: 0.899 }, { tank: "Rocketeer", factor: 0.899 }, ] //let's actually implement these: function canvas_2_window(a){ let b = a/(canvas.width/window.innerWidth); return b; } function window_2_canvas(a){ let b = a * (canvas.width/window.innerWidth); return b; } function windowScaling_2_window(a){ let b = (windowScaling_2_canvas(a) ) / (canvas.width/window.innerWidth); return b; } function windowScaling_2_canvas(a){ let b = a*windowScaling(); return b; } function diepUnits_2_canvas(a){ let b = a/scalingFactor; return b; } function diepUnits_2_window(a){ let b = (diepUnits_2_canvas(a))/(canvas.width/window.innerWidth); return b; } function window_2_diepUnits(a){ let b = ( canvas_2_diepUnits(a) )*(canvas.width/window.innerWidth); return b; } function canvas_2_diepUnits(a){ let b = a * scalingFactor; return b; } function window_2_windowScaling(a){ let b = ( canvas_2_windowScaling(a) )*(canvas.width/window.innerWidth); return b; } function canvas_2_windowScaling(a){ let b = a*windowScaling(); return b; } function diepUnits_2_windowScaling(a){ let b = ( diepUnits_2_canvas(a) ) * fieldFactor; return b; } function windowScaling_2_diepUntis(a){ let b = ( a/fieldFactor ) * scalingFactor; return b; } // function check_FOV_requests() { if (script_list.fov) { if (toggleButtons.Addons['FOV changer']) { change_FOV_request = true; change_FOV(FOVindex); } else { change_FOV_request = false; change_FOV(); } } } setInterval(check_FOV_requests, 500); function calculateFOV(Fv, l) { const numerator = 0.55 * Fv; const denominator = Math.pow(1.01, (l - 1) / 2); legit_FOV = numerator / denominator; window.legit_FOV = legit_FOV; let l1 = new_FOVs.length; for (let i = 0; i < l1; i++) { if (new_FOVs[i].name != 'Background') { new_FOVs[i].FOV = ((0.55 * new_FOVs[i].fieldFactor) / (Math.pow(1.01, (l - 1) / 2))); } else { new_FOVs[i].FOV = 0.3499999940395355; } } if (typeof window.HEAPF32 !== 'undefined' && typeof window.fov !== 'undefined' && window.fov.length > 0 && !window.legit_request) { //use this part, if you have a fov script that can share it's fov value with you FOV = HEAPF32[fov[0]]; } else { //use this part if you have no fov script FOV = legit_FOV; } return FOV; } function change_FOV(index) { for (const fov of window.fov) { if (change_FOV_request && !window.legit_request) { if (index === 0) { window.HEAPF32[fov] = new_FOVs[index].FOV; } window.HEAPF32[fov] = new_FOVs[index].FOV; } else { window.HEAPF32[fov] = legit_FOV; } } } function apply_values(FF) { calculateFOV(FF, player.level); scalingFactor = FOV * windowScaling(); ripsaw_radius = diepUnits * scalingFactor; diepUnits = 53 * (1.01 ** (player.level - 1)); } function apply_changes(value) { if (found) { fieldFactor = fieldFactors[value].factor; loltank = player.tank; player.last_level = player.level; apply_values(fieldFactor); } else { if (value === null) { fieldFactor = 1.0; loltank = "default"; lolztank = player.tank; player.last_level = player.level; apply_values(fieldFactor); } } } function bruteforce_tanks() { let l = fieldFactors.length; for (let i = 0; i < l; i++) { if (player.tank.includes(fieldFactors[i].tank)) { found = true; //console.log("FOUND TANK " + fieldFactors[i].tank); apply_changes(i); break; } else { found = false; if (i < l - 1) { /* console.log(`checking tank ${i}`); } else { console.log("Tank set to default or not found") */ apply_changes(null); } } } } window.addEventListener("resize", bruteforce_tanks); function check_lvl_change() { if (player.last_level != player.level) { bruteforce_tanks(); } } function check_change() { check_lvl_change(); if (loltank != player.tank) { if (loltank === "default") { if (lolztank != player.tank) { bruteforce_tanks(); } else { return; } } else { bruteforce_tanks(); } } } setInterval(check_change, 250); // search tree function function findTankAndParent(tree, id, parent = null, grandparent = null) { for (const [key, value] of Object.entries(tree)) { const currentParent = key === "skip" ? parent : Number(key); // Match for direct keys if (Number(key) === id) { return { id, parent }; } // Match for arrays if (Array.isArray(value) && value.includes(id)) { return { id, parent: currentParent }; } // Special handling for "skip" keys if (key === "skip") { if (typeof value === "object") { // Recursively search within "skip" tree const result = findTankAndParent(value, id, parent, grandparent); if (result) return result; } else if (value === id) { return { id, parent: grandparent }; // Use grandparent for direct "skip" match } } // Nested object traversal if (typeof value === "object" && value !== null) { const result = findTankAndParent(value, id, currentParent, parent); if (result) { return result; } } } return null; } // TANK IDS TREE const tanks_tree = { 0: { 1: { 3: [2, 14, 42], 4: [5, 40], 13: [18, 48], }, 6: { 15: [21, 22], 11: [12, 17, 26, 33, 48, 52], 19: [28, 43], 31: [32, 33, 34, 35, 44], }, 7: { skip: 29, 10: [25, 49, 54, 55, 56], 20: [32, 39, 43], }, 8: { 4: [5, 40], 9: [23, 24], 13: [18, 48], 41: [39, 40], }, skip: { 36: [38, 50, 51], }, }, }; let tank_box_nums = [ ["Twin", 0], ["Sniper", 1], ["Machine Gun", 2], ["Flank Guard", 3], ["Smasher", 4], ["Triple Shot", 0], ["Quad Tank", 1], ["Twin Flank", 2], ["Assassin", 0], ["Overseer", 1], ["Hunter", 2], ["Trapper", 3], ["Destroyer", 0], ["Gunner", 1], ["Sprayer", 2], ["Tri-Angle", 0], ["Quad Tank", 1], ["Twin Flank", 2], ["Auto 3", 3], ["Landmine", 0], ["Auto Smasher", 1], ["Spike", 2], ["Triplet", 0], ["Penta Shot", 1], ["Spread Shot", 2], ["Octo Tank", 0], ["Auto 5", {cond:"Auto 3", num:0}, {cond: "Quad Tank", num: 1}], ["Triple Twin", 0], ["Battle Ship", 1], ["Ranger", 0], ["Stalker", 1], ["Overlord", 0], ["Necromancer", 1], ["Manager", 2], ["Overtrapper", 3], ["Battleship", 4], ["Factory", 5], ["Predator", 0], ["Streamliner", {cond: "Hunter", num:1}, {cond: "Gunner", num:2}], ["Tri-Trapper", 0], ["Gunner Trapper", 1], ["Overtrapper", 2], ["Mega Trapper", 3], ["Auto Trapper", 4], ["Hybrid", 0], ["Annihilator", 1], ["Skimmer", 2], ["Rocketeer", 3], ["Glider", 4], ["Auto Gunner", {cond: "Gunner", num: 0}, {cond: "Auto 3", num: 1}], ["Booster", 0], ["Fighter", 1], ["Landmine", 0], ["Auto Smasher", 1], ["Spike", 2], ]; function convert_id_name(type, value) { const tank = window.__common__.tanks.find( type === "id to name" ? (tank) => tank.id === value : (tank) => tank.name === value ); if (!tank) { console.error(`Tank not found for ${type}: ${value}`); return null; } return type === "id to name" ? tank.name : tank.id; } function find_upgrade_cond(tank_name) { const target_id = convert_id_name("name to id", tank_name); if (!target_id) { console.error("Target ID not found"); return null; } console.log(`Target ID for ${tank_name}: ${target_id}`); const tree_result = findTankAndParent(tanks_tree, target_id); if (!tree_result) { console.error(`Tank not found in tree for ID: ${target_id}`); return null; } const cond_id = tree_result.parent; const cond_name = convert_id_name("id to name", cond_id); if (!cond_name) { console.error("Condition name not found"); return null; } return cond_name; } function get_full_path(Tank){ let current_tank = Tank; let temp_arr = []; temp_arr.push(Tank); while(find_upgrade_cond(current_tank) != null){ current_tank = find_upgrade_cond(current_tank); temp_arr.push(current_tank); } temp_arr.reverse(); return temp_arr; } function auto_upgrade(Tank){ if(player.tank === Tank){ console.log("you are already that tank"); return; } let temp_arr = get_full_path(Tank); let l = temp_arr.length; let bool = false; for(let i = 0; i < l; i++){ if(player.tank === temp_arr[i] && i != l){ console.log(`upgrading to ${temp_arr[i+1]}`); handle_tank_upgrades(temp_arr[i+1]); bool = true; break; } } !bool?console.warn("something went wrong"):null; } function handle_tank_upgrades(Tank){ if(player.tank === Tank){ return; } let l = tank_box_nums.length; let temp_arr = []; let cond_num = -1; for(let i = 0; i < l; i++){ let target = tank_box_nums[i]; if(target[0] === Tank){ temp_arr = tank_box_nums[i]; break } } switch(true){ case temp_arr.length === 2: cond_num = temp_arr[1]; break case temp_arr.length > 2: for(let j = 1; j < temp_arr.length; j++){ if(player.tank === temp_arr[j].cond){ cond_num = temp_arr[j].num; } } break default: console.warn("temp_arr in illegal state, quitting..."); return } window.upgrading = true; upgrade(boxes[cond_num].color); } let test_tank = "Auto Gunner"; function upgrade_func(){ if(state === "in game" && player.tank != test_tank && toggleButtons.Mouse["Upgrade to Auto Gunner"]){ auto_upgrade(test_tank); }else{ window.upgrading = false; } } setInterval(upgrade_func, 100); //canvas gui let offsetX = 0; let offsetY = 0; //for canvas text height and space between it let text_startingY = canvas_2_windowScaling(450); let textAdd = canvas_2_windowScaling(25); let selected_box = null; let _bp = { //box parameters startX: 47, startY: 67, distX: 13, distY: 9, width: 86, height: 86, outer_xy: 2 } let _bo = { //box offsets offsetX: _bp.width + (_bp.outer_xy * 2) + _bp.distX, offsetY: _bp.height + (_bp.outer_xy * 2) + _bp.distY } function step_offset(steps, offset){ let final_offset = 0; switch(offset){ case "x": final_offset = _bp.startX + (steps * _bo.offsetX); break case "y": final_offset = _bp.startY + (steps * _bo.offsetY); break } return final_offset; } const boxes = [ { color: "lightblue", LUcornerX: _bp.startX, LUcornerY: _bp.startY }, { color: "green", LUcornerX: _bp.startX + _bo.offsetX, LUcornerY: _bp.startY }, { color: "red", LUcornerX: _bp.startX, LUcornerY: _bp.startY + _bo.offsetY }, { color: "yellow", LUcornerX: _bp.startX + _bo.offsetX, LUcornerY: _bp.startY + _bo.offsetY }, { color: "blue", LUcornerX: _bp.startX, LUcornerY: step_offset(2, "y") }, { color: "rainbow", LUcornerX: _bp.startX + _bo.offsetX, LUcornerY: step_offset(2, "y") } ] //new upgrading Tank logic function upgrade_get_coords(color){ let l = boxes.length; let upgrade_coords = {x: "not defined", y: "not defined"}; for(let i = 0; i < l; i++){ if(boxes[i].color === color){ upgrade_coords.x = windowScaling_2_window(boxes[i].LUcornerX + (_bp.width/2)); upgrade_coords.y = windowScaling_2_window(boxes[i].LUcornerY + (_bp.height/2)); } } return upgrade_coords; } function get_invert_mouse_coords(){ let _x = coords.x; let _y = coords.y; let center = {x: window.innerWidth/2, y: window.innerHeight/2}; let d = {x: _x-center.x, y: _y-center.y}; let inverted_coords = {x: center.x-d.x, y: center.y-d.y}; return inverted_coords; } let inverted = false; function invert_mouse(){ window.requestAnimationFrame(invert_mouse); if((toggleButtons.Mouse["Anti Aim"] || toggleButtons.Mouse["Freeze Mouse"]) && !toggleButtons.Mouse["Sandbox Hacks"] && connected){ return; } if(!inverted){ mouse_move(coords.x, coords.y); return; } let new_coords = get_invert_mouse_coords(); freezeMouseMove(); mouse_move(new_coords.x, new_coords.y); } window.requestAnimationFrame(invert_mouse); function handle_sandbox_checks(){ if(toggleButtons.Mouse["Sandbox Hacks"]){ if(gamemode != "Sandbox"){ one_time_notification("To use sandbox hacks, switch to a sandbox server", rgbToNumber(...notification_rbgs.warning), 2500); return; } if(input.get_convar("ren_upgrades") != 'true'){ input.set_convar("ren_upgrades", 'true'); one_time_notification(`force enabled ren_upgrades for the script`, rgbToNumber(...notification_rbgs.require), 2500); } triflank = true; one_time_notification(`To start, upgrade to ${sandbox_hax_modes[sandbox_hax_index].tank}`, rgbToNumber(...notification_rbgs.normal), 2500); }else{ triflank = false; } } function smart_shgun(){ handle_sandbox_checks(); if(triflank && sandbox_hax_modes[sandbox_hax_index].name === "Shotgun"){ shotgun(sandbox_hax_index); } } setInterval(smart_shgun, 0); function smart_trap(){ handle_sandbox_checks(); if(triflank && sandbox_hax_modes[sandbox_hax_index].name === "Trap Flip"){ one_time_notification("Warning! Trap Flip uses flip fire, which might be incosistent on laggy servers", rgbToNumber(...notification_rbgs.warning), 2500); flip_trap1(sandbox_hax_index); }else{ inverted?inverted = false: null; } } setInterval(smart_trap, 250); function smart_triflank(){ handle_sandbox_checks(); if(triflank && !sandbox_hax_modes[sandbox_hax_index].unique){ sandbox_hax_loop(sandbox_hax_index); } } setInterval(smart_triflank, 200); function is_between(Tank){ //USE FOR SANDBOX ONLY let start = find_upgrade_cond(Tank); let end = Tank; let interval = [convert_id_name("name to id", start), convert_id_name("name to id", end)]; let ids = []; for(let i = interval[1]; i >= interval[0]; i--){ let name = convert_id_name("id to name", i); ids.push(name); } return ids.includes(player.tank); } function sandbox_hax_loop(i){ if(player.tank === find_upgrade_cond(sandbox_hax_modes[i].tank)){ //auto_spin?null:key_press("KeyC", 100 * multiplier); //auto_spin = !auto_spin; setTimeout(() => { upgrade(sandbox_hax_modes[i].color, 0, 0, 0); }, 100); setTimeout(() => { mouse_move(coords.x, coords.y); }, 100); }else if(is_between(sandbox_hax_modes[i].tank)){ //auto_spin?key_press("KeyC", 250 * multiplier):null; //auto_spin = !auto_spin; key_press("Backslash", 100); } } function flip_trap1(i){ if(player.tank === find_upgrade_cond(sandbox_hax_modes[i].tank)){ setTimeout(() => { inverted = true; }, 200); setTimeout(() => { upgrade(sandbox_hax_modes[i].color, 0, 0, 0); }, 250); }else if(is_between(sandbox_hax_modes[i].tank)){ setTimeout(() => { inverted = false; }, 50); setTimeout(() => { key_press("Backslash"); }, 75); } } function shotgun(i){ console.log(sandbox_hax_modes[i].tank); if(player.tank === find_upgrade_cond(sandbox_hax_modes[i].tank[0]) || player.tank === find_upgrade_cond(sandbox_hax_modes[i].tank[1])){ upgrade(sandbox_hax_modes[i].color, 0, 0, 0); mouse_move(coords.x, coords.y); // }else if(is_between(sandbox_hax_modes[i].tank[1])){ }else if(player.tank === sandbox_hax_modes[i].tank[1]){ key_press("Backslash", 0); } } function upgrade(color, delay = 100, cdelay1, cdelay2){ let u_coords = upgrade_get_coords(color); ghost_click_at(u_coords.x, u_coords.y, cdelay1, cdelay2); } function ctx_text(fcolor, scolor, lineWidth, font, text, textX, textY) { ctx.fillStyle = fcolor; ctx.lineWidth = lineWidth; ctx.font = font; ctx.strokeStyle = scolor; ctx.strokeText(`${text}`, textX, textY) ctx.fillText(`${text}`, textX, textY) } function ctx_rect(x, y, a, b, c) { ctx.beginPath(); ctx.strokeStyle = c; ctx.strokeRect(x, y, a, b); } //use this for game entities function dot_in_diepunits(diepunits_X, diepunits_Y) { ctx_arc(diepunits_X * scalingFactor, diepunits_Y * scalingFactor, 5, 0, 2 * Math.PI, false, "lightblue"); } function circle_in_diepunits(diepunits_X, diepunits_Y, diepunits_R, c) { ctx.beginPath(); ctx.arc(diepunits_X * scalingFactor, diepunits_Y * scalingFactor, diepunits_R * scalingFactor, 0, 2 * Math.PI, false); ctx.strokeStyle = c; ctx.stroke(); } function big_half_circle(diepunits_X, diepunits_Y, diepunits_R, c) { let centerY = diepunits_Y * scalingFactor; let centerX = diepunits_X * scalingFactor; let angle = Math.atan2(coords.y - centerY, coords.x - centerX); ctx.beginPath(); ctx.arc(centerX, centerY, diepunits_R * scalingFactor, angle - Math.PI / 2, angle + Math.PI / 2, false); ctx.strokeStyle = c; ctx.stroke(); } function small_half_circle(diepunits_X, diepunits_Y, diepunits_R, c) { let centerY = diepunits_Y * scalingFactor; let centerX = diepunits_X * scalingFactor; let angle = Math.atan2(coords.y - centerY, coords.x - centerX); ctx.beginPath(); ctx.arc(centerX, centerY, diepunits_R * scalingFactor, angle + Math.PI / 2, angle - Math.PI / 2, false); ctx.strokeStyle = c; ctx.stroke(); } //use this for ui elements like upgrades or scoreboard function dot_in_diepunits_FOVless(diepunits_X, diepunits_Y) { ctx_arc(canvas_2_windowScaling(diepunits_X), canvas_2_windowScaling(diepunits_Y), 5, 0, 2 * Math.PI, false, "lightblue"); } function square_for_grid(x, y, a, b, color) { ctx.beginPath(); ctx.rect(canvas_2_windowScaling(x), canvas_2_windowScaling(y), canvas_2_windowScaling(a), canvas_2_windowScaling(b)); ctx.strokeStyle = color; ctx.stroke(); } function draw_upgrade_grid() { let box = {width: 86, height: 86}; //in windowScaling let l = boxes.length; for (let i = 0; i < l; i++) { let start_x = windowScaling_2_window(boxes[i].LUcornerX); let start_y = windowScaling_2_window(boxes[i].LUcornerY); let end_x = windowScaling_2_window(boxes[i].LUcornerX + box.width); let end_y = windowScaling_2_window(boxes[i].LUcornerY + box.height); let temp_color = "black"; if (coords.x > start_x && coords.y > start_y && coords.x < end_x && coords.y < end_y) { temp_color = "red"; selected_box = i; } else { temp_color = "black"; selected_box = null; } square_for_grid(boxes[i].LUcornerX, boxes[i].LUcornerY, 86, 86, temp_color); } for (let i = 0; i < l; i++) { dot_in_diepunits_FOVless(boxes[i].LUcornerX, boxes[i].LUcornerY); dot_in_diepunits_FOVless(boxes[i].LUcornerX + box.width/2, boxes[i].LUcornerY); dot_in_diepunits_FOVless(boxes[i].LUcornerX + box.width, boxes[i].LUcornerY); dot_in_diepunits_FOVless(boxes[i].LUcornerX + box.width, boxes[i].LUcornerY + box.height/2); dot_in_diepunits_FOVless(boxes[i].LUcornerX + box.width, boxes[i].LUcornerY + box.height); dot_in_diepunits_FOVless(boxes[i].LUcornerX, boxes[i].LUcornerY + box.height/2); dot_in_diepunits_FOVless(boxes[i].LUcornerX, boxes[i].LUcornerY + box.height); dot_in_diepunits_FOVless(boxes[i].LUcornerX + box.width, boxes[i].LUcornerY + box.height/2); } } const gradients = ["#94b3d0", "#96b0c7", "#778daa", "#4c7299", "#52596c", "#19254e", "#2d445f", "#172631"]; const tank_group1 = ["Trapper", "Overtrapper", "Mega Trapper", "Tri-Trapper"]; //Traps only const tank_group2 = ["Tank", "Twin", "Triple Shot", "Spread Shot", "Penta Shot", "Machine Gun", "Sprayer", "Triplet"]; //constant bullets [initial speed = 0.699] const tank_group2round = ["Twin Flank", "Triple Twin", "Quad Tank", "OctoT ank", "Flank Guard"]; const tank_group3 = ["GunnerTrapper"]; //Traps AND constant bullets const tank_group4 = ["Fighter", "Booster", "Tri-Angle"]; // fast tanks const tank_group5 = ["Sniper", "Assassin", "Stalker", "Ranger"]; //sniper+ bullets const tank_group6 = ["Destroyer", "Hybrid", "Annihilator"]; //slower bullets [intitial speed = 0.699] //const tank_group7 = ["Overseer", "Overlord", "Manager", "Necromancer"]; //infinite bullets(drones) (UNFINISHED) const tank_group8 = ["Factory"]; //drones with spreading abilities const tank_group9 = ["Battleship"]; //special case const tank_group10 = ["Streamliner"]; // special case const tank_group11 = ["Gunner", "AutoGunner"] // (UNFINISHED) //get bullet speed function count_fours(string) { let fours_count = 0; let temp_array = [...string]; for (let i = 0; i < temp_array.length; i++) { if (temp_array[i] === "4") { fours_count++; } } return fours_count; } function draw_cirle_radius_for_tank() { let b_s; if (diep_data.length > 0) { player.raw_build = diep_data[0][1]; player.real_time_build = real_build(player.raw_build); b_s = count_fours(player.real_time_build); } else { b_s = 0; } if (tank_group1.includes(player.tank)) { circle_in_diepunits(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 485 + (52.5 * b_s), gradients[b_s]); } else if (tank_group2.includes(player.tank)) { big_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1850 + (210 * b_s), gradients[b_s]); } else if (tank_group2round.includes(player.tank)) { circle_in_diepunits(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1850 + (210 * b_s), gradients[b_s]); } else if (tank_group3.includes(player.tank)) { big_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1850 + (210 * b_s), gradients[b_s]); small_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 485 + (52.5 * b_s), gradients[b_s]); } else if (tank_group4.includes(player.tank)) { big_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1850 + (210 * b_s), gradients[b_s]); small_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1135 + (100 * b_s), gradients[b_s]); } else if (tank_group5.includes(player.tank)) { big_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 2680 + (350 * b_s), gradients[b_s]); } else if (tank_group6.includes(player.tank)) { big_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1443.21 + (146.79 * b_s), gradients[b_s]); /* }else if(tank_group7.includes(player.tank)){ circle_in_diepunits( canvas.width/2/scalingFactor , canvas.height/2/scalingFactor, 1607 + (145*b_s), gradients[b_s]); circle_in_diepunits( coords.x*2/scalingFactor , coords.y*2/scalingFactor, 1607 + (145*i), gradients[b_s]); */ } else if (tank_group8.includes(player.tank)) { if (!auto_fire) { circle_in_diepunits(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 200, gradients[0]); } else { circle_in_diepunits(coords.x * two / scalingFactor, coords.y * two / scalingFactor, 800, gradients[1]); circle_in_diepunits(coords.x * two / scalingFactor, coords.y * two / scalingFactor, 900, gradients[2]); } } else if (tank_group9.includes(player.tank)) { circle_in_diepunits(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1640 + (210 * b_s), gradients[b_s]); } else if (tank_group10.includes(player.tank)) { big_half_circle(canvas.width / 2 / scalingFactor, canvas.height / 2 / scalingFactor, 1750 + (190 * b_s), gradients[b_s]); } else { return; } } //let's calculate the angle var vector_l = [null, null]; var angle_l = 0; function calc_leader() { if (script_list.minimap_leader_v1) { let xc = canvas.width / 2; let yc = canvas.height / 2; vector_l[0] = window.l_arrow.xl - xc; vector_l[1] = window.l_arrow.yl - yc; angle_l = Math.atan2(vector_l[1], vector_l[0]) * (180 / Math.PI); } else if (script_list.minimap_leader_v2) { let xc = canvas.width / 2; let yc = canvas.height / 2; vector_l[0] = window.L_X - xc; vector_l[1] = window.L_Y - yc; angle_l = Math.atan2(vector_l[1], vector_l[0]) * (180 / Math.PI); } else { console.log("waiting for leader script to give us values"); } } // Minimap logic var minimap_elements = [ { name: "minimap", x: 177.5, y: 177.5, width: 162.5, height: 162.5, color: "purple" }, { name: "2 Teams Blue Team", x: 177.5, y: 177.5, width: 17.5, height: 162.5, color: "blue" }, { name: "2 Teams Blue Team zone", x: 160.0, y: 177.5, width: 17.5, height: 162.5, color: "SlateBlue" }, { name: "2 Teams Red Team", x: 32.5, y: 177.5, width: 17.5, height: 162.5, color: "red" }, { name: "2 Teams Red Team zone", x: 50, y: 177.5, width: 17.5, height: 162.5, color: "orangeRed" }, { name: "4 Teams Blue Team", x: 177.5, y: 177.5, width: 25, height: 25, color: "blue" }, { name: "4 Teams Blue zone", x: 177.5, y: 177.5, width: 40, height: 40, color: "SlateBlue" }, { name: "4 Teams Purple Team", x: 40, y: 177.5, width: 25, height: 25, color: "purple" }, { name: "4 Teams Purple zone", x: 55, y: 177.5, width: 40, height: 40, color: "Violet" }, { name: "4 Teams Green Team", x: 177.5, y: 40, width: 25, height: 25, color: "green" }, { name: "4 Teams Green zone", x: 177.5, y: 55, width: 40, height: 40, color: "LimeGreen" }, { name: "4 Teams Red Team", x: 40, y: 40, width: 25, height: 25, color: "orangeRed" }, { name: "4 Teams Red zone", x: 55, y: 55, width: 40, height: 40, color: "red" }, ]; var m_e_ctx_coords = [ { name: "minimap", startx: null, stary: null, endx: null, endy: null }, { name: "2 Teams Blue Team", startx: null, stary: null, endx: null, endy: null }, { name: "2 Teams Blue Team Zone", startx: null, stary: null, endx: null, endy: null }, { name: "2 Teams Red Team", startx: null, stary: null, endx: null, endy: null }, { name: "2 Teams Red Team Zone", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Blue Team", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Blue zone", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Purple Team", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Purple zone", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Green Team", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Green zone", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Red Team", startx: null, stary: null, endx: null, endy: null }, { name: "4 Teams Red zone", startx: null, stary: null, endx: null, endy: null } ] function draw_minimap() { let l = minimap_elements.length; switch (gamemode) { case "2 Teams": for (let i = 0; i < 5; i++) { if (i === 2 || i === 4) { if (toggleButtons.Functional['Toggle Base Zones']) { updateAndDrawElement(i); } } else { updateAndDrawElement(i); } } break; case "4 Teams": updateAndDrawElement(0); for (let i = 5; i < l; i++) { if (i === 6 || i === 8 || i === 10 || i === 12) { if (toggleButtons.Functional['Toggle Base Zones']) { updateAndDrawElement(i); } } else { updateAndDrawElement(i); } } break; } if (script_list.minimap_leader_v1 || script_list.minimap_leader_v2) { minimap_collision_check(); } } function updateAndDrawElement(index) { // Update their real-time position m_e_ctx_coords[index].startx = canvas.width - (minimap_elements[index].x * windowScaling()); m_e_ctx_coords[index].starty = canvas.height - (minimap_elements[index].y * windowScaling()); m_e_ctx_coords[index].endx = m_e_ctx_coords[index].startx + minimap_elements[index].width * windowScaling(); m_e_ctx_coords[index].endy = m_e_ctx_coords[index].starty + minimap_elements[index].height * windowScaling(); // Draw the element if(!toggleButtons.Debug["Toggle Minimap"]){ return; } ctx.beginPath(); ctx.rect(m_e_ctx_coords[index].startx, m_e_ctx_coords[index].starty, minimap_elements[index].width * windowScaling(), minimap_elements[index].height * windowScaling()); ctx.lineWidth = "1"; ctx.strokeStyle = minimap_elements[index].color; ctx.stroke(); } function minimap_collision_check() { if (script_list.minimap_leader_v1 || script_list.minimap_leader_v2) { let x = script_list.minimap_leader_v1 ? window.m_arrow.xl : window.M_X; let y = script_list.minimap_leader_v1 ? window.m_arrow.yl : window.M_Y; if (m_e_ctx_coords[0].startx < x && m_e_ctx_coords[0].starty < y && m_e_ctx_coords[0].endx > x && m_e_ctx_coords[0].endy > y) { if (gamemode === "2 Teams") { if (checkWithinBase(1, x, y)) position_on_minimap = "blue base"; else if (checkWithinBase(2, x, y)) position_on_minimap = "blue drones"; else if (checkWithinBase(3, x, y)) position_on_minimap = "red base"; else if (checkWithinBase(4, x, y)) position_on_minimap = "red drones"; else position_on_minimap = "not in the base"; } else if (gamemode === "4 Teams") { if (checkWithinBase(6, x, y)) { if (checkWithinBase(5, x, y)) { position_on_minimap = "blue base" } else { position_on_minimap = "blue drones"; } } else if (checkWithinBase(8, x, y)) { if (checkWithinBase(7, x, y)) { position_on_minimap = "purple base" } else { position_on_minimap = "purple drones"; } } else if (checkWithinBase(10, x, y)) { if (checkWithinBase(9, x, y)) { position_on_minimap = "green base" } else { position_on_minimap = "green drones"; } } else if (checkWithinBase(12, x, y)) { if (checkWithinBase(11, x, y)) { position_on_minimap = "red base" } else { position_on_minimap = "red drones"; } } else { position_on_minimap = "not in the base"; } } else { position_on_minimap = "Warning! not on minimap"; } } } } function checkWithinBase(baseIndex, x, y) { return m_e_ctx_coords[baseIndex].startx < x && m_e_ctx_coords[baseIndex].starty < y && m_e_ctx_coords[baseIndex].endx > x && m_e_ctx_coords[baseIndex].endy > y; } //notify player about entering base zones let alerted = false; let team_clrs = ["blue", "red", "purple", "green"]; function alert_about_drones() { if (position_on_minimap.includes('drones') && !position_on_minimap.includes(team_clrs[player.team_index])) { if (!alerted) { new_notification("Warning drones!", rgbToNumber(...notification_rbgs.warning), 2500); alerted = true; } } else { alerted = false; } } //let's try drawing a line to the leader function apply_vector_on_minimap() { if (script_list.minimap_leader_v2) { let x = window.M_X; let y = window.M_Y; let thetaRadians = angle_l * (Math.PI / 180); let r = m_e_ctx_coords[0].endx - m_e_ctx_coords[0].startx; let x2 = x + r * Math.cos(thetaRadians); let y2 = y + r * Math.sin(thetaRadians); ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(x2, y2); ctx.stroke(); } } const circle_gradients = [ "#FF0000", // Red "#FF4D00", // Orange Red "#FF8000", // Orange "#FFB300", // Dark Goldenrod "#FFD700", // Gold "#FFEA00", // Yellow "#D6FF00", // Light Yellow Green "#A3FF00", // Yellow Green "#6CFF00", // Lime Green "#00FF4C", // Medium Spring Green "#00FF9D", // Turquoise "#00D6FF", // Sky Blue "#006CFF", // Blue "#0000FF" // Dark Blue ]; function draw_crx_events() { //you need either leader arrow or moveTo/lineTo script from h3llside for this part if (script_list.moveToLineTo_debug) { let l = window.y_and_x.length; for (let i = 0; i < l; i++) { ctx_arc(window.y_and_x[i][0], window.y_and_x[i][1], 10, 0, 2 * Math.PI, false, circle_gradients[i]); ctx_text("white", "DarkRed", 6, 1.5 + "em Ubuntu", i, window.y_and_x[i][0], window.y_and_x[i][1]); } } else if (script_list.minimap_leader_v1) { //ctx_arc(window.l_arrow.xm, window.l_arrow.ym, 15, 0, 2 * Math.PI, false, window.l_arrow.color); //ctx_arc(window.m_arrow.xm, window.m_arrow.ym, 1, 0, 2 * Math.PI, false, "yellow"); ctx_arc(window.l_arrow.xl, window.l_arrow.yl, 5, 0, 2 * Math.PI, false, window.l_arrow.color); ctx_arc(window.m_arrow.xl, window.m_arrow.yl, 1, 0, 2 * Math.PI, false, "yellow"); } } //tank aim lines let TurretRatios = [ { name: "Destroyer", ratio: 95 / 71.4, color: "red" }, { name: "Anni", ratio: 95 / 96.6, color: "darkred" }, { name: "Fighter", ratio: 80 / 42, color: "orange" }, { name: "Booster", ratio: 70 / 42, color: "green" }, { name: "Tank", ratio: 95 / 42, color: "yellow" }, { name: "Sniper", ratio: 110 / 42, color: "yellow" }, { name: "Ranger", ratio: 120 / 42, color: "orange" }, { name: "Hunter", ratio: 95 / 56.7, color: "orange" }, { name: "Predator", ratio: 80 / 71.4, color: "darkorange" }, { name: "Mega Trapper", ratio: 60 / 54.6, color: "red" }, { name: "Trapper", ratio: 60 / 42, color: "orange" }, { name: "Gunner Trapper", ratio: 95 / 26.6, color: "yellow" }, { name: "Predator", ratio: 95 / 84.8, color: "red" }, { name: "Gunner(small)", ratio: 65 / 25.2, color: "lightgreen" }, { name: "Gunner(big)", ratio: 85 / 25.2, color: "green" }, { name: "Spread1", ratio: 89 / 29.4, color: "orange" }, { name: "Spread2", ratio: 83 / 29.4, color: "orange" }, { name: "Spread3", ratio: 71 / 29.4, color: "orange" }, { name: "Spread4", ratio: 65 / 29.4, color: "orange" }, //{name: "bullet", ratio: 1, color: "pink"}, ]; function drawTheThing(x, y, r, index) { if (toggleButtons.Visual['Toggle Aim Lines']) { if (TurretRatios[index].name != "bullet") { ctx.strokeStyle = TurretRatios[index].color; ctx.lineWidth = 5; let extendedR = 300 * scalingFactor; // Reverse the angle to switch the direction const reversedAngle = -angle; // Calculate the end point of the line const endX = x + extendedR * Math.cos(reversedAngle); const endY = y + extendedR * Math.sin(reversedAngle); // Draw the line ctx.beginPath(); ctx.moveTo(x, y); ctx.lineTo(endX, endY); ctx.stroke(); // Draw text at the end of the line ctx.font = "20px Arial"; ctx.fillStyle = TurretRatios[index].color; ctx.strokeStyle = "black"; ctx.strokeText(TurretRatios[index].name, endX, endY); ctx.fillText(TurretRatios[index].name, endX, endY); ctx.beginPath(); } else { ctx.strokeStyle = TurretRatios[index].color; ctx.lineWidth = 5; // Draw text at the end of the line ctx.font = "15px Arial"; ctx.fillStyle = TurretRatios[index].color; ctx.strokeStyle = "black"; let tankRadiusesTrans = []; for (let i = 1; i <= 45; i++) { let value = Math.abs((48.589 * (1.01 ** (i - 1))) * Math.abs(scalingFactor).toFixed(4)).toFixed(3); tankRadiusesTrans.push(value); } let r_abs = Math.abs(r).toFixed(3); if (r_abs < tankRadiusesTrans[0]) { ctx.beginPath(); ctx.strokeStyle = TurretRatios[index].color; ctx.arc(x, y - r / 2, r * 2, 0, 2 * Math.PI); ctx.stroke(); ctx.beginPath(); } else { // Find the closest value in the array let closestValue = tankRadiusesTrans.reduce((prev, curr) => { return (Math.abs(curr - r_abs) < Math.abs(prev - r_abs) ? curr : prev); }); // Find the index of the closest value let closestIndex = tankRadiusesTrans.indexOf(closestValue); if (closestIndex !== -1) { let r_name = `Level ${closestIndex + 1}`; ctx.strokeText(r_name, x, y + 50 * scalingFactor); ctx.fillText(r_name, x, y + 50 * scalingFactor); ctx.beginPath(); } else { let r_name = `radius: ${Math.abs(r).toFixed(4)} 1: ${tankRadiusesTrans[0]} 2: ${tankRadiusesTrans[1]} 3: ${tankRadiusesTrans[2]}`; ctx.strokeText(r_name, x, y); ctx.fillText(r_name, x, y); ctx.beginPath(); } /* ctx.strokeText(TurretRatios[index].name, x, y); ctx.fillText(TurretRatios[index].name, x, y); */ } } } } var angle, a, b, width; let perm_cont = []; CanvasRenderingContext2D.prototype.setTransform = new Proxy(CanvasRenderingContext2D.prototype.setTransform, { apply(target, thisArgs, args) { // Check if the ratio matches the specified conditions let l = TurretRatios.length; for (let i = 0; i < l; i++) { if (Math.abs(args[0] / args[3]).toFixed(3) == (TurretRatios[i].ratio).toFixed(3)) { if (TurretRatios[i].name === "bullet") { if (args[0] != 1 && args[0] > 10 && args[0] < 100 && args[4] > 1 && args[5] > 1 && args[4] != args[5] && thisArgs.globalAlpha != 0.10000000149011612 && thisArgs.globalAlpha != 0.3499999940395355) { if (!perm_cont.includes(thisArgs)) { perm_cont.push(thisArgs); //console.log(perm_cont); } angle = Math.atan2(args[2], args[3]) || 0; width = Math.hypot(args[3], args[2]); a = args[4] - Math.cos(angle + Math.PI / 2) * width / 2; b = args[5] + Math.sin(angle + Math.PI / 2) * width / 2; //console.log(b); if (a > 0 && b > 0 && thisArgs.fillStyle != "#1B1B1B") { //OUTLINE COLOR drawTheThing(a, b, Math.hypot(args[3], args[2]), i); } } } else { angle = Math.atan2(args[2], args[3]) || 0; width = Math.hypot(args[3], args[2]); a = args[4] - Math.cos(angle + Math.PI / 2) * width / 2; b = args[5] + Math.sin(angle + Math.PI / 2) * width / 2; drawTheThing(a, b, Math.hypot(args[3], args[2]), i); } } } return Reflect.apply(target, thisArgs, args); } }); const ms_fps_clrs = ["lime", "green", "yellow", "orange", "darkorange", "red", "darkred"]; const ms_filters = new Uint16Array([15, 26, 50, 90, 170, 380, 1000]); const fps_filters = new Uint16Array([59, 55, 50, 35, 20, 10, 5]); function pick_fps_color() { let fps_num = parseFloat(fps); let l = fps_filters.length; for (let i = 0; i < l; i++) { if (fps_num > fps_filters[i]) { ctx_text(ms_fps_clrs[i], "black", 4, 1 + "em Ubuntu", fps + "fps", canvas.width / 2, canvas.height / 2); return; } } } function pick_ms_color() { let ms_num = parseFloat(ms); for (let i = 0; i < ms_filters.length; i++) { if (ms_num < ms_filters[i]) { ctx_text(ms_fps_clrs[i], "black", 4, 1 + "em Ubuntu", ms + "ms", canvas.width / 2, canvas.height / 2 + 20); return; } } } //gonna work on that later (it's not accurate enough) const arena_sizes = { startX: -3400, startY: -3400, endX: 3400, endY: 3400 } function world_2_minimap(x, y){ let minimap_width = minimapDim[0]; let minimap_height = minimapDim[1]; let center = {x:minimapPos[0]+minimap_width/2, y:minimapPos[1]+minimap_height/2}; let scaled_du = minimap_width/(arena_sizes.endX*2); return {x:center.x+(x*scaled_du), y:center.y+(y*scaled_du)}; } function world_your_pos(){ let minimap_width = (minimapPos[0]+minimapDim[0])-minimapPos[0]; let minimap_height = (minimapPos[1]+minimapDim[1])-minimapPos[1]; let center = {x:minimapPos[0]+minimap_width/2, y:minimapPos[1]+minimap_height/2}; let scaled_du = minimap_width/(arena_sizes.endX*2); let offset = {x: (window.M_X - center.x)/scaled_du, y: (window.M_Y - center.y)/scaled_du}; console.log(offset); return offset; } function window_2_world(x, y){ let tank_pos = world_your_pos(); /* let width = window.innerWidth*FOV; let height = window.innerHeight*FOV; */ let width = window.innerWidth; let height = window.innerHeight; let corners = { lu: { x: tank_pos.x-(width/2), y: tank_pos.y-(height/2) }, rb: { x: tank_pos.x+(width/2), y: tank_pos.y+(height/2) } } let final_coords = {x: corners.lu.x+x, y: corners.lu.y+y}; return final_coords; } function world_2_window(x, y){ let tank_pos = world_your_pos(); let final_coords = { x: (x-tank_pos.x)/FOV, y: (y-tank_pos.y)/FOV } //ctx_arc(window_2_canvas(final_coords.x), window_2_canvas(final_coords.y), 10, 0, 2 * Math.PI, false, "yellow"); //console.log(final_coords); return final_coords; } function draw_point(x, y){ let point = world_2_minimap(x, y); ctx_arc(window_2_canvas(point.x), window_2_canvas(point.y), 1, 0, 2 * Math.PI, false, "yellow"); } setTimeout(() => { let gui = () => { check_addon_scripts(); text_startingY = canvas_2_windowScaling(450); textAdd = canvas_2_windowScaling(25); if (state === "in game") { let coordss = world_2_window(arena_sizes.startX + 1450, arena_sizes.startY + 1450); ctx.beginPath(); ctx.moveTo(window.innerWidth/2, window.innerHeight/2); ctx.lineTo(coordss.x, coordss.y); ctx.stroke(); let mouse = window_2_world(coords.x, coords.y); draw_point(mouse.x, mouse.y); if (ms_active) { pick_fps_color(); pick_ms_color(); } draw_minimap(); if (toggleButtons.Functional['Toggle Base Zones']) { alert_about_drones(); } if (script_list.minimap_leader_v2) { if (toggleButtons.Visual['Toggle Leader Angle']) { calc_leader(); apply_vector_on_minimap(); } } if (toggleButtons.Debug['Toggle Arrow pos']) { window.arrowv2_debug = true; } else { window.arrowv2_debug = false; } if (script_list.set_transform_debug) { ctx_arc(window.crx_container[2], window.crx_container[3], 50, 0, 2 * Math.PI, false, "yellow"); } if (toggleButtons.Debug['Toggle Text']) { ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "canvas Lvl:" + player.level, canvas.width / 20 + 10, text_startingY + (textAdd * 0)); ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "canvas tank: " + player.tank, canvas.width / 20 + 10, text_startingY + (textAdd * 1)); ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "radius: " + ripsaw_radius, canvas.width / 20 + 10, text_startingY + (textAdd * 2)); ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "scaling Factor: " + scalingFactor, canvas.width / 20 + 10, text_startingY + (textAdd * 3)); ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "diep Units: " + diepUnits, canvas.width / 20 + 10, text_startingY + (textAdd * 4)); ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "Fov: " + FOV, canvas.width / 20 + 10, text_startingY + (textAdd * 5)); ctx_text("white", "DarkRed", 3, 1 + "em Ubuntu", "vector: " + Math.floor(vector_l[0]) + ", " + Math.floor(vector_l[1]) + "angle: " + Math.floor(angle_l), canvas.width / 20 + 10, text_startingY + (textAdd * 7)); //ctx_text("white", "DarkRed", 6, 1.5 + "em Ubuntu", "realX: " + coords.x + "realY: " + coords.y + "newX: " + coords.x*windowScaling() + "newY: " + coords.y*windowScaling(), coords.x*2, coords.y*2); //points at mouse ctx_arc(coords.x * two, coords.y * two, 5, 0, 2 * Math.PI, false, "purple"); /* circle_in_diepunits(coords.x*2/scalingFactor, coords.y*2/scalingFactor, 35, "pink"); circle_in_diepunits(coords.x*2/scalingFactor, coords.y*2/scalingFactor, 55, "yellow"); circle_in_diepunits(coords.x*2/scalingFactor, coords.y*2/scalingFactor, 75, "purple"); circle_in_diepunits(coords.x*2/scalingFactor, coords.y*2/scalingFactor, 200, "blue"); */ //coords at mouse ctx_text("white", "DarkRed", 6, 1.5 + "em Ubuntu", "realX: " + coords.x * two + "realY: " + coords.y * two, coords.x * two, coords.y * two); } if (player.level != null && player.tank != null) { if (toggleButtons.Debug['Toggle Middle Circle']) { ctx.beginPath(); ctx.moveTo(canvas.width / 2 + offsetX, canvas.height / 2 + offsetY); ctx.lineTo(coords.x * two, coords.y * two); ctx.stroke(); ctx_arc(canvas.width / 2 + offsetX, canvas.height / 2 + offsetY, ripsaw_radius, 0, 2 * Math.PI, false, "darkblue"); ctx_arc(canvas.width / 2 + offsetX, canvas.height / 2 + offsetY, ripsaw_radius * 0.9, 0, 2 * Math.PI, false, "lightblue"); } if (toggleButtons.Debug['Toggle Upgrades']) { draw_upgrade_grid(); } //draw_server_border(4000, 2250); draw_crx_events(); if (toggleButtons.Visual['Toggle Bullet Distance']) { draw_cirle_radius_for_tank(); } }; } window.requestAnimationFrame(gui); } gui(); setTimeout(() => { gui(); }, 5000); }, 1000); // Alert players about missing scripts (for addons) let notified = {}; function require(category, toggleButton, script) { if (state === "in game") { const notificationKey = `${category}-${toggleButton}-${script}`; if (toggleButtons[category]?.[toggleButton] && !script_list[script] && !notified[notificationKey]) { new_notification(`${toggleButton} requires ${script} to be active!`, rgbToNumber(...notification_rbgs.require), 7500); notified[notificationKey] = true; } } } function check_addon_scripts() { require('Addons', 'FOV changer', 'fov'); } //cooldowns (unfinished) let c_cd = "red"; let c_r = "green"; const cooldowns = [ { Tank: "Destroyer", cooldown0: 109, cooldown1: 94, cooldown2: 81, cooldown3: 86 }, ] //detect which slot was clicked document.addEventListener('mousedown', checkPos) function checkPos(e) { console.log(boxes[selected_box]); } //warns you about annis, destroyers /* function drawTheThing(x,y,r) { if(script_boolean){ let a = ctx.fillStyle; ctx.fillStyle = "#FF000044"; ctx.beginPath(); ctx.arc(x,y,4*r,0,2*Math.PI); ctx.fill(); ctx.fillStyle = "#FF000066"; ctx.beginPath(); ctx.arc(x,y,2*r,0,2*Math.PI); ctx.fill(); ctx.beginPath(); } } var angle,a,b,width; CanvasRenderingContext2D.prototype.setTransform = new Proxy(CanvasRenderingContext2D.prototype.setTransform, { apply(target, thisArgs, args) { //console.log(thisArgs) if (Math.abs(args[0]/args[3]).toFixed(3) == (95/71.4).toFixed(3) || Math.abs(args[0]/args[3]).toFixed(3) == (95/96.6).toFixed(3)) { angle = Math.atan2(args[2],args[3]) || 0; width = Math.hypot(args[3], args[2]); a = args[4]-Math.cos(angle+Math.PI/2)*width/2; b = args[5]+Math.sin(angle+Math.PI/2)*width/2; drawTheThing(a,b, Math.hypot(args[3],args[2])); } return Reflect.apply(target, thisArgs, args); } }); */ //physics for movement (UNFINISHED) /* //movement speed ingame stat let m_s = [0, 1, 2, 3, 4, 5, 6, 7]; function accelarate(A_o){ //Accelaration let sum = 0; runForTicks((ticksPassed, currentTick) => { console.log("sum is being calculated..."); sum += A_o * Math.pow(0.9, ticksPassed - 1); offsetX = Math.floor(sum * scalingFactor); console.log(offsetX); }, 50); //decelerate(sum); } function decelerate(sum){ //deceleration let res = 0; runForTicks((ticksPassed, currentTick) => { console.log("res is being calculated..."); res = sum * Math.pow(0.9, ticksPassed); offsetX = Math.floor(res * scalingFactor); console.log(offsetX); }, 50); } function calculate_speed(movement_speed_stat){ console.log("calculate_speed function called"); //use Accelaration for first 50 ticks, then deceleration until ticks hit 100, then stop moving //calculating base value, we'll need this later let a = (1.07**movement_speed_stat); let b = (1.015**(player.level - 1)); let A_o = 2.55*(a/b); accelarate(A_o); } */ //handle Key presses let key_storage = []; let keyHeld = {}; window.addEventListener('keydown', function(e) { if (!keyHeld[e.key]) { keyHeld[e.key] = true; key_storage.push(e.key); analyse_keys(); } console.log(key_storage); }); window.addEventListener('keyup', function(e) { if (key_storage.includes(e.key)) { key_storage.splice(key_storage.indexOf(e.key), 1); } keyHeld[e.key] = false; console.log(key_storage); analyse_keys(); }); function analyse_keys() { if (key_storage.includes("j")) { //J change_visibility(); //auto spin && auto fire } else if (key_storage.includes("l")) { ms_active = !ms_active; } else if (key_storage.includes("e")) { //E if (ingamescreen.classList.contains("screen") && ingamescreen.classList.contains("active")) { f_s("fire"); } else { auto_fire = false; } console.log(auto_fire); }else if (key_storage.includes("c")) { console.log(auto_spin); if (ingamescreen.classList.contains("screen") && ingamescreen.classList.contains("active")) { f_s("spin"); } else { auto_spin = false; } console.log(auto_spin); //stats } else if (toggleButtons.Functional['Stats']) { if (key_storage.includes("u")) { if (key_storage.includes("r")) { reset_stats(); } if (!document.body.contains(upgrade_box)) { document.body.appendChild(upgrade_box); } update_stats(); if (stats_limit >= 0) { for (let i = 1; i < 9; i++) { if (key_storage.includes(`${i}`) && stats[i] < 7) { stats[i] += 1; stats_limit -= 1; } } } } else { if (document.body.contains(upgrade_box)) { document.body.removeChild(upgrade_box); } use_stats_ingame(); } } } //stats handler var stats_instructions_showed = false; function show_stats_instructions() { if (toggleButtons.Functional['Stats']) { input.execute("ren_stats false"); if (!stats_instructions_showed) { if (state === "in game") { use_stats_ingame(); new_notification("Usage: hold 'u' button and then press a number between 1 and 9", rgbToNumber(...notification_rbgs.normal), 5000); new_notification("Explanation: this module lets you choose a tank build that will stay even after you die", rgbToNumber(...notification_rbgs.normal), 5100); new_notification("unless you press r while pressing u", rgbToNumber(...notification_rbgs.normal), 5200); stats_instructions_showed = true; } } else { if (state === "in menu") { stats_instructions_showed = false; } } } else { input.execute("ren_stats true"); } } setInterval(show_stats_instructions, 500); let stats = ["don't use this", 0, 0, 0, 0, 0, 0, 0, 0]; let stats_limit = 32; function update_stats() { let l = stats.length; for (let i = 1; i < l; i++) { let stat_steps = stats[i]; for (let j = 1; j < stat_steps + 1; j++) { let stat_row = document.querySelector(`#row${[i]} > #s_box${j}`); stat_row.style.backgroundColor = `${upgrade_name_colors[i]}`; } } } function reset_stats() { let l = stats.length; for (let i = 1; i < l; i++) { let stat_steps = stats[i]; for (let j = 1; j < stat_steps + 1; j++) { let stat_row = document.querySelector(`#row${[i]} > #s_box${j}`); stat_row.style.backgroundColor = "black"; } } stats = ["don't use this", 0, 0, 0, 0, 0, 0, 0, 0]; stats_limit = 32; } function use_stats_ingame() { let final_decision = ""; for (let i = 5; i < 9; i++) { for (let j = 0; j < stats[i]; j++) { final_decision += `${i}`; } } for (let i = 1; i < 5; i++) { for (let j = 0; j < stats[i]; j++) { final_decision += `${i}`; } } input.execute(`game_stats_build ${final_decision}`); } const upgrade_names = [ "don't use this", "Health Regen", "Max Health", "Body Damage", "Bullet Speed", "Bullet Penetration", "Bullet Damage", "Reload", "Movement Speed", ]; const upgrade_name_colors = [ "don't use this", "DarkSalmon", "pink", "DarkViolet", "DodgerBlue", "yellow", "red", "lime", "lightblue", ]; const upgrade_box = document.createElement("div"); upgrade_box.style.width = "400px"; upgrade_box.style.height = "300px"; upgrade_box.style.backgroundColor = "lightGray"; upgrade_box.style.position = "fixed"; upgrade_box.style.display = "block"; upgrade_box.style.bottom = "10px"; upgrade_box.style.zIndex = 100; for (let i = 1; i < 9; i++) { create_upgrades(`row${i}`, i); } function create_upgrades(name, rownum) { let black_box = document.createElement("div"); black_box.id = name; black_box.style.width = "350px"; black_box.style.height = "20px"; black_box.style.position = "relative"; black_box.style.display = "block"; black_box.style.marginTop = "15px"; black_box.style.left = "25px"; for (let i = 1; i < 8; i++) { let small_box = document.createElement("div"); small_box.id = `s_box${i}`; small_box.style.width = "20px"; small_box.style.height = "20px"; small_box.style.backgroundColor = "black"; small_box.style.display = "inline-block"; small_box.style.border = "2px solid white"; black_box.appendChild(small_box); } let upgrade_btn = document.createElement("button"); upgrade_btn.id = upgrade_names[rownum]; upgrade_btn.style.color = "black"; upgrade_btn.innerHTML = "+"; upgrade_btn.style.width = "20px"; upgrade_btn.style.height = "20px"; upgrade_btn.style.backgroundColor = upgrade_name_colors[rownum]; upgrade_btn.style.display = "inline-block"; upgrade_btn.style.border = "2px solid black"; upgrade_btn.style.cursor = "pointer"; black_box.appendChild(upgrade_btn); let text_el = document.createElement("h3"); text_el.innerText = `[${rownum}] ${upgrade_names[rownum]}`; text_el.style.fontSize = "15px"; text_el.style.display = "inline-block"; black_box.appendChild(text_el); upgrade_box.appendChild(black_box); } // Handle key presses for moving the center (UNFINISHED) /* function return_to_center(XorY, posOrNeg){ console.log("function called with: " + XorY + posOrNeg); if(XorY === "x"){ if(posOrNeg === "pos"){ while(offsetX < 0){ offsetX += 0.5*scalingFactor; } }else if(posOrNeg === "neg"){ while(offsetX > 0){ offsetX -= 0.5*scalingFactor; } }else{ console.log("invalid posOrNeg at return_to_center();") } }else if(XorY === "y"){ if(posOrNeg === "pos"){ while(offsetY < 0){ offsetY += 0.5*scalingFactor; } }else if(posOrNeg === "neg"){ while(offsetY > 0){ offsetY -= 0.5*scalingFactor; } }else{ console.log("invalid posOrNeg at return_to_center();") } }else{ console.log("invalid XorY at return_to_center();"); } } document.onkeydown = function(e) { switch (e.keyCode) { case 87: // 'W' key console.log("W"); if(offsetY >= -87.5*scalingFactor){ offsetY -= 12.5*scalingFactor; } break case 83: // 'S' key console.log("S"); if(offsetY <= 87.5*scalingFactor){ offsetY += 12.5*scalingFactor; } break; case 68: // 'D' key console.log("D"); if(offsetX <= 87.5*scalingFactor){ offsetX += 12.5*scalingFactor; } break case 65: // 'A' key console.log("A"); if(offsetX >= -87.5*scalingFactor){ offsetX -= 12.5*scalingFactor; } break } } document.onkeyup = function(e) { switch (e.keyCode) { case 87: // 'W' key console.log("W unpressed"); return_to_center("y", "pos"); break case 83: // 'S' key console.log("S unpressed"); return_to_center("y", "neg"); break; case 68: // 'D' key console.log("D unpressed"); return_to_center("x", "neg"); break case 65: console.log("A unpressed"); return_to_center("x", "pos"); } } */
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址