您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A Community Script for Krunker
// ==UserScript== // @name The Gaming Guru Community Script // @namespace https://skidlamer.github.io/ // @version 0.1 // @description A Community Script for Krunker // @author The Gaming Guru Community // @iconURL https://cdn.discordapp.com/icons/692606346645733396/2c8c01e76973634afcaec17d22ba5e80.webp?size=128 // @match *://krunker.io/* // @grant none // ==/UserScript== (function(script, state) { 'use strict'; const states = { updating:"GAME UPDATING\n", disconect:"DISCONNECTED\n", connecting:"CONNECTING...\n", ready:"CLICK TO PLAY\n", } var me; var GUI; var showMenu = true; var menuDirty = true; var features = []; var updatedFeat = new Map(); var players = new Map(); var vars = new Map(); var downKeys = new Set(); let setVars = function() { vars.set("isYou", {regex:/this\['\w+']=k,this\['(\w+)']=w,this\['\w+']=!0x0/,pos:1}) vars.set("inView", {regex:/if\(!\w+\['(\w+)']\)continue/,pos:1}) for (const [name, object] of vars.entries()) { let result = object.regex.exec(script); if ( result ) { object.val = result[object.pos]; console.log("found: ", name, " at ", result.index, " value: ", object.val); } else { object.val = null; alert("Failed to find ", name); } } } let decodeText = function(str, array, xor) { for (var i = 0, il = array.byteLength; i < il; i ++) { str += String.fromCharCode(array.getUint8(i) ^ xor); } try { return decodeURIComponent( escape( str ) ); } catch ( e ) { return str; } } let getVersion = function() { const elems = document.getElementsByClassName('terms'); const version = elems[elems.length - 1].innerText; return version; } let saveAs = function(name, data) { let blob = new Blob([data], {type: 'text/plain'}); let el = window.document.createElement("a"); el.href = window.URL.createObjectURL(blob); el.download = name; document.body.appendChild(el); el.click(); document.body.removeChild(el); } let isDefined = function(object) { return void 0 !== object; } let isType = function(item, type) { return typeof item === type; } let addObserver = function(elm, check, callback, onshow = true) { return new MutationObserver((mutationsList, observer) => { if (check == 'src' || onshow && mutationsList[0].target.style.display == 'block' || !onshow) { callback(mutationsList[0].target); } }).observe(elm, check == 'childList' ? { childList: true } : { attributes: true, attributeFilter: [check] }); } let addListener = function(elm, type, callback = null) { if (!isDefined(elm)) { alert("Failed creating " + type + "listener"); return } elm.addEventListener(type, event => callback(event)); } //Storage let canStore = (typeof(Storage) !== "undefined"); let saveVal = function(name, val) { if (canStore) localStorage.setItem(name, val); } let deleteVal = function(name) { if (canStore) localStorage.removeItem(name); } let getSavedVal = function(name) { if (canStore) return localStorage.getItem(name); return null; } //Features let newFeature = (name, keyBind, array, myFunction = null) => { const cStruct = (...keys) => ((...v) => keys.reduce((o, k, i) => { o[k] = v[i]; return o }, {})); let item = []; const myStruct = cStruct('name', 'key', 'value', 'valueStr', 'container', 'myFunction') const value = parseInt(getSavedVal("utilities_" + name) || 0); const feature = myStruct(name, keyBind, value, array.length ? array[value] : '', array, myFunction); if (array.length || myFunction) features.push(feature); item.push(feature); return item; } let getFeature = (name) => { for (const feature of features) { if (feature.name.toLowerCase() === name.toLowerCase()) { return feature; } } return null; } let onUpdated = (feature) => { window.SOUND.play('tick_0', 0.1); if (feature.container.length) { feature.value += 1; if (feature.value > feature.container.length - 1) { feature.value = 0; } feature.valueStr = feature.container[feature.value]; saveVal("utilities_" + feature.name, feature.value); } if (feature.container.length == 2 && feature.container[0] == 'Off' && feature.container[1] == 'On') { console.debug(feature.name, " is now ", feature.valueStr); } if (!updatedFeat.has(feature.name)) { console.debug(feature.name, " - Update Pending ") updatedFeat.set(feature.name, feature); } menuDirty = true; } // keyDown let keyDown = (key) => downKeys.has(key) // onTick Function let onTick = function(game, delta) { if (!isDefined(me) || !me || !me.active) return; const featureBhop = getFeature('Bhop'); if (isDefined(featureBhop) && featureBhop.value) { if (keyDown("Space") || featureBhop.value !== 2 && featureBhop.value !== 4) { game.controls.keys[game.controls.jumpKey] ^= 1; game.controls.keys[game.controls.crouchKey] = (me.yVel < -0.04 && me.canSlide) && featureBhop.value !== 1 && featureBhop.value !== 2 ? 1 : 0; } } } // onInitialize let initialize = function() { //Add Features newFeature('ESP', "5", ['Off', 'On']); newFeature('Bhop', "6", ['Off', 'Auto Jump', 'Key Jump', 'Auto Slide', 'Key Slide']); // GameState addObserver(window.instructionHolder, 'style', (target) => { state = target.innerText; if (state.includes(states.updating)) { alert(state); location.reload(); } else console.log(state) }); // GUI Init GUI = document.getElementById("myGUI"); if (GUI == null) { GUI = document.createElement('div'); GUI.id = "myGUI"; GUI.style = "float:left;width:100%;background-color: rgba(0,0,0,0.25);border-radius:5%;text-align:right;line-height:0.8;margin-top:5%;"; } // Input/output let mouseDownL = false, mouseDownM = false, mouseDownR = false; addListener(document, "keyup", event => { if (downKeys.has(event.code)) downKeys.delete(event.code) }) addListener(document, "keydown", event => { if ('INPUT' == document.activeElement.tagName || !window.endUI && window.endUI.style.display) return; switch (event.code) { case 'F1': showMenu ^= 1; window.SOUND.play('tick_0', 0.1); menuDirty = showMenu; break; case 'F2': saveAs("game_" + getVersion() + ".js", script); break; default: if (!downKeys.has(event.code)) downKeys.add(event.code); for (const feature of features) { if (feature && "Digit" + feature.key == event.code) { if (feature.container.length) onUpdated(feature); else if (typeof feature.myFunction === "function") feature.myFunction(); } } break; } }) addListener(document, "mousedown", event =>{ const Left=0, Middle=1, Right=2; switch(event.button) { case Left: mouseDownL = true; break; case Middle: mouseDownM = true; break; case Right: mouseDownR = true; break; default: break; } }); addListener(document, "mouseup", event =>{ const Left=0, Middle=1, Right=2; switch(event.button) { case Left: mouseDownL = false; break; case Middle: mouseDownM = false; break; case Right: mouseDownR = false; break; default: break; } }); //Hook Array Array.prototype.push = new Proxy(Array.prototype.push, { apply: function(target, that, [item, ...sub]) { if (!state) return target.apply(that, [item, ...sub]); let size = target.apply(that, [item, ...sub]); if (item instanceof Object && item.isPlayer) { players.set(size - 1, item); } return size; } }) //Hook Frame window.requestAnimationFrame = new Proxy(window.requestAnimationFrame, { apply: function(target, that, args) { for (let [key, player] of players) { if (player && player.active) { if (player[vars.get("isYou").val]) { me = player; if (!player.update.proxy) { player.update = new Proxy(player.update, { apply: function(target, that, [game, delta]) { that.update.proxy = true; onTick(game, delta); return target.apply(that, [game, delta]); } }) } else { const topLeft = document.getElementById("topLeftHolder"); if (topLeft && GUI) { if (!topLeft.contains(GUI)) { topLeft.appendChild(GUI); } else if (showMenu) { if (menuDirty) { menuDirty = false; GUI.innerHTML = "<br><h4 style='text-align:center;color:#1E90FF;'>Community Skid</h4><hr>"; for (const feature of features) { GUI.innerHTML += `<h5><span style='float:left;margin-left:10%;color:rgba(255,193,72,255)'>${feature.key}</span> <span style='float:left;margin-left:10%;color:rgba(255,255,255,255)'>${feature.name}</span> <span style=float:all;margin-right:10%;margin-left:10%;color:${feature.valueStr == "On" ? "#B2F252" : feature.valueStr == "Off" ? "#FF4444" : "#999EA5"};'>${feature.valueStr}</span></h5>`; } GUI.innerHTML += "<br>"; } } else if (GUI.innerHTML) GUI.innerHTML = null; } for (let[name, feature] of updatedFeat) { updatedFeat.delete(name); } } } else { const featureESP = getFeature('ESP'); if (isDefined(featureESP) && featureESP) { player[vars.get("inView").val] = featureESP.value; } } } } return target.apply(that, args); } }) } // Hook Promise Respose to buff Response.prototype.arrayBuffer = new Proxy(Response.prototype.arrayBuffer, { apply: function(target, that, args) { const returnValue = target.apply(that, args); returnValue.then(buffer => { script = decodeText("", new DataView(buffer), 0x69); setVars(); initialize(); }); return returnValue; } }) })("", null);