您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
you should have not added the google ad tracker or do i misunderstand?
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/21135/134858/20114-%20%28safe%20from%20google%20trackers%29.js
function doMod() { var colorScheme = { 'rgb(205,205,205)': 'rgb(28,28,28)', // background 'rgb(245,245,245)': 'rgb(222,222,222)', // name 'rgb(0,178,225)': 'rgb(22,127,255)', // blue tank 'rgb(241,78,84)': 'rgb(255,33,33)', // red tank / ffa bullet 'rgb(153,153,153)': 'rgb(55,55,55)', // tank's nozzle 'rgb(85,85,85)': 'rgb(10,10,10)', // outline for objects, names and healthbar 'rgb(255,232,105)': 'rgb(255,222,33)', // square / sentry in dominator mode 'rgb(252,118,119)': 'rgb(255,77,0)', // triangle 'rgb(118,141,252)': 'rgb(111,55,255)', // hexagon 'rgb(241,119,221)': 'rgb(255,111,255)', // triangle bot 'rgb(252,195,118)': 'rgb(255,155,55)' // square minion }; var debug_logc = false, debug_colors = [ ], debug_text = ''; function onCanvasFill(fullColor) { fullColor = fullColor.replace(/ /g, ''); //if(debug_logc) { if(debug_colors.indexOf(fullColor) == -1 && !colorScheme.hasOwnProperty(fullColor)) debug_colors.push(fullColor); } if (colorScheme.hasOwnProperty(fullColor)) return document.getElementById('optnDarkTheme').checked ? colorScheme[fullColor] : fullColor; else return fullColor; } function onCanvasStroke(fullColor) { fullColor = fullColor.replace(/ /g, ''); //if(debug_logc) { if(debug_colors.indexOf(fullColor) == -1 && !colorScheme.hasOwnProperty(fullColor)) debug_colors.push(fullColor); } if (colorScheme.hasOwnProperty(fullColor)) return document.getElementById('optnDarkTheme').checked ? colorScheme[fullColor] : fullColor; else return fullColor; } setTimeout(function () { if (debug_logc) { for (var i = 0; i < debug_colors.length; i++) debug_text += debug_colors[i] + ' '; if (debug_text !== '') prompt('Color list', debug_text); } debug_logc = false; }, 10000); var canvas = document.getElementById('canvas'); var nick = document.getElementById('textInput'); var optionsDiv, popupsDiv, trDiv; var keepOptionOpen = false, playerAlive = - 1; var holdingKey = { }; window.onbeforeunload = function () { return 'Quit game?'; }; function editPanels() { optionsDiv = document.createElement('div'); optionsDiv.id = 'gameOptions'; optionsDiv.style = 'position: absolute; display: none; top: 60%; left: 50%; transform: translate(-50%, 0%); width: 340px; padding: 6px 12px; border: 2px dashed #333; background-color: #EEE; color: #000; font-family: Tahoma; font-size: 12px;'; optionsDiv.innerHTML = '<div></div><div></div><div></div>'; document.body.insertBefore(optionsDiv, nick.parentElement.nextElementSibling); optionsDiv.children[0].style = 'margin-bottom: 4px; padding-bottom: 6px; border-bottom: 1px solid #888; font-family: Ubuntu; font-size: 16px; text-align: center'; optionsDiv.children[1].style = 'margin-bottom: 12px;'; optionsDiv.children[2].style = 'font-size: 10px; text-align: right;'; optionsDiv.children[0].innerHTML += 'Game Options<a style="position: absolute; top: 1px; right: 4px; color: #222; text-decoration: none; font-family: serif; font-size: 12px;" href="#">✖</a>'; optionsDiv.children[1].innerHTML += '<div><strong>(Z)</strong><label><input type="checkbox" id="optnAutoRespawn">Auto respawn</label></div>'; optionsDiv.children[1].innerHTML += '<div><strong>(X)</strong><label><input type="checkbox" id="optnAutoFire">Auto fire</label></div>'; optionsDiv.children[1].innerHTML += '<div><strong>(C)</strong><label><input type="checkbox" id="optn4x3">4:3 aspect</label></div>'; optionsDiv.children[1].innerHTML += '<div><strong>(V)</strong><label><input type="checkbox" id="optnDarkTheme">Dark theme</label></div>'; optionsDiv.children[2].innerHTML += '<a style="background-color: #222; color: #AF3; padding: 1px 6px; border-radius: 2px; text-decoration: none; float: left;" href="http://i.imgur.com/zGB6vLI.png" target="_blank">></form>'; popupsDiv = document.createElement('div'); popupsDiv.id = 'notificationPopups'; popupsDiv.style = 'position: absolute; display: flex; flex-direction: column-reverse; bottom: 10px; left: 210px; width: 260px; max-height: 200px; overflow: hidden; font-family: Ubuntu;'; document.body.insertBefore(popupsDiv, optionsDiv.nextElementSibling); trDiv = document.createElement('div'); trDiv.id = 'topRight'; trDiv.style = 'position: absolute; top: 5px; right: 5px;'; document.body.insertBefore(trDiv, popupsDiv.nextElementSibling); optionsDiv.children[0].getElementsByTagName('a') [0].onclick = function (e) { toggleOptions(); e.preventDefault(); }; var options = optionsDiv.children[1]; for (var i = 0; i < options.children.length; i++) { options.children[i].style = 'display: inline-block; width: 50%; margin: 2px 0px;'; options.children[i].children[0].style = 'display: inline-block; width: 18px;'; options.children[i].children[1].style = 'position: relative; top: 1px;'; options.children[i].children[1].children[0].style = 'position: relative; top: 2px;'; } } editPanels(); var inputs = document.getElementsByTagName('input'); for (var i = 0; i < inputs.length; i++) { if (!inputs[i].id) continue; if (localStorage.getItem(inputs[i].id) !== null) { if (inputs[i].type == 'checkbox') inputs[i].checked = JSON.parse(localStorage.getItem(inputs[i].id)); else inputs[i].value = localStorage.getItem(inputs[i].id); } inputs[i].addEventListener('change', onInputsChanged); } function onInputsChanged() { if (this.id == 'optnAutoRespawn' && this.checked) respawnPlayer(); else if (this.id == 'optnAutoFire') simulateKeyPress(69); else if (this.id == 'optn4x3') toggle4x3(this.checked); if (this != nick) createPopup(this.parentNode.textContent + ' <span style="color: ' + (this.checked ? '#9D2;">Enabled</span>' : '#F33;">Disabled</span>')); if (this.type == 'checkbox') localStorage.setItem(this.id, this.checked); else localStorage.setItem(this.id, this.value); } function toggle4x3(enabled) { if (enabled) { canvas.setAttribute('width', window.innerHeight * 4 / 3 + 'px'); canvas.style.width = window.innerHeight * 4 / 3 + 'px'; } else { canvas.setAttribute('width', window.innerWidth); canvas.style.width = ''; } optionsDiv.style.left = canvas.width / 2 + 'px'; } document.addEventListener('keydown', function (e) { var key = e.keyCode || e.which; if (holdingKey[key]) { e.stopPropagation(); return; } if (key == 27) toggleOptions(); if (e.target == nick) { if (key == 13) onPlayerSpawn_Pre(); } else { if (!(e.ctrlKey || e.altKey || e.shiftKey)) { if (key == 90) document.getElementById('optnAutoRespawn').click(); else if (key == 88) document.getElementById('optnAutoFire').click(); else if (key == 67) document.getElementById('optn4x3').click(); else if (key == 86) document.getElementById('optnDarkTheme').click(); } else if (e.shiftKey) { if (key >= 49 && key <= 52) { canvas.dispatchEvent(new MouseEvent('mousemove', { 'clientX': 60, 'clientY': 60 })); setTimeout(function () { canvas.dispatchEvent(new MouseEvent('mousemove', { 'clientX': 60, 'clientY': 60 })); if (canvas.style.cursor == 'pointer') { var nextTank = tankInfo.order[currentTank][key - 49]; if (nextTank) { var data = new Uint8Array([4, nextTank]); proxiedSend.call(wsPrototype, data); currentTank = nextTank; createPopup('Tank upgrade: <span style="color: #FA2;">' + tankInfo.list[nextTank] + '</span>', 4000, '#800'); } } }, 0); } e.stopPropagation(); } holdingKey[key] = true; } }); document.addEventListener('keyup', function (e) { var key = e.keyCode || e.which; holdingKey[key] = false; }); function toggleOptions() { optionsDiv.style.display = optionsDiv.style.display == 'none' ? 'block' : 'none'; keepOptionOpen = keepOptionOpen ? false : true; } function createPopup(msg, displayTime = 2000, bgColor = 'rgba(0,0,0,0.7)') { var popup = document.createElement('div'); popup.style = 'display: table; background-color: ' + bgColor + '; color: #DDD; margin: 2px 0px; max-width: 260px; padding: 0px 16px 2px 16px; border-radius: 30px; font-size: 12px;'; popup.innerHTML = msg; popupsDiv.insertBefore(popup, popupsDiv.firstChild); setTimeout(function () { popup.remove(); }, displayTime); } var observer = new MutationObserver(function (changes) { changes.forEach(function (change) { if (nick.parentElement.style.display == 'none') { onPlayerSpawn(); playerAlive = true; } else { if (playerAlive == - 1) onGameLoad(); else if (playerAlive === true) onPlayerDeath(); playerAlive = false; } }); }); observer.observe(nick.parentElement, { attributes: true, attributeFilter: [ 'style' ] }); function loadTrDiv() { //lol goodbye google...or maybe not????? } setTimeout(loadTrDiv, 10000); setInterval(loadTrDiv, 60000); function onGameLoad() { nick.value = localStorage.getItem('textInput'); optionsDiv.style.display = 'block'; if (document.getElementById('optnAutoRespawn').checked) setTimeout(function () { respawnPlayer(); }, 1000); if (document.getElementById('optn4x3').checked) toggle4x3(true); } function onPlayerSpawn_Pre() { trDiv.style.display = 'none'; if (!keepOptionOpen) optionsDiv.style.display = 'none'; } function onPlayerSpawn() { currentTank = 0; for (var i = 0; i < Object.keys(statInfo).length; i++) statInfo[Object.keys(statInfo) [i]][2] = 0; if (document.getElementById('optnAutoFire').checked) simulateKeyPress(69); } function onPlayerDeath() { trDiv.style.display = 'block'; if (document.getElementById('optnAutoRespawn').checked) respawnPlayer(); else optionsDiv.style.display = 'block'; } function respawnPlayer() { trDiv.style.display = 'none'; nick.focus(); simulateKeyPress(13); if (!keepOptionOpen) optionsDiv.style.display = 'none'; } [ 'blur', 'focus' ].forEach(function (e) { window.addEventListener(e, function () { holdingKey = { }; }); }); window.addEventListener('resize', function () { if (document.getElementById('optn4x3').checked) toggle4x3(true); }); function simulateKeyPress(key) { if (navigator.userAgent.toLowerCase().indexOf('firefox') != - 1) { window.dispatchEvent(new KeyboardEvent('keydown', { keyCode: key })); window.dispatchEvent(new KeyboardEvent('keyup', { keyCode: key })); } else { var eventObj; eventObj = document.createEvent('Events'); eventObj.initEvent('keydown', true, true); eventObj.keyCode = key; window.dispatchEvent(eventObj); eventObj = document.createEvent('Events'); eventObj.initEvent('keyup', true, true); eventObj.keyCode = key; window.dispatchEvent(eventObj); } } // Big thanks to the folks at https://github.com/firebolt55439/Diep.io-Protocol for the codes below var proxiedSend = window.WebSocket.prototype.send; var wsInstances = new Set(); var wsPrototype = null; window.WebSocket.prototype.send = function (data) { if (!wsInstances.has(this)) { wsInstances.add(this); var inst = this; var proxiedRecv = inst.onmessage; this.onmessage = function (event) { event = handleRecvData.call(this, event, proxiedRecv); return proxiedRecv.call(this, event); }; wsPrototype = this; console.log('Successfully hijacked onmessage handler.'); } data = handleSendData.call(this, data); return proxiedSend.call(this, data); }; var statInfo = { 0: [ 'Movement Speed', '43FFF9', 0 ], 2: [ 'Reload', '82FF43', 0 ], 4: [ 'Bullet Damage', 'FF4343', 0 ], 6: [ 'Bullet Penetration', 'FFDE43', 0 ], 8: [ 'Bullet Speed', '437FFF', 0 ], 10: [ 'Body Damage', '8543FF', 0 ], 12: [ 'Max Health', 'F943FF', 0 ], 14: [ 'Health Regen', 'FCAD76', 0 ] }; var currentTank = 0; var tankInfo = { 'list': { 2: 'Twin', 4: 'Triplet', 6: 'Triple Shot', 8: 'Quad Tank', 10: 'Octo Tank', 12: 'Sniper', 14: 'Machine Gun', 16: 'Flank Guard', 18: 'Tri-Angle', 20: 'Destroyer', 22: 'Overseer', 24: 'Overlord', 26: 'Twin Flank', 28: 'Penta Shot', 30: 'Assassin', 34: 'Necromancer', 36: 'Triple Twin', 38: 'Hunter', 40: 'Gunner', 42: 'Stalker', 44: 'Ranger', 46: 'Booster', 48: 'Fighter', 50: 'Hybrid', 52: 'Manager' }, 'order': { 0: [ 2, 12, 14, 16 ], // 'Default': [ 'Twin', 'Sniper', 'Machine Gun', 'Flank Guard' ], 2: [ 6, 8, 26 ], // 'Twin': [ 'Triple Shot', 'Quad Tank', 'Twin Flank' ], 12: [ 30, 22, 38 ], // 'Sniper': [ 'Assassin', 'Overseer', 'Hunter' ], 14: [ 20, 40 ], // 'Machine Gun': [ 'Destroyer', 'Gunner' ], 16: [ 18, 8, 26 ], // 'Flank Guard': [ 'Tri Angle', 'Quad Tank', 'Twin Flank' ], 6: [ 4, 28 ], // 'Triple Shot': [ 'Triplet', 'Penta Shot' ], 8: [ 10 ], // 'Quad Tank': [ 'Octo Tank' ], 26: [ 10, 36 ], // 'Twin Flank': [ 'Octo Tank', 'Triple Twin' ], 30: [ 44, 42 ], // 'Assassin': [ 'Ranger', 'Stalker' ], 22: [ 24, 34, 52 ], // 'Overseer': [ 'Overlord', 'Necromancer', 'Manager' ], 20: [ 50 ], // 'Destroyer' : [ 'Hybrid' ], 18: [ 46, 48 ] // 'Tri-Angle': [ 'Booster', 'Fighter' ], }, 'order_min': { 0: [ 2, 12, 14, 16 ], 2: [ 6, 8, 26 ], 12: [ 30, 22, 38 ], 14: [ 20, 40 ], 16: [ 18, 8, 26 ], 6: [ 4, 28 ], 8: [ 10 ], 26: [ 10, 36 ], 30: [ 44, 42 ], 22: [ 24, 34, 52 ], 20: [ 50 ], 18: [ 46, 48 ] }, 'fullorder_min': { 0: { 2: { 6: [ 4, 28 ], 8: [ 10 ], 26: [ 10, 36 ] }, 12: { 30: [ 44, 42 ], 22: [ 24, 34, 52 ], 38: [ ] }, 14: { 20: [ 50 ], 40: [ ] }, 16: { 18: [ 46, 48 ], 8: [ 10 ], 26: [ 10, 36 ] } } } }; function handleRecvData(event, proxiedRecv) { var dv = new DataView(event.data); var arr = new Uint8Array(event.data); if (arr[0] == 4) { // server info var str = String.fromCharCode.apply(null, arr.slice(1, arr.length - 1)); console.log('WS Packet: ServerInfo. str: ' + str); } return event; } function handleSendData(data) { if (data[0] == 0 || data[0] == 2) { // server connect var str = String.fromCharCode.apply(null, data.slice(1, data.length - 1)); if (data[0] == 0) console.log('WS Packet: OnConnect. Player ID: ' + str); else console.log('WS Packet: OnSpawn. Name: "' + str + '"'); } else if (data[0] == 3) { // stat upgrade var upgrade = data[1]; statInfo[upgrade][2]++; createPopup('Upgraded level ' + statInfo[upgrade][2] + ' <span style="color: #' + statInfo[upgrade][1] + '">' + statInfo[upgrade][0] + '</span>'); } else if (data[0] == 4) { // tank upgrade var upgrade = data[1]; currentTank = upgrade; createPopup('Tank upgrade: <span style="color: #FA2;">' + tankInfo.list[upgrade] + '</span>', 4000, '#800'); } return data; } }