Krunker Cheat

Aimbot, ESP, Recoil Comp, ESP Lines, and Hardcore Mode. Original script by wi1lliott8411; also marked under "downloadURL"

// ==UserScript==
// @name        Krunker Cheat
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Aimbot, ESP, Recoil Comp, ESP Lines, and Hardcore Mode. Original script by wi1lliott8411; also marked under "downloadURL"
// @description:de Aimbot, ESP, Recoil Comp, ESP Lines und Hardcore Mode. Originales Skript von wi1lliott8411; auch noch markiert bei "downloadURL"
// @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-end
// @require      https://unpkg.com/[email protected]/build/three.min.js
// ==/UserScript==

(function() {
    'use strict';

    /************* CSS Styles (Modernized) *************/
    const style = document.createElement('style');
    style.innerHTML = `
    /* Modern System Font Stack */
    :root {
        --neon-color: #00ffff; /* Leuchtendes Cyan */
        --on-color: #00ffff;
        --off-color: #ff4757; /* Kräftiges Rot */
        --bg-dark: rgba(18, 18, 18, 0.9);
        --bg-item: rgba(0, 0, 0, 0.4);
    }

    .msg {
        position: absolute;
        left: 10px;
        bottom: 10px;
        color: #fff;
        background: rgba(0, 0, 0, 0.85);
        font-weight: 500;
        padding: 12px 20px;
        border-radius: 6px;
        box-shadow: 0 4px 15px rgba(0, 0, 0, 0.7);
        animation: msg-in 0.3s forwards cubic-bezier(0.25, 0.8, 0.25, 1), msg-out 0.3s forwards 3s cubic-bezier(0.25, 0.8, 0.25, 1);
        z-index: 999999;
        pointer-events: none;
        font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
    }
    @keyframes msg-in {
        from {transform: translateX(-120%); opacity: 0;}
        to {transform: translateX(0); opacity: 1;}
    }
    @keyframes msg-out {
        from {transform: translateX(0); opacity: 1;}
        to {transform: translateX(-120%); opacity: 0;}
    }

    .zui {
        position: fixed;
        right: 10px;
        top: 10px;
        z-index: 9999;
        display: flex;
        flex-direction: column;
        font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
        font-size: 14px;
        color: #fff;
        width: 280px; /* Slightly wider */
        user-select: none;
        border-radius: 12px; /* Smoother corners */
        overflow: hidden;
        /* Glassmorphism/Acrylic Effect */
        background: var(--bg-dark);
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
        box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.4);
        border: 1px solid rgba(255, 255, 255, 0.18); /* Subtle light border */
    }
    .zui-header {
        background: rgba(30, 30, 30, 0.95);
        padding: 12px;
        font-weight: 700;
        font-size: 17px;
        text-align: center;
        position: relative;
        cursor: pointer;
        color: var(--neon-color);
        border-bottom: 2px solid var(--neon-color);
        text-shadow: 0 0 5px rgba(0, 255, 255, 0.5); /* Neon glow */
    }
    .zui-item {
        padding: 12px 15px;
        display: flex;
        justify-content: space-between;
        align-items: center;
        background: var(--bg-item);
        border-bottom: 1px solid rgba(255, 255, 255, 0.1);
        transition: background 0.2s, color 0.2s;
        cursor: pointer;
        color: #fff;
    }
    .zui-item:last-child {
        border-bottom: none;
    }
    .zui-item:hover {
        background: rgba(0, 255, 255, 0.15); /* Subtle neon highlight on hover */
        color: var(--neon-color);
    }
    .zui-item.text {
        justify-content: center;
        cursor: unset;
        text-align: center;
        background: none;
        border-bottom: none;
        padding: 8px 15px;
        font-size: 12px;
        color: rgba(255, 255, 255, 0.5);
    }
    .zui-item-value {
        font-weight: bold;
        transition: color 0.2s;
    }
    .zui-content {
        color: #fff;
        display: block;
    }
    `;
    document.head.appendChild(style);

    /************* Common Variables and Functions *************/

    const COOKIE_NAME = "krunker_access_auth";
    const COOKIE_VALID_DAYS = 7;

    function setCookie(name, value, days) {
        const date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        const expires = "expires=" + date.toUTCString();
        document.cookie = name + "=" + encodeURIComponent(value) + ";" + expires + ";path=/";
    }

    function getCookie(name) {
        const decodedCookie = decodeURIComponent(document.cookie);
        const ca = decodedCookie.split(';');
        const cookieName = name + "=";
        for (let i = 0; i < ca.length; i++) {
            let c = ca[i].trim();
            if (c.indexOf(cookieName) === 0) {
                return c.substring(cookieName.length, c.length);
            }
        }
        return "";
    }

    function checkAccess() {
        const storedValue = getCookie(COOKIE_NAME);
        if (storedValue) {
            const storedTime = parseInt(storedValue, 10);
            const elapsedTime = Date.now() - storedTime;
            if (elapsedTime < COOKIE_VALID_DAYS * 24 * 60 * 60 * 1000) {
                return true;
            }
        }
        setCookie(COOKIE_NAME, Date.now().toString(), COOKIE_VALID_DAYS);
        return false;
    }

    if (!checkAccess()) {
        console.log("Access denied. Please redownload the script.");
        return;
    }

    console.log("KCS v0.8.0 is loaded.");

    const THREE = window.THREE;
    delete window.THREE;

    // Nur die gewünschten Features behalten
    const settings = {
        aimbotEnabled: false,
        espEnabled: true,
        espLines: false,
        recoilCompEnabled: true,
    };

    const addOnSettings = {
        'Krunker Hardcore Mode': false
    };

    const keyToSetting = {
        KeyB: 'aimbotEnabled',
        KeyM: 'espEnabled',
        KeyN: 'espLines',
        KeyC: 'recoilCompEnabled', // Key C für Recoil Compensation (Bisher kein Key)
        KeyH: 'Krunker Hardcore Mode', // Key H für Hardcore Mode (Bisher kein Key)
    };

    // Key mappings für AddOn settings (für toggleSetting und applyImmediateAddOnEffects)
    const addOnKeyMap = {
        'Krunker Hardcore Mode': 'KeyH'
    };

    let scene;
    let myPlayer;

    const x = {
        window: window,
        document: document,
        querySelector: document.querySelector.bind(document),
        consoleLog: console.log,
        ReflectApply: Reflect.apply,
        ArrayPrototype: Array.prototype,
        ArrayPush: Array.prototype.push,
        ObjectPrototype: Object.prototype,
        clearInterval: window.clearInterval,
        setTimeout: window.setTimeout,
        indexOf: String.prototype.indexOf,
        requestAnimationFrame: window.requestAnimationFrame
    };

    x.consoleLog('Waiting to inject...');

    const proxied = function (object) {
        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(0.0, 1.0, 1.0, 1.0); /* Neon Cyan */
        }
        `
    });

    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 showMsg(message, bool) {
        let msgDiv = document.querySelector('.msg');
        if (!msgDiv) {
            msgDiv = document.createElement('div');
            msgDiv.className = 'msg';
            document.body.appendChild(msgDiv);
        }
        msgDiv.innerText = message;
        msgDiv.style.background = bool ? 'rgba(0, 150, 0, 0.85)' : 'rgba(180, 0, 0, 0.85)';
        msgDiv.style.display = 'block';
        setTimeout(() => {
            // Die Animation im CSS kümmert sich um das Ausblenden
        }, 3000);
    }

    function aimAtTarget(myPlayer, targetPlayer, factor) {
        tempVector.setScalar(0);
        if (targetPlayer && targetPlayer.children && targetPlayer.children[0] && targetPlayer.children[0].children && targetPlayer.children[0].children[0]) {
            targetPlayer.children[0].children[0].localToWorld(tempVector);
        } else {
            tempVector.copy(targetPlayer.position);
        }

        tempObject.position.copy(myPlayer.position);
        tempObject.lookAt(tempVector);

        myPlayer.children[0].rotation.x += factor * (-tempObject.rotation.x - myPlayer.children[0].rotation.x);
        myPlayer.rotation.y += factor * ((tempObject.rotation.y + Math.PI) - myPlayer.rotation.y);
    }

    // Recoil Compensation (Bleibt wie bisher)
    let shooting = false;
    let stableRotationX = 0;
    let noRecoilInterval = null;
    function startNoRecoilLoop() {
        if (noRecoilInterval) return;
        noRecoilInterval = setInterval(() => {
            if (!myPlayer || !shooting || !settings.recoilCompEnabled) return;
            myPlayer.children[0].rotation.x = stableRotationX;
        }, 10);
    }

    function stopNoRecoilLoop() {
        if (noRecoilInterval) {
            clearInterval(noRecoilInterval);
            noRecoilInterval = null;
        }
    }

    window.addEventListener('pointerdown', function(event) {
        if (!myPlayer) return;
        if (event.button === 0) {
            shooting = true;
            stableRotationX = myPlayer.children[0].rotation.x;
            if (settings.recoilCompEnabled) {
                startNoRecoilLoop();
            }
        }
    });

    window.addEventListener('pointerup', function(event) {
        if (event.button === 0) {
            shooting = false;
            stopNoRecoilLoop();
        }
    });

    // Krunker Hardcore Mode
    function enablekrunkerhardcore(){
        console.log("Krunker Hardcore Mode enabled");
        if (scene) {
            scene.fog = new THREE.Fog(0x000000, 10, 50);
        }
    }

    function disablekrunkerhardcore(){
        console.log("Krunker Hardcore Mode disabled");
        if (scene) {
            scene.fog = null;
        }
    }

    function animate() {
        x.requestAnimationFrame.call(x.window, animate);

        if (!scene && !injectTimer) {
            const el = x.querySelector('#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;
                    if (scene && !scene.getObjectByName('espLine')) {
                        line.name = 'espLine';
                        scene.add(line);
                    }
                }, 2000);
            }
        }

        if (!scene) return;

        const players = [];
        myPlayer = null;

        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) {}
            }
        }

        if (!myPlayer) {
            x.consoleLog('No player found.');
            x.ArrayPrototype.push = proxied;
            return;
        }

        let counter = 0;
        let targetPlayer;
        let minDistance = Infinity;
        const maxAimbotDistance = 255;

        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;
            }

            if (settings.espLines) {
                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.box.visible = settings.espEnabled;

            const distance = player.position.distanceTo(myPlayer.position);
            // Ursprüngliche Aimbot-Logik: Nächster Gegner (3D-Distanz)
            if (distance < minDistance && distance <= maxAimbotDistance) {
                targetPlayer = player;
                minDistance = distance;
            }
        }

        if (settings.espLines) {
            linePositions.needsUpdate = true;
            line.geometry.setDrawRange(0, counter);
            line.visible = true;
        } else {
            line.visible = false;
        }

        if (!targetPlayer) return;

        if (settings.aimbotEnabled) {
            aimAtTarget(myPlayer, targetPlayer, 1.0);
        }
    }

    function fromHtml(html) {
        const div = document.createElement('div');
        div.innerHTML = html;
        return div.children[0];
    }

    function createGUI() {
        // HIER wurde das Menü komplett neu aufgebaut, um nur die 5 Features zu zeigen.
        const guiEl = fromHtml(`
        <div class="zui">
            <div class="zui-header">
                Krunker Cheat
                <span class="zui-item-value" style="color:var(--neon-color)">*</span>
            </div>
            <div class="zui-content">
                <div class="zui-section main-settings-section">
                    <div class="zui-item" data-setting="aimbotEnabled">
                        <span>Aimbot (B)</span>
                        <span class="zui-item-value">OFF</span>
                    </div>
                    <div class="zui-item" data-setting="espEnabled">
                        <span>ESP (M)</span>
                        <span class="zui-item-value">OFF</span>
                    </div>
                    <div class="zui-item" data-setting="espLines">
                        <span>ESP Lines (N)</span>
                        <span class="zui-item-value">OFF</span>
                    </div>
                    <div class="zui-item" data-setting="recoilCompEnabled">
                        <span>Recoil Compensation (C)</span>
                        <span class="zui-item-value">OFF</span>
                    </div>
                    <div class="zui-item" data-addon-setting="Krunker Hardcore Mode">
                        <span>Krunker Hardcore Mode (H)</span>
                        <span class="zui-item-value">OFF</span>
                    </div>
                </div>
                <div class="zui-item text">
                    <span>Dev: xenona</span>
                </div>
            </div>
        </div>
        `);

        // Da es nur noch eine Sektion gibt, brauchen wir keine Toggle-Buttons mehr.

        const mainToggleItems = guiEl.querySelectorAll('.main-settings-section .zui-item[data-setting]');
        mainToggleItems.forEach(item => {
            const settingKey = item.getAttribute('data-setting');
            const valueEl = item.querySelector('.zui-item-value');
            updateSettingDisplay(settingKey, settings[settingKey], valueEl);

            item.addEventListener('click', function() {
                settings[settingKey] = !settings[settingKey];
                updateSettingDisplay(settingKey, settings[settingKey], valueEl);
                showMsg(`${fromCamel(settingKey)} ${settings[settingKey] ? 'enabled' : 'disabled'}`, settings[settingKey]);
                applyImmediateEffects(settingKey, settings[settingKey]);
            });
        });

        // Hardcore Mode wird separat behandelt, da es im addOnSettings-Objekt ist (muss bleiben, da es eine spezielle Funktion auslöst)
        const addOnToggleItem = guiEl.querySelector('.main-settings-section .zui-item[data-addon-setting="Krunker Hardcore Mode"]');
        if (addOnToggleItem) {
            const settingName = 'Krunker Hardcore Mode';
            const valueEl = addOnToggleItem.querySelector('.zui-item-value');
            updateAddOnSettingDisplay(settingName, addOnSettings[settingName], valueEl);

            addOnToggleItem.addEventListener('click', function() {
                addOnSettings[settingName] = !addOnSettings[settingName];
                updateAddOnSettingDisplay(settingName, addOnSettings[settingName], valueEl);
                showMsg(`${settingName} ${addOnSettings[settingName] ? 'enabled' : 'disabled'}`, addOnSettings[settingName]);
                applyImmediateAddOnEffects(settingName, addOnSettings[settingName]);
            });
        }

        return guiEl;
    }

    function updateSettingDisplay(settingKey, isActive, valueEl) {
        valueEl.innerText = isActive ? 'ON' : 'OFF';
        // NEON COLORS: Cyan for ON, Vibrant Red for OFF
        valueEl.style.color = isActive ? '#00ffff' : '#ff4757';
    }

    function updateAddOnSettingDisplay(settingName, isActive, valueEl) {
        valueEl.innerText = isActive ? 'ON' : 'OFF';
        // NEON COLORS: Cyan for ON, Vibrant Red for OFF
        valueEl.style.color = isActive ? '#00ffff' : '#ff4757';
    }

    function applyImmediateEffects(settingKey, value) {
        console.log(`Setting ${settingKey} turned ${value ? 'ON' : 'OFF'}`);

        switch(settingKey) {
            case 'aimbotEnabled':
                // AimAssist wurde entfernt, also nur Aimbot übrig
                break;
            case 'espEnabled':
            case 'espLines':
                break;
            case 'recoilCompEnabled':
                // Recoil Comp ist ein Toggle (an/aus) und die Logik wird in pointerdown/up und animate gehandhabt.
                break;
            default:
                console.log(`No action for setting: ${settingKey}`);
        }
    }

    function applyImmediateAddOnEffects(settingName, value) {
        console.log(`Add-On setting ${settingName} turned ${value ? 'ON' : 'OFF'}`);

        switch(settingName) {
            case 'Krunker Hardcore Mode':
                if(value) { enablekrunkerhardcore(); } else { disablekrunkerhardcore(); }
                break;
            default:
                console.log(`No action for Add-On setting: ${settingName}`);
        }
    }

    function fromCamel(text) {
        const result = text.replace(/([A-Z])/g, ' $1');
        return result.charAt(0).toUpperCase() + result.slice(1);
    }

    // Dummy functions für entfernte Features entfernt
    function enableAimbot(){console.log("Aimbot enabled");}
    function disableAimbot(){console.log("Aimbot disabled");}
    function enableESP(){console.log("ESP enabled");}
    function disableESP(){console.log("ESP disabled");}
    function enableESPLines(){console.log("ESP Lines enabled");}
    function disableESPLines(){console.log("ESP Lines disabled");}
    function enableRecoilCompensation(){console.log("Recoil Compensation enabled");}
    function disableRecoilCompensation(){console.log("Recoil Compensation disabled");}

    window.addEventListener('keyup', function (event) {
        if (document.activeElement && document.activeElement.value !== undefined) return;

        // Haupt-Settings-Toggle
        if (keyToSetting[event.code]) {
            const settingKey = keyToSetting[event.code];

            // Überprüfen ob es ein Standard-Setting ist
            if (settings.hasOwnProperty(settingKey)) {
                toggleSetting(settingKey);
            }
            // Überprüfen ob es ein AddOn-Setting ist (Hardcore Mode)
            else if (addOnSettings.hasOwnProperty(settingKey)) {
                addOnSettings[settingKey] = !addOnSettings[settingKey];

                const item = document.querySelector(`.main-settings-section .zui-item[data-addon-setting="${settingKey}"]`);
                if(item) {
                    const valueEl = item.querySelector('.zui-item-value');
                    updateAddOnSettingDisplay(settingKey, addOnSettings[settingKey], valueEl);
                }
                showMsg(`${settingKey} ${addOnSettings[settingKey] ? 'enabled' : 'disabled'}`, addOnSettings[settingKey]);
                applyImmediateAddOnEffects(settingKey, addOnSettings[settingKey]);
            }
        }
    });

    function toggleSetting(key) {
        settings[key] = !settings[key];
        showMsg(`${fromCamel(key)} ${settings[key] ? 'enabled' : 'disabled'}`, settings[key]);
        const item = document.querySelector(`.main-settings-section .zui-item[data-setting="${key}"]`);
        if(item) {
            const valueEl = item.querySelector('.zui-item-value');
            updateSettingDisplay(key, settings[key], valueEl);
        }
        applyImmediateEffects(key, settings[key]);
    }

    function appendGUI() {
        const gui = createGUI();
        document.body.appendChild(gui);
    }

    if (document.readyState === 'loading') {
        window.addEventListener('DOMContentLoaded', appendGUI);
    } else {
        appendGUI();
    }

    animate();

})();