BALLISTIC Client+ | AIMBOT+ESP

Cheat mod for deadshot.io with, Chams, Aimbot, and Crosshair. All tested and working. 100% UNDETECTED

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         BALLISTIC Client+ | AIMBOT+ESP
// @description  Cheat mod for deadshot.io with, Chams, Aimbot, and Crosshair. All tested and working. 100% UNDETECTED
// @author       levifrsn63
// @match        *://*/*
// @license      Nigga University
// @run-at       document-start
// @version      3.2
// @namespace https://greasyfork.org/users/
// ==/UserScript==

(function() {
    'use strict';

    // ====================================
    // DISABLE AUTO-FULLSCREEN
    // ====================================
    const blockFullscreen = () => {
        if (Element.prototype.requestFullscreen) {
            Element.prototype.requestFullscreen = function() {
                return Promise.reject(new Error('Fullscreen blocked'));
            };
        }
        ['webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen'].forEach(m => {
            if (Element.prototype[m]) Element.prototype[m] = function() { return Promise.reject(); };
        });
        document.addEventListener('fullscreenchange', (e) => {
            if (document.fullscreenElement) document.exitFullscreen();
        }, true);
    };
    blockFullscreen();

    // ====================================
    // CONFIG & STATE
    // ====================================
    const defaultConfig = {
        showCrosshair: true, crosshairColor: "#3645B5",
        crosshairSize: 6, rgbCrosshair: false, mobile: false,
        menuVisible: true, x: 20, y: 20,
        espMaster: true, esp: false, espType: 'corner', tracers: false, showClass: false,
        chams: false, chamsMode: 'additive', chamsColor: '#a855f7',
        aimbotEnabled: false, aimFov: 100, aimSensitivity: 1.0, aimPrediction: 2,
        crosshairDot: false
    };

    let config = { ...defaultConfig };
    const saved = localStorage.getItem("ballistic_config");
    if (saved) { try { config = { ...config, ...JSON.parse(saved) }; } catch (e) {} }
    function save() { localStorage.setItem("ballistic_config", JSON.stringify(config)); }

    const state = {
        detectedPlayers: [],
        viewProjMatrix: null,
        PLAYER_HISTORY: new Map(),
        PLAYER_VERTEX_SET: new Set([8829, 10392, 10944, 16413]),
        VERTEX_CLASS_MAP: { 8829: 'Shotgun', 10392: 'Assault Rifle', 10944: 'Sniper', 16413: 'SMG' },
        uniformCache: new Map(),
        activeTextureUnit: 0,
        textureUnitBindings: new Array(32).fill(null),
        textureDataMap: new WeakMap(),
        currentProgram: null,
        isDepthEnabled: false,
        currentTarget: null,
        isAiming: false,
        aimRemainderX: 0,
        aimRemainderY: 0,
        lastAimbotFrame: 0,
        cachedSPos: null
    };

    // Mobile spoof
    if (config.mobile) {
        const ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1";
        Object.defineProperties(navigator, {
            userAgent: { get: () => ua }, platform: { get: () => "iPhone" },
            maxTouchPoints: { get: () => 5 }, vendor: { get: () => "Apple Computer, Inc." }
        });
        window.ontouchstart = () => {};
    }

    // ====================================
    // AIMBOT LOGIC
    // ====================================
    const originalX = Object.getOwnPropertyDescriptor(MouseEvent.prototype, 'movementX').get;
    const originalY = Object.getOwnPropertyDescriptor(MouseEvent.prototype, 'movementY').get;

    const applyAimbot = (orig, isY) => {
        if (config.aimbotEnabled && state.isAiming && state.currentTarget) {
            const now = performance.now();
            if (now !== state.lastAimbotFrame) {
                state.cachedSPos = worldToScreen(state.currentTarget.position);
                state.lastAimbotFrame = now;
            }

            if (state.cachedSPos && Number.isFinite(state.cachedSPos[0]) && Number.isFinite(state.cachedSPos[1])) {
                const center = isY ? window.innerHeight / 2 : window.innerWidth / 2;
                const delta = (state.cachedSPos[isY ? 1 : 0] - center) * config.aimSensitivity;

                let total = delta + (isY ? state.aimRemainderY : state.aimRemainderX);
                let movement = Math.round(total);

                if (isY) state.aimRemainderY = total - movement;
                else state.aimRemainderX = total - movement;

                if (Number.isFinite(movement)) {
                    const MAX_SNAP = 120;
                    return Math.max(-MAX_SNAP, Math.min(MAX_SNAP, movement));
                }
            }
        } else {
            state.aimRemainderX = 0;
            state.aimRemainderY = 0;
        }
        return typeof orig === 'number' ? orig : 0;
    };

    Object.defineProperty(MouseEvent.prototype, 'movementX', { get: function () { return applyAimbot(originalX.call(this), false); } });
    Object.defineProperty(MouseEvent.prototype, 'movementY', { get: function () { return applyAimbot(originalY.call(this), true); } });

    window.addEventListener('mousedown', (e) => { if (e.button === 2) state.isAiming = true; });
    window.addEventListener('mouseup', (e) => { if (e.button === 2) state.isAiming = false; });

    // ====================================
    // UI SYSTEM
    // ====================================
    let leftPanel, rightPanel, contentArea, highlight, tabBar, arrow, clientText, featureList;
    let minimized = false, activeTab = 'Visuals', selectedIndex = 0;
    let savedESPStates = { esp: false, tracers: false, showClass: false, chams: false };

    const options = {
        Visuals: [
            { label: 'ESP', type: 'checkbox', key: 'espMastaer' },
            { label: 'Player Boxes', type: 'checkbox', key: 'esp' },
            { label: 'Box Type', type: 'select', key: 'espType', options: ['corner', 'normal', 'circle', 'diamond', 'cross'] },
            { label: 'Lines Color', type: 'color', key: 'lineColor' },
            { label: 'Snaplines', type: 'checkbox', key: 'tracers' },
            { label: 'Player Info', type: 'checkbox', key: 'showClass' },
            { label: 'Chams', type: 'checkbox', key: 'chams' },
            { label: 'Chams Mode', type: 'select', key: 'chamsMode', options: ['additive', 'wireframe', 'flat', 'darken', 'tint', 'hide'] },
            { label: 'Chams Color', type: 'color', key: 'chamsColor' }
        ],
        Aimbot: [
            { label: 'Aimbot', type: 'checkbox', key: 'aimbotEnabled' },
            { label: 'Aim FOV', type: 'slider', key: 'aimFov', min: 10, max: 1000, step: 10 },
            { label: 'Sensitivity', type: 'slider', key: 'aimSensitivity', min: 0.1, max: 2.5, step: 0.05 },
            { label: 'Prediction', type: 'slider', key: 'aimPrediction', min: 0, max: 2, step: 0.1 }
        ],
        Settings: [
            { label: 'Mobile Mode [M] (BETA)', type: 'checkbox', key: 'mobile' },
            { label: 'Crosshair Dot', type: 'checkbox', key: 'crosshairDot' },
            { label: 'Crosshair Size', type: 'slider', key: 'crosshairSize', min: 1, max: 20, step: 1 }
        ]
    };

    // ====================================
    // HELPER FUNCTIONS
    // ====================================
    const isDeadshotDomain = () => window.location.hostname.includes('deadshot.io');

    function multiplyMatrixVec4(m, x, y, z, w) {
        return [
            m[0] * x + m[4] * y + m[8] * z + m[12] * w,
            m[1] * x + m[5] * y + m[9] * z + m[13] * w,
            m[2] * x + m[6] * y + m[10] * z + m[14] * w,
            m[3] * x + m[7] * y + m[11] * z + m[15] * w
        ];
    }

    function worldToScreen(pos, overrideMatrix) {
        const m = overrideMatrix || state.viewProjMatrix;
        if (!m) return null;
        const clip = multiplyMatrixVec4(m, pos[0], pos[1], pos[2], 1);
        if (clip[3] <= 0.001) return null;
        return [
            (clip[0] / clip[3] + 1) * 0.5 * window.innerWidth,
            (1 - clip[1] / clip[3]) * 0.5 * window.innerHeight,
            clip[3]
        ];
    }

    function getCachedMatrices(program) {
        const cache = state.uniformCache.get(program);
        if (!cache) return { vp: null, model: null, boneUnit: null, opacity: 1.0, isEnemy: true };

        let vp = null, model = null, boneUnit = null, opacity = 1.0, isEnemy = false;
        for (const [name, val] of cache) {
            if (val?.length === 16) {
                if (val[11] !== 0 && Math.abs(val[15]) > 1.0) vp = val;
                else if (/modelMatrix/i.test(name)) model = val;
            } else if (name === 'boneTexture') boneUnit = val;
            else if (name === 'opacity') opacity = val;
            else if (typeof val === 'number') {
                const nameLower = name.toLowerCase();
                if (nameLower.includes('isenemy') && val === 1) isEnemy = true;
                else if (nameLower.includes('teamid') || nameLower.includes('team_id')) isEnemy = (val !== window._wxLocalTeam);
                else if (val === 1 && !['left', 'specMultMult', 'opacity'].includes(name) && name.length > 5) {
                    isEnemy = true;
                }
            }
        }
        return { vp, model, boneUnit, opacity, isEnemy };
    }

    function processDrawCall(gl, program, vertexCount) {
        const { vp, model, boneUnit, opacity, isEnemy } = getCachedMatrices(program);
        if (vp) state.viewProjMatrix = vp;

        const isPlayer = state.PLAYER_VERTEX_SET.has(vertexCount) || (boneUnit !== null && vertexCount > 3000);

        if (!model || !isPlayer || opacity < 0.1) return;

        let headPos = [model[12], model[13] + 0.6, model[14]];

        if (boneUnit !== null && state.textureUnitBindings[boneUnit]) {
            const boneData = state.textureDataMap.get(state.textureUnitBindings[boneUnit]);
            if (boneData?.length >= 23 * 16) {
                const b22 = 22 * 16;
                headPos = [boneData[b22 + 12], boneData[b22 + 13] + 0.6, boneData[b22 + 14]];
            }
        }

        if (!headPos.every(Number.isFinite)) return;

        const chestPos = [headPos[0], headPos[1] - 0.6 * 0.35, headPos[2]];

        const playerClass = state.VERTEX_CLASS_MAP[vertexCount] || 'Unknown';

        const playerKey = `${vertexCount}_${model[12].toFixed(1)}_${model[14].toFixed(1)}`;
        let finalHead = [...headPos];
        let finalChest = [...chestPos];

        const hist = state.PLAYER_HISTORY.get(playerKey) || { last: headPos, vel: [0, 0, 0], acc: [0, 0, 0], tick: Date.now(), enemyTick: 0, visTick: 0 };
        const now = Date.now();
        if (isEnemy) hist.enemyTick = now;
        if (state.isDepthEnabled) hist.visTick = now;

        if (!isEnemy && hist.enemyTick === 0) {
            state.PLAYER_HISTORY.set(playerKey, hist);
            return;
        }

        if (now - hist.enemyTick > 4000) {
            state.PLAYER_HISTORY.set(playerKey, hist);
            return;
        }

        let depth = 5;
        if (state.viewProjMatrix) {
            const clip = multiplyMatrixVec4(state.viewProjMatrix, headPos[0], headPos[1], headPos[2], 1);
            if (clip[3] > 0) depth = clip[3];
        }

        // Aimbot prediction logic from aimbot.js
        if (config.aimPrediction > 0) {
            const dt = (now - hist.tick) / 1000;
            if (dt > 0.008 && dt < 0.2) {
                const instVel = [(headPos[0] - hist.last[0]) / dt, (headPos[1] - hist.last[1]) / dt, (headPos[2] - hist.last[2]) / dt];
                hist.vel = hist.vel.map((v, i) => v * 0.7 + instVel[i] * 0.3);
                const lookAhead = 0.05 * config.aimPrediction;
                finalHead = headPos.map((v, i) => v + hist.vel[i] * lookAhead);
                finalChest = chestPos.map((v, i) => v + hist.vel[i] * lookAhead);
            }
        }

        if (finalHead.every(Number.isFinite)) {
            state.detectedPlayers.push({
                position: finalHead,
                bodyPos: finalChest,
                playerClass: playerClass,
                vertexCount: vertexCount,
                playerDepth: depth,
                playerKey: playerKey,
                isVisible: (hist.visTick === 0 || now - hist.visTick < 250),
                ctxProjMatrix: state.viewProjMatrix ? state.viewProjMatrix.slice() : null
            });
        }
        hist.last = headPos;
        hist.tick = now;
        state.PLAYER_HISTORY.set(playerKey, hist);
    }

    function drawChams(gl, mode, colorHex, originalArgs, originalDrawFunc) {
        if (mode === 'hide') return;

        const washEnabled = gl.isEnabled(gl.DEPTH_TEST);
        const wCull = gl.isEnabled(gl.CULL_FACE);
        const wBlend = gl.isEnabled(gl.BLEND);

        gl.disable(gl.CULL_FACE);
        if (!washEnabled) gl.enable(gl.DEPTH_TEST);
        gl.depthFunc(gl.ALWAYS);

        const r = parseInt(colorHex.slice(1, 3), 16) / 255;
        const g = parseInt(colorHex.slice(3, 5), 16) / 255;
        const b = parseInt(colorHex.slice(5, 7), 16) / 255;
        gl.blendColor(r, g, b, 1.0);
        if (!gl.isEnabled(gl.BLEND)) gl.enable(gl.BLEND);

        const primMode = mode === 'wireframe' ? gl.LINES : originalArgs[0];

        if (mode === 'flat') {
            gl.blendEquation(gl.FUNC_ADD);
            gl.blendFunc(gl.CONSTANT_COLOR, gl.ZERO);
        } else if (mode === 'darken') {
            gl.blendEquation(gl.FUNC_ADD);
            gl.blendFunc(gl.ZERO, gl.CONSTANT_COLOR);
        } else if (mode === 'additive' || mode === 'tint') {
            gl.blendEquation(gl.FUNC_ADD);
            gl.blendFuncSeparate(gl.CONSTANT_COLOR, gl.ONE, gl.SRC_ALPHA, gl.ONE);
        } else {
            gl.blendEquation(gl.FUNC_ADD);
            gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
        }

        const passes = (mode === 'additive') ? 3 : 1;
        for (let i = 0; i < passes; i++) {
            originalDrawFunc.apply(gl, [primMode, ...Array.prototype.slice.call(originalArgs, 1)]);
        }

        gl.depthFunc(gl.LEQUAL);
        if (wCull) gl.enable(gl.CULL_FACE);
        if (!washEnabled) gl.disable(gl.DEPTH_TEST);
        if (!wBlend) gl.disable(gl.BLEND);
        gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
    }

    // ====================================
    // WEBGL HOOKS
    // ====================================
    const originalGetContext = HTMLCanvasElement.prototype.getContext;
    const proxyCache = new WeakMap();

    HTMLCanvasElement.prototype.getContext = new Proxy(HTMLCanvasElement.prototype.getContext, {
        apply(target, thisArgs, args) {
            const ctx = Reflect.apply(target, thisArgs, args);
            if (!ctx || (args[0] !== 'webgl' && args[0] !== 'webgl2')) return ctx;
            if (proxyCache.has(ctx)) return proxyCache.get(ctx);

            const handler = {
                get(target, prop) {
                    const val = target[prop];
                    if (typeof val === 'function') {
                        if (prop === 'enable') {
                            return function(...args) {
                                if (args[0] === 2929) state.isDepthEnabled = true;
                                return Reflect.apply(val, target, args);
                            };
                        }
                        if (prop === 'disable') {
                            return function(...args) {
                                if (args[0] === 2929) state.isDepthEnabled = false;
                                return Reflect.apply(val, target, args);
                            };
                        }
                        if (prop === 'useProgram') {
                            return function(program) {
                                state.currentProgram = program;
                                return Reflect.apply(val, target, arguments);
                            };
                        }
                        if (prop === 'getUniformLocation') {
                            return function(...args) {
                                const loc = Reflect.apply(val, target, args);
                                if (loc) loc._name = args[1];
                                return loc;
                            };
                        }
                        if (prop === 'activeTexture') {
                            return function(...args) {
                                state.activeTextureUnit = args[0] - target.TEXTURE0;
                                return Reflect.apply(val, target, args);
                            };
                        }
                        if (prop === 'bindTexture') {
                            return function(...args) {
                                if (args[0] === target.TEXTURE_2D) state.textureUnitBindings[state.activeTextureUnit] = args[1];
                                return Reflect.apply(val, target, args);
                            };
                        }
                        if (prop === 'texImage2D') {
                            return function(...args) {
                                const p = args[args.length - 1];
                                if (p instanceof Float32Array) {
                                    const tex = state.textureUnitBindings[state.activeTextureUnit];
                                    if (tex) state.textureDataMap.set(tex, p);
                                }
                                return Reflect.apply(val, target, args);
                            };
                        }
                        if (prop === 'uniformMatrix4fv' || prop === 'uniform1f' || prop === 'uniform1i') {
                            return function(...args) {
                                const loc = args[0];
                                if (state.currentProgram && loc?._name) {
                                    if (!state.uniformCache.has(state.currentProgram)) state.uniformCache.set(state.currentProgram, new Map());
                                    let val = args[1];

                                    if (prop === 'uniformMatrix4fv') {
                                        const name = loc._name;
                                        const mat = args[2];
                                        if (mat[11] !== 0 && Math.abs(mat[15]) > 1.0) {
                                            state.viewProjMatrix = mat.slice();
                                            val = state.viewProjMatrix;
                                        } else if (name.toLowerCase().includes('modelmatrix')) {
                                            val = mat.slice();
                                        } else {
                                            val = mat;
                                        }
                                    }
                                    state.uniformCache.get(state.currentProgram).set(loc._name, val);
                                }
                                return Reflect.apply(val, target, args);
                            };
                        }
                        if (prop === 'drawElements') {
                            return function(...args) {
                                const gl = target;
                                const vC = args[1];

                                if (state.currentProgram && vC > 1000) {
                                    try { processDrawCall(gl, state.currentProgram, vC); } catch(e) {}
                                }

                                if (config.chams && state.PLAYER_VERTEX_SET.has(vC)) {
                                    drawChams(gl, config.chamsMode, config.chamsColor, args, val);
                                    return;
                                }

                                return Reflect.apply(val, target, args);
                            };
                        }
                        return val.bind(target);
                    }
                    return val;
                }
            };
            const proxied = new Proxy(ctx, handler);
            proxyCache.set(ctx, proxied);
            return proxied;
        }
    });

    // ====================================
    // ESP CANVAS & RENDERING
    // ====================================
    let espCanvas, espCtx;

    function setupCanvas() {
        if (!isDeadshotDomain()) return;
        if (espCanvas) return;

        espCanvas = document.createElement('canvas');
        espCanvas.id = 'esp-overlay-canvas';
        espCanvas.style.cssText = "position:fixed;top:0;left:0;width:100%;height:100%;z-index:999999;pointer-events:none;";
        document.documentElement.appendChild(espCanvas);

        function updateCanvasSize() { espCanvas.width = window.innerWidth; espCanvas.height = window.innerHeight; }
        window.addEventListener('resize', updateCanvasSize);
        updateCanvasSize();
        espCtx = espCanvas.getContext('2d');

        function loop() { renderESP(); requestAnimationFrame(loop); }
        loop();
    }

    function renderESP() {
        if (!espCtx) return;
        const w = espCanvas.width, h = espCanvas.height;
        const cx = w / 2, cy = h / 2;
        espCtx.clearRect(0, 0, w, h);

        // Draw FOV circle for aimbot
        if (config.aimbotEnabled && config.aimFov > 0) {
            espCtx.beginPath();
            espCtx.arc(cx, cy, config.aimFov, 0, Math.PI * 2);
            espCtx.strokeStyle = 'rgba(168, 85, 247, 0.4)';
            espCtx.lineWidth = 1.5;
            espCtx.stroke();
        }

        // Draw crosshair dot
        if (config.crosshairDot) {
            espCtx.beginPath();
            espCtx.arc(cx, cy, config.crosshairSize, 0, Math.PI * 2);
            espCtx.fillStyle = config.crosshairColor || '#3645B5';
            espCtx.fill();
        }

        // Aimbot target selection
        if (config.aimbotEnabled) {
            let best = null, minDist = config.aimFov;
            state.detectedPlayers.forEach(p => {
                if (!p.position || !p.ctxProjMatrix) return;
                const sPos = worldToScreen(p.position, p.ctxProjMatrix);
                if (!sPos) return;
                const d = Math.hypot(sPos[0] - cx, sPos[1] - cy);
                if (d < minDist) { minDist = d; best = p; }
            });
            state.currentTarget = best;
        }

        state.detectedPlayers.forEach(p => {
            if (!p.position || !p.ctxProjMatrix) return;
            const headY = p.position[1];
            const feetY = headY - 2.3;

            // Project head and feet to screen space
            const top = worldToScreen([p.position[0], headY + 0.3, p.position[2]], p.ctxProjMatrix);
            const bot = worldToScreen([p.position[0], feetY, p.position[2]], p.ctxProjMatrix);
            if (!top || !bot) return;

            const boxH = Math.abs(bot[1] - top[1]);
            if (boxH < 5 || boxH > h * 2) return;
            const boxW = boxH * 0.6;
            const sx = top[0];
            const sy = Math.min(top[1], bot[1]);
            const depth = top[2];

            if (config.esp) {
                espCtx.strokeStyle = config.lineColor || '#a855f7';
                espCtx.lineWidth = 1.5;

                if (config.espType === 'corner') {
                    const cl = Math.min(boxW, boxH) * 0.25;
                    espCtx.beginPath();
                    espCtx.moveTo(sx - boxW / 2, sy + cl); espCtx.lineTo(sx - boxW / 2, sy); espCtx.lineTo(sx - boxW / 2 + cl, sy);
                    espCtx.moveTo(sx + boxW / 2 - cl, sy); espCtx.lineTo(sx + boxW / 2, sy); espCtx.lineTo(sx + boxW / 2, sy + cl);
                    espCtx.moveTo(sx + boxW / 2, sy + boxH - cl); espCtx.lineTo(sx + boxW / 2, sy + boxH); espCtx.lineTo(sx + boxW / 2 - cl, sy + boxH);
                    espCtx.moveTo(sx - boxW / 2 + cl, sy + boxH); espCtx.lineTo(sx - boxW / 2, sy + boxH); espCtx.lineTo(sx - boxW / 2, sy + boxH - cl);
                    espCtx.stroke();
                } else if (config.espType === 'normal') {
                    espCtx.strokeRect(sx - boxW / 2, sy, boxW, boxH);
                } else if (config.espType === 'circle') {
                    espCtx.beginPath();
                    espCtx.arc(sx, sy + boxH/2, boxW/2, 0, Math.PI * 2);
                    espCtx.stroke();
                } else if (config.espType === 'diamond') {
                    espCtx.beginPath();
                    espCtx.moveTo(sx, sy);
                    espCtx.lineTo(sx + boxW/2, sy + boxH/2);
                    espCtx.lineTo(sx, sy + boxH);
                    espCtx.lineTo(sx - boxW/2, sy + boxH/2);
                    espCtx.closePath();
                    espCtx.stroke();
                } else if (config.espType === 'cross') {
                    espCtx.beginPath();
                    espCtx.moveTo(sx - boxW/2, sy);
                    espCtx.lineTo(sx + boxW/2, sy + boxH);
                    espCtx.moveTo(sx + boxW/2, sy);
                    espCtx.lineTo(sx - boxW/2, sy + boxH);
                    espCtx.stroke();
                }

                // Draw snaplines
                if (config.tracers) {
                    espCtx.strokeStyle = config.lineColor || '#a855f7';
                    espCtx.lineWidth = 1;
                    espCtx.beginPath();
                    espCtx.moveTo(cx, h);
                    espCtx.lineTo(sx, sy + boxH);
                    espCtx.stroke();
                }

                // Draw player info
                if (config.showClass) {
                    espCtx.fillStyle = 'white';
                    espCtx.font = 'bold 10px Consolas, monospace';
                    espCtx.textAlign = 'center';
                    espCtx.fillText(p.playerClass.toUpperCase(), sx, sy - 6);
                    espCtx.fillStyle = 'white';
                    espCtx.font = 'bold 14px Consolas, monospace';
                    espCtx.textAlign = 'left';
                    espCtx.fillText(Math.round(depth) + 'm', sx + boxW / 2 + 5, sy + boxH / 2);
                }
            }
        });

        state.detectedPlayers.length = 0;

        if (state.PLAYER_HISTORY.size > 50) {
            const now = Date.now();
            for (const [id, data] of state.PLAYER_HISTORY) {
                if (now - data.tick > 2000) state.PLAYER_HISTORY.delete(id);
            }
        }
    }

    // ====================================
    // UI FUNCTIONS
    // ====================================

    // Style definitions
    const UI_STYLES = {
        panel: {
            position: 'fixed', width: '320px', background: '#2b2b2b', color: '#f1f1f1',
            fontFamily: 'Consolas, monospace', zIndex: 99999, border: '1px solid #3a3a3a',
            boxShadow: '0 2px 8px rgba(0,0,0,0.5)', padding: '0', userSelect: 'none',
            transition: 'width 0.2s ease'
        },
        tabBar: { display: 'flex', borderBottom: '1px solid #3a3a3a', background: '#232323' },
        tab: (active) => ({
            flex: '1', padding: '8px 0', textAlign: 'center', cursor: 'pointer',
            background: active ? '#2b2b2b' : '#232323', borderRight: '1px solid #3a3a3a',
            fontSize: '12px', fontWeight: '500', color: active ? '#ddd' : '#888',
            transition: 'color 0.2s'
        }),
        content: {
            padding: '10px', fontSize: '12px', lineHeight: '1.4', background: '#2b2b2b',
            position: 'relative', overflow: 'hidden', maxHeight: '500px', overflowY: 'auto'
        },
        highlight: {
            position: 'absolute', left: '6px', width: 'calc(100% - 12px)', height: '28px',
            background: 'rgba(54, 69, 181, 0.2)', transition: 'top 0.2s ease', pointerEvents: 'none'
        },
        row: {
            marginBottom: '4px', display: 'flex', alignItems: 'center',
            padding: '4px 6px 4px 8px', position: 'relative', cursor: 'pointer',
            minHeight: '28px', borderLeft: '2px solid transparent',
            transition: 'border-left 0.2s ease'
        }
    };

    // Helper: Create element with styles
    function createEl(tag, styles = {}, text = '') {
        const el = document.createElement(tag);
        if (text) el.textContent = text;
        Object.assign(el.style, styles);
        return el;
    }

    // Helper: Create checkbox row
    function createCheckbox(opt, index) {
        const isESPOption = ['esp', 'tracers', 'showClass', 'chams'].includes(opt.key);
        const isDisabled = !config.espMastaer && activeTab === 'Visuals' && opt.key !== 'espMastaer';
        const isChecked = config[opt.key];

        const row = createEl('div', {
            ...UI_STYLES.row,
            borderLeft: isChecked ? '2px solid #A5ACE4' : '2px solid transparent',
            opacity: isDisabled ? '0.4' : '1',
            cursor: isDisabled ? 'not-allowed' : 'pointer'
        });

        const box = createEl('div', {
            width: '12px', height: '12px', border: isDisabled ? '1px solid #333' : '1px solid #666', marginRight: '8px',
            display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
            background: isChecked ? '#3645B5' : 'transparent', flexShrink: '0'
        });

        if (isChecked) {
            const check = createEl('span', { color: '#fff', fontSize: '9px', fontWeight: 'bold' }, '✓');
            box.appendChild(check);
        }

        const label = createEl('span', {
            color: isDisabled ? '#444' : (isChecked ? '#A5ACE4' : '#ddd'),
            fontSize: '12px', fontWeight: isChecked ? 'bold' : 'normal',
            transition: 'color 0.2s, font-weight 0.2s'
        }, opt.label);

        row.append(box, label);
        row.addEventListener('mouseenter', () => { if (!isDisabled) { selectedIndex = index; moveHighlight(); } });
        row.addEventListener('click', (e) => {
            if (isDisabled) return;
            e.stopPropagation();
            const newVal = !config[opt.key];
            config[opt.key] = newVal;

            if (opt.key === 'espMastaer') {
                if (newVal) {
                    // Restore saved states
                    config.esp = savedESPStates.esp;
                    config.tracers = savedESPStates.tracers;
                    config.showClass = savedESPStates.showClass;
                    config.chams = savedESPStates.chams;
                } else {
                    // Save current states and turn off
                    savedESPStates.esp = config.esp;
                    savedESPStates.tracers = config.tracers;
                    savedESPStates.showClass = config.showClass;
                    savedESPStates.chams = config.chams;
                    config.esp = false;
                    config.tracers = false;
                    config.showClass = false;
                    config.chams = false;
                }
            }

            save();
            renderContent();
            updateRightPanel();
        });
        return row;
    }

    // Helper: Create slider row
    function createSlider(opt, index) {
        const row = createEl('div', UI_STYLES.row);
        const label = createEl('span', { color: '#ddd', fontSize: '12px' }, opt.label);

        const container = createEl('div', { marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: '6px' });
        const slider = createEl('input');
        slider.type = 'range';
        slider.min = opt.min;
        slider.max = opt.max;
        slider.step = opt.step || 1;
        const scale = opt.scale || 1;
        slider.value = config[opt.key] / scale;
        Object.assign(slider.style, { width: '80px', accentColor: '#3645B5' });

        const valueLabel = createEl('span', { minWidth: '30px', fontSize: '11px', color: '#aaa' },
            Math.round(config[opt.key] * 100) / 100);

        slider.addEventListener('input', (e) => {
            e.stopPropagation();
            config[opt.key] = parseFloat(slider.value) * scale;
            valueLabel.textContent = Math.round(config[opt.key] * 100) / 100;
            save();
        });

        container.append(slider, valueLabel);
        row.append(label, container);
        row.addEventListener('mouseenter', () => { selectedIndex = index; moveHighlight(); });
        return row;
    }

    // Helper: Create color picker row
    function createColor(opt, index) {
        const isDisabled = !config.espMaster && activeTab === 'Visuals';

        const row = createEl('div', {
            ...UI_STYLES.row,
            opacity: isDisabled ? '0.4' : '1',
            cursor: isDisabled ? 'not-allowed' : 'pointer'
        });

        const label = createEl('span', {
            color: isDisabled ? '#444' : '#ddd',
            fontSize: '12px'
        }, opt.label);

        const input = createEl('input');
        input.type = 'color';
        input.value = config[opt.key];
        input.disabled = isDisabled;
        Object.assign(input.style, {
            marginLeft: 'auto', border: 'none', width: '30px', height: '20px',
            background: 'none', cursor: isDisabled ? 'not-allowed' : 'pointer'
        });

        input.addEventListener('input', (e) => {
            e.stopPropagation();
            config[opt.key] = input.value;
            save();
        });

        row.append(label, input);
        row.addEventListener('mouseenter', () => { if (!isDisabled) { selectedIndex = index; moveHighlight(); } });
        return row;
    }

    // Helper: Create select dropdown row
    function createSelect(opt, index) {
        const isDisabled = !config.espMaster && activeTab === 'Visuals';

        const row = createEl('div', {
            ...UI_STYLES.row,
            opacity: isDisabled ? '0.4' : '1',
            cursor: isDisabled ? 'not-allowed' : 'pointer'
        });

        const label = createEl('span', {
            color: isDisabled ? '#444' : '#ddd',
            fontSize: '12px'
        }, opt.label);

        const select = createEl('select');
        Object.assign(select.style, {
            marginLeft: 'auto', background: '#2b2b2b', border: isDisabled ? '1px solid #333' : '1px solid #3a3a3a',
            color: isDisabled ? '#444' : '#f1f1f1', padding: '4px 8px', borderRadius: '3px',
            fontSize: '11px', fontFamily: 'Consolas, monospace', outline: 'none',
            cursor: isDisabled ? 'not-allowed' : 'pointer'
        });
        select.disabled = isDisabled;

        opt.options.forEach(val => {
            const option = createEl('option', {}, val.charAt(0).toUpperCase() + val.slice(1));
            option.value = val;
            if (config[opt.key] === val) option.selected = true;
            select.appendChild(option);
        });

        select.addEventListener('change', (e) => {
            e.stopPropagation();
            config[opt.key] = select.value;
            save();
        });
        select.addEventListener('click', (e) => e.stopPropagation());

        row.append(label, select);
        row.addEventListener('mouseenter', () => { if (!isDisabled) { selectedIndex = index; moveHighlight(); } });
        return row;
    }

    function createUI() {
        if (!isDeadshotDomain()) return;
        if (document.getElementById('esp-eclipse-ui')) return;

        // Right panel (enabled features)
        rightPanel = createEl('div', {
            ...UI_STYLES.panel, right: '20px', width: '180px', display: config.menuVisible ? 'block' : 'none',
            background: 'transparent', border: 'none', boxShadow: 'none'
        });
        document.body.appendChild(rightPanel);

        featureList = createEl('div', { padding: '0', textAlign: 'right' });
        rightPanel.appendChild(featureList);

        // Left panel (main menu)
        leftPanel = createEl('div', { ...UI_STYLES.panel, id: 'esp-eclipse-ui', left: config.x + 'px', top: config.y + 'px' });
        leftPanel.style.display = config.menuVisible ? 'block' : 'none';
        document.body.appendChild(leftPanel);

        // Client text
        clientText = createEl('div', {
            position: 'absolute', bottom: '-25px', left: '0', color: '#888',
            fontFamily: 'Consolas, monospace', fontSize: '15px', fontStyle: 'italic',
            userSelect: 'none', transition: 'opacity 0.2s ease', opacity: config.menuVisible ? '1' : '0',
            whiteSpace: 'nowrap', pointerEvents: 'none'
        }, 'Ballistic Client');
        leftPanel.appendChild(clientText);

        // Minimize arrow
        arrow = createEl('div', {
            position: 'absolute', bottom: '-25px', left: '85px', cursor: 'pointer',
            fontWeight: 'bold', fontSize: '14px', userSelect: 'none', color: '#888',
            padding: '2px 4px', transition: 'left 0.2s ease', fontFamily: 'Consolas, monospace'
        }, '◀');
        arrow.addEventListener('mouseenter', () => arrow.style.color = '#aaa');
        arrow.addEventListener('mouseleave', () => arrow.style.color = '#888');
        arrow.addEventListener('click', () => toggleMinimize());
        leftPanel.appendChild(arrow);

        // Tab bar
        tabBar = createEl('div', UI_STYLES.tabBar);
        leftPanel.appendChild(tabBar);

        // Create tabs
        const tabs = ['Visuals', 'Aimbot', 'Settings'];
        const tabButtons = {};
        tabs.forEach(name => {
            const btn = createEl('div', UI_STYLES.tab(name === activeTab), name);
            btn.addEventListener('mouseenter', () => { if (activeTab !== name) btn.style.color = '#aaa'; });
            btn.addEventListener('mouseleave', () => { if (activeTab !== name) btn.style.color = '#888'; });
            btn.addEventListener('click', () => switchTab(name));
            tabBar.appendChild(btn);
            tabButtons[name] = btn;
        });

        // Tab switching functions
        window.switchTab = (name) => {
            activeTab = name;
            tabs.forEach(n => {
                const btn = tabButtons[n];
                const active = n === name;
                btn.style.background = active ? '#2b2b2b' : '#232323';
                btn.style.color = active ? '#ddd' : '#888';
            });
            renderContent();
        };

        window.toggleMinimize = () => {
            minimized = !minimized;
            config.menuVisible = !minimized;
            leftPanel.style.width = minimized ? '30px' : '320px';
            arrow.style.left = minimized ? '35px' : '85px';
            arrow.textContent = minimized ? '⚙' : '◀';
            arrow.style.fontSize = minimized ? '16px' : '14px';
            contentArea.style.display = minimized ? 'none' : 'block';
            tabBar.style.display = minimized ? 'none' : 'flex';
            clientText.style.opacity = minimized ? '0' : '1';
            rightPanel.style.display = config.menuVisible ? 'block' : 'none';
            save();
        };

        // Content area
        contentArea = createEl('div', UI_STYLES.content);
        leftPanel.appendChild(contentArea);

        // Initial render
        renderContent();
        updateRightPanel();
        setupDraggable();

        // Watch for external custom dropdown elements and remove them
        const observer = new MutationObserver(() => {
            document.querySelectorAll('.new-select2, .new-option, [class*="select2"]').forEach(el => el.remove());
        });
        observer.observe(document.body, { childList: true, subtree: true });
    }

    function renderContent() {
        // Clear content and recreate highlight
        while (contentArea.firstChild) contentArea.removeChild(contentArea.firstChild);

        // Remove any external custom dropdown elements
        document.querySelectorAll('.new-select2, .new-option, [class*="select2"]').forEach(el => el.remove());

        highlight = createEl('div', UI_STYLES.highlight);
        contentArea.appendChild(highlight);

        // Render options using helper functions
        const handlers = { checkbox: createCheckbox, slider: createSlider, color: createColor, select: createSelect };
        options[activeTab].forEach((opt, i) => {
            const row = handlers[opt.type](opt, i);
            contentArea.appendChild(row);
        });

        selectedIndex = 0;
        moveHighlight();
    }

    function moveHighlight() {
        const rows = Array.from(contentArea.children).filter(c => c !== highlight);
        if (rows[selectedIndex]) {
            highlight.style.top = rows[selectedIndex].offsetTop + 'px';
            highlight.style.height = rows[selectedIndex].offsetHeight + 'px';
        }
    }

    function updateRightPanel() {
        const activeFeatures = Object.values(options).flat()
            .filter(opt => opt.type === 'checkbox' && config[opt.key])
            .map(opt => opt.label.replace(/\s*\[.*?\]\s*/g, ''));

        featureList.innerHTML = '';
        activeFeatures.forEach(feature => {
            featureList.appendChild(createEl('div', {
                padding: '2px 0', marginBottom: '2px', color: '#a855f7', fontSize: '12px', fontWeight: 'bold'
            }, feature));
        });
    }

    function setupDraggable() {
        let isDragging = false, offsetX, offsetY;

        const start = (e) => {
            isDragging = true;
            offsetX = e.clientX - leftPanel.offsetLeft;
            offsetY = e.clientY - leftPanel.offsetTop;
            e.preventDefault();
        };

        tabBar.addEventListener('mousedown', start);
        leftPanel.addEventListener('mousedown', (e) => minimized && e.target === leftPanel && start(e));

        window.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            leftPanel.style.left = (e.clientX - offsetX) + 'px';
            leftPanel.style.top = (e.clientY - offsetY) + 'px';
            rightPanel.style.top = (e.clientY - offsetY) + 'px';
            config.x = e.clientX - offsetX;
            config.y = e.clientY - offsetY;
            save();
        });

        window.addEventListener('mouseup', () => isDragging = false);
    }

    // ====================================
    // KEYBOARD CONTROLS
    // ====================================
    window.addEventListener('keydown', (e) => {
        if (!isDeadshotDomain()) return;
        if (document.activeElement?.tagName === 'INPUT' || document.activeElement?.tagName === 'SELECT') return;

        if (e.code === 'Insert' || e.code === 'Delete' || e.code === 'KeyP' || (e.key === 'Shift' && e.location === 2)) {
            config.menuVisible = !config.menuVisible;
            if (leftPanel) leftPanel.style.display = config.menuVisible ? 'block' : 'none';
            if (rightPanel) rightPanel.style.display = config.menuVisible ? 'block' : 'none';
            if (clientText) clientText.style.opacity = config.menuVisible ? '1' : '0';
            save();
            e.preventDefault();
            e.stopPropagation();
        }
        if (e.code === 'KeyM') { config.mobile = !config.mobile; save(); renderContent(); }
    }, true);

    // ====================================
    // AD REMOVAL
    // ====================================
    function removeAds() {
        // Remove common ad elements
        const adSelectors = [
            'iframe[src*="ads"]',
            'iframe[src*="doubleclick"]',
            'iframe[src*="googlesyndication"]',
            'div[id*="ad"]',
            'div[class*="ad"]',
            'div[id*="banner"]',
            'div[class*="banner"]',
            '.ad-container',
            '.ad-banner',
            '.sidebar-ad',
            '#ad-sidebar',
            '.side-ad'
        ];

        adSelectors.forEach(selector => {
            document.querySelectorAll(selector).forEach(el => {
                el.style.display = 'none';
                el.remove();
            });
        });

        // Remove side panels that might be ads
        const sidePanels = document.querySelectorAll('aside, .sidebar, .side-panel');
        sidePanels.forEach(panel => {
            if (panel.offsetWidth > 50 && panel.offsetHeight > 50) {
                const rect = panel.getBoundingClientRect();
                // If it's on the left or right side of the screen
                if (rect.left < 100 || rect.right > window.innerWidth - 100) {
                    panel.style.display = 'none';
                }
            }
        });
    }

    // ====================================
    // INITIALIZE
    // ====================================
    function init() {
        if (!isDeadshotDomain()) return;
        createUI();
        setupCanvas();
        removeAds();
        // Run ad removal periodically
        setInterval(removeAds, 2000);
    }

    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
    else init();

})();