// ==UserScript== // @name KRUNKVILLAIN - Krunker.io HACK AIMBOT ESP BHOP // @namespace Roogybot // @version 1.0.1 // @description Aimbot, Auto Reload, Auto BHop and Wall Hack for Krunker.io // @author Roogybot // @include https://krunker.io/ // @include https://krunker.io/?game=* // @grant GM_xmlhttpRequest // @run-at document-start // ==/UserScript== var OnOffMode; (function (OnOffMode) { OnOffMode["On"] = "On"; OnOffMode["Off"] = "Off"; })(OnOffMode || (OnOffMode = {})); class Module { constructor() { this.allStates = this.getAllModes(); this.currentModeIndex = this.allStates.indexOf(this.getInitialMode()); } onModeChanged() { // Let implementations override this if needed } onTick() { // Let implementations override this if needed } getInitialMode() { return this.allStates[0]; } onKeyPressed() { this.currentModeIndex++; if (this.currentModeIndex >= this.allStates.length) { this.currentModeIndex = 0; } this.onModeChanged(); } isEnabled() { return this.currentModeIndex !== 0; } getStatus() { return this.allStates[this.currentModeIndex].toString(); } getCurrentMode() { return this.allStates[this.currentModeIndex]; } } var AimbotMode; (function (AimbotMode) { AimbotMode["Off"] = "Off"; AimbotMode["Quickscoper"] = "Quickscoper"; AimbotMode["OnRMB"] = "On RMB"; })(AimbotMode || (AimbotMode = {})); class Aimbot extends Module { constructor() { super(...arguments); this.scopingOut = false; this.canShoot = true; } getName() { return 'Aimbot'; } getKey() { return 'I'; } getAllModes() { return [AimbotMode.Off, AimbotMode.Quickscoper, AimbotMode.OnRMB]; } onTick() { if (!this.players) { return; } const possibleTargets = this.players .filter(player => { return player.active && player.inView && !player.isYou && (!player.team || player.team !== this.me.team); }) .sort((p1, p2) => this.distance(this.me, p1) - this.distance(this.me, p2)); let isLockedOn = false; if (possibleTargets.length > 0) { const target = possibleTargets[0]; switch (this.getCurrentMode()) { case AimbotMode.Quickscoper: isLockedOn = this.runQuickscoper(target); break; case AimbotMode.OnRMB: isLockedOn = this.runOnRMB(target); break; } } if (!isLockedOn) { this.control.camLookAt(null); this.control.target = null; if (this.getCurrentMode() === AimbotMode.Quickscoper) { this.control.mouseDownL = 0; this.control.mouseDownR = 0; } } } runQuickscoper(target) { if (this.me.didShoot) { this.canShoot = false; setTimeout(() => { this.canShoot = true; }, this.me.weapon.rate); } if (this.control.mouseDownL === 1) { this.control.mouseDownL = 0; this.control.mouseDownR = 0; this.scopingOut = true; } if (this.me.aimVal === 1) { this.scopingOut = false; } if (this.scopingOut || !this.canShoot || this.me.recoilForce > 0.01) { return false; } this.lookAt(target); if (this.control.mouseDownR === 0) { this.control.mouseDownR = 1; } else if (this.me.aimVal < 0.2) { this.control.mouseDownL = 1 - this.control.mouseDownL; } return true; } runOnRMB(target) { if (this.control.mouseDownR === 0) { return false; } this.lookAt(target); return true; } lookAt(target) { this.control.camLookAt(target.x2, target.y2 + target.height - 1.5 - 2.5 * target.crouchVal - this.me.recoilAnimY * 0.3 * 25, target.z2); } distance(player1, player2) { const dx = player1.x - player2.x; const dy = player1.y - player2.y; const dz = player1.z - player2.z; return Math.sqrt(dx * dx + dy * dy + dz * dz); } } var BHopMode; (function (BHopMode) { BHopMode["Off"] = "Off"; BHopMode["Jump"] = "Jump"; BHopMode["SlideJump"] = "Slide Jump"; })(BHopMode || (BHopMode = {})); class AutoBHop extends Module { constructor() { super(...arguments); this.isSliding = false; } getName() { return 'Auto BHop'; } getKey() { return 'B'; } getAllModes() { return [BHopMode.Off, BHopMode.Jump, BHopMode.SlideJump]; } onTick() { this.control.keys[32] = !this.control.keys[32]; if (this.getCurrentMode() === BHopMode.SlideJump) { if (this.isSliding) { this.inputs[8] = 1; return; } if (this.me.yVel < -0.04 && this.me.canSlide) { this.isSliding = true; setTimeout(() => { this.isSliding = false; }, 350); this.inputs[8] = 1; } } } } class AutoReload extends Module { getName() { return 'Auto Reload'; } getKey() { return 'J'; } getAllModes() { return [OnOffMode.Off, OnOffMode.On]; } getInitialMode() { return OnOffMode.On; } onTick() { if (this.me.ammos[this.me.weaponIndex] === 0) { this.inputs[9] = 1; } } } class WallHack extends Module { getName() { return 'Wall Hack'; } getKey() { return 'O'; } getAllModes() { return [OnOffMode.Off, OnOffMode.On]; } getInitialMode() { unsafeWindow.wallHackEnabled = true; return OnOffMode.On; } onModeChanged() { unsafeWindow.wallHackEnabled = this.getCurrentMode() === OnOffMode.On; } } class Krunkbot { constructor() { this.modules = []; } init() { this.modules.push(new Aimbot()); this.modules.push(new AutoReload()); this.modules.push(new WallHack()); this.modules.push(new AutoBHop()); const initInfoBoxInterval = setInterval(() => { if (this.canInjectInfoBox()) { clearInterval(initInfoBoxInterval); this.injectInfoBox(); this.updateInfoBox(); } }, 100); } onTick(me, inputs) { this.modules.forEach(module => { if (module.isEnabled()) { module.me = me; module.inputs = inputs; module.control = unsafeWindow.control; module.players = unsafeWindow.players; module.onTick(); } }); } onKeyPressed(e) { let shouldUpdateInfoBox = false; this.modules.forEach(module => { if (module.getKey().toUpperCase() === e.key.toUpperCase()) { module.onKeyPressed(); shouldUpdateInfoBox = true; } }); if (shouldUpdateInfoBox) { this.updateInfoBox(); } } updateInfoBox() { const infoBox = unsafeWindow.document.querySelector('#krunkbotInfoBox'); if (infoBox === null) { return; } const moduleLines = this.modules.map(module => { return `
[${module.getKey().toUpperCase()}] ${module.getName()}
${module.getStatus()}
`; }); infoBox.innerHTML = `
Krunkbot
${moduleLines.join('')} `.trim(); } injectInfoBox() { const infoBox = unsafeWindow.document.createElement('div'); infoBox.innerHTML = `
`.trim(); const leaderDisplay = unsafeWindow.document.querySelector('#leaderDisplay'); leaderDisplay.parentNode.insertBefore(infoBox.firstChild, leaderDisplay.nextSibling); } canInjectInfoBox() { return unsafeWindow.document.querySelector('#leaderDisplay') !== null; } } // tslint:disable no-console class Logger { constructor(prefix) { this.prefix = prefix; } log(...message) { console.log(this.prefix, ...message); } error(...message) { console.error(this.prefix, ...message); } crash(message) { document.open(); document.write(` Krunkbot has crashed!
Krunkbot has crashed!
Error message: ${message}
`); document.close(); throw new Error(`${this.prefix} ${message}`); } } const logger = new Logger('[Krunkbot]'); function applyPatch(script, method, regex, replacer) { const newScript = script.replace(regex, replacer); if (script === newScript) { logger.crash(`${method} was not successful`); } return newScript; } function patchControl(script) { return applyPatch(script, 'patchControl', /var ([a-zA-Z0-9]+)=this,([a-zA-Z0-9]+)=([a-zA-Z0-9]+)\.renderer\.domElement/, ($0, $1, $2, $3) => { return `var ${$1} = window.control = this, ${$2} = ${$3}.renderer.domElement;`; }); } function patchPlayers(script) { return applyPatch(script, 'patchPlayers', /if\(this\.now/, 'window.players = this.players.list; if (this.now'); } function patchOnTick(script) { return applyPatch(script, 'patchOnTick', /,([a-zA-Z0-9]+)\.procInputs\(([a-zA-Z0-9]+)/, ($0, $1, $2) => { return `, window.onTick(${$1}, ${$2}), ${$1}.procInputs(${$2}`; }); } function patchOnKeyPressed(script) { return applyPatch(script, 'patchOnKeyPressed', /"keyup",function\(([a-zA-Z0-9]+)\){/, ($0, $1) => { return `"keyup", function (${$1}) { if (document.activeElement !== chatInput) { window.onKeyPressed(${$1}); }`; }); } function patchForAimbot(script) { return applyPatch(script, 'patchForAimbot', /{if\(this\.target\){(.+)}},this.camLookAt=/, ($0, $1) => { return ` { if (this.target) { this.object.rotation.y = this.target.yD; this.pitchObject.rotation.x = this.target.xD; const half = Math.PI / 2; this.pitchObject.rotation.x = Math.max(-half, Math.min(half, this.pitchObject.rotation.x)); this.yDr = this.pitchObject.rotation.x % Math.PI; this.xDr = this.object.rotation.y % Math.PI; ${$1} } }, this.camLookAt = `; }); } function patchForWallHack(script) { return applyPatch(script, 'patchForWallHack', /if\(([a-zA-Z0-9]+)\.inView\){(.+)}else ([a-zA-Z0-9]+)\.style\.display="none"}var ([a-zA-Z0-9]+);/, ($0, $1, $2, $3, $4) => { return ` if (${$1}.inView || window.wallHackEnabled) { ${$2} } else ${$3}.style.display = "none" } var ${$4}; `; }); } function patchIsHacker(script) { return applyPatch(script, 'patchIsHacker', /&&([a-zA-Z0-9]+)\.isHacker&&/, `&& 1 === 0 &&`); } function patchLastHack(script) { return applyPatch(script, 'patchIsHacker', /&&([a-zA-Z0-9]+)\.lastHack&&/, `&& 1 === 0 &&`); } function patchServerSearch(script) { return applyPatch(script, 'patchServerSearch', /([a-zA-Z0-9]+)\.data\.([a-zA-Z0-9]+)\.toLowerCase/, ($0, $1, $2) => { return `(${$1}.data.${$2} || '').toLowerCase`; }); } function patchStyleErrors(script) { return applyPatch(script, 'patchStyleErrors', /else document\.getElementById\("healthBarE"\+([a-zA-Z0-9]+)\)\.style\.width=([a-zA-Z0-9]+)\+"%"/, ($0, $1, $2) => { return `else (document.getElementById("healthBarE" + ${$1}) || { style: {} }).style.width = ${$2} + "%"`; }); } function patchGameScript(script) { logger.log('Patching the game script...'); script = patchControl(script); script = patchPlayers(script); script = patchOnTick(script); script = patchOnKeyPressed(script); script = patchForAimbot(script); script = patchForWallHack(script); script = patchIsHacker(script); script = patchLastHack(script); script = patchServerSearch(script); script = patchStyleErrors(script); logger.log('Successfully patched the game script!'); return script; } function request(url) { return new Promise(resolve => { logger.log(`Retrieving ${url}`); GM_xmlhttpRequest({ url, method: 'GET', onload: response => resolve(response.responseText), }); }); } function replaceRemoteScriptWithInline(html, partialSrc, script) { const inline = ``; const regExp = new RegExp(``); const withoutScriptTag = html.replace(regExp, ''); return withoutScriptTag + inline; } async function inlineRemoteScript(html, partialSrc) { const regExp = new RegExp(``); const [, prefix, suffix] = regExp.exec(html); const script = await request(prefix + partialSrc + suffix); return replaceRemoteScriptWithInline(html, partialSrc, script); }