// ==UserScript== // @name Krunker.IO Aimbot & ESP // @namespace http://tampermonkey.net/ // @version 0.2.9 // @description Locks aim to the nearest player in krunker.io and shows players behind walls. Also shows a line between you and them. // @author Zertalious (Zert) // @match *://krunker.io/* // @match *://browserfps.com/* // @exclude *://krunker.io/social* // @exclude *://krunker.io/editor* // @icon https://www.google.com/s2/favicons?domain=krunker.io // @grant none // @run-at document-start // @require https://unpkg.com/three@0.150.0/build/three.min.js // @antifeature ads // @downloadURL none // ==/UserScript== const THREE = window.THREE; delete window.THREE; const settings = { aimbotEnabled: true, aimbotOnRightMouse: false, espEnabled: true, espLines: true, wireframe: false }; const keyToSetting = { KeyB: 'aimbotEnabled', KeyL: 'aimbotOnRightMouse', KeyM: 'espEnabled', KeyN: 'espLines', KeyK: 'wireframe' }; const gui = createGUI(); let scene; const x = { window: window, document: document, querySelector: document.querySelector, consoleLog: console.log, ReflectApply: Reflect.apply, ArrayPrototype: Array.prototype, ArrayPush: Array.prototype.push, ObjectPrototype: Object.prototype, clearInterval: window.clearInterval, setTimeout: window.setTimeout, reToString: RegExp.prototype.toString, indexOf: String.prototype.indexOf, requestAnimationFrame: window.requestAnimationFrame }; x.consoleLog( 'Waiting to inject...' ); const proxied = function ( object ) { // [native code] try { if ( typeof object === 'object' && typeof object.parent === 'object' && object.parent.type === 'Scene' && object.parent.name === 'Main' ) { x.consoleLog( 'Found Scene!' ) scene = object.parent; x.ArrayPrototype.push = x.ArrayPush; } } catch ( error ) {} return x.ArrayPush.apply( this, arguments ); } const tempVector = new THREE.Vector3(); const tempObject = new THREE.Object3D(); tempObject.rotation.order = 'YXZ'; const geometry = new THREE.EdgesGeometry( new THREE.BoxGeometry( 5, 15, 5 ).translate( 0, 7.5, 0 ) ); const material = new THREE.RawShaderMaterial( { vertexShader: ` attribute vec3 position; uniform mat4 projectionMatrix; uniform mat4 modelViewMatrix; void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); gl_Position.z = 1.0; } `, fragmentShader: ` void main() { gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); } ` } ); const line = new THREE.LineSegments( new THREE.BufferGeometry(), material ); line.frustumCulled = false; const linePositions = new THREE.BufferAttribute( new Float32Array( 100 * 2 * 3 ), 3 ); line.geometry.setAttribute( 'position', linePositions ); let injectTimer = null; function animate() { x.requestAnimationFrame.call( x.window, animate ); if ( ! scene && ! injectTimer ) { const el = x.querySelector.call( x.document, '#loadingBg' ); if ( el && el.style.display === 'none' ) { x.consoleLog( 'Inject timer started!' ); injectTimer = x.setTimeout.call( x.window, () => { x.consoleLog( 'Injected!' ); x.ArrayPrototype.push = proxied; }, 2e3 ); } } if ( typeof shouldShowAd === 'undefined' || shouldShowAd === true || scene === undefined || ! scene.children ) { return; } const players = []; let myPlayer; for ( let i = 0; i < scene.children.length; i ++ ) { const child = scene.children[ i ]; if ( child.type === 'Object3D' ) { try { if ( child.children[ 0 ].children[ 0 ].type === 'PerspectiveCamera' ) { myPlayer = child; } else { players.push( child ); } } catch ( err ) {} } else if ( child.material ) { child.material.wireframe = settings.wireframe; } } if ( ! myPlayer ) { x.consoleLog( 'Player not found, finding new scene.' ); x.ArrayPrototype.push = proxied; return; } let counter = 0; let targetPlayer; let minDistance = Infinity; tempObject.matrix.copy( myPlayer.matrix ).invert() for ( let i = 0; i < players.length; i ++ ) { const player = players[ i ]; if ( ! player.box ) { const box = new THREE.LineSegments( geometry, material ); box.frustumCulled = false; player.add( box ); player.box = box; } if ( player.position.x === myPlayer.position.x && player.position.z === myPlayer.position.z ) { player.box.visible = false; if ( line.parent !== player ) { player.add( line ); } continue; } linePositions.setXYZ( counter ++, 0, 10, - 5 ); tempVector.copy( player.position ); tempVector.y += 9; tempVector.applyMatrix4( tempObject.matrix ); linePositions.setXYZ( counter ++, tempVector.x, tempVector.y, tempVector.z ); player.visible = settings.espEnabled || player.visible; player.box.visible = settings.espEnabled; const distance = player.position.distanceTo( myPlayer.position ); if ( distance < minDistance ) { targetPlayer = player; minDistance = distance; } } linePositions.needsUpdate = true; line.geometry.setDrawRange( 0, counter ); line.visible = settings.espLines; if ( settings.aimbotEnabled === false || ( settings.aimbotOnRightMouse && ! rightMouseDown ) || targetPlayer === undefined ) { return; } tempVector.setScalar( 0 ); targetPlayer.children[ 0 ].children[ 0 ].localToWorld( tempVector ); tempObject.position.copy( myPlayer.position ); tempObject.lookAt( tempVector ); myPlayer.children[ 0 ].rotation.x = - tempObject.rotation.x; myPlayer.rotation.y = tempObject.rotation.y + Math.PI; } const value = parseInt( new URLSearchParams( window.location.search ).get( 'showAd' ), 16 ); const shouldShowAd = isNaN( value ) || Date.now() - value < 0 || Date.now() - value > 10 * 60 * 1000; function removeQueries() { const withoutQuery = window.location.href.split( '?' )[ 0 ]; const params = new URLSearchParams( window.location.search ); params.delete( 'showAd' ); params.delete( 'scriptVersion' ); const newUrl = withoutQuery + '?' + params.toString(); window.history.pushState( null, '', newUrl ); } removeQueries(); const el = document.createElement( 'div' ); el.innerHTML = `