Krunker.IO Aimbot & ESP

Aimbot locks to nearest player & ESP shows players behind walls. Includes toggleable settings. For Krunker.io.

// ==UserScript==
// @name         Krunker.IO Aimbot & ESP
// @namespace    https://gf.qytechs.cn/users/662330-zertalious
// @version      0.3.1
// @description  Aimbot locks to nearest player & ESP shows players behind walls. Includes toggleable settings. For Krunker.io.
// @author       Zertalious
// @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/[email protected]/build/three.min.js
// ==/UserScript==

(function () {
    'use strict';

    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) {
        try {
            if (typeof object === '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;
                }, 2000);
            }
        }

        if (!scene?.children) return;

        const players = [];
        let myPlayer;

        for (const child of scene.children) {
            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 (const player of players) {
            if (!player.box) {
                const box = new THREE.LineSegments(geometry, material);
                box.frustumCulled = false;
                player.add(box);
                player.box = box;
            }

            if (player.position.equals(myPlayer.position)) {
                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 || (settings.aimbotOnRightMouse && !rightMouseDown) || !targetPlayer) 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;
    }

    let rightMouseDown = false;

    function handleMouse(event) {
        if (event.button === 2) rightMouseDown = event.type === 'pointerdown';
    }

    window.addEventListener('pointerdown', handleMouse);
    window.addEventListener('pointerup', handleMouse);

    window.addEventListener('keyup', (event) => {
        if (x.document.activeElement?.value !== undefined) return;
        if (keyToSetting[event.code]) toggleSetting(keyToSetting[event.code]);
        if (event.code === 'Slash') toggleElementVisibility(gui);
    });

    function toggleElementVisibility(el) {
        el.style.display = el.style.display === '' ? 'none' : '';
    }

    animate();

    function createGUI() {
        const guiEl = fromHtml(`
        <div style="position:fixed;top:10px;right:10px;background:#000;padding:10px;color:#fff;z-index:9999;">
            <div>Aimbot & ESP by Zertalious</div>
            ${Object.keys(settings).map(key => `
            <div>
                ${key}: <span id="toggle-${key}">${settings[key]}</span>
            </div>`).join('')}
        </div>`);
        document.body.appendChild(guiEl);
        return guiEl;
    }

    function fromHtml(html) {
        const div = document.createElement('div');
        div.innerHTML = html;
        return div.firstChild;
    }

    function toggleSetting(key) {
        settings[key] = !settings[key];
        document.getElementById(`toggle-${key}`).innerText = settings[key];
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址