您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Zoom Hack.
// ==UserScript== // @name Bloble.io Zoom The Patch // @namespace http://tampermonkey.net/ // @version 1.0 // @description Zoom Hack. // @author IMPERATOR // @match http://bloble.io/* // @grant none // ==/UserScript== window.UIList = window.UIList || []; window.initFuncs = window.initFuncs || []; window.statusItems = window.statusItems || []; window.sendIndex = 0; window.loops = 0; window.hasSentTarget = false; window.usePatch = true; window.cache = []; window.cacheHeight = 0; window.cacheIndexes = 0; window.shift = false; window.sendFrequency = 1E3 / 15 window.UIList.push({ level: 3, x: 0, description: 'Zoom Patch', html: '<div id="patch" onclick=patch()>Disable ZP</div>' }); window.statusItems.push({ name: 'Zoom Patch', order: 2, value: function () { return usePatch ? 'On' : 'Off'; } }); window.patch = function () { var el = document.getElementById('patch'); if (usePatch) { usePatch = false socket.emit("2", Math.round(camX), Math.round(camY)) el.textContent = 'Enable ZP' } else { usePatch = true; el.textContent = 'Disable ZP'; populate(); } window.statusBar(); return usePatch; } function populate() { if (!usePatch) return; cacheHeight = Math.round(maxScreenHeight / 1080); cacheIndexes = cacheHeight * cacheHeight - 1; for (var i = cache.length; i < cacheIndexes; i++) { cache[i] = spiral(i); } } populate(); window.addEventListener('keyup', function (a) { a = a.keyCode ? a.keyCode : a.which; if (a == 70) { // F to out (maxScreenHeight = 30000, maxScreenWidth = 53333, resize(true)); cameraSpd = (shift ? 1.8 : .85) * (Math.log(maxScreenHeight / 1080) + 1) populate() } if (a == 67) { // C to zoom in (maxScreenHeight = 1080, maxScreenWidth = 1920, resize(true)) cameraSpd = shift ? 1.8 : .85; populate() } if (a === 16) { shift = false; cameraSpd = .85 * (Math.log(maxScreenHeight / 1080) + 1); } }) window.addEventListener('keydown', function (a) { a = a.keyCode ? a.keyCode : a.which; if (a === 16) { shift = true; cameraSpd = 1.8 * (Math.log(maxScreenHeight / 1080) + 1); } }) function zoom(a) { a = window.event || a; a.preventDefault(); a.stopPropagation(); scroll = Math.max(-1, Math.min(1, a.wheelDelta || -a.detail)) if (scroll == -1) { //zoom out if (maxScreenHeight < 30000) { (maxScreenHeight += 250, maxScreenWidth += 250, resize(true)); cameraSpd = (shift ? 1.8 : .85) * (Math.log(maxScreenHeight / 1080) + 1) scroll = 0 populate() } } if (scroll == 1) { //zoom in if (maxScreenHeight > 1080) { (maxScreenHeight -= 250, maxScreenWidth -= 250, resize(true)) cameraSpd = (shift ? 1.8 : .85) * (Math.log(maxScreenHeight / 1080) + 1) scroll = 0 populate() } } } mainCanvas.addEventListener ? (window.addEventListener("mousewheel", zoom, !1), mainCanvas.addEventListener("DOMMouseScroll", zoom, !1)) : window.attachEvent("onmousewheel", zoom); function spiral(n) { var r = Math.floor((Math.sqrt(n + 1) - 1) / 2) + 1; var p = (8 * r * (r - 1)) / 2; var en = r * 2; var a = (1 + n - p) % (r * 8); var pos = [0, 0, r]; switch (Math.floor(a / (r * 2))) { case 0: pos[0] = a - r; pos[1] = -r; break; case 1: pos[0] = r; pos[1] = (a % en) - r; break; case 2: pos[0] = r - (a % en); pos[1] = r; break; case 3: pos[0] = -r; pos[1] = r - (a % en); break; } return pos; } window.initFuncs.push(function () { var js = window.updateGameLoop.toString(); var ind = js.indexOf('if (gameState && mapBounds) {'); if (ind === -1) ind = js.indexOf('if (gameState&&mapBounds) {'); if (ind === -1) ind = js.indexOf('if(gameState&&mapBounds){'); var ind2 = js.indexOf('}', ind); var n = js.substring(0, ind) + 'if(gameState&&mapBounds){if(camXS||camYS)camX+=camXS*cameraSpd*a,camY+=camYS*cameraSpd*a;player.x+camX<mapBounds[0]?camX=mapBounds[0]-player.x:player.x+camX>mapBounds[0]+mapBounds[2]&&(camX=mapBounds[0]+mapBounds[2]-player.x);player.y+camY<mapBounds[1]?camY=mapBounds[1]-player.y:player.y+camY>mapBounds[1]+mapBounds[3]&&(camY=mapBounds[1]+mapBounds[3]-player.y);if(currentTime-lastCamSend>=sendFrequency)if(lastCamSend=currentTime,usePatch&&cacheIndexes)if(lastCamX!=camX||lastCamY!=camY)lastCamX=camX,lastCamY=camY,loop=sendIndex=0;else{if(4>=loop){if(sendIndex%2)(sendIndex-1)%6?socket.emit("2",Math.round(camX),Math.round(camY)):socket.emit("2",0,0);else{var index=sendIndex/2;index>=cacheIndexes?(sendIndex=0,loop++):socket.emit("2",Math.round(camX+1920*cache[index][0]),Math.round(camY+1080*cache[index][1]))}hasSentTarget=!1;sendIndex++}}else lastCamX==camX&&lastCamY==camY&&hasSentTarget||(lastCamX=camX,hasSentTarget=!0,lastCamY=camY,loop=0,socket.emit("2",Math.round(camX),Math.round(camY)))}' + js.substr(ind2 + 1); n = n.substring(n.indexOf('{') + 1, n.lastIndexOf('}')); window.updateGameLoop = new Function('a', n) }); window.makeUI = function () { if (window.hasMadeUI) return; window.hasMadeUI = true; window.statusItems.sort(function (a, b) { return a.order - b.order; }) var levels = []; window.UIList.forEach((item) => { if (!levels[item.level]) levels[item.level] = []; levels[item.level].push(item) }) levels = levels.filter((a) => { if (a) { a.sort(function (a, b) { return a.x - b.x; }) return true; } else { return false; } }) var headAppend = document.getElementsByTagName("head")[0], style = document.createElement("div"); var toast = document.createElement('div'); toast.id = "snackbar"; var css = document.createElement('div'); css.innerHTML = '<style>\n\ #snackbar {\n\ visibility: hidden;\n\ min-width: 250px;\n\ margin-left: -125px;\n\ background-color: rgba(40, 40, 40, 0.5);\n\ color: #fff;\n\ text-align: center;\n\ border-radius: 4px;\n\ padding: 10px;\n\ font-family: "regularF";\n\ font-size: 20px;\n\ position: fixed;\n\ z-index: 100;\n\ left: 50%;\n\ top: 30px;\n\ }\n\ #snackbar.show {\n\ visibility: visible;\n\ -webkit-animation: fadein 0.5s;\n\ animation: fadein 0.5s;\n\ }\n\ #snackbar.hide {\n\ visibility: visible;\n\ -webkit-animation: fadeout 0.5s;\n\ animation: fadeout 0.5s;\n\ }\n\ @-webkit-keyframes fadein {\n\ from {top: 0; opacity: 0;}\n\ to {top: 30px; opacity: 1;}\n\ }\n\ @keyframes fadein {\n\ from {top: 0; opacity: 0;}\n\ to {top: 30px; opacity: 1;}\n\ }\n\ @-webkit-keyframes fadeout {\n\ from {top: 30px; opacity: 1;}\n\ to {top: 0; opacity: 0;}\n\ }\n\ @keyframes fadeout {\n\ from {top: 30px; opacity: 1;}\n\ to {top: 0; opacity: 0;}\n\ }\n\ </style>' var height = levels.length * (14 + 19) + (levels.length - 1) * 7 + 15; style.innerHTML = "<style>\n\ #noobscriptUI, #noobscriptUI > div > div {\n\ background-color:rgba(40,40,40,.5);\n\ margin-left: 3px;\n\ border-radius:4px;\n\ pointer-events:all\n\ }\n\ #noobscriptUI {\n\ top: -" + (height + 12) + "px;\n\ transition: 1s;\n\ margin-left:10px;\n\ position:absolute;\n\ padding-left:24px;\n\ margin-top:9px;\n\ padding-top:15px;\n\ width:580px;\n\ height: " + height + "px;\n\ font-family:arial;\n\ left:25%\n\ }\n\ #noobscriptUI:hover{\n\ top:0px\n\ }\n\ #noobscriptUI > div > div {\n\ color:#fff;\n\ padding:7px;\n\ height:19px;\n\ display:inline-block;\n\ cursor:pointer;\n\ font-size:15px\n\ }\n\ </style>" headAppend.appendChild(style); headAppend.appendChild(css); var contAppend = document.getElementById("gameUiContainer"), menuA = document.createElement("div"); var code = ['<div id="noobscriptUI">\n']; levels.forEach((items, i) => { code.push(i === 0 ? ' <div>\n' : ' <div style="margin-top:7px;">\n'); items.forEach((el) => { code.push(' ' + el.html + '\n'); }) code.push(' </div>\n'); }) code.push(' <div id="confinfo" style="margin-top:4px; color: white; text-align: center; font-size: 10px; white-space:pre"></div>') code.push('</div>'); menuA.innerHTML = code.join(""); contAppend.insertBefore(menuA, contAppend.firstChild) contAppend.appendChild(toast) var toastTimeout = false; window.showToast = function (msg) { toast.textContent = msg; if (toastTimeout) clearTimeout(toastTimeout); else toast.className = "show"; toastTimeout = setTimeout(function () { toast.className = 'hide' setTimeout(function () { toast.className = ''; }, 400); toastTimeout = false; }, 3000); } window.statusBar = function () { var el = document.getElementById('confinfo'); var text = []; window.statusItems.forEach((item, i) => { if (i !== 0) text.push(' '); if (item.name) text.push(item.name + ': '); text.push(item.value()); }) el.textContent = text.join(''); } window.statusBar(); window.initFuncs.forEach((func) => { func(); }) } setTimeout(() => { window.makeUI(); }, 1000)