KremCheats - KrunkBrutal (Aimbot Mega Update)

Krunker Play safe - ESP, Aimbot, Rage, Triggerbot and more

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         KremCheats - KrunkBrutal (Aimbot Mega Update)
// @version      1.2
// @icon         https://i.imgur.com/zv8kMZS.png
// @description  Krunker Play safe - ESP, Aimbot, Rage, Triggerbot and more
// @author       KremCheats
// @license      All Rights Reserved
// @match        *://krunker.io/*
// @match        *://browserfps.com/*
// @run-at       document-start
// @require      https://cdn.jsdelivr.net/npm/[email protected]/build/three.min.js
// @grant        GM_setValue
// @grant        GM_getValue
// @namespace    https://greasyfork.org/users/1546742
// ==/UserScript==

/*
 * KremCheats - KrunkBrutal v1.0
 * Copyright (c) 2024 KremCheats
 * All Rights Reserved - Private Code
 * Discord: https://discord.gg/MHCcGgsX56
 */

(function(_0x4f8a2b) {
    'use strict';

    // --- ADVANCED BYPASS LOGIC ---
    var _0xa = window.alert, _0xb = window.confirm, _0xc = window.prompt;
    window.alert = function(_0xm) { if (_0xm && typeof _0xm === 'string') { var _0xl = _0xm.toLowerCase(); if (_0xl.includes('extension') || _0xl.includes('disable') || _0xl.includes('plugin') || _0xl.includes('blocker') || _0xl.includes('detected')) return; } return _0xa.apply(this, arguments); };
    window.confirm = function(_0xm) { if (_0xm && typeof _0xm === 'string') { var _0xl = _0xm.toLowerCase(); if (_0xl.includes('extension') || _0xl.includes('disable') || _0xl.includes('plugin') || _0xl.includes('blocker') || _0xl.includes('detected')) return false; } return _0xb.apply(this, arguments); };
    window.prompt = function(_0xm) { if (_0xm && typeof _0xm === 'string') { var _0xl = _0xm.toLowerCase(); if (_0xl.includes('extension') || _0xl.includes('disable') || _0xl.includes('plugin')) return null; } return _0xc.apply(this, arguments); };

    try { Object.defineProperty(navigator, 'plugins', { get: function() { return []; }, configurable: true }); } catch(_0xe) {}
    try { Object.defineProperty(navigator, 'webdriver', { get: function() { return false; }, configurable: true }); } catch(_0xe) {}
    try { Object.defineProperty(navigator, 'languages', { get: function() { return ['en-US', 'en']; }, configurable: true }); } catch(_0xe) {}

    var _0xgt = Date.prototype.getTime;
    Date.prototype.getTime = function() { return _0xgt.call(this) + Math.random() * 2 - 1; };

    window.chrome = window.chrome || {};
    window.chrome.runtime = undefined;

    var _0xof = window.fetch;
    window.fetch = function() { 
        var _0xu = arguments[0]; 
        if (typeof _0xu === 'string' && (_0xu.includes('chrome-extension://') || _0xu.includes('anticheat') || _0xu.includes('detection'))) return Promise.reject(new Error('blocked')); 
        return _0xof.apply(this, arguments); 
    };

    // --- CONFIGURATION ---
    var DISCORD_URL = 'https://discord.gg/MHCcGgsX56';
    var LOGO_URL = 'https://i.imgur.com/zv8kMZS.png';

    var colorList = [
        { name: "Red", value: "1.0, 0.0, 0.0", hex: "#ff0000" },
        { name: "Orange", value: "1.0, 0.5, 0.0", hex: "#ff8000" },
        { name: "Yellow", value: "1.0, 1.0, 0.0", hex: "#ffff00" },
        { name: "Green", value: "0.0, 1.0, 0.0", hex: "#00ff00" },
        { name: "Cyan", value: "0.0, 1.0, 1.0", hex: "#00ffff" },
        { name: "Blue", value: "0.0, 0.0, 1.0", hex: "#0000ff" },
        { name: "Purple", value: "0.5, 0.0, 1.0", hex: "#8000ff" },
        { name: "Pink", value: "1.0, 0.0, 0.5", hex: "#ff0080" },
        { name: "White", value: "1.0, 1.0, 1.0", hex: "#ffffff" }
    ];

    var defaultCfg = {
        aimbotOn: true,
        aimbone: 'head',
        aimStr: 10000,
        aimKey: 'MouseRight',
        vertAdj: 9.5,
        vertOn: true,
        predInt: 1.0,
        aimSmooth: 0.1,
        visCheck: false,

        rageOn: false,
        rageSmooth: 0.6,
        rageOff: 0.6,
        rageDist: 100000,
        rageVis: false,
        rageBone: 'head',
        rageKey: 'None',
        rageAlways: true,

        triggerOn: false,
        triggerFov: 30,
        triggerDelay: 50,

        fovOn: true,
        fovShow: true,
        fovSize: 200,
        fovCol: '#ff0000',
        fovRgb: false,

        espOn: true,
        espIdx: 0,
        espCol: "1.0, 0.0, 0.0",
        espThick: 2,
        espDist: true,
        espMax: 500,
        espHp: true,
        espLine: false,
        espLinePos: 'bottom',
        espRgb: false,

        wireOn: false,
        wireRgb: false,
        worldWire: false,
        chamsOn: true,
        chamsCol: '#ff0000',

        tpOn: false,
        camX: 0,
        camY: 2,
        camZ: -5,

        noRecoil: 0,
        silentOn: false,
        speedOn: false,
        speedVal: 1.5,
        jumpOn: false,
        bhopOn: false,

        uiHidden: false,
        panic: false,

        keys: {
            togAim: 'KeyT',
            togEsp: 'KeyE',
            cycCol: 'KeyC',
            togRgb: 'KeyR'
        }
    };

    var cfg = Object.assign({}, defaultCfg, GM_getValue('kremCfg', {}));

    var sceneRef = null, initTimer = null;
    var rightDown = false, keyDown = false, rageKeyDown = false;
    var lockOn = false, locked = null, posHist = {};
    var rgbLoop = null, hue = 0, localRef = null;
    var lastTrigger = 0;

    var stablePitch = null, stableYaw = null, stableRotY = null, stableChildX = null;
    var firing = false, lastFire = 0;

    var gameState = null, playerObj = null, inputObj = null;

    function waitGame() {
        if (typeof window.gameState !== "undefined" && typeof window.player !== "undefined" && typeof window.input !== "undefined") {
            gameState = window.gameState;
            playerObj = window.player;
            inputObj = window.input;
        } else {
            setTimeout(waitGame, 500);
        }
    }
    waitGame();

    setInterval(function() {
        if (!playerObj || !gameState) {
            if (typeof window.player !== "undefined") playerObj = window.player;
            if (typeof window.gameState !== "undefined") gameState = window.gameState;
            if (typeof window.input !== "undefined") inputObj = window.input;
        }
    }, 2000);

    var Engine = window.THREE;
    delete window.THREE;

    var utils = { win: window, doc: document, arrPush: Array.prototype.push, raf: window.requestAnimationFrame };

    var detectScene = function(obj) {
        try {
            if (typeof obj === 'object' && typeof obj.parent === 'object' && obj.parent.type === 'Scene' && obj.parent.name === 'Main') {
                sceneRef = obj.parent;
                Array.prototype.push = utils.arrPush;
            }
        } catch (e) {}
        return utils.arrPush.apply(this, arguments);
    };

    var tempVec = new Engine.Vector3();
    var tempObj = new Engine.Object3D();
    tempObj.rotation.order = 'YXZ';

    var boxGeo = new Engine.EdgesGeometry(new Engine.BoxGeometry(4.8, 14.8, 4.8).translate(0, 7.4, 0));

    var espMat = new Engine.RawShaderMaterial({
        vertexShader: 'attribute vec3 position;uniform mat4 projectionMatrix;uniform mat4 modelViewMatrix;void main(){vec4 p=projectionMatrix*modelViewMatrix*vec4(position,1.0);p.z=0.1;gl_Position=p;}',
        fragmentShader: 'precision mediump float;uniform vec3 espColor;void main(){gl_FragColor=vec4(espColor,1.0);}',
        uniforms: { espColor: { value: new Engine.Vector3(1.0, 0.0, 0.0) } },
        depthTest: false, depthWrite: false, transparent: true
    });

    var lineGeo = new Engine.BufferGeometry();
    var linePos = new Engine.BufferAttribute(new Float32Array(300), 3);
    lineGeo.setAttribute('position', linePos);

    var lineMat = new Engine.LineBasicMaterial({ color: 0xff0000, linewidth: 2, depthTest: false, depthWrite: false, transparent: true });
    var lineVis = new Engine.LineSegments(lineGeo, lineMat);
    lineVis.frustumCulled = false;
    lineVis.renderOrder = 9998;

    var hpCanvas = document.createElement('canvas');
    hpCanvas.width = window.innerWidth;
    hpCanvas.height = window.innerHeight;
    hpCanvas.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;z-index:9998;';

    var raycaster = new Engine.Raycaster();

    function updateEspColor() {
        var parts = cfg.espCol.split(',').map(function(v) { return parseFloat(v.trim()); });
        espMat.uniforms.espColor.value.set(parts[0], parts[1], parts[2]);
        lineMat.color.setRGB(parts[0], parts[1], parts[2]);
    }

    function saveCfg() { GM_setValue('kremCfg', cfg); }

    function startRgb() {
        if (rgbLoop) return;
        rgbLoop = setInterval(function() {
            hue = (hue + 2) % 360;
            var rgb = hslRgb(hue / 360, 1, 0.5);
            if (cfg.espRgb) {
                cfg.espCol = rgb.r + ', ' + rgb.g + ', ' + rgb.b;
                updateEspColor();
            }
            if (cfg.fovRgb) {
                var fov = document.getElementById('krem-fov');
                if (fov) fov.style.borderColor = 'hsl(' + hue + ', 100%, 50%)';
            }
            if (cfg.wireRgb) {
                cfg.chamsCol = 'hsl(' + hue + ', 100%, 50%)';
            }
        }, 30);
    }

    function stopRgb() {
        if (rgbLoop) { clearInterval(rgbLoop); rgbLoop = null; }
    }

    function hslRgb(h, s, l) {
        var r, g, b;
        if (s === 0) { r = g = b = l; }
        else {
            var hue2rgb = function(p, q, t) {
                if (t < 0) t += 1; if (t > 1) t -= 1;
                if (t < 1/6) return p + (q - p) * 6 * t;
                if (t < 1/2) return q;
                if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
                return p;
            };
            var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
            var p = 2 * l - q;
            r = hue2rgb(p, q, h + 1/3);
            g = hue2rgb(p, q, h);
            b = hue2rgb(p, q, h - 1/3);
        }
        return { r: r.toFixed(2), g: g.toFixed(2), b: b.toFixed(2) };
    }

    function blockMouse(e) { e.stopImmediatePropagation(); e.preventDefault(); }

    function onDown(e) {
        if (cfg.panic) return;
        if (cfg.aimKey === 'MouseRight' && e.button === 2) { keyDown = true; rightDown = true; }
        else if (cfg.aimKey === 'MouseLeft' && e.button === 0) { keyDown = true; }
        else if (cfg.aimKey === 'MouseMiddle' && e.button === 1) { keyDown = true; }
        if (cfg.rageKey === 'MouseRight' && e.button === 2) rageKeyDown = true;
        else if (cfg.rageKey === 'MouseLeft' && e.button === 0) rageKeyDown = true;
        else if (cfg.rageKey === 'MouseMiddle' && e.button === 1) rageKeyDown = true;
    }

    function onUp(e) {
        if (e.button === 2 || e.button === 0 || e.button === 1) {
            rightDown = false; keyDown = false; rageKeyDown = false; lockOn = false; locked = null;
            document.removeEventListener('mousemove', blockMouse, true);
        }
    }

    function getHp(ent) {
        try {
            if (!gameState || !gameState.players) return 100;
            var players = Object.values(gameState.players);
            for (var i = 0; i < players.length; i++) {
                var p = players[i];
                if (p && p.pos) {
                    var dx = Math.abs(p.pos.x - ent.position.x);
                    var dz = Math.abs(p.pos.z - ent.position.z);
                    if (dx < 1 && dz < 1) return p.health || 100;
                }
            }
            return ent.health !== undefined ? ent.health : 100;
        } catch (e) { return 100; }
    }

    function applySpeed() {
        try {
            if (!playerObj || cfg.panic) return;
            if (playerObj.velocity) {
                playerObj.velocity.x *= cfg.speedVal;
                playerObj.velocity.z *= cfg.speedVal;
            }
        } catch (e) {}
    }

    function applyBhop() {
        try {
            if (!playerObj || !cfg.bhopOn || cfg.panic) return;
            if (playerObj.onGround || playerObj.grounded || (playerObj.velocity && playerObj.velocity.y === 0)) {
                if (playerObj.velocity) playerObj.velocity.y = 0.11;
                if (playerObj.canJump !== undefined) playerObj.canJump = true;
            }
        } catch (e) {}
    }

    function applyJump() {
        try {
            if (!playerObj || cfg.panic) return;
            if (playerObj.jumpHeight !== undefined) {
                if (!playerObj._ojh) playerObj._ojh = playerObj.jumpHeight;
                playerObj.jumpHeight = playerObj._ojh * 1.8;
            }
            if (playerObj.jumpVel !== undefined) {
                if (!playerObj._ojv) playerObj._ojv = playerObj.jumpVel;
                playerObj.jumpVel = playerObj._ojv * 1.5;
            }
        } catch (e) {}
    }

    function applyNoRecoil() {
        try {
            if (cfg.noRecoil === 0 || !playerObj || cfg.panic) return;
            var red = cfg.noRecoil / 100;
            if (playerObj.weapon) {
                if (playerObj.weapon.recoil !== undefined) playerObj.weapon.recoil *= (1 - red);
                if (playerObj.weapon.recoilMult !== undefined) playerObj.weapon.recoilMult = (1 - red);
            }
            if (playerObj.recoil !== undefined) playerObj.recoil *= (1 - red);
            if (playerObj.recoilAnimY !== undefined) playerObj.recoilAnimY *= (1 - red);
            if (playerObj.recoilAnimX !== undefined) playerObj.recoilAnimX *= (1 - red);

            if (cfg.noRecoil === 100) {
                var now = Date.now();
                var isFiring = playerObj.didShoot || (playerObj.weapon && playerObj.weapon.shooting) || (inputObj && inputObj.mouseDown) || (now - lastFire < 100);
                if (playerObj.didShoot) lastFire = now;

                if (isFiring && !firing) {
                    if (playerObj.camera) { stablePitch = playerObj.camera.pitch; stableYaw = playerObj.camera.yaw; }
                    stableRotY = playerObj.rotation ? playerObj.rotation.y : null;
                    if (playerObj.children && playerObj.children[0]) stableChildX = playerObj.children[0].rotation.x;
                    firing = true;
                }

                if (firing) {
                    if (playerObj.camera && stablePitch !== null) {
                        playerObj.camera.pitch = stablePitch;
                        playerObj.camera.yaw = stableYaw;
                    }
                    if (stableRotY !== null && playerObj.rotation) playerObj.rotation.y = stableRotY;
                    if (playerObj.children && playerObj.children[0] && stableChildX !== null) playerObj.children[0].rotation.x = stableChildX;
                    if (playerObj.recoilAnimY !== undefined) playerObj.recoilAnimY = 0;
                    if (playerObj.recoilAnimX !== undefined) playerObj.recoilAnimX = 0;
                    if (playerObj.weapon) {
                        if (playerObj.weapon.recoil !== undefined) playerObj.weapon.recoil = 0;
                        if (playerObj.weapon.spread !== undefined) playerObj.weapon.spread = 0;
                    }
                }

                if (!isFiring && firing) {
                    firing = false;
                    stablePitch = null; stableYaw = null; stableRotY = null; stableChildX = null;
                }
            }
        } catch (e) {}
    }

    function applyWireframe(ent) {
        try {
            if (!ent.children || !ent.children[0] || !ent.children[0].children || cfg.panic) return;
            var mesh = ent.children[0].children[0];
            if (mesh && mesh.material) {
                mesh.material.wireframe = cfg.wireOn;
                mesh.material.transparent = true;
                mesh.material.fog = false;
                mesh.material.depthWrite = false;
                if (cfg.chamsOn) {
                    mesh.material.depthTest = false;
                    var col = new Engine.Color(cfg.chamsCol);
                    if (mesh.material.color) mesh.material.color.copy(col);
                    if (mesh.material.emissive) mesh.material.emissive.copy(col);
                } else {
                    mesh.material.depthTest = true;
                }
            }
        } catch (e) {}
    }

    function isVisible(from, to, scene) {
        if (!cfg.rageVis) return true;
        try {
            var dir = new Engine.Vector3().subVectors(to, from).normalize();
            raycaster.set(from, dir);
            raycaster.far = from.distanceTo(to);
            var walls = scene.children.filter(function(c) { return c.type === 'Mesh' && c.geometry; });
            var hits = raycaster.intersectObjects(walls, true);
            return hits.length === 0;
        } catch (e) { return true; }
    }

    function isTeammate(ent, local) {
        try {
            if (!gameState || !gameState.players) return false;
            var localTeam = null, entTeam = null;
            var players = Object.values(gameState.players);
            for (var i = 0; i < players.length; i++) {
                var p = players[i];
                if (p && p.pos) {
                    if (Math.abs(p.pos.x - local.position.x) < 1 && Math.abs(p.pos.z - local.position.z) < 1) localTeam = p.team;
                    if (Math.abs(p.pos.x - ent.position.x) < 1 && Math.abs(p.pos.z - ent.position.z) < 1) entTeam = p.team;
                }
            }
            return localTeam !== null && entTeam !== null && localTeam === entTeam;
        } catch (e) { return false; }
    }

    function hasHead(ent) {
        try {
            return ent.children && ent.children[0] && ent.children[0].children && ent.children[0].children.length > 4 &&
                   ent.children[0].children[4] && ent.children[0].children[4].children &&
                   ent.children[0].children[4].children[0] && ent.children[0].children[4].children[0].name === 'head';
        } catch (e) { return false; }
    }

    function getHeadPos(ent) {
        var pos = new Engine.Vector3();
        try {
            if (hasHead(ent)) {
                ent.children[0].children[4].children[0].getWorldPosition(pos);
            } else {
                pos.copy(ent.position);
                pos.y += 11;
            }
        } catch (e) {
            pos.copy(ent.position);
            pos.y += 11;
        }
        return pos;
    }

    function getTargetPos(ent, bone) {
        var pos = getHeadPos(ent);
        if (bone === 'chest') pos.y -= 4;
        else if (bone === 'body') pos.y -= 7;
        return pos;
    }

    function getKeyName(code) {
        if (!code || code === 'None') return 'None';
        if (code.startsWith('Key')) return code.replace('Key', '');
        if (code.startsWith('Mouse')) return code.replace('Mouse', 'M');
        return code.replace('Left', '').replace('Right', '');
    }

    function initUI() {
        if (document.getElementById('krem-root')) return;

        var root = document.createElement('div');
        root.id = 'krem-root';
        root.innerHTML = [
            '<style>',
            '#krem-root{font-family:"Segoe UI",Arial,sans-serif;user-select:none}',
            '.km{position:fixed;top:60px;left:60px;width:520px;background:linear-gradient(180deg,#0d0d0d 0%,#080808 100%);border:1px solid #1a1a1a;border-radius:6px;z-index:99999;box-shadow:0 8px 32px rgba(0,0,0,0.95)}',
            '.km.min .km-body{display:none}',
            '.km-hdr{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:linear-gradient(90deg,#0f0f0f 0%,#151515 100%);border-bottom:2px solid #ff0000;border-radius:6px 6px 0 0;cursor:move}',
            '.km-hdr-l{display:flex;align-items:center;gap:12px}',
            '.km-logo{width:36px;height:36px;border-radius:6px;border:1px solid #ff0000}',
            '.km-title{font-size:16px;font-weight:800;color:#ff0000;letter-spacing:2px;text-shadow:0 0 10px rgba(255,0,0,0.5)}',
            '.km-ver{font-size:10px;color:#555;margin-top:2px}',
            '.km-hdr-r{display:flex;gap:8px}',
            '.km-btn{width:28px;height:28px;border:1px solid #333;background:rgba(255,0,0,0.1);color:#ff0000;border-radius:4px;cursor:pointer;font-size:14px;font-weight:bold;transition:all 0.2s}',
            '.km-btn:hover{background:rgba(255,0,0,0.3);border-color:#ff0000}',
            '.km-dc{padding:6px 12px;background:linear-gradient(135deg,#5865F2 0%,#4752C4 100%);color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:600;transition:all 0.2s}',
            '.km-dc:hover{transform:scale(1.05);box-shadow:0 0 12px rgba(88,101,242,0.5)}',
            '.km-body{display:flex;height:420px}',
            '.km-nav{width:110px;background:#080808;border-right:1px solid #151515;padding:8px 0}',
            '.km-tab{padding:12px 14px;font-size:11px;font-weight:700;color:#444;cursor:pointer;border-left:3px solid transparent;transition:all 0.2s;letter-spacing:0.5px}',
            '.km-tab:hover{color:#888;background:rgba(255,255,255,0.02)}',
            '.km-tab.on{color:#ff0000;background:linear-gradient(90deg,rgba(255,0,0,0.1) 0%,transparent 100%);border-left-color:#ff0000}',
            '.km-main{flex:1;overflow-y:auto;padding:14px}',
            '.km-main::-webkit-scrollbar{width:6px}',
            '.km-main::-webkit-scrollbar-track{background:#080808}',
            '.km-main::-webkit-scrollbar-thumb{background:#ff0000;border-radius:3px}',
            '.km-pnl{display:none}',
            '.km-pnl.on{display:block}',
            '.km-sec{background:linear-gradient(180deg,#0f0f0f 0%,#0a0a0a 100%);border:1px solid #1a1a1a;border-radius:6px;padding:14px;margin-bottom:12px}',
            '.km-sec-t{font-size:11px;font-weight:800;color:#ff0000;margin-bottom:12px;text-transform:uppercase;letter-spacing:1px;padding-bottom:8px;border-bottom:1px solid #1a1a1a}',
            '.km-row{display:flex;justify-content:space-between;align-items:center;padding:8px 0;border-bottom:1px solid #111}',
            '.km-row:last-child{border-bottom:none}',
            '.km-lbl{font-size:12px;color:#888}',
            '.km-tog{width:40px;height:20px;background:#1a1a1a;border-radius:10px;position:relative;cursor:pointer;transition:all 0.2s;border:1px solid #222}',
            '.km-tog::after{content:"";position:absolute;width:16px;height:16px;background:#444;border-radius:50%;top:1px;left:2px;transition:all 0.2s}',
            '.km-tog.on{background:#ff0000;border-color:#ff0000}',
            '.km-tog.on::after{left:21px;background:#fff}',
            '.km-sld-w{padding:8px 0}',
            '.km-sld-h{display:flex;justify-content:space-between;font-size:12px;color:#888;margin-bottom:6px}',
            '.km-sld-v{color:#ff0000;font-weight:700}',
            '.km-sld{width:100%;height:4px;-webkit-appearance:none;background:#1a1a1a;border-radius:2px;outline:none}',
            '.km-sld::-webkit-slider-thumb{-webkit-appearance:none;width:14px;height:14px;background:#ff0000;border-radius:50%;cursor:pointer;box-shadow:0 0 8px rgba(255,0,0,0.5)}',
            '.km-sel{width:100%;padding:8px 10px;background:#111;border:1px solid #222;border-radius:4px;color:#aaa;font-size:12px;outline:none}',
            '.km-sel:focus{border-color:#ff0000}',
            '.km-sel option{background:#0a0a0a}',
            '.km-key{padding:6px 12px;background:#111;border:1px solid #222;border-radius:4px;color:#ff0000;font-size:10px;font-weight:700;cursor:pointer;min-width:60px;text-align:center;transition:all 0.2s}',
            '.km-key:hover{border-color:#ff0000;box-shadow:0 0 8px rgba(255,0,0,0.3)}',
            '.km-key.rec{background:#ff0000;color:#000}',
            '.km-col{width:60px;height:28px;border:1px solid #222;border-radius:4px;cursor:pointer;background:transparent}',
            '#krem-fov{position:fixed;border:2px solid;border-radius:50%;pointer-events:none;z-index:9999;transform:translate(-50%,-50%)}',
            '</style>',
            '<div class="km" id="km">',
            '<div class="km-hdr" id="km-hdr">',
            '<div class="km-hdr-l">',
            '<img class="km-logo" src="' + LOGO_URL + '">',
            '<div><div class="km-title">KremCheats - KrunkBrutal</div><div class="km-ver">Version 1.0</div></div>',
            '</div>',
            '<div class="km-hdr-r">',
            '<button class="km-dc" onclick="window.open(\'' + DISCORD_URL + '\',\'_blank\')">DISCORD</button>',
            '<button class="km-btn" id="km-min">−</button>',
            '</div>',
            '</div>',
            '<div class="km-body">',
            '<div class="km-nav">',
            '<div class="km-tab on" data-t="aim">AIMBOT</div>',
            '<div class="km-tab" data-t="rage">RAGE</div>',
            '<div class="km-tab" data-t="esp">ESP</div>',
            '<div class="km-tab" data-t="vis">VISUALS</div>',
            '<div class="km-tab" data-t="misc">MISC</div>',
            '<div class="km-tab" data-t="cfg">CONFIG</div>',
            '</div>',
            '<div class="km-main">',

            '<div class="km-pnl on" data-p="aim">',
            '<div class="km-sec">',
            '<div class="km-sec-t">Aimbot Settings</div>',
            '<div class="km-row"><span class="km-lbl">Enable Aimbot</span><div class="km-tog' + (cfg.aimbotOn ? ' on' : '') + '" data-k="aimbotOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Prediction</span><div class="km-tog' + (cfg.vertOn ? ' on' : '') + '" data-k="vertOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Visibility Check</span><div class="km-tog' + (cfg.visCheck ? ' on' : '') + '" data-k="visCheck"></div></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Target Bone</div>',
            '<select class="km-sel" id="aimbone">',
            '<option value="head"' + (cfg.aimbone === 'head' ? ' selected' : '') + '>Head</option>',
            '<option value="chest"' + (cfg.aimbone === 'chest' ? ' selected' : '') + '>Chest</option>',
            '<option value="body"' + (cfg.aimbone === 'body' ? ' selected' : '') + '>Body</option>',
            '</select>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Aim Settings</div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Aim Strength</span><span class="km-sld-v" id="aimStr-v">' + cfg.aimStr + '</span></div><input type="range" class="km-sld" id="aimStr" min="100" max="20000" value="' + cfg.aimStr + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Prediction</span><span class="km-sld-v" id="predInt-v">' + cfg.predInt.toFixed(1) + '</span></div><input type="range" class="km-sld" id="predInt" min="0" max="3" step="0.1" value="' + cfg.predInt + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Vertical Offset</span><span class="km-sld-v" id="vertAdj-v">' + cfg.vertAdj.toFixed(1) + '</span></div><input type="range" class="km-sld" id="vertAdj" min="0" max="20" step="0.5" value="' + cfg.vertAdj + '"></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">FOV Circle</div>',
            '<div class="km-row"><span class="km-lbl">Enable FOV</span><div class="km-tog' + (cfg.fovOn ? ' on' : '') + '" data-k="fovOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Show Circle</span><div class="km-tog' + (cfg.fovShow ? ' on' : '') + '" data-k="fovShow"></div></div>',
            '<div class="km-row"><span class="km-lbl">RGB FOV</span><div class="km-tog' + (cfg.fovRgb ? ' on' : '') + '" data-k="fovRgb"></div></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>FOV Size</span><span class="km-sld-v" id="fovSize-v">' + cfg.fovSize + '</span></div><input type="range" class="km-sld" id="fovSize" min="50" max="600" value="' + cfg.fovSize + '"></div>',
            '</div>',
            '</div>',

            '<div class="km-pnl" data-p="rage">',
            '<div class="km-sec">',
            '<div class="km-sec-t">Rage Aimbot</div>',
            '<div class="km-row"><span class="km-lbl">Enable Rage</span><div class="km-tog' + (cfg.rageOn ? ' on' : '') + '" data-k="rageOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Always Active</span><div class="km-tog' + (cfg.rageAlways ? ' on' : '') + '" data-k="rageAlways"></div></div>',
            '<div class="km-row"><span class="km-lbl">Visible Only</span><div class="km-tog' + (cfg.rageVis ? ' on' : '') + '" data-k="rageVis"></div></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Rage Target</div>',
            '<select class="km-sel" id="rageBone">',
            '<option value="head"' + (cfg.rageBone === 'head' ? ' selected' : '') + '>Head</option>',
            '<option value="chest"' + (cfg.rageBone === 'chest' ? ' selected' : '') + '>Chest</option>',
            '<option value="body"' + (cfg.rageBone === 'body' ? ' selected' : '') + '>Body</option>',
            '</select>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Rage Key</div>',
            '<select class="km-sel" id="rageKey">',
            '<option value="None"' + (cfg.rageKey === 'None' ? ' selected' : '') + '>None (Always)</option>',
            '<option value="MouseRight"' + (cfg.rageKey === 'MouseRight' ? ' selected' : '') + '>Right Mouse</option>',
            '<option value="MouseLeft"' + (cfg.rageKey === 'MouseLeft' ? ' selected' : '') + '>Left Mouse</option>',
            '<option value="KeyV"' + (cfg.rageKey === 'KeyV' ? ' selected' : '') + '>V Key</option>',
            '</select>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Rage Settings</div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Smoothing</span><span class="km-sld-v" id="rageSmooth-v">' + cfg.rageSmooth.toFixed(2) + '</span></div><input type="range" class="km-sld" id="rageSmooth" min="0.1" max="1" step="0.05" value="' + cfg.rageSmooth + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Offset</span><span class="km-sld-v" id="rageOff-v">' + cfg.rageOff.toFixed(2) + '</span></div><input type="range" class="km-sld" id="rageOff" min="0" max="2" step="0.1" value="' + cfg.rageOff + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Max Distance</span><span class="km-sld-v" id="rageDist-v">' + cfg.rageDist + '</span></div><input type="range" class="km-sld" id="rageDist" min="100" max="100000" step="100" value="' + cfg.rageDist + '"></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Triggerbot</div>',
            '<div class="km-row"><span class="km-lbl">Enable Triggerbot</span><div class="km-tog' + (cfg.triggerOn ? ' on' : '') + '" data-k="triggerOn"></div></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Trigger FOV</span><span class="km-sld-v" id="triggerFov-v">' + cfg.triggerFov + 'px</span></div><input type="range" class="km-sld" id="triggerFov" min="5" max="100" value="' + cfg.triggerFov + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Trigger Delay</span><span class="km-sld-v" id="triggerDelay-v">' + cfg.triggerDelay + 'ms</span></div><input type="range" class="km-sld" id="triggerDelay" min="0" max="200" value="' + cfg.triggerDelay + '"></div>',
            '</div>',
            '</div>',

            '<div class="km-pnl" data-p="esp">',
            '<div class="km-sec">',
            '<div class="km-sec-t">ESP Settings</div>',
            '<div class="km-row"><span class="km-lbl">Enable ESP</span><div class="km-tog' + (cfg.espOn ? ' on' : '') + '" data-k="espOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Show Distance</span><div class="km-tog' + (cfg.espDist ? ' on' : '') + '" data-k="espDist"></div></div>',
            '<div class="km-row"><span class="km-lbl">Show Health</span><div class="km-tog' + (cfg.espHp ? ' on' : '') + '" data-k="espHp"></div></div>',
            '<div class="km-row"><span class="km-lbl">Tracer Lines</span><div class="km-tog' + (cfg.espLine ? ' on' : '') + '" data-k="espLine"></div></div>',
            '<div class="km-row"><span class="km-lbl">RGB ESP</span><div class="km-tog' + (cfg.espRgb ? ' on' : '') + '" data-k="espRgb"></div></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">ESP Appearance</div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Max Distance</span><span class="km-sld-v" id="espMax-v">' + cfg.espMax + 'm</span></div><input type="range" class="km-sld" id="espMax" min="50" max="1000" value="' + cfg.espMax + '"></div>',
            '<div class="km-row"><span class="km-lbl">ESP Color</span><select class="km-sel" id="espColSel" style="width:100px">' + colorList.map(function(c, i) { return '<option value="' + i + '"' + (cfg.espIdx === i ? ' selected' : '') + '>' + c.name + '</option>'; }).join('') + '</select></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Wireframe & Chams</div>',
            '<div class="km-row"><span class="km-lbl">Player Wireframe</span><div class="km-tog' + (cfg.wireOn ? ' on' : '') + '" data-k="wireOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">RGB Wireframe</span><div class="km-tog' + (cfg.wireRgb ? ' on' : '') + '" data-k="wireRgb"></div></div>',
            '<div class="km-row"><span class="km-lbl">World Wireframe</span><div class="km-tog' + (cfg.worldWire ? ' on' : '') + '" data-k="worldWire"></div></div>',
            '<div class="km-row"><span class="km-lbl">Enable Chams</span><div class="km-tog' + (cfg.chamsOn ? ' on' : '') + '" data-k="chamsOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Chams Color</span><input type="color" class="km-col" id="chamsCol" value="' + cfg.chamsCol + '"></div>',
            '</div>',
            '</div>',

            '<div class="km-pnl" data-p="vis">',
            '<div class="km-sec">',
            '<div class="km-sec-t">3rd Person Camera</div>',
            '<div class="km-row"><span class="km-lbl">Enable 3rd Person</span><div class="km-tog' + (cfg.tpOn ? ' on' : '') + '" data-k="tpOn"></div></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Camera X</span><span class="km-sld-v" id="camX-v">' + cfg.camX + '</span></div><input type="range" class="km-sld" id="camX" min="-10" max="10" step="0.5" value="' + cfg.camX + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Camera Y</span><span class="km-sld-v" id="camY-v">' + cfg.camY + '</span></div><input type="range" class="km-sld" id="camY" min="-10" max="10" step="0.5" value="' + cfg.camY + '"></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Camera Z</span><span class="km-sld-v" id="camZ-v">' + cfg.camZ + '</span></div><input type="range" class="km-sld" id="camZ" min="-20" max="5" step="0.5" value="' + cfg.camZ + '"></div>',
            '</div>',
            '</div>',

            '<div class="km-pnl" data-p="misc">',
            '<div class="km-sec">',
            '<div class="km-sec-t">Weapon Mods</div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>No Recoil</span><span class="km-sld-v" id="noRecoil-v">' + cfg.noRecoil + '%</span></div><input type="range" class="km-sld" id="noRecoil" min="0" max="100" value="' + cfg.noRecoil + '"></div>',
            '<div class="km-row"><span class="km-lbl">Silent Aim</span><div class="km-tog' + (cfg.silentOn ? ' on' : '') + '" data-k="silentOn"></div></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Movement Hacks</div>',
            '<div class="km-row"><span class="km-lbl">Speed Hack</span><div class="km-tog' + (cfg.speedOn ? ' on' : '') + '" data-k="speedOn"></div></div>',
            '<div class="km-sld-w"><div class="km-sld-h"><span>Speed Multiplier</span><span class="km-sld-v" id="speedVal-v">' + cfg.speedVal.toFixed(1) + 'x</span></div><input type="range" class="km-sld" id="speedVal" min="1" max="3" step="0.1" value="' + cfg.speedVal + '"></div>',
            '<div class="km-row"><span class="km-lbl">Auto Bhop</span><div class="km-tog' + (cfg.bhopOn ? ' on' : '') + '" data-k="bhopOn"></div></div>',
            '<div class="km-row"><span class="km-lbl">Jump Hack</span><div class="km-tog' + (cfg.jumpOn ? ' on' : '') + '" data-k="jumpOn"></div></div>',
            '</div>',
            '</div>',

            '<div class="km-pnl" data-p="cfg">',
            '<div class="km-sec">',
            '<div class="km-sec-t">Aim Key</div>',
            '<select class="km-sel" id="aimKey">',
            '<option value="MouseRight"' + (cfg.aimKey === 'MouseRight' ? ' selected' : '') + '>Right Mouse</option>',
            '<option value="MouseLeft"' + (cfg.aimKey === 'MouseLeft' ? ' selected' : '') + '>Left Mouse</option>',
            '<option value="MouseMiddle"' + (cfg.aimKey === 'MouseMiddle' ? ' selected' : '') + '>Middle Mouse</option>',
            '<option value="KeyV"' + (cfg.aimKey === 'KeyV' ? ' selected' : '') + '>V Key</option>',
            '<option value="ShiftLeft"' + (cfg.aimKey === 'ShiftLeft' ? ' selected' : '') + '>Shift</option>',
            '</select>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Keybinds</div>',
            '<div class="km-row"><span class="km-lbl">Toggle Aimbot</span><button class="km-key" data-b="togAim">' + getKeyName(cfg.keys.togAim) + '</button></div>',
            '<div class="km-row"><span class="km-lbl">Toggle ESP</span><button class="km-key" data-b="togEsp">' + getKeyName(cfg.keys.togEsp) + '</button></div>',
            '<div class="km-row"><span class="km-lbl">Cycle Color</span><button class="km-key" data-b="cycCol">' + getKeyName(cfg.keys.cycCol) + '</button></div>',
            '<div class="km-row"><span class="km-lbl">Toggle RGB</span><button class="km-key" data-b="togRgb">' + getKeyName(cfg.keys.togRgb) + '</button></div>',
            '</div>',
            '<div class="km-sec">',
            '<div class="km-sec-t">Info</div>',
            '<div class="km-row"><span class="km-lbl">UI Toggle</span><span style="color:#ff0000;font-size:11px">Ctrl + Alt + L</span></div>',
            '<div class="km-row"><span class="km-lbl">Panic Key</span><span style="color:#ff0000;font-size:11px">Delete</span></div>',
            '<div class="km-row"><span class="km-lbl">Discord</span><span style="color:#5865F2;font-size:11px">discord.gg/MHCcGgsX56</span></div>',
            '</div>',
            '</div>',

            '</div>',
            '</div>',
            '</div>',
            '<div id="krem-fov" style="display:' + (cfg.fovShow ? 'block' : 'none') + ';border-color:' + cfg.fovCol + '"></div>'
        ].join('');

        if (!document.body) { setTimeout(initUI, 100); return; }
        document.body.appendChild(root);
        
        if (cfg.uiHidden) {
            var menu = document.getElementById('km');
            if (menu) menu.style.display = 'none';
        }
        
        bindUI();
        makeDrag();
        updateFov();
        setInterval(updateFov, 16);
    }

    function bindUI() {
        document.querySelectorAll('.km-tab').forEach(function(tab) {
            tab.onclick = function() {
                document.querySelectorAll('.km-tab').forEach(function(t) { t.classList.remove('on'); });
                document.querySelectorAll('.km-pnl').forEach(function(p) { p.classList.remove('on'); });
                tab.classList.add('on');
                document.querySelector('[data-p="' + tab.dataset.t + '"]').classList.add('on');
            };
        });

        document.getElementById('km-min').onclick = function() {
            document.getElementById('km').classList.toggle('min');
        };

        document.querySelectorAll('.km-tog').forEach(function(tog) {
            tog.onclick = function() {
                var k = tog.dataset.k;
                cfg[k] = !cfg[k];
                tog.classList.toggle('on');
                if (k === 'espRgb' || k === 'fovRgb' || k === 'wireRgb') {
                    if (cfg.espRgb || cfg.fovRgb || cfg.wireRgb) startRgb(); else stopRgb();
                }
                if (k === 'fovShow') document.getElementById('krem-fov').style.display = cfg.fovShow ? 'block' : 'none';
                saveCfg();
            };
        });

        var sliders = [
            { id: 'aimStr', k: 'aimStr', s: '', d: 0 },
            { id: 'predInt', k: 'predInt', s: '', d: 1 },
            { id: 'vertAdj', k: 'vertAdj', s: '', d: 1 },
            { id: 'fovSize', k: 'fovSize', s: '', d: 0 },
            { id: 'espMax', k: 'espMax', s: 'm', d: 0 },
            { id: 'noRecoil', k: 'noRecoil', s: '%', d: 0 },
            { id: 'speedVal', k: 'speedVal', s: 'x', d: 1 },
            { id: 'rageSmooth', k: 'rageSmooth', s: '', d: 2 },
            { id: 'rageOff', k: 'rageOff', s: '', d: 2 },
            { id: 'rageDist', k: 'rageDist', s: '', d: 0 },
            { id: 'camX', k: 'camX', s: '', d: 1 },
            { id: 'camY', k: 'camY', s: '', d: 1 },
            { id: 'camZ', k: 'camZ', s: '', d: 1 },
            { id: 'triggerFov', k: 'triggerFov', s: 'px', d: 0 },
            { id: 'triggerDelay', k: 'triggerDelay', s: 'ms', d: 0 }
        ];

        sliders.forEach(function(sl) {
            var el = document.getElementById(sl.id);
            var vEl = document.getElementById(sl.id + '-v');
            if (el && vEl) {
                el.oninput = function(e) {
                    var v = parseFloat(e.target.value);
                    cfg[sl.k] = v;
                    vEl.textContent = (sl.d > 0 ? v.toFixed(sl.d) : v) + sl.s;
                    saveCfg();
                };
            }
        });

        var aimbone = document.getElementById('aimbone');
        if (aimbone) aimbone.onchange = function(e) { cfg.aimbone = e.target.value; saveCfg(); };

        var rageBone = document.getElementById('rageBone');
        if (rageBone) rageBone.onchange = function(e) { cfg.rageBone = e.target.value; saveCfg(); };

        var rageKey = document.getElementById('rageKey');
        if (rageKey) rageKey.onchange = function(e) { cfg.rageKey = e.target.value; saveCfg(); };

        var aimKey = document.getElementById('aimKey');
        if (aimKey) aimKey.onchange = function(e) { cfg.aimKey = e.target.value; saveCfg(); };

        var espColSel = document.getElementById('espColSel');
        if (espColSel) espColSel.onchange = function(e) {
            var i = parseInt(e.target.value);
            cfg.espIdx = i;
            cfg.espCol = colorList[i].value;
            updateEspColor();
            saveCfg();
        };

        var chamsCol = document.getElementById('chamsCol');
        if (chamsCol) chamsCol.oninput = function(e) { cfg.chamsCol = e.target.value; saveCfg(); };

        document.querySelectorAll('.km-key').forEach(function(btn) {
            btn.onclick = function() {
                var bk = btn.dataset.b;
                btn.classList.add('rec');
                btn.textContent = '...';
                var handler = function(e) {
                    e.preventDefault(); e.stopPropagation();
                    cfg.keys[bk] = e.code;
                    btn.textContent = getKeyName(e.code);
                    btn.classList.remove('rec');
                    document.removeEventListener('keydown', handler, true);
                    saveCfg();
                };
                document.addEventListener('keydown', handler, true);
            };
        });
    }

    function makeDrag() {
        var menu = document.getElementById('km');
        var hdr = document.getElementById('km-hdr');
        var drag = false, ox = 0, oy = 0;

        hdr.onmousedown = function(e) {
            if (e.target.tagName === 'BUTTON') return;
            drag = true;
            ox = e.clientX - menu.offsetLeft;
            oy = e.clientY - menu.offsetTop;
            menu.style.transition = 'none';
        };

        document.onmousemove = function(e) {
            if (!drag) return;
            menu.style.left = (e.clientX - ox) + 'px';
            menu.style.top = (e.clientY - oy) + 'px';
        };

        document.onmouseup = function() { drag = false; menu.style.transition = ''; };
    }

    function updateFov() {
        var fov = document.getElementById('krem-fov');
        if (!fov) return;
        fov.style.width = cfg.fovSize + 'px';
        fov.style.height = cfg.fovSize + 'px';
        fov.style.left = (window.innerWidth / 2) + 'px';
        fov.style.top = (window.innerHeight / 2) + 'px';
        if (!cfg.fovRgb) fov.style.borderColor = cfg.fovCol;
        fov.style.display = cfg.fovShow && cfg.fovOn && !cfg.panic ? 'block' : 'none';
    }

    function toggleUI() {
        cfg.uiHidden = !cfg.uiHidden;
        var menu = document.getElementById('km');
        if (menu) menu.style.display = cfg.uiHidden ? 'none' : 'block';
        saveCfg();
    }

    function applyTriggerbot(entities, local, camera) {
        if (!cfg.triggerOn || !camera || cfg.panic) return;

        var now = Date.now();
        if (now - lastTrigger < cfg.triggerDelay) return;

        var centerX = window.innerWidth / 2;
        var centerY = window.innerHeight / 2;

        for (var i = 0; i < entities.length; i++) {
            var ent = entities[i];
            if (ent === local || ent === localRef) continue;
            if (isTeammate(ent, local)) continue;

            var headPos = getHeadPos(ent);
            var screenPos = headPos.clone().project(camera);

            if (screenPos.z > 1) continue;

            var screenX = (screenPos.x * 0.5 + 0.5) * window.innerWidth;
            var screenY = (-screenPos.y * 0.5 + 0.5) * window.innerHeight;

            var dist = Math.sqrt(Math.pow(screenX - centerX, 2) + Math.pow(screenY - centerY, 2));

            if (dist < cfg.triggerFov) {
                lastTrigger = now;
                try {
                    if (inputObj) {
                        inputObj.mouseDown = true;
                        setTimeout(function() { if (inputObj) inputObj.mouseDown = false; }, 50);
                    }
                    document.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, button: 0 }));
                    setTimeout(function() {
                        document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, button: 0 }));
                    }, 50);
                } catch (e) {}
                break;
            }
        }
    }

    function mainLoop() {
        utils.raf.call(utils.win, mainLoop);

        if (!sceneRef && !initTimer) {
            var loadEl = document.querySelector('#loadingBg');
            if (loadEl && loadEl.style.display === 'none') {
                initTimer = setTimeout(function() {
                    Array.prototype.push = detectScene;
                    initTimer = null;
                }, 2000);
            }
            return;
        }

        if (!sceneRef || cfg.panic) {
            if (lineVis.parent) sceneRef.remove(lineVis);
            if (hpCanvas.parentNode) hpCanvas.parentNode.removeChild(hpCanvas);
            return;
        }

        if (cfg.speedOn) applySpeed();
        if (cfg.bhopOn) applyBhop();
        if (cfg.jumpOn) applyJump();
        applyNoRecoil();

        if (cfg.worldWire) {
            sceneRef.children.forEach(function(c) {
                if (c.material && c.material.wireframe !== undefined) c.material.wireframe = true;
            });
        }

        var entities = [];
        var local = null;

        sceneRef.children.forEach(function(child) {
            if (child.type === 'Object3D') {
                try {
                    var cam = child.children[0] && child.children[0].children[0];
                    if (cam && cam.type === 'PerspectiveCamera') {
                        local = child;
                        localRef = child;
                    } else {
                        var bbox = new Engine.Box3().setFromObject(child);
                        var height = bbox.getSize(new Engine.Vector3()).y;
                        if (height > 10 && height < 20) {
                            entities.push(child);
                        }
                    }
                } catch (e) {}
            }
        });

        if (!local) return;

        if (cfg.tpOn && local.children[0]) {
            local.children[0].position.set(cfg.camX, cfg.camY, cfg.camZ);
        } else if (local.children[0]) {
            local.children[0].position.set(0, 0, 0);
        }

        if (!lineVis.parent) sceneRef.add(lineVis);
        if (!hpCanvas.parentNode) document.body.appendChild(hpCanvas);

        var posCount = 0;
        var curTgt = null;
        var minDist = Infinity;
        var rageTgt = null;
        var rageDist = Infinity;

        tempObj.matrix.copy(local.matrix).invert();

        var curPos = {};
        for (var i = 0; i < entities.length; i++) {
            curPos[entities[i].id] = entities[i].position.clone();
        }

        var hCtx = hpCanvas.getContext('2d');
        hCtx.clearRect(0, 0, hpCanvas.width, hpCanvas.height);

        var camera = local.children && local.children[0] && local.children[0].children && local.children[0].children[0];

        for (var i = 0; i < entities.length; i++) {
            var ent = entities[i];

            if (ent === local || ent === localRef) continue;
            if (isTeammate(ent, local)) {
                if (ent.espBox) ent.espBox.visible = false;
                continue;
            }

            var dist = ent.position.distanceTo(local.position);
            if (dist < 1) continue;
            if (dist > cfg.espMax) {
                if (ent.espBox) ent.espBox.visible = false;
                continue;
            }

            if (cfg.wireOn || cfg.chamsOn) applyWireframe(ent);

            if (!ent.espBox) {
                var box = new Engine.LineSegments(boxGeo, espMat.clone());
                box.frustumCulled = false;
                box.renderOrder = 9999;
                ent.add(box);
                ent.espBox = box;
            }

            if (cfg.espLine) {
                var pPos = local.position;
                var startY = pPos.y;
                if (cfg.espLinePos === 'top') startY += 10;
                else if (cfg.espLinePos === 'middle') startY += 5;
                linePos.setXYZ(posCount++, pPos.x, startY, pPos.z);
                linePos.setXYZ(posCount++, ent.position.x, ent.position.y + 7, ent.position.z);
            }

            var predPos = ent.position.clone();
            if (posHist[ent.id]) {
                var vel = new Engine.Vector3().subVectors(curPos[ent.id], posHist[ent.id]);
                predPos.add(vel.multiplyScalar(cfg.predInt));
            }

            ent.visible = true;

            var inFov = false;

            if (camera && camera.type === 'PerspectiveCamera') {
                var screenPos = predPos.clone().project(camera);
                var screenX = (screenPos.x * 0.5 + 0.5) * window.innerWidth;
                var screenY = (-screenPos.y * 0.5 + 0.5) * window.innerHeight;
                var centerX = window.innerWidth / 2;
                var centerY = window.innerHeight / 2;
                var distFromCenter = Math.sqrt(Math.pow(screenX - centerX, 2) + Math.pow(screenY - centerY, 2));
                var fovRad = cfg.fovSize / 2;
                inFov = (screenPos.z < 1) && (distFromCenter <= fovRad);

                if (cfg.espHp && cfg.espOn && screenPos.z > 0 && screenPos.z < 1) {
                    var hp = getHp(ent);
                    var hpPct = Math.max(0, Math.min(1, hp / 100));
                    var barW = 50, barH = 5;
                    var barX = screenX - barW / 2;
                    var barY = screenY - 80;

                    if (barX > -barW && barX < window.innerWidth && barY > -20 && barY < window.innerHeight) {
                        hCtx.fillStyle = 'rgba(0,0,0,0.6)';
                        hCtx.fillRect(barX, barY, barW, barH);
                        hCtx.fillStyle = hpPct > 0.6 ? '#0f0' : hpPct > 0.3 ? '#ff0' : '#f00';
                        hCtx.fillRect(barX, barY, barW * hpPct, barH);
                        hCtx.strokeStyle = '#fff';
                        hCtx.lineWidth = 1;
                        hCtx.strokeRect(barX, barY, barW, barH);
                        hCtx.fillStyle = '#fff';
                        hCtx.font = 'bold 9px Arial';
                        hCtx.textAlign = 'center';
                        hCtx.fillText(Math.round(hp) + 'HP', screenX, barY - 2);
                    }
                }
            }

            var fovOk = cfg.fovOn ? inFov : true;
            if (!lockOn && fovOk && dist < minDist) {
                curTgt = ent;
                minDist = dist;
            }

            if (cfg.rageOn && dist < cfg.rageDist && dist > 1) {
                var canTarget = true;
                if (cfg.rageVis) {
                    canTarget = isVisible(local.position, ent.position, sceneRef);
                }
                if (canTarget && dist < rageDist) {
                    rageTgt = ent;
                    rageDist = dist;
                }
            }
        }

        if (cfg.espOn) {
            for (var i = 0; i < entities.length; i++) {
                var ent = entities[i];
                if (ent === local || ent === localRef) continue;
                if (isTeammate(ent, local)) continue;
                var dist = ent.position.distanceTo(local.position);
                if (dist < 1) continue;
                if (dist > cfg.espMax) continue;

                if (ent.espBox) {
                    var parts = cfg.espCol.split(',').map(function(v) { return parseFloat(v.trim()); });
                    ent.espBox.material.uniforms.espColor.value.set(parts[0], parts[1], parts[2]);
                    if (ent === curTgt) ent.espBox.material.uniforms.espColor.value.set(0, 1, 0);
                    ent.espBox.visible = true;
                }
            }
        } else {
            for (var i = 0; i < entities.length; i++) {
                if (entities[i].espBox) entities[i].espBox.visible = false;
            }
        }

        posHist = curPos;
        linePos.needsUpdate = true;
        lineGeo.setDrawRange(0, posCount);
        lineVis.visible = cfg.espLine && cfg.espOn;

        if (cfg.triggerOn && camera) {
            applyTriggerbot(entities, local, camera);
        }

        var rageActive = cfg.rageAlways || (cfg.rageKey !== 'None' && rageKeyDown);
        if (cfg.rageOn && rageTgt && local && rageActive) {
            doRageAim(rageTgt, local);
        }

        var aimActive = (cfg.aimKey === 'MouseRight' && rightDown) ||
            (cfg.aimKey === 'MouseLeft' && keyDown) ||
            (cfg.aimKey === 'MouseMiddle' && keyDown) || keyDown;

        if (!cfg.aimbotOn || !aimActive) {
            if (lockOn) {
                lockOn = false; locked = null;
                document.removeEventListener('mousemove', blockMouse, true);
            }
            return;
        }

        if (!lockOn && curTgt) {
            locked = curTgt;
            lockOn = true;
            document.addEventListener('mousemove', blockMouse, true);
        }

        if (!curTgt) {
            lockOn = false; locked = null;
            document.removeEventListener('mousemove', blockMouse, true);
            return;
        }

        if (locked && !sceneRef.children.includes(locked)) {
            lockOn = false; locked = null;
            document.removeEventListener('mousemove', blockMouse, true);
            return;
        }

        if (!locked) return;

        var targetPos = getTargetPos(locked, cfg.aimbone);

        if (posHist[locked.id] && curPos[locked.id]) {
            var vel = new Engine.Vector3().subVectors(curPos[locked.id], posHist[locked.id]);
            targetPos.add(vel.multiplyScalar(cfg.predInt));
        }

        if (cfg.vertOn) targetPos.y += cfg.vertAdj;

        tempVec.copy(targetPos);
        tempObj.position.copy(local.position);
        tempObj.lookAt(tempVec);

        var aimFactor = Math.min(1.0, cfg.aimStr / 100);

        if (local.children && local.children.length > 0) {
            var curX = local.children[0].rotation.x;
            var tgtX = -tempObj.rotation.x;
            local.children[0].rotation.x = curX + (tgtX - curX) * aimFactor;
        }

        var curY = local.rotation.y;
        var tgtY = tempObj.rotation.y + Math.PI;
        local.rotation.y = curY + (tgtY - curY) * aimFactor;
    }

    function doRageAim(target, local) {
        if (!target || !local) return;
        if (target === local || target === localRef) return;

        try {
            var targetPos = getTargetPos(target, cfg.rageBone);
            var dist = target.position.distanceTo(local.position);

            tempObj.position.copy(local.position);
            tempObj.lookAt(targetPos.x, targetPos.y, targetPos.z);

            var tgtRotX = -tempObj.rotation.x + (cfg.rageOff / dist) * 5;
            var tgtRotY = tempObj.rotation.y + Math.PI;

            local.children[0].rotation.x += (tgtRotX - local.children[0].rotation.x) * cfg.rageSmooth;
            local.rotation.y += (tgtRotY - local.rotation.y) * cfg.rageSmooth;
        } catch (e) {}
    }

    document.addEventListener('pointerdown', onDown);
    document.addEventListener('pointerup', onUp);

    document.addEventListener('keydown', function(e) {
        if (e.code === cfg.aimKey) keyDown = true;
        if (e.code === cfg.rageKey) rageKeyDown = true;

        if (e.ctrlKey && e.altKey && e.code === 'KeyL') {
            e.preventDefault();
            toggleUI();
        }

        if (e.code === 'Delete') {
            cfg.panic = !cfg.panic;
            if (cfg.panic) {
                var menu = document.getElementById('km');
                if (menu) menu.style.display = 'none';
                var fov = document.getElementById('krem-fov');
                if (fov) fov.style.display = 'none';
            } else {
                if (!cfg.uiHidden) {
                    var menu = document.getElementById('km');
                    if (menu) menu.style.display = 'block';
                }
                updateFov();
            }
        }

        if (e.code === cfg.keys.togAim) {
            cfg.aimbotOn = !cfg.aimbotOn;
            var tog = document.querySelector('[data-k="aimbotOn"]');
            if (tog) tog.classList.toggle('on', cfg.aimbotOn);
            saveCfg();
        }
        if (e.code === cfg.keys.togEsp) {
            cfg.espOn = !cfg.espOn;
            var tog = document.querySelector('[data-k="espOn"]');
            if (tog) tog.classList.toggle('on', cfg.espOn);
            saveCfg();
        }
        if (e.code === cfg.keys.cycCol) {
            cfg.espIdx = (cfg.espIdx + 1) % colorList.length;
            cfg.espCol = colorList[cfg.espIdx].value;
            updateEspColor();
            var sel = document.getElementById('espColSel');
            if (sel) sel.value = cfg.espIdx;
            saveCfg();
        }
        if (e.code === cfg.keys.togRgb) {
            cfg.espRgb = !cfg.espRgb;
            var tog = document.querySelector('[data-k="espRgb"]');
            if (tog) tog.classList.toggle('on', cfg.espRgb);
            if (cfg.espRgb) startRgb(); else stopRgb();
            saveCfg();
        }
    });

    document.addEventListener('keyup', function(e) {
        if (e.code === cfg.aimKey) keyDown = false;
        if (e.code === cfg.rageKey) rageKeyDown = false;
    });

    window.addEventListener('resize', function() {
        hpCanvas.width = window.innerWidth;
        hpCanvas.height = window.innerHeight;
    });

    setTimeout(initUI, 1000);
    mainLoop();

})();